From 83fc734b8f6bbb75698fc575ddab1d63cb706067 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 2 Feb 2024 11:28:42 -0800 Subject: [PATCH 001/923] add neural ff weights to release --- release/files_common | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/files_common b/release/files_common index 91945a0621..1158d2c552 100644 --- a/release/files_common +++ b/release/files_common @@ -95,7 +95,7 @@ selfdrive/car/ecu_addrs.py selfdrive/car/isotp_parallel_query.py selfdrive/car/tests/__init__.py selfdrive/car/tests/test_car_interfaces.py -selfdrive/car/torque_data/*.toml +selfdrive/car/torque_data/* selfdrive/car/body/*.py selfdrive/car/chrysler/*.py From 71236204bb78d64feb3d46680176dfb37741dc5d Mon Sep 17 00:00:00 2001 From: Hoang Bui <47828508+bongbui321@users.noreply.github.com> Date: Fri, 2 Feb 2024 15:06:05 -0500 Subject: [PATCH 002/923] Fix self.started value pass in metadrive test (#31153) * fix value pass * fix test --------- Co-authored-by: Justin Newberry --- tools/sim/bridge/common.py | 8 ++++---- tools/sim/tests/test_metadrive_bridge.py | 3 +-- tools/sim/tests/test_sim_bridge.py | 5 ++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index bdd53852c0..91ab0b6f07 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -2,7 +2,7 @@ import signal import threading import functools -from multiprocessing import Process, Queue +from multiprocessing import Process, Queue, Value from abc import ABC, abstractmethod from typing import Optional @@ -39,7 +39,7 @@ class SimulatorBridge(ABC): self._exit_event = threading.Event() self._threads = [] self._keep_alive = True - self.started = False + self.started = Value('i', False) signal.signal(signal.SIGTERM, self._on_shutdown) self._exit = threading.Event() self.simulator_state = SimulatorState() @@ -61,7 +61,7 @@ class SimulatorBridge(ABC): self.close() def close(self): - self.started = False + self.started.value = False self._exit_event.set() if self.world is not None: @@ -181,6 +181,6 @@ Ignition: {self.simulator_state.ignition} Engaged: {self.simulator_state.is_enga if self.rk.frame % 25 == 0: self.print_status() - self.started = True + self.started.value = True self.rk.keep_time() diff --git a/tools/sim/tests/test_metadrive_bridge.py b/tools/sim/tests/test_metadrive_bridge.py index 4d784956d2..6cb8e1465e 100755 --- a/tools/sim/tests/test_metadrive_bridge.py +++ b/tools/sim/tests/test_metadrive_bridge.py @@ -2,14 +2,13 @@ import pytest import unittest -from openpilot.tools.sim.run_bridge import parse_args from openpilot.tools.sim.bridge.metadrive.metadrive_bridge import MetaDriveBridge from openpilot.tools.sim.tests.test_sim_bridge import TestSimBridgeBase @pytest.mark.slow class TestMetaDriveBridge(TestSimBridgeBase): def create_bridge(self): - return MetaDriveBridge(parse_args([])) + return MetaDriveBridge(False, False) if __name__ == "__main__": diff --git a/tools/sim/tests/test_sim_bridge.py b/tools/sim/tests/test_sim_bridge.py index 850fd83bac..504914c562 100644 --- a/tools/sim/tests/test_sim_bridge.py +++ b/tools/sim/tests/test_sim_bridge.py @@ -3,7 +3,7 @@ import subprocess import time import unittest -from multiprocessing import Queue, Value +from multiprocessing import Queue from cereal import messaging from openpilot.common.basedir import BASEDIR @@ -27,7 +27,6 @@ class TestSimBridgeBase(unittest.TestCase): sm = messaging.SubMaster(['controlsState', 'onroadEvents', 'managerState']) q = Queue() bridge = self.create_bridge() - bridge.started = Value('b', False) p_bridge = bridge.run(q, retries=10) self.processes.append(p_bridge) @@ -35,7 +34,7 @@ class TestSimBridgeBase(unittest.TestCase): # Wait for bridge to startup start_waiting = time.monotonic() - while not bridge.started and time.monotonic() < start_waiting + max_time_per_step: + while not bridge.started.value and time.monotonic() < start_waiting + max_time_per_step: time.sleep(0.1) self.assertEqual(p_bridge.exitcode, None, f"Bridge process should be running, but exited with code {p_bridge.exitcode}") From a5766e27967707d51c4e7181a3509c78b3671d16 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 2 Feb 2024 12:53:12 -0800 Subject: [PATCH 003/923] encoderd: get frame size over vipc (#31276) * encoderd: get frame size over vipc * bump cereal * fix ffmpeg * no print --- cereal | 2 +- system/loggerd/encoder/encoder.cc | 6 ++++++ system/loggerd/encoder/encoder.h | 3 ++- system/loggerd/encoder/ffmpeg_encoder.cc | 14 +++++++------- system/loggerd/encoder/v4l_encoder.cc | 4 ++-- system/loggerd/loggerd.cc | 2 +- system/loggerd/loggerd.h | 4 ++-- 7 files changed, 21 insertions(+), 14 deletions(-) diff --git a/cereal b/cereal index a6ade85c9d..c54369f8ad 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit a6ade85c9dd6652fde547b9e089a297f67606dcf +Subproject commit c54369f8ad4e0bcb18c96feb4334755c6f65e8f1 diff --git a/system/loggerd/encoder/encoder.cc b/system/loggerd/encoder/encoder.cc index 0aba4b8b49..c4bd91bcf7 100644 --- a/system/loggerd/encoder/encoder.cc +++ b/system/loggerd/encoder/encoder.cc @@ -2,6 +2,10 @@ VideoEncoder::VideoEncoder(const EncoderInfo &encoder_info, int in_width, int in_height) : encoder_info(encoder_info), in_width(in_width), in_height(in_height) { + + out_width = encoder_info.frame_width > 0 ? encoder_info.frame_width : in_width; + out_height = encoder_info.frame_height > 0 ? encoder_info.frame_height : in_height; + pm.reset(new PubMaster({encoder_info.publish_name})); } @@ -25,6 +29,8 @@ void VideoEncoder::publisher_publish(VideoEncoder *e, int segment_num, uint32_t edata.setFlags(flags); edata.setLen(dat.size()); edat.setData(dat); + edat.setWidth(out_width); + edat.setHeight(out_height); if (flags & V4L2_BUF_FLAG_KEYFRAME) edat.setHeader(header); uint32_t bytes_size = capnp::computeSerializedSizeInWords(msg) * sizeof(capnp::word); diff --git a/system/loggerd/encoder/encoder.h b/system/loggerd/encoder/encoder.h index 9c23928cc6..7c203f9193 100644 --- a/system/loggerd/encoder/encoder.h +++ b/system/loggerd/encoder/encoder.h @@ -22,10 +22,11 @@ public: virtual void encoder_open(const char* path) = 0; virtual void encoder_close() = 0; - static void publisher_publish(VideoEncoder *e, int segment_num, uint32_t idx, VisionIpcBufExtra &extra, unsigned int flags, kj::ArrayPtr header, kj::ArrayPtr dat); + void publisher_publish(VideoEncoder *e, int segment_num, uint32_t idx, VisionIpcBufExtra &extra, unsigned int flags, kj::ArrayPtr header, kj::ArrayPtr dat); protected: int in_width, in_height; + int out_width, out_height; const EncoderInfo encoder_info; private: diff --git a/system/loggerd/encoder/ffmpeg_encoder.cc b/system/loggerd/encoder/ffmpeg_encoder.cc index f44f2fbed7..9d992f088d 100644 --- a/system/loggerd/encoder/ffmpeg_encoder.cc +++ b/system/loggerd/encoder/ffmpeg_encoder.cc @@ -29,16 +29,16 @@ FfmpegEncoder::FfmpegEncoder(const EncoderInfo &encoder_info, int in_width, int frame = av_frame_alloc(); assert(frame); frame->format = AV_PIX_FMT_YUV420P; - frame->width = encoder_info.frame_width; - frame->height = encoder_info.frame_height; - frame->linesize[0] = encoder_info.frame_width; - frame->linesize[1] = encoder_info.frame_width/2; - frame->linesize[2] = encoder_info.frame_width/2; + frame->width = out_width; + frame->height = out_height; + frame->linesize[0] = out_width; + frame->linesize[1] = out_width/2; + frame->linesize[2] = out_width/2; convert_buf.resize(in_width * in_height * 3 / 2); - if (in_width != encoder_info.frame_width || in_height != encoder_info.frame_height) { - downscale_buf.resize(encoder_info.frame_width * encoder_info.frame_height * 3 / 2); + if (in_width != out_width || in_height != out_height) { + downscale_buf.resize(out_width * out_height * 3 / 2); } } diff --git a/system/loggerd/encoder/v4l_encoder.cc b/system/loggerd/encoder/v4l_encoder.cc index 571f5979e2..2bd2863126 100644 --- a/system/loggerd/encoder/v4l_encoder.cc +++ b/system/loggerd/encoder/v4l_encoder.cc @@ -164,8 +164,8 @@ V4LEncoder::V4LEncoder(const EncoderInfo &encoder_info, int in_width, int in_hei .fmt = { .pix_mp = { // downscales are free with v4l - .width = (unsigned int)encoder_info.frame_width, - .height = (unsigned int)encoder_info.frame_height, + .width = (unsigned int)(out_width), + .height = (unsigned int)(out_height), .pixelformat = (encoder_info.encode_type == cereal::EncodeIndex::Type::FULL_H_E_V_C) ? V4L2_PIX_FMT_HEVC : V4L2_PIX_FMT_H264, .field = V4L2_FIELD_ANY, .colorspace = V4L2_COLORSPACE_DEFAULT, diff --git a/system/loggerd/loggerd.cc b/system/loggerd/loggerd.cc index 27dfa187c4..3c0ffc1667 100644 --- a/system/loggerd/loggerd.cc +++ b/system/loggerd/loggerd.cc @@ -116,7 +116,7 @@ int handle_encoder_msg(LoggerdState *s, Message *msg, std::string &name, struct assert(encoder_info.filename != NULL); re.writer.reset(new VideoWriter(s->logger.segmentPath().c_str(), encoder_info.filename, idx.getType() != cereal::EncodeIndex::Type::FULL_H_E_V_C, - encoder_info.frame_width, encoder_info.frame_height, encoder_info.fps, idx.getType())); + edata.getWidth(), edata.getHeight(), encoder_info.fps, idx.getType())); // write the header auto header = edata.getHeader(); re.writer->write((uint8_t *)header.begin(), header.size(), idx.getTimestampEof()/1000, true, false); diff --git a/system/loggerd/loggerd.h b/system/loggerd/loggerd.h index cfc06c28d3..ea288f4861 100644 --- a/system/loggerd/loggerd.h +++ b/system/loggerd/loggerd.h @@ -35,8 +35,8 @@ public: const char *publish_name; const char *filename = NULL; bool record = true; - int frame_width = 1928; - int frame_height = 1208; + int frame_width = -1; + int frame_height = -1; int fps = MAIN_FPS; int bitrate = MAIN_BITRATE; cereal::EncodeIndex::Type encode_type = Hardware::PC() ? cereal::EncodeIndex::Type::BIG_BOX_LOSSLESS From 0277fc5548bc87a17ae34b914df0593d034e5e94 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 2 Feb 2024 17:18:01 -0500 Subject: [PATCH 004/923] Pytest: consistent hardware state for tici tests (#31279) * consistent hardware * consistent hardware * moved * this too * ruff * s * duplicated --------- Co-authored-by: Comma Device --- Jenkinsfile | 2 +- conftest.py | 18 +++++++++++++++--- selfdrive/test/test_onroad.py | 8 +------- system/hardware/tici/tests/test_hardware.py | 7 +------ system/hardware/tici/tests/test_power_draw.py | 5 +---- 5 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 816c2971c0..d3b3444991 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -208,7 +208,7 @@ node { deviceStage("tici", "tici-common", ["UNSAFE=1"], [ ["build", "cd selfdrive/manager && ./build.py"], ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py", ["panda/", "selfdrive/boardd/"]], - ["test power draw", "./system/hardware/tici/tests/test_power_draw.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"], diff --git a/conftest.py b/conftest.py index c4eb259a35..e215bb8b4c 100644 --- a/conftest.py +++ b/conftest.py @@ -4,7 +4,7 @@ import random from openpilot.common.prefix import OpenpilotPrefix from openpilot.selfdrive.manager import manager -from openpilot.system.hardware import TICI +from openpilot.system.hardware import TICI, HARDWARE def pytest_sessionstart(session): @@ -57,12 +57,24 @@ def openpilot_class_fixture(): os.environ.update(starting_env) +@pytest.fixture(scope="class") +def tici_setup_fixture(): + """Ensure a consistent state for tests on-device""" + HARDWARE.initialize_hardware() + HARDWARE.set_power_save(False) + os.system("pkill -9 -f athena") + os.system("rm /dev/shm/*") + + @pytest.hookimpl(tryfirst=True) def pytest_collection_modifyitems(config, items): skipper = pytest.mark.skip(reason="Skipping tici test on PC") for item in items: - if not TICI and "tici" in item.keywords: - item.add_marker(skipper) + if "tici" in item.keywords: + if not TICI: + item.add_marker(skipper) + else: + item.fixturenames.append('tici_setup_fixture') if "xdist_group_class_property" in item.keywords: class_property_name = item.get_closest_marker('xdist_group_class_property').args[0] diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 335da73232..036eacfa48 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -112,17 +112,11 @@ class TestOnroad(unittest.TestCase): # setup env params = Params() - if "CI" in os.environ: - params.clear_all() params.remove("CurrentRoute") set_params_enabled() os.environ['TESTING_CLOSET'] = '1' if os.path.exists(Paths.log_root()): shutil.rmtree(Paths.log_root()) - os.system("rm /dev/shm/*") - - # Make sure athena isn't running - os.system("pkill -9 -f athena") # start manager and run openpilot for a minute proc = None @@ -429,4 +423,4 @@ class TestOnroad(unittest.TestCase): if __name__ == "__main__": - unittest.main() + pytest.main() diff --git a/system/hardware/tici/tests/test_hardware.py b/system/hardware/tici/tests/test_hardware.py index 4abc86107b..0c436595ee 100755 --- a/system/hardware/tici/tests/test_hardware.py +++ b/system/hardware/tici/tests/test_hardware.py @@ -12,11 +12,6 @@ HARDWARE = Tici() @pytest.mark.tici class TestHardware(unittest.TestCase): - @classmethod - def setUpClass(cls): - HARDWARE.initialize_hardware() - HARDWARE.set_power_save(False) - def test_power_save_time(self): ts = [] for _ in range(5): @@ -30,4 +25,4 @@ class TestHardware(unittest.TestCase): if __name__ == "__main__": - unittest.main() + pytest.main() diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index 0518eec543..db75f79af5 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -11,7 +11,6 @@ import cereal.messaging as messaging from cereal.services import SERVICE_LIST from openpilot.common.mock import mock_messages from openpilot.selfdrive.car.car_helpers import write_car_param -from openpilot.system.hardware import HARDWARE from openpilot.system.hardware.tici.power_monitor import get_power from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.selfdrive.manager.manager import manager_cleanup @@ -41,8 +40,6 @@ PROCS = [ class TestPowerDraw(unittest.TestCase): def setUp(self): - HARDWARE.initialize_hardware() - HARDWARE.set_power_save(False) write_car_param() # wait a bit for power save to disable @@ -88,4 +85,4 @@ class TestPowerDraw(unittest.TestCase): if __name__ == "__main__": - unittest.main() + pytest.main() From 28a15dbfe916c40d30a4901484e2d75fcb8af4cc Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 2 Feb 2024 18:45:59 -0500 Subject: [PATCH 005/923] CI: enable logical cpus for all selfdrive tests (#31281) logical --- .github/workflows/selfdrive_tests.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 964c36776e..860cfa48f7 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -26,7 +26,7 @@ env: RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PYTHONWARNINGS=error -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c - PYTEST: pytest --continue-on-collection-errors --cov --cov-report=xml --cov-append --durations=0 --durations-min=5 --hypothesis-seed 0 + PYTEST: pytest --continue-on-collection-errors --cov --cov-report=xml --cov-append --durations=0 --durations-min=5 --hypothesis-seed 0 -n logical jobs: build_release: @@ -182,7 +182,7 @@ jobs: run: | ${{ env.RUN }} "source selfdrive/test/setup_xvfb.sh && \ export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \ - $PYTEST --timeout 60 -m 'not slow' -n $(nproc) && \ + $PYTEST --timeout 60 -m 'not slow' && \ ./selfdrive/ui/tests/create_test_translations.sh && \ QT_QPA_PLATFORM=offscreen ./selfdrive/ui/tests/test_translations && \ ./selfdrive/ui/tests/test_translations.py" From 9ab374f3b05421af5978adc508981a7af5f9f4f4 Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Fri, 2 Feb 2024 16:29:45 -0800 Subject: [PATCH 006/923] athenad: return normalized origin in getVersion() (#31283) --- selfdrive/athena/athenad.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 0a5c9b7999..cd0b1b4f04 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -36,7 +36,7 @@ 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_origin, get_short_branch, get_version +from openpilot.system.version import get_commit, get_normalized_origin, get_short_branch, get_version from openpilot.system.hardware.hw import Paths @@ -316,7 +316,7 @@ def getMessage(service: str, timeout: int = 1000) -> dict: def getVersion() -> Dict[str, str]: return { "version": get_version(), - "remote": get_origin(''), + "remote": get_normalized_origin(''), "branch": get_short_branch(''), "commit": get_commit(default=''), } From 2193458da9b2379032f7afd506b36db1f8fc6ffd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 2 Feb 2024 19:20:28 -0800 Subject: [PATCH 007/923] bump panda (#31287) --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index ec17f75efc..457e3b262d 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ec17f75efca05c04313049e1d6dd376ef54d42ec +Subproject commit 457e3b262d798aa6e400033c92d12a0b0f52a7ed From 52be3805b093d5850a42237569892d980341b1ed Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 2 Feb 2024 21:25:34 -0600 Subject: [PATCH 008/923] use pytest for release tests (#31280) * not pytest? * copy what build release does * Update .github/workflows/release.yaml --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 38dbf07a47..3e3fe46e7a 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -47,7 +47,7 @@ jobs: export PYTHONPATH=$TARGET_DIR cd $TARGET_DIR scons -j$(nproc) - selfdrive/car/tests/test_car_interfaces.py + pytest -n logical selfdrive/car/tests/test_car_interfaces.py - name: Push master-ci run: | unset TARGET_DIR From 7affba06d89b366d98f42c4ea3a2f904e6ef3357 Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Fri, 2 Feb 2024 21:23:32 -0800 Subject: [PATCH 009/923] simplify git remote is comma check (#31284) * simplify git remote is comma check * cast to str * eliminate default and always return string * add type annotation for cache decorator * fix up default handling --- selfdrive/athena/athenad.py | 6 +-- selfdrive/controls/controlsd.py | 2 +- selfdrive/controls/lib/events.py | 2 +- selfdrive/manager/manager.py | 6 +-- selfdrive/sentry.py | 2 +- .../test/process_replay/test_processes.py | 2 +- selfdrive/tombstoned.py | 2 +- system/version.py | 49 ++++++++----------- 8 files changed, 31 insertions(+), 40 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index cd0b1b4f04..833bf841f5 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -316,9 +316,9 @@ def getMessage(service: str, timeout: int = 1000) -> dict: def getVersion() -> Dict[str, str]: return { "version": get_version(), - "remote": get_normalized_origin(''), - "branch": get_short_branch(''), - "commit": get_commit(default=''), + "remote": get_normalized_origin(), + "branch": get_short_branch(), + "commit": get_commit(), } diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 2aae956090..7660e5bd3a 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -60,7 +60,7 @@ class Controls: config_realtime_process(4, Priority.CTRL_HIGH) # Ensure the current branch is cached, otherwise the first iteration of controlsd lags - self.branch = get_short_branch("") + self.branch = get_short_branch() # Setup sockets self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState', diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 7df41927cf..b366728094 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -224,7 +224,7 @@ def user_soft_disable_alert(alert_text_2: str) -> AlertCallbackType: return func def startup_master_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int) -> Alert: - branch = get_short_branch("") # Ensure get_short_branch is cached to avoid lags on startup + branch = get_short_branch() # Ensure get_short_branch is cached to avoid lags on startup if "REPLAY" in os.environ: branch = "replay" diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 8d50b53e25..7733acec93 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -65,9 +65,9 @@ def manager_init() -> None: params.put("Version", get_version()) params.put("TermsVersion", terms_version) params.put("TrainingVersion", training_version) - params.put("GitCommit", get_commit(default="")) - params.put("GitBranch", get_short_branch(default="")) - params.put("GitRemote", get_origin(default="")) + params.put("GitCommit", get_commit()) + 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()) diff --git a/selfdrive/sentry.py b/selfdrive/sentry.py index 6b14b6bbd6..5b63a9fe2d 100644 --- a/selfdrive/sentry.py +++ b/selfdrive/sentry.py @@ -44,7 +44,7 @@ def set_tag(key: str, value: str) -> None: def init(project: SentryProject) -> bool: # forks like to mess with this, so double check - comma_remote = is_comma_remote() and "commaai" in get_origin(default="") + comma_remote = is_comma_remote() and "commaai" in get_origin() if not comma_remote or not is_registered_device() or PC: return False diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 46fa93ba4d..407a103232 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -160,7 +160,7 @@ if __name__ == "__main__": sys.exit(1) cur_commit = get_commit() - if cur_commit is None: + if not cur_commit: raise Exception("Couldn't get current commit") print(f"***** testing against commit {ref_commit} *****") diff --git a/selfdrive/tombstoned.py b/selfdrive/tombstoned.py index 5a81e93b28..ba3582d130 100755 --- a/selfdrive/tombstoned.py +++ b/selfdrive/tombstoned.py @@ -124,7 +124,7 @@ 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(default='nocommit')[:8]}_{safe_fn(clean_path)}"[:MAX_TOMBSTONE_FN_LEN] + new_fn = f"{date}_{(get_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/system/version.py b/system/version.py index 6bcae5f3fa..980a4fcc7c 100755 --- a/system/version.py +++ b/system/version.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import os import subprocess -from typing import List, Optional +from typing import List, Optional, Callable, TypeVar from functools import lru_cache from openpilot.common.basedir import BASEDIR @@ -13,8 +13,8 @@ TESTED_BRANCHES = RELEASE_BRANCHES + ['devel', 'devel-staging'] training_version: bytes = b"0.2.0" terms_version: bytes = b"2" - -def cache(user_function, /): +_RT = TypeVar("_RT") +def cache(user_function: Callable[..., _RT], /) -> Callable[..., _RT]: return lru_cache(maxsize=None)(user_function) @@ -30,41 +30,37 @@ def run_cmd_default(cmd: List[str], default: Optional[str] = None) -> Optional[s @cache -def get_commit(branch: str = "HEAD", default: Optional[str] = None) -> Optional[str]: - return run_cmd_default(["git", "rev-parse", branch], default=default) +def get_commit(branch: str = "HEAD") -> str: + return run_cmd_default(["git", "rev-parse", branch]) or "" @cache -def get_short_branch(default: Optional[str] = None) -> Optional[str]: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"], default=default) +def get_short_branch() -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"]) or "" @cache -def get_branch(default: Optional[str] = None) -> Optional[str]: - return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], default=default) +def get_branch() -> str: + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]) or "" @cache -def get_origin(default: Optional[str] = None) -> Optional[str]: +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"], default=default) + return run_cmd_default(["git", "config", "--get", "remote.origin.url"]) or "" @cache -def get_normalized_origin(default: Optional[str] = None) -> Optional[str]: - origin: Optional[str] = get_origin() - - if origin is None: - return default - - return origin.replace("git@", "", 1) \ - .replace(".git", "", 1) \ - .replace("https://", "", 1) \ - .replace(":", "/", 1) +def get_normalized_origin() -> str: + return get_origin() \ + .replace("git@", "", 1) \ + .replace(".git", "", 1) \ + .replace("https://", "", 1) \ + .replace(":", "/", 1) @cache @@ -75,7 +71,7 @@ def get_version() -> str: @cache def get_short_version() -> str: - return get_version().split('-')[0] # type: ignore + return get_version().split('-')[0] @cache def is_prebuilt() -> bool: @@ -86,12 +82,7 @@ def is_prebuilt() -> bool: 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 - origin: Optional[str] = get_origin() - if origin is None: - return False - - return origin.startswith(('git@github.com:commaai', 'https://github.com/commaai')) - + return get_normalized_origin() == "github.com/commaai/openpilot" @cache def is_tested_branch() -> bool: @@ -105,7 +96,7 @@ def is_release_branch() -> bool: def is_dirty() -> bool: origin = get_origin() branch = get_branch() - if (origin is None) or (branch is None): + if not origin or not branch: return True dirty = False From d0a1fa636a9bf2f6137c4a61b27fa29f690864f6 Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Fri, 2 Feb 2024 23:10:04 -0800 Subject: [PATCH 010/923] logging: make swaglog context match in python and c (#31288) * logging: make swaglog context match in python and c * add git context to athenad --- common/swaglog.cc | 9 +++++++++ selfdrive/athena/manage_athenad.py | 11 +++++++++-- selfdrive/manager/manager.py | 3 +++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/common/swaglog.cc b/common/swaglog.cc index 873836b725..7864a6355a 100644 --- a/common/swaglog.cc +++ b/common/swaglog.cc @@ -41,6 +41,15 @@ public: if (char* dongle_id = getenv("DONGLE_ID")) { ctx_j["dongle_id"] = dongle_id; } + if (char* git_origin = getenv("GIT_ORIGIN")) { + ctx_j["origin"] = git_origin; + } + if (char* git_branch = getenv("GIT_BRANCH")) { + ctx_j["branch"] = git_branch; + } + if (char* git_commit = getenv("GIT_COMMIT")) { + ctx_j["commit"] = git_commit; + } if (char* daemon_name = getenv("MANAGER_DAEMON")) { ctx_j["daemon"] = daemon_name; } diff --git a/selfdrive/athena/manage_athenad.py b/selfdrive/athena/manage_athenad.py index 2a4a12e559..486e426911 100755 --- a/selfdrive/athena/manage_athenad.py +++ b/selfdrive/athena/manage_athenad.py @@ -6,7 +6,8 @@ from multiprocessing import Process from openpilot.common.params import Params from openpilot.selfdrive.manager.process import launcher from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_version, is_dirty +from openpilot.system.hardware import HARDWARE +from openpilot.system.version import get_version, get_normalized_origin, get_short_branch, get_commit, is_dirty ATHENA_MGR_PID_PARAM = "AthenadPid" @@ -14,7 +15,13 @@ ATHENA_MGR_PID_PARAM = "AthenadPid" def main(): params = Params() dongle_id = params.get("DongleId").decode('utf-8') - cloudlog.bind_global(dongle_id=dongle_id, version=get_version(), dirty=is_dirty()) + cloudlog.bind_global(dongle_id=dongle_id, + version=get_version(), + origin=get_normalized_origin(), + branch=get_short_branch(), + commit=get_commit(), + dirty=is_dirty(), + device=HARDWARE.get_device_type()) try: while 1: diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 7733acec93..ddc1200cbc 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -79,6 +79,9 @@ 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 if not is_dirty(): os.environ['CLEAN'] = '1' From 011054030064dc4cf7ff6590681389fdfb66ae19 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 3 Feb 2024 01:43:30 -0600 Subject: [PATCH 011/923] Test car interfaces: init controllers (#31282) * not pytest? * copy what build release does * test controls step with CI and lat/long controllers, car controller.update, etc * clean up * not needed * not here * here * better cmt * fix test_fuzzy * see what's failing * need conftest for OPENPILOT_PREFIX to work! * up * clean up * test * fix * params put is slow * stash * Revert "stash" This reverts commit 22cc9f814c0699f7046970763663205907f2890b. * stash bad * just freaking merge * sort * rm --- selfdrive/car/tests/test_car_interfaces.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index a920bd45da..2306cbf456 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -14,6 +14,10 @@ from openpilot.selfdrive.car.car_helpers import interfaces from openpilot.selfdrive.car.fingerprints import all_known_cars from openpilot.selfdrive.car.fw_versions import FW_VERSIONS from openpilot.selfdrive.car.interfaces import get_interface_attr +from openpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle +from openpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID +from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque +from openpilot.selfdrive.controls.lib.longcontrol import LongControl from openpilot.selfdrive.test.fuzzy_generation import DrawType, FuzzyGenerator ALL_ECUS = list({ecu for ecus in FW_VERSIONS.values() for ecu in ecus.keys()}) @@ -105,6 +109,17 @@ class TestCarInterfaces(unittest.TestCase): car_interface.apply(CC, now_nanos) now_nanos += DT_CTRL * 1e9 # 10ms + # Test controller initialization + # TODO: wait until card refactor is merged to run controller a few times, + # hypothesis also slows down significantly with just one more message draw + LongControl(car_params) + if car_params.steerControlType == car.CarParams.SteerControlType.angle: + LatControlAngle(car_params, car_interface) + elif car_params.lateralTuning.which() == 'pid': + LatControlPID(car_params, car_interface) + elif car_params.lateralTuning.which() == 'torque': + LatControlTorque(car_params, car_interface) + # Test radar interface RadarInterface = importlib.import_module(f'selfdrive.car.{car_params.carName}.radar_interface').RadarInterface radar_interface = RadarInterface(car_params) From 81f52f2e53f24a303e5bccb39af840a2718b2424 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 3 Feb 2024 01:45:28 -0600 Subject: [PATCH 012/923] car_helpers: don't log fingerprints as a dict (#31289) Update car_helpers.py --- selfdrive/car/car_helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 47290c89ee..7e96008149 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -187,7 +187,7 @@ def fingerprint(logcan, sendcan, num_pandas): cloudlog.event("fingerprinted", car_fingerprint=car_fingerprint, source=source, fuzzy=not exact_match, cached=cached, fw_count=len(car_fw), ecu_responses=list(ecu_rx_addrs), vin_rx_addr=vin_rx_addr, vin_rx_bus=vin_rx_bus, - fingerprints=finger, fw_query_time=fw_query_time, error=True) + fingerprints=repr(finger), fw_query_time=fw_query_time, error=True) return car_fingerprint, finger, vin, car_fw, source, exact_match @@ -195,7 +195,7 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas) if candidate is None: - cloudlog.event("car doesn't match any fingerprints", fingerprints=fingerprints, error=True) + cloudlog.event("car doesn't match any fingerprints", fingerprints=repr(fingerprints), error=True) candidate = "mock" CarInterface, CarController, CarState = interfaces[candidate] From a094179b4d2231e3f43b25596ecb20d6b9c4be70 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 4 Feb 2024 14:26:03 -0800 Subject: [PATCH 013/923] add cavli modem config (#31297) * add cavli modem config * fix linter --------- Co-authored-by: Comma Device --- system/hardware/tici/hardware.py | 35 ++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 3431718e22..f606422028 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -457,24 +457,37 @@ class Tici(HardwareBase): def configure_modem(self): sim_id = self.get_sim_info().get('sim_id', '') - # configure modem as data-centric - cmds = [ - 'AT+QNVW=5280,0,"0102000000000000"', - 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', - 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', - ] modem = self.get_modem() + try: + manufacturer = str(modem.Get(MM_MODEM, 'Manufacturer', dbus_interface=DBUS_PROPS, timeout=TIMEOUT)) + except Exception: + manufacturer = None + + cmds = [] + if manufacturer == 'Cavli Inc.': + cmds += [ + # use sim slot + 'AT^SIMSWAP=1', + + # configure ECM mode + 'AT$QCPCFG=usbNet,1' + ] + else: + cmds += [ + # configure modem as data-centric + 'AT+QNVW=5280,0,"0102000000000000"', + 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', + 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', + ] + + # clear out old blue prime initial APN + os.system('mmcli -m any --3gpp-set-initial-eps-bearer-settings="apn="') for cmd in cmds: try: modem.Command(cmd, math.ceil(TIMEOUT), dbus_interface=MM_MODEM, timeout=TIMEOUT) except Exception: pass - # blue prime - blue_prime = sim_id.startswith('8901410') - initial_apn = "Broadband" if blue_prime else "" - os.system(f'mmcli -m any --3gpp-set-initial-eps-bearer-settings="apn={initial_apn}"') - # eSIM prime if sim_id.startswith('8985235'): dest = "/etc/NetworkManager/system-connections/esim.nmconnection" From 3972073fd4f33a6af3f88c6bb010171a38c03ba4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 4 Feb 2024 14:48:06 -0800 Subject: [PATCH 014/923] tools: fix up can_replay --- tools/replay/can_replay.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index 8ed6c63aa4..ef6864f110 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -2,6 +2,7 @@ import argparse import os import time +import usb1 import threading os.environ['FILEREADER_CACHE'] = '1' @@ -42,7 +43,11 @@ def send_thread(s, flock): snd = CAN_MSGS[idx] snd = list(filter(lambda x: x[-1] <= 2, snd)) - s.can_send_many(snd) + try: + s.can_send_many(snd) + except usb1.USBErrorTimeout: + # timeout is fine, just means the CAN TX buffer is full + pass idx = (idx + 1) % len(CAN_MSGS) # Drain panda message buffer @@ -57,20 +62,11 @@ def connect(): flashing_lock = threading.Lock() while True: # look for new devices - for p in [Panda, PandaJungle]: - if p is None: - continue - - for s in p.list(): - if s not in serials: - with p(s) as pp: - if pp.get_type() == Panda.HW_TYPE_TRES: - serials[s] = None - continue - - print("starting send thread for", s) - serials[s] = threading.Thread(target=send_thread, args=(p(s), flashing_lock)) - serials[s].start() + for s in PandaJungle.list(): + if s not in serials: + print("starting send thread for", s) + serials[s] = threading.Thread(target=send_thread, args=(PandaJungle(s), flashing_lock)) + serials[s].start() # try to join all send threads cur_serials = serials.copy() @@ -94,7 +90,7 @@ if __name__ == "__main__": print("Loading log...") if args.route_or_segment_name is None: - args.route_or_segment_name = "77611a1fac303767/2020-03-24--09-50-38/10:16" + args.route_or_segment_name = "77611a1fac303767/2020-03-24--09-50-38/1:3" sr = LogReader(args.route_or_segment_name) From 43f151eea9bf48559f05211fdb7682325d2905f9 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 4 Feb 2024 15:29:43 -0800 Subject: [PATCH 015/923] compressed_vipc supports all frame sizes --- tools/camerastream/compressed_vipc.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tools/camerastream/compressed_vipc.py b/tools/camerastream/compressed_vipc.py index ac7ca2520b..6e4ad3866e 100755 --- a/tools/camerastream/compressed_vipc.py +++ b/tools/camerastream/compressed_vipc.py @@ -10,7 +10,6 @@ import time import cereal.messaging as messaging from cereal.visionipc import VisionIpcServer, VisionStreamType -W, H = 1928, 1208 V4L2_BUF_FLAG_KEYFRAME = 8 ENCODE_SOCKETS = { @@ -19,10 +18,11 @@ ENCODE_SOCKETS = { VisionStreamType.VISION_STREAM_DRIVER: "driverEncodeData", } -def decoder(addr, vipc_server, vst, nvidia, debug=False): +def decoder(addr, vipc_server, vst, nvidia, W, H, debug=False): sock_name = ENCODE_SOCKETS[vst] if debug: print("start decoder for %s" % sock_name) + if nvidia: os.environ["NV_LOW_LATENCY"] = "3" # both bLowLatency and CUVID_PKT_ENDOFPICTURE sys.path += os.environ["LD_LIBRARY_PATH"].split(":") @@ -99,16 +99,28 @@ def decoder(addr, vipc_server, vst, nvidia, debug=False): % (len(msgs), evta.idx.encodeId, evt.logMonoTime/1e9, evta.idx.timestampEof/1e6, frame_latency, process_latency, network_latency, pc_latency, process_latency+network_latency+pc_latency ), len(evta.data), sock_name) + class CompressedVipc: def __init__(self, addr, vision_streams, nvidia=False, debug=False): + print("getting frame sizes") + os.environ["ZMQ"] = "1" + messaging.context = messaging.Context() + sm = messaging.SubMaster([ENCODE_SOCKETS[s] for s in vision_streams], addr=addr) + while min(sm.rcv_frame.values()) == 0: + sm.update(100) + os.environ.pop("ZMQ") + messaging.context = messaging.Context() + self.vipc_server = VisionIpcServer("camerad") for vst in vision_streams: - self.vipc_server.create_buffers(vst, 4, False, W, H) + ed = sm[ENCODE_SOCKETS[vst]] + self.vipc_server.create_buffers(vst, 4, False, ed.width, ed.height) self.vipc_server.start_listener() self.procs = [] for vst in vision_streams: - p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, debug)) + ed = sm[ENCODE_SOCKETS[vst]] + p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, debug, ed.width, ed.height)) p.start() self.procs.append(p) From 7694712cd6823a99c3f1c03270bb7167e4c1bdf9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 5 Feb 2024 01:35:39 -0800 Subject: [PATCH 016/923] Revert "Ford: don't fingerprint on engine (#31195)" This reverts commit 1d1c9936cf5711c5414b2da2ee823f7233e7882e. --- selfdrive/car/ford/fingerprints.py | 54 +++++++++++++++++++++- selfdrive/car/ford/tests/test_ford.py | 2 +- selfdrive/car/ford/values.py | 8 +++- selfdrive/car/tests/test_fw_fingerprint.py | 6 +-- 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 0085b6b9c6..0cd812bc6b 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -19,6 +19,12 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'M1PT-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'M1PA-14C204-GF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'M1PA-14C204-RE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'N1PA-14C204-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'N1PA-14C204-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.ESCAPE_MK4: { (Ecu.eps, 0x730, None): [ @@ -41,6 +47,17 @@ FW_VERSIONS = { b'LJ6T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LV4T-14F397-GG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'LX6A-14C204-BJV\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6A-14C204-BJX\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6A-14C204-CNG\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6A-14C204-DPK\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6A-14C204-ESG\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MX6A-14C204-BEF\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MX6A-14C204-BEJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MX6A-14C204-CAB\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NX6A-14C204-BLE\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.EXPLORER_MK6: { (Ecu.eps, 0x730, None): [ @@ -66,9 +83,21 @@ FW_VERSIONS = { b'LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LB5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LB5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LC5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LC5T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'LB5A-14C204-ATJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5A-14C204-ATS\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5A-14C204-AUJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5A-14C204-AZL\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5A-14C204-BUJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LB5A-14C204-EAC\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MB5A-14C204-MD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MB5A-14C204-RC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NB5A-14C204-AZD\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NB5A-14C204-HB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PB5A-14C204-DA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.F_150_MK14: { (Ecu.eps, 0x730, None): [ @@ -83,6 +112,9 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'PL3A-14C204-BRB\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.F_150_LIGHTNING_MK1: { (Ecu.abs, 0x760, None): [ @@ -94,6 +126,9 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x764, None): [ b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'NL3A-14C204-BAR\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.MUSTANG_MACH_E_MK1: { (Ecu.eps, 0x730, None): [ @@ -109,6 +144,11 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'MJ98-14C204-BBP\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'MJ98-14C204-BBS\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NJ98-14C204-VH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.FOCUS_MK4: { (Ecu.eps, 0x730, None): [ @@ -123,6 +163,9 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'JX6A-14C204-BPL\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, CAR.MAVERICK_MK1: { (Ecu.eps, 0x730, None): [ @@ -139,5 +182,14 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'NZ6A-14C204-AAA\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6A-14C204-PA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6A-14C204-ZA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'NZ6A-14C204-ZC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6A-14C204-BE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6A-14C204-JC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'PZ6A-14C204-JE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + ], }, } diff --git a/selfdrive/car/ford/tests/test_ford.py b/selfdrive/car/ford/tests/test_ford.py index dff29629f6..a1f0b81a58 100755 --- a/selfdrive/car/ford/tests/test_ford.py +++ b/selfdrive/car/ford/tests/test_ford.py @@ -52,7 +52,7 @@ class TestFordFW(unittest.TestCase): @parameterized.expand(FW_VERSIONS.items()) def test_fw_versions(self, car_model: str, fw_versions: Dict[Tuple[capnp.lib.capnp._EnumModule, int, Optional[int]], Iterable[bytes]]): for (ecu, addr, subaddr), fws in fw_versions.items(): - self.assertIn(ecu, ECU_FW_CORE, "Unexpected ECU") + self.assertIn(ecu, ECU_ADDRESSES, "Unknown ECU") self.assertEqual(addr, ECU_ADDRESSES[ecu], "ECU address mismatch") self.assertIsNone(subaddr, "Unexpected ECU subaddress") diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index a18e6f461e..2c4415be2b 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -111,15 +111,21 @@ FW_QUERY_CONFIG = FwQueryConfig( requests=[ # CAN and CAN FD queries are combined. # FIXME: For CAN FD, ECUs respond with frames larger than 8 bytes on the powertrain bus + # TODO: properly handle auxiliary requests to separate queries and add back whitelists Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + # whitelist_ecus=[Ecu.engine], + ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + # whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.shiftByWire], bus=0, auxiliary=True, ), ], extra_ecus=[ - (Ecu.engine, 0x7e0, None), (Ecu.shiftByWire, 0x732, None), ], ) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 064f2e5651..9f6a847568 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -254,13 +254,13 @@ class TestFwFingerprintTiming(unittest.TestCase): @pytest.mark.timeout(60) def test_fw_query_timing(self): - total_ref_time = 6.8 + total_ref_time = 7.0 brand_ref_times = { 1: { 'gm': 0.5, 'body': 0.1, 'chrysler': 0.3, - 'ford': 0.1, + 'ford': 0.2, 'honda': 0.55, 'hyundai': 0.65, 'mazda': 0.1, @@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'volkswagen': 0.2, }, 2: { - 'ford': 0.2, + 'ford': 0.3, 'hyundai': 1.05, } } From f0b591e345f6523c6c0534a90df192e5d10a7eb4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 5 Feb 2024 10:06:18 -0800 Subject: [PATCH 017/923] [bot] Update Python packages and pre-commit hooks (#31300) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 4 +- poetry.lock | 676 +++++++++++++++++++++------------------- 2 files changed, 350 insertions(+), 330 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa05b5b8a2..a336bd3378 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: - --explicit-package-bases exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(xx/)' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.14 + rev: v0.2.0 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' @@ -90,6 +90,6 @@ repos: args: - --lock - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.27.3 + rev: 0.27.4 hooks: - id: check-github-workflows diff --git a/poetry.lock b/poetry.lock index 4cd6f5062e..5b0c6c20b2 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.2" +version = "3.9.3" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:772fbe371788e61c58d6d3d904268e48a594ba866804d08c995ad71b144f94cb"}, - {file = "aiohttp-3.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:edd4f1af2253f227ae311ab3d403d0c506c9b4410c7fc8d9573dec6d9740369f"}, - {file = "aiohttp-3.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cfee9287778399fdef6f8a11c9e425e1cb13cc9920fd3a3df8f122500978292b"}, - {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc158466f6a980a6095ee55174d1de5730ad7dec251be655d9a6a9dd7ea1ff9"}, - {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54ec82f45d57c9a65a1ead3953b51c704f9587440e6682f689da97f3e8defa35"}, - {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abeb813a18eb387f0d835ef51f88568540ad0325807a77a6e501fed4610f864e"}, - {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc91d07280d7d169f3a0f9179d8babd0ee05c79d4d891447629ff0d7d8089ec2"}, - {file = "aiohttp-3.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b65e861f4bebfb660f7f0f40fa3eb9f2ab9af10647d05dac824390e7af8f75b7"}, - {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04fd8ffd2be73d42bcf55fd78cde7958eeee6d4d8f73c3846b7cba491ecdb570"}, - {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3d8d962b439a859b3ded9a1e111a4615357b01620a546bc601f25b0211f2da81"}, - {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ceb658afd12b27552597cf9a65d9807d58aef45adbb58616cdd5ad4c258c39e"}, - {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0e4ee4df741670560b1bc393672035418bf9063718fee05e1796bf867e995fad"}, - {file = "aiohttp-3.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2dec87a556f300d3211decf018bfd263424f0690fcca00de94a837949fbcea02"}, - {file = "aiohttp-3.9.2-cp310-cp310-win32.whl", hash = "sha256:3e1a800f988ce7c4917f34096f81585a73dbf65b5c39618b37926b1238cf9bc4"}, - {file = "aiohttp-3.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:ea510718a41b95c236c992b89fdfc3d04cc7ca60281f93aaada497c2b4e05c46"}, - {file = "aiohttp-3.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6aaa6f99256dd1b5756a50891a20f0d252bd7bdb0854c5d440edab4495c9f973"}, - {file = "aiohttp-3.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a27d8c70ad87bcfce2e97488652075a9bdd5b70093f50b10ae051dfe5e6baf37"}, - {file = "aiohttp-3.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:54287bcb74d21715ac8382e9de146d9442b5f133d9babb7e5d9e453faadd005e"}, - {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb3d05569aa83011fcb346b5266e00b04180105fcacc63743fc2e4a1862a891"}, - {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c8534e7d69bb8e8d134fe2be9890d1b863518582f30c9874ed7ed12e48abe3c4"}, - {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4bd9d5b989d57b41e4ff56ab250c5ddf259f32db17159cce630fd543376bd96b"}, - {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa6904088e6642609981f919ba775838ebf7df7fe64998b1a954fb411ffb4663"}, - {file = "aiohttp-3.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bda42eb410be91b349fb4ee3a23a30ee301c391e503996a638d05659d76ea4c2"}, - {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:193cc1ccd69d819562cc7f345c815a6fc51d223b2ef22f23c1a0f67a88de9a72"}, - {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b9f1cb839b621f84a5b006848e336cf1496688059d2408e617af33e3470ba204"}, - {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:d22a0931848b8c7a023c695fa2057c6aaac19085f257d48baa24455e67df97ec"}, - {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4112d8ba61fbd0abd5d43a9cb312214565b446d926e282a6d7da3f5a5aa71d36"}, - {file = "aiohttp-3.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c4ad4241b52bb2eb7a4d2bde060d31c2b255b8c6597dd8deac2f039168d14fd7"}, - {file = "aiohttp-3.9.2-cp311-cp311-win32.whl", hash = "sha256:ee2661a3f5b529f4fc8a8ffee9f736ae054adfb353a0d2f78218be90617194b3"}, - {file = "aiohttp-3.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:4deae2c165a5db1ed97df2868ef31ca3cc999988812e82386d22937d9d6fed52"}, - {file = "aiohttp-3.9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6f4cdba12539215aaecf3c310ce9d067b0081a0795dd8a8805fdb67a65c0572a"}, - {file = "aiohttp-3.9.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:84e843b33d5460a5c501c05539809ff3aee07436296ff9fbc4d327e32aa3a326"}, - {file = "aiohttp-3.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8008d0f451d66140a5aa1c17e3eedc9d56e14207568cd42072c9d6b92bf19b52"}, - {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61c47ab8ef629793c086378b1df93d18438612d3ed60dca76c3422f4fbafa792"}, - {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc71f748e12284312f140eaa6599a520389273174b42c345d13c7e07792f4f57"}, - {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a1c3a4d0ab2f75f22ec80bca62385db2e8810ee12efa8c9e92efea45c1849133"}, - {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a87aa0b13bbee025faa59fa58861303c2b064b9855d4c0e45ec70182bbeba1b"}, - {file = "aiohttp-3.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2cc0d04688b9f4a7854c56c18aa7af9e5b0a87a28f934e2e596ba7e14783192"}, - {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1956e3ac376b1711c1533266dec4efd485f821d84c13ce1217d53e42c9e65f08"}, - {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:114da29f39eccd71b93a0fcacff178749a5c3559009b4a4498c2c173a6d74dff"}, - {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:3f17999ae3927d8a9a823a1283b201344a0627272f92d4f3e3a4efe276972fe8"}, - {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:f31df6a32217a34ae2f813b152a6f348154f948c83213b690e59d9e84020925c"}, - {file = "aiohttp-3.9.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7a75307ffe31329928a8d47eae0692192327c599113d41b278d4c12b54e1bd11"}, - {file = "aiohttp-3.9.2-cp312-cp312-win32.whl", hash = "sha256:972b63d589ff8f305463593050a31b5ce91638918da38139b9d8deaba9e0fed7"}, - {file = "aiohttp-3.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:200dc0246f0cb5405c80d18ac905c8350179c063ea1587580e3335bfc243ba6a"}, - {file = "aiohttp-3.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:158564d0d1020e0d3fe919a81d97aadad35171e13e7b425b244ad4337fc6793a"}, - {file = "aiohttp-3.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da1346cd0ccb395f0ed16b113ebb626fa43b7b07fd7344fce33e7a4f04a8897a"}, - {file = "aiohttp-3.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eaa9256de26ea0334ffa25f1913ae15a51e35c529a1ed9af8e6286dd44312554"}, - {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1543e7fb00214fb4ccead42e6a7d86f3bb7c34751ec7c605cca7388e525fd0b4"}, - {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:186e94570433a004e05f31f632726ae0f2c9dee4762a9ce915769ce9c0a23d89"}, - {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d52d20832ac1560f4510d68e7ba8befbc801a2b77df12bd0cd2bcf3b049e52a4"}, - {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1c45e4e815ac6af3b72ca2bde9b608d2571737bb1e2d42299fc1ffdf60f6f9a1"}, - {file = "aiohttp-3.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa906b9bdfd4a7972dd0628dbbd6413d2062df5b431194486a78f0d2ae87bd55"}, - {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:68bbee9e17d66f17bb0010aa15a22c6eb28583edcc8b3212e2b8e3f77f3ebe2a"}, - {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4c189b64bd6d9a403a1a3f86a3ab3acbc3dc41a68f73a268a4f683f89a4dec1f"}, - {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8a7876f794523123bca6d44bfecd89c9fec9ec897a25f3dd202ee7fc5c6525b7"}, - {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:d23fba734e3dd7b1d679b9473129cd52e4ec0e65a4512b488981a56420e708db"}, - {file = "aiohttp-3.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b141753be581fab842a25cb319f79536d19c2a51995d7d8b29ee290169868eab"}, - {file = "aiohttp-3.9.2-cp38-cp38-win32.whl", hash = "sha256:103daf41ff3b53ba6fa09ad410793e2e76c9d0269151812e5aba4b9dd674a7e8"}, - {file = "aiohttp-3.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:328918a6c2835861ff7afa8c6d2c70c35fdaf996205d5932351bdd952f33fa2f"}, - {file = "aiohttp-3.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5264d7327c9464786f74e4ec9342afbbb6ee70dfbb2ec9e3dfce7a54c8043aa3"}, - {file = "aiohttp-3.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07205ae0015e05c78b3288c1517afa000823a678a41594b3fdc870878d645305"}, - {file = "aiohttp-3.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae0a1e638cffc3ec4d4784b8b4fd1cf28968febc4bd2718ffa25b99b96a741bd"}, - {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d43302a30ba1166325974858e6ef31727a23bdd12db40e725bec0f759abce505"}, - {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16a967685907003765855999af11a79b24e70b34dc710f77a38d21cd9fc4f5fe"}, - {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6fa3ee92cd441d5c2d07ca88d7a9cef50f7ec975f0117cd0c62018022a184308"}, - {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b500c5ad9c07639d48615a770f49618130e61be36608fc9bc2d9bae31732b8f"}, - {file = "aiohttp-3.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c07327b368745b1ce2393ae9e1aafed7073d9199e1dcba14e035cc646c7941bf"}, - {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cc7d6502c23a0ec109687bf31909b3fb7b196faf198f8cff68c81b49eb316ea9"}, - {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:07be2be7071723c3509ab5c08108d3a74f2181d4964e869f2504aaab68f8d3e8"}, - {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:122468f6fee5fcbe67cb07014a08c195b3d4c41ff71e7b5160a7bcc41d585a5f"}, - {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:00a9abcea793c81e7f8778ca195a1714a64f6d7436c4c0bb168ad2a212627000"}, - {file = "aiohttp-3.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7a9825fdd64ecac5c670234d80bb52bdcaa4139d1f839165f548208b3779c6c6"}, - {file = "aiohttp-3.9.2-cp39-cp39-win32.whl", hash = "sha256:5422cd9a4a00f24c7244e1b15aa9b87935c85fb6a00c8ac9b2527b38627a9211"}, - {file = "aiohttp-3.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:7d579dcd5d82a86a46f725458418458fa43686f6a7b252f2966d359033ffc8ab"}, - {file = "aiohttp-3.9.2.tar.gz", hash = "sha256:b0ad0a5e86ce73f5368a164c10ada10504bf91869c05ab75d982c6048217fbf7"}, + {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"}, ] [package.dependencies] @@ -255,13 +255,13 @@ files = [ [[package]] name = "azure-core" -version = "1.29.7" +version = "1.30.0" description = "Microsoft Azure Core Library for Python" optional = false python-versions = ">=3.7" files = [ - {file = "azure-core-1.29.7.tar.gz", hash = "sha256:2944faf1a7ff1558b1f457cabf60f279869cabaeef86b353bed8eb032c7d8c5e"}, - {file = "azure_core-1.29.7-py3-none-any.whl", hash = "sha256:95a7b41b4af102e5fcdfac9500fcc82ff86e936c7145a099b7848b9ac0501250"}, + {file = "azure-core-1.30.0.tar.gz", hash = "sha256:6f3a7883ef184722f6bd997262eddaf80cfe7e5b3e0caaaf8db1695695893d35"}, + {file = "azure_core-1.30.0-py3-none-any.whl", hash = "sha256:3dae7962aad109610e68c9a7abb31d79720e1d982ddf61363038d175a5025e89"}, ] [package.dependencies] @@ -395,13 +395,13 @@ numpy = "*" [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -825,43 +825,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.1" +version = "42.0.2" 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.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:265bdc693570b895eb641410b8fc9e8ddbce723a669236162b9d9cfb70bd8d77"}, - {file = "cryptography-42.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:160fa08dfa6dca9cb8ad9bd84e080c0db6414ba5ad9a7470bc60fb154f60111e"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:727387886c9c8de927c360a396c5edcb9340d9e960cda145fca75bdafdabd24c"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d84673c012aa698555d4710dcfe5f8a0ad76ea9dde8ef803128cc669640a2e0"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e6edc3a568667daf7d349d7e820783426ee4f1c0feab86c29bd1d6fe2755e009"}, - {file = "cryptography-42.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:d50718dd574a49d3ef3f7ef7ece66ef281b527951eb2267ce570425459f6a404"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:9544492e8024f29919eac2117edd8c950165e74eb551a22c53f6fdf6ba5f4cb8"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ab6b302d51fbb1dd339abc6f139a480de14d49d50f65fdc7dff782aa8631d035"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2fe16624637d6e3e765530bc55caa786ff2cbca67371d306e5d0a72e7c3d0407"}, - {file = "cryptography-42.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ed1b2130f5456a09a134cc505a17fc2830a1a48ed53efd37dcc904a23d7b82fa"}, - {file = "cryptography-42.0.1-cp37-abi3-win32.whl", hash = "sha256:e5edf189431b4d51f5c6fb4a95084a75cef6b4646c934eb6e32304fc720e1453"}, - {file = "cryptography-42.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:6bfd823b336fdcd8e06285ae8883d3d2624d3bdef312a0e2ef905f332f8e9302"}, - {file = "cryptography-42.0.1-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:351db02c1938c8e6b1fee8a78d6b15c5ccceca7a36b5ce48390479143da3b411"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:430100abed6d3652208ae1dd410c8396213baee2e01a003a4449357db7dc9e14"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dff7a32880a51321f5de7869ac9dde6b1fca00fc1fef89d60e93f215468e824"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b512f33c6ab195852595187af5440d01bb5f8dd57cb7a91e1e009a17f1b7ebca"}, - {file = "cryptography-42.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:95d900d19a370ae36087cc728e6e7be9c964ffd8cbcb517fd1efb9c9284a6abc"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:6ac8924085ed8287545cba89dc472fc224c10cc634cdf2c3e2866fe868108e77"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cb2861a9364fa27d24832c718150fdbf9ce6781d7dc246a516435f57cfa31fe7"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25ec6e9e81de5d39f111a4114193dbd39167cc4bbd31c30471cebedc2a92c323"}, - {file = "cryptography-42.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9d61fcdf37647765086030d81872488e4cb3fafe1d2dda1d487875c3709c0a49"}, - {file = "cryptography-42.0.1-cp39-abi3-win32.whl", hash = "sha256:16b9260d04a0bfc8952b00335ff54f471309d3eb9d7e8dbfe9b0bd9e26e67881"}, - {file = "cryptography-42.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:7911586fc69d06cd0ab3f874a169433db1bc2f0e40988661408ac06c4527a986"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d3594947d2507d4ef7a180a7f49a6db41f75fb874c2fd0e94f36b89bfd678bf2"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:8d7efb6bf427d2add2f40b6e1e8e476c17508fa8907234775214b153e69c2e11"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:126e0ba3cc754b200a2fb88f67d66de0d9b9e94070c5bc548318c8dab6383cb6"}, - {file = "cryptography-42.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:802d6f83233cf9696b59b09eb067e6b4d5ae40942feeb8e13b213c8fad47f1aa"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0b7cacc142260ada944de070ce810c3e2a438963ee3deb45aa26fd2cee94c9a4"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:32ea63ceeae870f1a62e87f9727359174089f7b4b01e4999750827bf10e15d60"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d3902c779a92151f134f68e555dd0b17c658e13429f270d8a847399b99235a3f"}, - {file = "cryptography-42.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50aecd93676bcca78379604ed664c45da82bc1241ffb6f97f6b7392ed5bc6f04"}, - {file = "cryptography-42.0.1.tar.gz", hash = "sha256:fd33f53809bb363cf126bebe7a99d97735988d9b0131a2be59fbf83e1259a5b7"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be"}, + {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529"}, + {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9"}, + {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2"}, + {file = "cryptography-42.0.2-cp37-abi3-win32.whl", hash = "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee"}, + {file = "cryptography-42.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee"}, + {file = "cryptography-42.0.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90"}, + {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea"}, + {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33"}, + {file = "cryptography-42.0.2-cp39-abi3-win32.whl", hash = "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635"}, + {file = "cryptography-42.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2"}, + {file = "cryptography-42.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a"}, + {file = "cryptography-42.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65"}, + {file = "cryptography-42.0.2.tar.gz", hash = "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888"}, ] [package.dependencies] @@ -1340,13 +1340,13 @@ rewrite = ["tokenize-rt (>=3)"] [[package]] name = "geopandas" -version = "0.14.2" +version = "0.14.3" description = "Geographic pandas extensions" optional = false python-versions = ">=3.9" files = [ - {file = "geopandas-0.14.2-py3-none-any.whl", hash = "sha256:0efa61235a68862c1c6be89fc3707cdeba67667d5676bb19e24f3c57a8c2f723"}, - {file = "geopandas-0.14.2.tar.gz", hash = "sha256:6e71d57b8376f9fdc9f1c3aa3170e7e420e91778de854f51013ae66fd371ccdb"}, + {file = "geopandas-0.14.3-py3-none-any.whl", hash = "sha256:41b31ad39e21bc9e8c4254f78f8dc4ce3d33d144e22e630a00bb336c83160204"}, + {file = "geopandas-0.14.3.tar.gz", hash = "sha256:748af035d4a068a4ae00cab384acb61d387685c833b0022e0729aa45216b23ac"}, ] [package.dependencies] @@ -2047,71 +2047,71 @@ testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" -version = "2.1.4" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0b838c37ba596fcbfca71651a104a611543077156cb0a26fe0c475e1f152ee8"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac1ebf6983148b45b5fa48593950f90ed6d1d26300604f321c74a9ca1609f8e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0fbad3d346df8f9d72622ac71b69565e621ada2ce6572f37c2eae8dacd60385d"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5291d98cd3ad9a562883468c690a2a238c4a6388ab3bd155b0c75dd55ece858"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a7cc49ef48a3c7a0005a949f3c04f8baa5409d3f663a1b36f0eba9bfe2a0396e"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83041cda633871572f0d3c41dddd5582ad7d22f65a72eacd8d3d6d00291df26"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win32.whl", hash = "sha256:0c26f67b3fe27302d3a412b85ef696792c4a2386293c53ba683a89562f9399b0"}, - {file = "MarkupSafe-2.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:a76055d5cb1c23485d7ddae533229039b850db711c554a12ea64a0fd8a0129e2"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9e9e3c4020aa2dc62d5dd6743a69e399ce3de58320522948af6140ac959ab863"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0042d6a9880b38e1dd9ff83146cc3c9c18a059b9360ceae207805567aacccc69"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d03fea4c4e9fd0ad75dc2e7e2b6757b80c152c032ea1d1de487461d8140efc"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ab3a886a237f6e9c9f4f7d272067e712cdb4efa774bef494dccad08f39d8ae6"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abf5ebbec056817057bfafc0445916bb688a255a5146f900445d081db08cbabb"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e1a0d1924a5013d4f294087e00024ad25668234569289650929ab871231668e7"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e7902211afd0af05fbadcc9a312e4cf10f27b779cf1323e78d52377ae4b72bea"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c669391319973e49a7c6230c218a1e3044710bc1ce4c8e6eb71f7e6d43a2c131"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win32.whl", hash = "sha256:31f57d64c336b8ccb1966d156932f3daa4fee74176b0fdc48ef580be774aae74"}, - {file = "MarkupSafe-2.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:54a7e1380dfece8847c71bf7e33da5d084e9b889c75eca19100ef98027bd9f56"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a76cd37d229fc385738bd1ce4cba2a121cf26b53864c1772694ad0ad348e509e"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:987d13fe1d23e12a66ca2073b8d2e2a75cec2ecb8eab43ff5624ba0ad42764bc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5244324676254697fe5c181fc762284e2c5fceeb1c4e3e7f6aca2b6f107e60dc"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78bc995e004681246e85e28e068111a4c3f35f34e6c62da1471e844ee1446250"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4d176cfdfde84f732c4a53109b293d05883e952bbba68b857ae446fa3119b4f"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f9917691f410a2e0897d1ef99619fd3f7dd503647c8ff2475bf90c3cf222ad74"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f06e5a9e99b7df44640767842f414ed5d7bedaaa78cd817ce04bbd6fd86e2dd6"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:396549cea79e8ca4ba65525470d534e8a41070e6b3500ce2414921099cb73e8d"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win32.whl", hash = "sha256:f6be2d708a9d0e9b0054856f07ac7070fbe1754be40ca8525d5adccdbda8f475"}, - {file = "MarkupSafe-2.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:5045e892cfdaecc5b4c01822f353cf2c8feb88a6ec1c0adef2a2e705eef0f656"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7a07f40ef8f0fbc5ef1000d0c78771f4d5ca03b4953fc162749772916b298fc4"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d18b66fe626ac412d96c2ab536306c736c66cf2a31c243a45025156cc190dc8a"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:698e84142f3f884114ea8cf83e7a67ca8f4ace8454e78fe960646c6c91c63bfa"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a3b78a5af63ec10d8604180380c13dcd870aba7928c1fe04e881d5c792dc4e"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:15866d7f2dc60cfdde12ebb4e75e41be862348b4728300c36cdf405e258415ec"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6aa5e2e7fc9bc042ae82d8b79d795b9a62bd8f15ba1e7594e3db243f158b5565"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:54635102ba3cf5da26eb6f96c4b8c53af8a9c0d97b64bdcb592596a6255d8518"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win32.whl", hash = "sha256:3583a3a3ab7958e354dc1d25be74aee6228938312ee875a22330c4dc2e41beb0"}, - {file = "MarkupSafe-2.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:d6e427c7378c7f1b2bef6a344c925b8b63623d3321c09a237b7cc0e77dd98ceb"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:bf1196dcc239e608605b716e7b166eb5faf4bc192f8a44b81e85251e62584bd2"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df98d4a9cd6a88d6a585852f56f2155c9cdb6aec78361a19f938810aa020954"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b835aba863195269ea358cecc21b400276747cc977492319fd7682b8cd2c253d"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23984d1bdae01bee794267424af55eef4dfc038dc5d1272860669b2aa025c9e3"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c98c33ffe20e9a489145d97070a435ea0679fddaabcafe19982fe9c971987d5"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9896fca4a8eb246defc8b2a7ac77ef7553b638e04fbf170bff78a40fa8a91474"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b0fe73bac2fed83839dbdbe6da84ae2a31c11cfc1c777a40dbd8ac8a6ed1560f"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c7556bafeaa0a50e2fe7dc86e0382dea349ebcad8f010d5a7dc6ba568eaaa789"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win32.whl", hash = "sha256:fc1a75aa8f11b87910ffd98de62b29d6520b6d6e8a3de69a70ca34dea85d2a8a"}, - {file = "MarkupSafe-2.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:3a66c36a3864df95e4f62f9167c734b3b1192cb0851b43d7cc08040c074c6279"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:765f036a3d00395a326df2835d8f86b637dbaf9832f90f5d196c3b8a7a5080cb"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:21e7af8091007bf4bebf4521184f4880a6acab8df0df52ef9e513d8e5db23411"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5c31fe855c77cad679b302aabc42d724ed87c043b1432d457f4976add1c2c3e"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7653fa39578957bc42e5ebc15cf4361d9e0ee4b702d7d5ec96cdac860953c5b4"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47bb5f0142b8b64ed1399b6b60f700a580335c8e1c57f2f15587bd072012decc"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:fe8512ed897d5daf089e5bd010c3dc03bb1bdae00b35588c49b98268d4a01e00"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:36d7626a8cca4d34216875aee5a1d3d654bb3dac201c1c003d182283e3205949"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b6f14a9cd50c3cb100eb94b3273131c80d102e19bb20253ac7bd7336118a673a"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win32.whl", hash = "sha256:c8f253a84dbd2c63c19590fa86a032ef3d8cc18923b8049d91bcdeeb2581fbf6"}, - {file = "MarkupSafe-2.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:8b570a1537367b52396e53325769608f2a687ec9a4363647af1cded8928af959"}, - {file = "MarkupSafe-2.1.4.tar.gz", hash = "sha256:3aae9af4cac263007fd6309c64c6ab4506dd2b79382d9d19a1994f9240b8db4f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -2319,85 +2319,101 @@ portalocker = [ [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -2592,35 +2608,36 @@ reference = ["Pillow", "google-re2"] [[package]] name = "onnxruntime" -version = "1.16.3" +version = "1.17.0" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.16.3-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:3bc41f323ac77acfed190be8ffdc47a6a75e4beeb3473fbf55eeb075ccca8df2"}, - {file = "onnxruntime-1.16.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:212741b519ee61a4822c79c47147d63a8b0ffde25cd33988d3d7be9fbd51005d"}, - {file = "onnxruntime-1.16.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f91f5497fe3df4ceee2f9e66c6148d9bfeb320cd6a71df361c66c5b8bac985a"}, - {file = "onnxruntime-1.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef2b1fc269cabd27f129fb9058917d6fdc89b188c49ed8700f300b945c81f889"}, - {file = "onnxruntime-1.16.3-cp310-cp310-win32.whl", hash = "sha256:f36b56a593b49a3c430be008c2aea6658d91a3030115729609ec1d5ffbaab1b6"}, - {file = "onnxruntime-1.16.3-cp310-cp310-win_amd64.whl", hash = "sha256:3c467eaa3d2429c026b10c3d17b78b7f311f718ef9d2a0d6938e5c3c2611b0cf"}, - {file = "onnxruntime-1.16.3-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:a225bb683991001d111f75323d355b3590e75e16b5e0f07a0401e741a0143ea1"}, - {file = "onnxruntime-1.16.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9aded21fe3d898edd86be8aa2eb995aa375e800ad3dfe4be9f618a20b8ee3630"}, - {file = "onnxruntime-1.16.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00cccc37a5195c8fca5011b9690b349db435986bd508eb44c9fce432da9228a4"}, - {file = "onnxruntime-1.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e253e572021563226a86f1c024f8f70cdae28f2fb1cc8c3a9221e8b1ce37db5"}, - {file = "onnxruntime-1.16.3-cp311-cp311-win32.whl", hash = "sha256:a82a8f0b4c978d08f9f5c7a6019ae51151bced9fd91e5aaa0c20a9e4ac7a60b6"}, - {file = "onnxruntime-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:78d81d9af457a1dc90db9a7da0d09f3ccb1288ea1236c6ab19f0ca61f3eee2d3"}, - {file = "onnxruntime-1.16.3-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:04ebcd29c20473596a1412e471524b2fb88d55e6301c40b98dd2407b5911595f"}, - {file = "onnxruntime-1.16.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9996bab0f202a6435ab867bc55598f15210d0b72794d5de83712b53d564084ae"}, - {file = "onnxruntime-1.16.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b8f5083f903408238883821dd8c775f8120cb4a604166dbdabe97f4715256d5"}, - {file = "onnxruntime-1.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c2dcf1b70f8434abb1116fe0975c00e740722aaf321997195ea3618cc00558e"}, - {file = "onnxruntime-1.16.3-cp38-cp38-win32.whl", hash = "sha256:d4a0151e1accd04da6711f6fd89024509602f82c65a754498e960b032359b02d"}, - {file = "onnxruntime-1.16.3-cp38-cp38-win_amd64.whl", hash = "sha256:e8aa5bba78afbd4d8a2654b14ec7462ff3ce4a6aad312a3c2d2c2b65009f2541"}, - {file = "onnxruntime-1.16.3-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:6829dc2a79d48c911fedaf4c0f01e03c86297d32718a3fdee7a282766dfd282a"}, - {file = "onnxruntime-1.16.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:76f876c53bfa912c6c242fc38213a6f13f47612d4360bc9d599bd23753e53161"}, - {file = "onnxruntime-1.16.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4137e5d443e2dccebe5e156a47f1d6d66f8077b03587c35f11ee0c7eda98b533"}, - {file = "onnxruntime-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56695c1a343c7c008b647fff3df44da63741fbe7b6003ef576758640719be7b"}, - {file = "onnxruntime-1.16.3-cp39-cp39-win32.whl", hash = "sha256:985a029798744ce4743fcf8442240fed35c8e4d4d30ec7d0c2cdf1388cd44408"}, - {file = "onnxruntime-1.16.3-cp39-cp39-win_amd64.whl", hash = "sha256:28ff758b17ce3ca6bcad3d936ec53bd7f5482e7630a13f6dcae518eba8f71d85"}, + {file = "onnxruntime-1.17.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d2b22a25a94109cc983443116da8d9805ced0256eb215c5e6bc6dcbabefeab96"}, + {file = "onnxruntime-1.17.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4c87d83c6f58d1af2675fc99e3dc810f2dbdb844bcefd0c1b7573632661f6fc"}, + {file = "onnxruntime-1.17.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dba55723bf9b835e358f48c98a814b41692c393eb11f51e02ece0625c756b797"}, + {file = "onnxruntime-1.17.0-cp310-cp310-win32.whl", hash = "sha256:ee48422349cc500273beea7607e33c2237909f58468ae1d6cccfc4aecd158565"}, + {file = "onnxruntime-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f34cc46553359293854e38bdae2ab1be59543aad78a6317e7746d30e311110c3"}, + {file = "onnxruntime-1.17.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:16d26badd092c8c257fa57c458bb600d96dc15282c647ccad0ed7b2732e6c03b"}, + {file = "onnxruntime-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6f1273bebcdb47ed932d076c85eb9488bc4768fcea16d5f2747ca692fad4f9d3"}, + {file = "onnxruntime-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cb60fd3c2c1acd684752eb9680e89ae223e9801a9b0e0dc7b28adabe45a2e380"}, + {file = "onnxruntime-1.17.0-cp311-cp311-win32.whl", hash = "sha256:4b038324586bc905299e435f7c00007e6242389c856b82fe9357fdc3b1ef2bdc"}, + {file = "onnxruntime-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:93d39b3fa1ee01f034f098e1c7769a811a21365b4883f05f96c14a2b60c6028b"}, + {file = "onnxruntime-1.17.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:90c0890e36f880281c6c698d9bc3de2afbeee2f76512725ec043665c25c67d21"}, + {file = "onnxruntime-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7466724e809a40e986b1637cba156ad9fc0d1952468bc00f79ef340bc0199552"}, + {file = "onnxruntime-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d47bee7557a8b99c8681b6882657a515a4199778d6d5e24e924d2aafcef55b0a"}, + {file = "onnxruntime-1.17.0-cp312-cp312-win32.whl", hash = "sha256:bb1bf1ee575c665b8bbc3813ab906e091a645a24ccc210be7932154b8260eca1"}, + {file = "onnxruntime-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac2f286da3494b29b4186ca193c7d4e6a2c1f770c4184c7192c5da142c3dec28"}, + {file = "onnxruntime-1.17.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1ec485643b93e0a3896c655eb2426decd63e18a278bb7ccebc133b340723624f"}, + {file = "onnxruntime-1.17.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83c35809cda898c5a11911c69ceac8a2ac3925911854c526f73bad884582f911"}, + {file = "onnxruntime-1.17.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fa464aa4d81df818375239e481887b656e261377d5b6b9a4692466f5f3261edc"}, + {file = "onnxruntime-1.17.0-cp38-cp38-win32.whl", hash = "sha256:b7b337cd0586f7836601623cbd30a443df9528ef23965860d11c753ceeb009f2"}, + {file = "onnxruntime-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:fbb9faaf51d01aa2c147ef52524d9326744c852116d8005b9041809a71838878"}, + {file = "onnxruntime-1.17.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:5a06ab84eaa350bf64b1d747b33ccf10da64221ed1f38f7287f15eccbec81603"}, + {file = "onnxruntime-1.17.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d3d11db2c8242766212a68d0b139745157da7ce53bd96ba349a5c65e5a02357"}, + {file = "onnxruntime-1.17.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5632077c3ab8b0cd4f74b0af9c4e924be012b1a7bcd7daa845763c6c6bf14b7d"}, + {file = "onnxruntime-1.17.0-cp39-cp39-win32.whl", hash = "sha256:61a12732cba869b3ad2d4e29ab6cb62c7a96f61b8c213f7fcb961ba412b70b37"}, + {file = "onnxruntime-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:461fa0fc7d9c392c352b6cccdedf44d818430f3d6eacd924bb804fdea2dcfd02"}, ] [package.dependencies] @@ -2633,19 +2650,21 @@ sympy = "*" [[package]] name = "onnxruntime-gpu" -version = "1.16.3" +version = "1.17.0" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime_gpu-1.16.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c14bc735ad2b2286be9eadeea09bc190df38e8bce17e37b601761019cc7cc24f"}, - {file = "onnxruntime_gpu-1.16.3-cp310-cp310-win_amd64.whl", hash = "sha256:8de5ccfc005ea5ec50fbd104b7210c97623a9f8c13de6e64ce559b55956b757f"}, - {file = "onnxruntime_gpu-1.16.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5703454521a9c080ff3ac79b5d266e959cc735d442a1d8796763c7f92d6069dc"}, - {file = "onnxruntime_gpu-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:48bb615aed61f5620d1ad46b9005614e1a14de60f8218a1448cc9a643f23d399"}, - {file = "onnxruntime_gpu-1.16.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2811c8ea209aaedcc2600ca828025279c1b1242344af603122d28c2ea8ab26a4"}, - {file = "onnxruntime_gpu-1.16.3-cp38-cp38-win_amd64.whl", hash = "sha256:2e5a92770c9232776739f378804bf6fea20bae02878a50b7fe0f81e77a47ee92"}, - {file = "onnxruntime_gpu-1.16.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9305c7fc5981d7e04ad2afef1a403475fb84d658898567c91aa5a41c20ead356"}, - {file = "onnxruntime_gpu-1.16.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3ad8e7fbb22493267c23d61e997a6b2ac6236a08aa6b58a3a91848124c9b037"}, + {file = "onnxruntime_gpu-1.17.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1f2a4e0468ac0bd8246996c3d5dbba92cbbaca874bcd7f9cee4e99ce6eb27f5b"}, + {file = "onnxruntime_gpu-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:0721b7930d7abed3730b2335e639e60d94ec411bb4d35a0347cc9c8b52c34540"}, + {file = "onnxruntime_gpu-1.17.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:be0314afe399943904de7c1ca797cbcc63e6fad60eb85d3df6422f81dd94e79e"}, + {file = "onnxruntime_gpu-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:52125c24b21406d1431e43de1c98cea29c21e0cceba80db530b7e4c9216d86ea"}, + {file = "onnxruntime_gpu-1.17.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bb802d8033885c412269f8bc8877d8779b0dc874df6fb9df8b796cba7276ad66"}, + {file = "onnxruntime_gpu-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:8c43533e3e5335eaa78059fb86b849a4faded513a00c1feaaa205ca5af51c40f"}, + {file = "onnxruntime_gpu-1.17.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:1d461455bba160836d6c11c648c8fd4e4500d5c17096a13e6c2c9d22a4abd436"}, + {file = "onnxruntime_gpu-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4398f2175a92f4b35d95279a6294a89c462f24de058a2736ee1d498bab5a16"}, + {file = "onnxruntime_gpu-1.17.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1d0e3805cd1c024aba7f4ae576fd08545fc27530a2aaad2b3c8ac0ee889fbd05"}, + {file = "onnxruntime_gpu-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc1da5b93363ee600b5b220b04eeec51ad2c2b3e96f0b7615b16b8a173c88001"}, ] [package.dependencies] @@ -2992,18 +3011,18 @@ xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" 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.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +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)"] [[package]] name = "pluggy" @@ -6630,13 +6649,13 @@ files = [ [[package]] name = "pytz" -version = "2023.4" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.4-py2.py3-none-any.whl", hash = "sha256:f90ef520d95e7c46951105338d918664ebfd6f1d995bd7d153127ce90efafa6a"}, - {file = "pytz-2023.4.tar.gz", hash = "sha256:31d4583c4ed539cd037956140d695e42c033a19e984bfce9964a3f7d59bc2b40"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] [[package]] @@ -6905,28 +6924,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.1.14" +version = "0.2.0" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.14-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:96f76536df9b26622755c12ed8680f159817be2f725c17ed9305b472a757cdbb"}, - {file = "ruff-0.1.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:ab3f71f64498c7241123bb5a768544cf42821d2a537f894b22457a543d3ca7a9"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7060156ecc572b8f984fd20fd8b0fcb692dd5d837b7606e968334ab7ff0090ab"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a53d8e35313d7b67eb3db15a66c08434809107659226a90dcd7acb2afa55faea"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bea9be712b8f5b4ebed40e1949379cfb2a7d907f42921cf9ab3aae07e6fba9eb"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2270504d629a0b064247983cbc495bed277f372fb9eaba41e5cf51f7ba705a6a"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80258bb3b8909b1700610dfabef7876423eed1bc930fe177c71c414921898efa"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:653230dd00aaf449eb5ff25d10a6e03bc3006813e2cb99799e568f55482e5cae"}, - {file = "ruff-0.1.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b3acc6c4e6928459ba9eb7459dd4f0c4bf266a053c863d72a44c33246bfdbf"}, - {file = "ruff-0.1.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6b3dadc9522d0eccc060699a9816e8127b27addbb4697fc0c08611e4e6aeb8b5"}, - {file = "ruff-0.1.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:1c8eca1a47b4150dc0fbec7fe68fc91c695aed798532a18dbb1424e61e9b721f"}, - {file = "ruff-0.1.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:62ce2ae46303ee896fc6811f63d6dabf8d9c389da0f3e3f2bce8bc7f15ef5488"}, - {file = "ruff-0.1.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b2027dde79d217b211d725fc833e8965dc90a16d0d3213f1298f97465956661b"}, - {file = "ruff-0.1.14-py3-none-win32.whl", hash = "sha256:722bafc299145575a63bbd6b5069cb643eaa62546a5b6398f82b3e4403329cab"}, - {file = "ruff-0.1.14-py3-none-win_amd64.whl", hash = "sha256:e3d241aa61f92b0805a7082bd89a9990826448e4d0398f0e2bc8f05c75c63d99"}, - {file = "ruff-0.1.14-py3-none-win_arm64.whl", hash = "sha256:269302b31ade4cde6cf6f9dd58ea593773a37ed3f7b97e793c8594b262466b67"}, - {file = "ruff-0.1.14.tar.gz", hash = "sha256:ad3f8088b2dfd884820289a06ab718cde7d38b94972212cc4ba90d5fbc9955f3"}, + {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:638ea3294f800d18bae84a492cb5a245c8d29c90d19a91d8e338937a4c27fca0"}, + {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff35433fcf4dff6d610738712152df6b7d92351a1bde8e00bd405b08b3d5759"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9faafbdcf4f53917019f2c230766da437d4fd5caecd12ddb68bb6a17d74399"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8153a3e4128ed770871c47545f1ae7b055023e0c222ff72a759f5a341ee06483"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a75a98ae989a27090e9c51f763990ad5bbc92d20626d54e9701c7fe597f399"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:87057dd2fdde297130ff99553be8549ca38a2965871462a97394c22ed2dfc19d"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d232f99d3ab00094ebaf88e0fb7a8ccacaa54cc7fa3b8993d9627a11e6aed7a"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3c641f95f435fc6754b05591774a17df41648f0daf3de0d75ad3d9f099ab92"}, + {file = "ruff-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3826fb34c144ef1e171b323ed6ae9146ab76d109960addca730756dc19dc7b22"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eceab7d85d09321b4de18b62d38710cf296cb49e98979960a59c6b9307c18cfe"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:30ad74687e1f4a9ff8e513b20b82ccadb6bd796fe5697f1e417189c5cde6be3e"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7e3818698f8460bd0f8d4322bbe99db8327e9bc2c93c789d3159f5b335f47da"}, + {file = "ruff-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:edf23041242c48b0d8295214783ef543847ef29e8226d9f69bf96592dba82a83"}, + {file = "ruff-0.2.0-py3-none-win32.whl", hash = "sha256:e155147199c2714ff52385b760fe242bb99ea64b240a9ffbd6a5918eb1268843"}, + {file = "ruff-0.2.0-py3-none-win_amd64.whl", hash = "sha256:ba918e01cdd21e81b07555564f40d307b0caafa9a7a65742e98ff244f5035c59"}, + {file = "ruff-0.2.0-py3-none-win_arm64.whl", hash = "sha256:3fbaff1ba9564a2c5943f8f38bc221f04bac687cc7485e45237579fee7ccda79"}, + {file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"}, ] [[package]] @@ -7008,13 +7027,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.39.2" +version = "1.40.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.39.2.tar.gz", hash = "sha256:24c83b0b41c887d33328a9166f5950dc37ad58f01c9f2fbff6b87a6f1094170c"}, - {file = "sentry_sdk-1.39.2-py2.py3-none-any.whl", hash = "sha256:acaf597b30258fc7663063b291aa99e58f3096e91fe1e6634f4b79f9c1943e8e"}, + {file = "sentry-sdk-1.40.0.tar.gz", hash = "sha256:34ad8cfc9b877aaa2a8eb86bfe5296a467fffe0619b931a05b181c45f6da59bf"}, + {file = "sentry_sdk-1.40.0-py2.py3-none-any.whl", hash = "sha256:78575620331186d32f34b7ece6edea97ce751f58df822547d3ab85517881a27a"}, ] [package.dependencies] @@ -7040,7 +7059,7 @@ huey = ["huey (>=2)"] loguru = ["loguru (>=0.5)"] 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"] +pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] quart = ["blinker (>=1.1)", "quart (>=0.16.1)"] @@ -7523,13 +7542,13 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "timezonefinder" -version = "6.2.0" -description = "fast python package for finding the timezone of any point on earth (coordinates) offline" +version = "6.4.0" +description = "python package for finding the timezone of any point on earth (coordinates) offline" optional = false -python-versions = ">=3.8,<4" +python-versions = ">=3.9,<4" files = [ - {file = "timezonefinder-6.2.0-cp38-cp38-manylinux_2_35_x86_64.whl", hash = "sha256:06aa5926ed31687ea9eb00ab53203631f09a78f307285b4929da4ac4e2889240"}, - {file = "timezonefinder-6.2.0.tar.gz", hash = "sha256:d41fd2650bb4221fae5a61f9c2767158f9727c4aaca95e24da86394feb704220"}, + {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"}, ] [package.dependencies] @@ -7539,7 +7558,7 @@ numpy = ">=1.18,<2" setuptools = ">=65.5" [package.extras] -numba = ["numba (>=0.56,<1)"] +numba = ["numba (>=0.59,<1)"] pytz = ["pytz (>=2022.7.1)"] [[package]] @@ -7622,17 +7641,18 @@ files = [ [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.0" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] From fd07fc3ba483aca1c1bdbe6129756d4e223f2c32 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 5 Feb 2024 16:01:23 -0500 Subject: [PATCH 018/923] updated: close lock file on exit (#31285) * with open * those too * just 1 file * move this to another pr --- selfdrive/updated.py | 164 +++++++++++++++++++++---------------------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/selfdrive/updated.py b/selfdrive/updated.py index eb2759223b..3e4a849d21 100755 --- a/selfdrive/updated.py +++ b/selfdrive/updated.py @@ -413,96 +413,96 @@ def main() -> None: cloudlog.warning("updates are disabled by the DisableUpdates param") exit(0) - ov_lock_fd = open(LOCK_FILE, 'w') - try: - fcntl.flock(ov_lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) - except OSError as e: - raise RuntimeError("couldn't get overlay lock; is another instance running?") from e - - # Set low io priority - proc = psutil.Process() - if psutil.LINUX: - proc.ionice(psutil.IOPRIO_CLASS_BE, value=7) - - # Check if we just performed an update - if Path(os.path.join(STAGING_ROOT, "old_openpilot")).is_dir(): - cloudlog.event("update installed") - - if not params.get("InstallDate"): - t = datetime.datetime.utcnow().isoformat() - params.put("InstallDate", t.encode('utf8')) - - updater = Updater() - update_failed_count = 0 # TODO: Load from param? - wait_helper = WaitTimeHelper() - - # invalidate old finalized update - set_consistent_flag(False) - - # set initial state - params.put("UpdaterState", "idle") - - # Run the update loop - first_run = True - while True: - wait_helper.ready_event.clear() - - # Attempt an update - exception = None + with open(LOCK_FILE, 'w') as ov_lock_fd: try: - # TODO: reuse overlay from previous updated instance if it looks clean - init_overlay() + fcntl.flock(ov_lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB) + except OSError as e: + raise RuntimeError("couldn't get overlay lock; is another instance running?") from e - # ensure we have some params written soon after startup - updater.set_params(False, update_failed_count, exception) + # Set low io priority + proc = psutil.Process() + if psutil.LINUX: + proc.ionice(psutil.IOPRIO_CLASS_BE, value=7) - if not system_time_valid() or first_run: - first_run = False - wait_helper.sleep(60) - continue + # Check if we just performed an update + if Path(os.path.join(STAGING_ROOT, "old_openpilot")).is_dir(): + cloudlog.event("update installed") - update_failed_count += 1 + if not params.get("InstallDate"): + t = datetime.datetime.utcnow().isoformat() + params.put("InstallDate", t.encode('utf8')) - # check for update - params.put("UpdaterState", "checking...") - updater.check_for_update() + updater = Updater() + update_failed_count = 0 # TODO: Load from param? + wait_helper = WaitTimeHelper() - # download update - last_fetch = read_time_from_param(params, "UpdaterLastFetchTime") - timed_out = last_fetch is None or (datetime.datetime.utcnow() - last_fetch > datetime.timedelta(days=3)) - user_requested_fetch = wait_helper.user_request == UserRequest.FETCH - if params.get_bool("NetworkMetered") and not timed_out and not user_requested_fetch: - cloudlog.info("skipping fetch, connection metered") - elif wait_helper.user_request == UserRequest.CHECK: - cloudlog.info("skipping fetch, only checking") - else: - updater.fetch_update() - write_time_to_param(params, "UpdaterLastFetchTime") - update_failed_count = 0 - except subprocess.CalledProcessError as e: - cloudlog.event( - "update process failed", - cmd=e.cmd, - output=e.output, - returncode=e.returncode - ) - exception = f"command failed: {e.cmd}\n{e.output}" - OVERLAY_INIT.unlink(missing_ok=True) - except Exception as e: - cloudlog.exception("uncaught updated exception, shouldn't happen") - exception = str(e) - OVERLAY_INIT.unlink(missing_ok=True) + # invalidate old finalized update + set_consistent_flag(False) - try: - params.put("UpdaterState", "idle") - update_successful = (update_failed_count == 0) - updater.set_params(update_successful, update_failed_count, exception) - except Exception: - cloudlog.exception("uncaught updated exception while setting params, shouldn't happen") + # set initial state + params.put("UpdaterState", "idle") - # infrequent attempts if we successfully updated recently - wait_helper.user_request = UserRequest.NONE - wait_helper.sleep(5*60 if update_failed_count > 0 else 1.5*60*60) + # Run the update loop + first_run = True + while True: + wait_helper.ready_event.clear() + + # Attempt an update + exception = None + try: + # TODO: reuse overlay from previous updated instance if it looks clean + init_overlay() + + # ensure we have some params written soon after startup + updater.set_params(False, update_failed_count, exception) + + if not system_time_valid() or first_run: + first_run = False + wait_helper.sleep(60) + continue + + update_failed_count += 1 + + # check for update + params.put("UpdaterState", "checking...") + updater.check_for_update() + + # download update + last_fetch = read_time_from_param(params, "UpdaterLastFetchTime") + timed_out = last_fetch is None or (datetime.datetime.utcnow() - last_fetch > datetime.timedelta(days=3)) + user_requested_fetch = wait_helper.user_request == UserRequest.FETCH + if params.get_bool("NetworkMetered") and not timed_out and not user_requested_fetch: + cloudlog.info("skipping fetch, connection metered") + elif wait_helper.user_request == UserRequest.CHECK: + cloudlog.info("skipping fetch, only checking") + else: + updater.fetch_update() + write_time_to_param(params, "UpdaterLastFetchTime") + update_failed_count = 0 + except subprocess.CalledProcessError as e: + cloudlog.event( + "update process failed", + cmd=e.cmd, + output=e.output, + returncode=e.returncode + ) + exception = f"command failed: {e.cmd}\n{e.output}" + OVERLAY_INIT.unlink(missing_ok=True) + except Exception as e: + cloudlog.exception("uncaught updated exception, shouldn't happen") + exception = str(e) + OVERLAY_INIT.unlink(missing_ok=True) + + try: + params.put("UpdaterState", "idle") + update_successful = (update_failed_count == 0) + updater.set_params(update_successful, update_failed_count, exception) + except Exception: + cloudlog.exception("uncaught updated exception while setting params, shouldn't happen") + + # infrequent attempts if we successfully updated recently + wait_helper.user_request = UserRequest.NONE + wait_helper.sleep(5*60 if update_failed_count > 0 else 1.5*60*60) if __name__ == "__main__": From 50a552ab8dea59c17c3591f7619ca6c0ff410443 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 5 Feb 2024 16:46:34 -0600 Subject: [PATCH 019/923] Reapply "Ford: don't fingerprint on engine (#31195)" (#31303) * Reapply "Ford: don't fingerprint on engine (#31195)" This reverts commit 7694712cd6823a99c3f1c03270bb7167e4c1bdf9. * don't change the queries * revert refs --- selfdrive/car/ford/fingerprints.py | 54 +-------------------------- selfdrive/car/ford/tests/test_ford.py | 2 +- selfdrive/car/ford/values.py | 1 + 3 files changed, 3 insertions(+), 54 deletions(-) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 0cd812bc6b..0085b6b9c6 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -19,12 +19,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'M1PT-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'M1PA-14C204-GF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'M1PA-14C204-RE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'N1PA-14C204-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'N1PA-14C204-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.ESCAPE_MK4: { (Ecu.eps, 0x730, None): [ @@ -47,17 +41,6 @@ FW_VERSIONS = { b'LJ6T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LV4T-14F397-GG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'LX6A-14C204-BJV\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LX6A-14C204-BJX\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LX6A-14C204-CNG\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LX6A-14C204-DPK\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LX6A-14C204-ESG\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MX6A-14C204-BEF\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MX6A-14C204-BEJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MX6A-14C204-CAB\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NX6A-14C204-BLE\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.EXPLORER_MK6: { (Ecu.eps, 0x730, None): [ @@ -83,21 +66,9 @@ FW_VERSIONS = { b'LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LB5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LB5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LC5T-14F397-AE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LC5T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'LB5A-14C204-ATJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LB5A-14C204-ATS\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LB5A-14C204-AUJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LB5A-14C204-AZL\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LB5A-14C204-BUJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'LB5A-14C204-EAC\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MB5A-14C204-MD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MB5A-14C204-RC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NB5A-14C204-AZD\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NB5A-14C204-HB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PB5A-14C204-DA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.F_150_MK14: { (Ecu.eps, 0x730, None): [ @@ -112,9 +83,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'PL3A-14C204-BRB\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.F_150_LIGHTNING_MK1: { (Ecu.abs, 0x760, None): [ @@ -126,9 +94,6 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x764, None): [ b'ML3T-14D049-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'NL3A-14C204-BAR\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.MUSTANG_MACH_E_MK1: { (Ecu.eps, 0x730, None): [ @@ -144,11 +109,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'ML3T-14H102-ABS\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'MJ98-14C204-BBP\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'MJ98-14C204-BBS\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NJ98-14C204-VH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.FOCUS_MK4: { (Ecu.eps, 0x730, None): [ @@ -163,9 +123,6 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'JX6A-14C204-BPL\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, CAR.MAVERICK_MK1: { (Ecu.eps, 0x730, None): [ @@ -182,14 +139,5 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x706, None): [ b'NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], - (Ecu.engine, 0x7e0, None): [ - b'NZ6A-14C204-AAA\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NZ6A-14C204-PA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NZ6A-14C204-ZA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'NZ6A-14C204-ZC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PZ6A-14C204-BE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PZ6A-14C204-JC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - b'PZ6A-14C204-JE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', - ], }, } diff --git a/selfdrive/car/ford/tests/test_ford.py b/selfdrive/car/ford/tests/test_ford.py index a1f0b81a58..dff29629f6 100755 --- a/selfdrive/car/ford/tests/test_ford.py +++ b/selfdrive/car/ford/tests/test_ford.py @@ -52,7 +52,7 @@ class TestFordFW(unittest.TestCase): @parameterized.expand(FW_VERSIONS.items()) def test_fw_versions(self, car_model: str, fw_versions: Dict[Tuple[capnp.lib.capnp._EnumModule, int, Optional[int]], Iterable[bytes]]): for (ecu, addr, subaddr), fws in fw_versions.items(): - self.assertIn(ecu, ECU_ADDRESSES, "Unknown ECU") + self.assertIn(ecu, ECU_FW_CORE, "Unexpected ECU") self.assertEqual(addr, ECU_ADDRESSES[ecu], "ECU address mismatch") self.assertIsNone(subaddr, "Unexpected ECU subaddress") diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 2c4415be2b..0faf901fc2 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -126,6 +126,7 @@ FW_QUERY_CONFIG = FwQueryConfig( ), ], extra_ecus=[ + (Ecu.engine, 0x7e0, None), (Ecu.shiftByWire, 0x732, None), ], ) From 06bdc69a0229bece7b60178c421feda329522585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Tue, 6 Feb 2024 08:39:44 +0800 Subject: [PATCH 020/923] Certified Herbalist Model (#31294) ab9921cb-6e0a-4816-bec5-ebb55d37a7f1/700 --- selfdrive/modeld/models/supercombo.onnx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index dc93d84135..1777949cdd 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:763821410b35b06b598cacfa5bc3e312610b3f8de2729e0d5954d7571b6794be +oid sha256:738ef0a3407e1f918d928dd195dc0e2a326f7610a38184c4801a0f717a8255ea size 48219112 From a8aa04e6bda2fc8ca31db055f584bfc52d104d2c Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Mon, 5 Feb 2024 18:07:48 -0800 Subject: [PATCH 021/923] make URLFile safe after fork() (#31309) * make URLFile safe after fork() * cache the pool manager in each instance * type hints --- tools/lib/url_file.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/lib/url_file.py b/tools/lib/url_file.py index 5c6f187eee..be9c815c93 100644 --- a/tools/lib/url_file.py +++ b/tools/lib/url_file.py @@ -6,6 +6,7 @@ from hashlib import sha256 from urllib3 import PoolManager from urllib3.util import Timeout from tenacity import retry, wait_random_exponential, stop_after_attempt +from typing import Optional from openpilot.common.file_helpers import atomic_write_in_dir from openpilot.system.hardware.hw import Paths @@ -25,9 +26,12 @@ class URLFileException(Exception): class URLFile: - _tlocal = threading.local() + _pid: Optional[int] = None + _pool_manager: Optional[PoolManager] = None + _pool_manager_lock = threading.Lock() def __init__(self, url, debug=False, cache=None): + self._pool_manager = None self._url = url self._pos = 0 self._length = None @@ -41,11 +45,6 @@ class URLFile: if not self._force_download: os.makedirs(Paths.download_cache_root(), exist_ok=True) - try: - self._http_client = URLFile._tlocal.http_client - except AttributeError: - self._http_client = URLFile._tlocal.http_client = PoolManager() - def __enter__(self): return self @@ -55,10 +54,20 @@ class URLFile: self._local_file.close() self._local_file = None + def _http_client(self) -> PoolManager: + if self._pool_manager is None: + pid = os.getpid() + with URLFile._pool_manager_lock: + if URLFile._pid != pid or URLFile._pool_manager is None: # unsafe to share after fork + URLFile._pid = pid + URLFile._pool_manager = PoolManager(num_pools=10, maxsize=10) + self._pool_manager = URLFile._pool_manager + return self._pool_manager + @retry(wait=wait_random_exponential(multiplier=1, max=5), stop=stop_after_attempt(3), reraise=True) def get_length_online(self): timeout = Timeout(connect=50.0, read=500.0) - response = self._http_client.request('HEAD', self._url, timeout=timeout, preload_content=False) + response = self._http_client().request('HEAD', self._url, timeout=timeout, preload_content=False) if not (200 <= response.status <= 299): return -1 length = response.headers.get('content-length', 0) @@ -131,7 +140,7 @@ class URLFile: t1 = time.time() timeout = Timeout(connect=50.0, read=500.0) - response = self._http_client.request('GET', self._url, timeout=timeout, preload_content=False, headers=headers) + response = self._http_client().request('GET', self._url, timeout=timeout, preload_content=False, headers=headers) ret = response.data if self._debug: From b17f24d68ea560722a1596840ec0c79cf928f0ab Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 5 Feb 2024 21:35:12 -0500 Subject: [PATCH 022/923] test_logreader: test run_across_segments (#31305) * more logreader tests * not in ci for now * enable cache --- tools/lib/tests/test_logreader.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 676d2bbadf..7a8ea20b76 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,6 +1,7 @@ import shutil import tempfile import numpy as np +import os import unittest import pytest import requests @@ -8,7 +9,7 @@ import requests from parameterized import parameterized from unittest import mock -from openpilot.tools.lib.logreader import LogReader, parse_indirect, parse_slice, ReadMode +from openpilot.tools.lib.logreader import LogIterable, LogReader, parse_indirect, parse_slice, ReadMode from openpilot.tools.lib.route import SegmentRange NUM_SEGS = 17 # number of segments in the test route @@ -16,6 +17,11 @@ ALL_SEGS = list(np.arange(NUM_SEGS)) TEST_ROUTE = "344c5c15b34f2d8a/2024-01-03--09-37-12" QLOG_FILE = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2" + +def noop(segment: LogIterable): + return segment + + class TestLogReader(unittest.TestCase): @parameterized.expand([ (f"{TEST_ROUTE}", ALL_SEGS), @@ -124,6 +130,13 @@ class TestLogReader(unittest.TestCase): self.assertEqual(lr.first("carParams").carFingerprint, "SUBARU OUTBACK 6TH GEN") self.assertTrue(0 < len(list(lr.filter("carParams"))) < len(list(lr))) + @parameterized.expand([(True,), (False,)]) + @pytest.mark.slow + def test_run_across_segments(self, cache_enabled): + os.environ["FILEREADER_CACHE"] = "1" if cache_enabled else "0" + lr = LogReader(f"{TEST_ROUTE}/0:4") + self.assertEqual(len(lr.run_across_segments(4, noop)), len(list(lr))) + if __name__ == "__main__": unittest.main() From 35d848ad5290ed9c0747b0ac20a5affab6a561d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Mon, 5 Feb 2024 19:04:59 -0800 Subject: [PATCH 023/923] webrtcd: lazy import of aiortc (#31304) * Lazy imports in webrtcd * Lazy imports in web.py * Type hints * Remove FrameReaderVideoStreamTrack * leave the aiohttp.web import * Leave the client session * main leftover --- system/webrtc/device/video.py | 25 ------------------------- system/webrtc/webrtcd.py | 34 ++++++++++++++++++---------------- tools/bodyteleop/web.py | 15 ++++++++------- 3 files changed, 26 insertions(+), 48 deletions(-) diff --git a/system/webrtc/device/video.py b/system/webrtc/device/video.py index 1ecb6dbd74..314f812834 100644 --- a/system/webrtc/device/video.py +++ b/system/webrtc/device/video.py @@ -5,7 +5,6 @@ import av from teleoprtc.tracks import TiciVideoStreamTrack from cereal import messaging -from openpilot.tools.lib.framereader import FrameReader from openpilot.common.realtime import DT_MDL, DT_DMON @@ -43,27 +42,3 @@ class LiveStreamVideoStreamTrack(TiciVideoStreamTrack): def codec_preference(self) -> Optional[str]: return "H264" - - -class FrameReaderVideoStreamTrack(TiciVideoStreamTrack): - def __init__(self, input_file: str, dt: float = DT_MDL, camera_type: str = "driver"): - super().__init__(camera_type, dt) - - frame_reader = FrameReader(input_file) - self._frames = [frame_reader.get(i, pix_fmt="rgb24") for i in range(frame_reader.frame_count)] - self._frame_count = len(self.frames) - self._frame_index = 0 - self._pts = 0 - - async def recv(self): - self.log_debug("track sending frame %s", self._pts) - img = self._frames[self._frame_index] - - new_frame = av.VideoFrame.from_ndarray(img, format="rgb24") - new_frame.pts = self._pts - new_frame.time_base = self._time_base - - self._frame_index = (self._frame_index + 1) % self._frame_count - self._pts = await self.next_pts(self._pts) - - return new_frame diff --git a/system/webrtc/webrtcd.py b/system/webrtc/webrtcd.py index 12f9328532..cc26d50daf 100755 --- a/system/webrtc/webrtcd.py +++ b/system/webrtc/webrtcd.py @@ -6,34 +6,27 @@ import json import uuid import logging from dataclasses import dataclass, field -from typing import Any, List, Optional, Union +from typing import Any, List, Optional, Union, TYPE_CHECKING # aiortc and its dependencies have lots of internal warnings :( import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) -import aiortc -from aiortc.mediastreams import VideoStreamTrack, AudioStreamTrack -from aiortc.contrib.media import MediaBlackhole -from aiortc.exceptions import InvalidStateError -from aiohttp import web import capnp -from teleoprtc import WebRTCAnswerBuilder -from teleoprtc.info import parse_info_from_offer +from aiohttp import web +if TYPE_CHECKING: + from aiortc.rtcdatachannel import RTCDataChannel -from openpilot.system.webrtc.device.video import LiveStreamVideoStreamTrack -from openpilot.system.webrtc.device.audio import AudioInputStreamTrack, AudioOutputSpeaker from openpilot.system.webrtc.schema import generate_field - from cereal import messaging, log class CerealOutgoingMessageProxy: def __init__(self, sm: messaging.SubMaster): self.sm = sm - self.channels: List[aiortc.RTCDataChannel] = [] + self.channels: List['RTCDataChannel'] = [] - def add_channel(self, channel: aiortc.RTCDataChannel): + def add_channel(self, channel: 'RTCDataChannel'): self.channels.append(channel) def to_json(self, msg_content: Any): @@ -96,6 +89,8 @@ class CerealProxyRunner: self.task = None async def run(self): + from aiortc.exceptions import InvalidStateError + while True: try: self.proxy.update() @@ -109,6 +104,13 @@ class CerealProxyRunner: class StreamSession: def __init__(self, sdp: str, cameras: List[str], incoming_services: List[str], outgoing_services: List[str], debug_mode: bool = False): + from aiortc.mediastreams import VideoStreamTrack, AudioStreamTrack + from aiortc.contrib.media import MediaBlackhole + from openpilot.system.webrtc.device.video import LiveStreamVideoStreamTrack + from openpilot.system.webrtc.device.audio import AudioInputStreamTrack, AudioOutputSpeaker + from teleoprtc import WebRTCAnswerBuilder + from teleoprtc.info import parse_info_from_offer + config = parse_info_from_offer(sdp) builder = WebRTCAnswerBuilder(sdp) @@ -192,7 +194,7 @@ class StreamRequestBody: bridge_services_out: List[str] = field(default_factory=list) -async def get_stream(request: web.Request): +async def get_stream(request: 'web.Request'): stream_dict, debug_mode = request.app['streams'], request.app['debug'] raw_body = await request.json() body = StreamRequestBody(**raw_body) @@ -206,7 +208,7 @@ async def get_stream(request: web.Request): return web.json_response({"sdp": answer.sdp, "type": answer.type}) -async def get_schema(request: web.Request): +async def get_schema(request: 'web.Request'): services = request.query["services"].split(",") services = [s for s in services if s] assert all(s in log.Event.schema.fields and not s.endswith("DEPRECATED") for s in services), "Invalid service name" @@ -214,7 +216,7 @@ async def get_schema(request: web.Request): return web.json_response(schema_dict) -async def on_shutdown(app: web.Application): +async def on_shutdown(app: 'web.Application'): for session in app['streams'].values(): session.stop() del app['streams'] diff --git a/tools/bodyteleop/web.py b/tools/bodyteleop/web.py index 53077af67e..b1fb9525db 100644 --- a/tools/bodyteleop/web.py +++ b/tools/bodyteleop/web.py @@ -6,9 +6,10 @@ import os import ssl import subprocess -from aiohttp import web, ClientSession import pyaudio import wave +from aiohttp import web +from aiohttp import ClientSession from openpilot.common.basedir import BASEDIR from openpilot.system.webrtc.webrtcd import StreamRequestBody @@ -22,7 +23,7 @@ WEBRTCD_HOST, WEBRTCD_PORT = "localhost", 5001 ## UTILS -async def play_sound(sound): +async def play_sound(sound: str): SOUNDS = { "engage": "selfdrive/assets/sounds/engage.wav", "disengage": "selfdrive/assets/sounds/disengage.wav", @@ -51,7 +52,7 @@ async def play_sound(sound): p.terminate() ## SSL -def create_ssl_cert(cert_path, key_path): +def create_ssl_cert(cert_path: str, key_path: str): try: proc = subprocess.run(f'openssl req -x509 -newkey rsa:4096 -nodes -out {cert_path} -keyout {key_path} \ -days 365 -subj "/C=US/ST=California/O=commaai/OU=comma body"', @@ -75,17 +76,17 @@ def create_ssl_context(): return ssl_context ## ENDPOINTS -async def index(request): +async def index(request: 'web.Request'): with open(os.path.join(TELEOPDIR, "static", "index.html"), "r") as f: content = f.read() return web.Response(content_type="text/html", text=content) -async def ping(request): +async def ping(request: 'web.Request'): return web.Response(text="pong") -async def sound(request): +async def sound(request: 'web.Request'): params = await request.json() sound_to_play = params["sound"] @@ -93,7 +94,7 @@ async def sound(request): return web.json_response({"status": "ok"}) -async def offer(request): +async def offer(request: 'web.Request'): params = await request.json() body = StreamRequestBody(params["sdp"], ["driver"], ["testJoystick"], ["carState"]) body_json = json.dumps(dataclasses.asdict(body)) From cd153e637631d8f4eeaf530dff7510ed6d73c071 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 5 Feb 2024 22:30:33 -0600 Subject: [PATCH 024/923] log vin request to qlog (#31314) --- selfdrive/car/vin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index f69771546f..676593255a 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -42,7 +42,7 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=3, debug=False): if vin.startswith(b'\x11'): vin = vin[1:18] - cloudlog.warning(f"got vin with {request=}") + cloudlog.error(f"got vin with {request=}") return get_rx_addr_for_tx_addr(addr), bus, vin.decode() except Exception: cloudlog.exception("VIN query exception") From 7eb9b9a277d374d0e98bc9bb29e50bdbcd41c0fb Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 00:06:30 -0500 Subject: [PATCH 025/923] update model replay ref (#31310) update ref --- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index a2f6896307..2d886684af 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -fee90bcee1e545c7ec9a39d3c7d4e42cfefb9955 +06bdc69a0229bece7b60178c421feda329522585 From 55cc3989d8958b48f34eb55f2a6f564fb4e2af86 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 5 Feb 2024 23:48:57 -0600 Subject: [PATCH 026/923] Ford: add ABS address to get VIN without OBD port (#31308) * consider ford abs * cmts * fix * who * Revert "who" This reverts commit eef45b147fab715a9f35b9712e8b9d7ebb1b2fdf. * this doesn't work correctly * add cmt * fix * Revert "fix" This reverts commit 60dfe09c426e74293711df9e2f3b2f75cf3a1da9. --- selfdrive/car/fw_query_definitions.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 8ff0bd47c4..1d6104574e 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -14,7 +14,8 @@ EcuAddrSubAddr = Tuple[int, int, Optional[int]] LiveFwVersions = Dict[AddrType, Set[bytes]] OfflineFwVersions = Dict[str, Dict[EcuAddrSubAddr, List[bytes]]] -STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x18da10f1, 0x18da0ef1] # engine, VMCU, 29-bit engine, PGM-FI +# A global list of addresses we will only ever consider for VIN responses +STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x18da10f1, 0x18da0ef1] # engine, hybrid controller, Ford abs, 29-bit engine, PGM-FI def p16(val): From 618366be061024f9252043aab4a48194343690f8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 5 Feb 2024 23:52:06 -0600 Subject: [PATCH 027/923] get_vin: respond to full 11-bit diagnostic address range (#31317) * fix * not 7df * cleaner * whop --- selfdrive/car/vin.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index 676593255a..fe451aa9a9 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -26,8 +26,14 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=3, debug=False): if bus not in valid_buses: continue + # When querying functional addresses, ideally we respond to everything that sends a first frame to avoid leaving the + # ECU in a temporary bad state. Note that we may not cover all ECUs and response offsets. TODO: query physical addrs + tx_addrs = vin_addrs + if functional_addrs is not None: + tx_addrs = [a for a in range(0x700, 0x800) if a != 0x7DF] + list(range(0x18DA00F1, 0x18DB00F1, 0x100)) + try: - query = IsoTpParallelQuery(sendcan, logcan, bus, vin_addrs, [request, ], [response, ], response_offset=rx_offset, + query = IsoTpParallelQuery(sendcan, logcan, bus, tx_addrs, [request, ], [response, ], response_offset=rx_offset, functional_addrs=functional_addrs, debug=debug) results = query.get_data(timeout) From b94aba6281486685cb1a33221c7fa7860be4537e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 00:52:16 -0500 Subject: [PATCH 028/923] CI: Move repo maintenance bots to 6am (#31316) later --- .github/workflows/repo-maintenance.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/repo-maintenance.yaml b/.github/workflows/repo-maintenance.yaml index bd882210fa..a59fd0ebf8 100644 --- a/.github/workflows/repo-maintenance.yaml +++ b/.github/workflows/repo-maintenance.yaml @@ -2,7 +2,7 @@ name: repo maintenance on: schedule: - - cron: "0 12 * * 1" # every Monday at 12am UTC (4am PST) + - cron: "0 14 * * 1" # every Monday at 2am UTC (6am PST) workflow_dispatch: jobs: From cbd46802b05b8883d6fa3f64fa069a5d5aaabd17 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 5 Feb 2024 23:00:45 -0800 Subject: [PATCH 029/923] fix bootlog count (#31319) --- selfdrive/manager/helpers.py | 2 +- system/loggerd/logger.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/manager/helpers.py b/selfdrive/manager/helpers.py index 1b6f8df1ef..797f4ee92e 100644 --- a/selfdrive/manager/helpers.py +++ b/selfdrive/manager/helpers.py @@ -56,7 +56,7 @@ def save_bootlog(): def fn(tmpdir): env = os.environ.copy() - env['PARAMS_ROOT'] = tmpdir + env['PARAMS_COPY_PATH'] = tmpdir subprocess.call("./bootlog", cwd=os.path.join(BASEDIR, "system/loggerd"), env=env) shutil.rmtree(tmpdir) t = threading.Thread(target=fn, args=(tmp, )) diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index bb829df6ed..2fc6492ad4 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -40,7 +40,7 @@ kj::Array logger_build_init_data() { init.setOsVersion(util::read_file("/VERSION")); // log params - auto params = Params(); + auto params = Params(util::getenv("PARAMS_COPY_PATH", "")); std::map params_map = params.readAll(); init.setGitCommit(params_map["GitCommit"]); From dd6065c33b66e04b0ba79d78f967349a5cec6a67 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 01:57:46 -0600 Subject: [PATCH 030/923] Reapply "Ford: don't fingerprint on engine (#31195)" part 2 (#31320) * Reapply "Ford: don't fingerprint on engine (#31195) part 2" This reverts commit 7694712cd6823a99c3f1c03270bb7167e4c1bdf9. * add comment Co-authored-by: Cameron Clough --------- Co-authored-by: Cameron Clough --- selfdrive/car/ford/values.py | 8 +------- selfdrive/car/tests/test_fw_fingerprint.py | 6 +++--- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 0faf901fc2..c080e02299 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -111,21 +111,15 @@ FW_QUERY_CONFIG = FwQueryConfig( requests=[ # CAN and CAN FD queries are combined. # FIXME: For CAN FD, ECUs respond with frames larger than 8 bytes on the powertrain bus - # TODO: properly handle auxiliary requests to separate queries and add back whitelists Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], - # whitelist_ecus=[Ecu.engine], - ), - Request( - [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], - [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], - # whitelist_ecus=[Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.shiftByWire], bus=0, auxiliary=True, ), ], extra_ecus=[ + # We are unlikely to get a response from the PCM from behind the gateway (Ecu.engine, 0x7e0, None), (Ecu.shiftByWire, 0x732, None), ], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 9f6a847568..064f2e5651 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -254,13 +254,13 @@ class TestFwFingerprintTiming(unittest.TestCase): @pytest.mark.timeout(60) def test_fw_query_timing(self): - total_ref_time = 7.0 + total_ref_time = 6.8 brand_ref_times = { 1: { 'gm': 0.5, 'body': 0.1, 'chrysler': 0.3, - 'ford': 0.2, + 'ford': 0.1, 'honda': 0.55, 'hyundai': 0.65, 'mazda': 0.1, @@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'volkswagen': 0.2, }, 2: { - 'ford': 0.3, + 'ford': 0.2, 'hyundai': 1.05, } } From ee16eefc1a1d865b2e3cdb7b887da9e8b8765cd3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 02:05:08 -0600 Subject: [PATCH 031/923] Ford: Add missing FW for Escape 2022 (#31321) Add missing FW for a25d5d0b645d8bc3 --- selfdrive/car/ford/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 0085b6b9c6..a5d465849a 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -24,6 +24,7 @@ FW_VERSIONS = { (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', + b'LX6C-14D003-AK\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x760, None): [ From e6bace867ee6b472bb0f399dd860908135ba0d2d Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Tue, 6 Feb 2024 03:42:28 -0500 Subject: [PATCH 032/923] VW MQB: Add FW for 2024 Volkswagen Jetta (#30979) * VW MQB: Add FW for 2024 Volkswagen Jetta * update docs * fix sorting --- docs/CARS.md | 4 ++-- selfdrive/car/volkswagen/fingerprints.py | 5 +++++ selfdrive/car/volkswagen/values.py | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 5620bc703c..e31095687e 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -267,8 +267,8 @@ A supported vehicle is one that just works when you install a comma device. All |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-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|Jetta GLI 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|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
|| diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index dcdb2e62bf..dd184c85f3 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -320,6 +320,7 @@ FW_VERSIONS = { b'\xf1\x8704E906024L \xf1\x895595', b'\xf1\x8704E906024L \xf1\x899970', b'\xf1\x8704E906027MS\xf1\x896223', + b'\xf1\x8705E906013DB\xf1\x893361', b'\xf1\x875G0906259T \xf1\x890003', ], (Ecu.transmission, 0x7e1, None): [ @@ -327,6 +328,7 @@ FW_VERSIONS = { b'\xf1\x8709S927158BS\xf1\x893642', b'\xf1\x8709S927158BS\xf1\x893694', b'\xf1\x8709S927158CK\xf1\x893770', + b'\xf1\x8709S927158JC\xf1\x894113', b'\xf1\x8709S927158R \xf1\x893552', b'\xf1\x8709S927158R \xf1\x893587', b'\xf1\x870GC300020N \xf1\x892803', @@ -340,6 +342,7 @@ FW_VERSIONS = { b'\xf1\x875Q0959655BR\xf1\x890403\xf1\x82\x1319170031313300314240011550159333463100', b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314642021650169333613100', b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1314171231313500314643021650169333613100', + b'\xf1\x875Q0959655CB\xf1\x890421\xf1\x82\x1317171231313500314642023050309333613100', ], (Ecu.eps, 0x712, None): [ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A10A11A1', @@ -347,9 +350,11 @@ FW_VERSIONS = { b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521B00404A1', b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A00642A1', b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A10A01A1', + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x000_A1080_OM', b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A10A11A1', ], (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', b'\xf1\x875Q0907572N \xf1\x890681', b'\xf1\x875Q0907572P \xf1\x890682', b'\xf1\x875Q0907572R \xf1\x890771', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index f4809e4523..35cb3607ec 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -223,8 +223,8 @@ CAR_INFO: Dict[str, Union[VWCarInfo, List[VWCarInfo]]] = { VWCarInfo("Volkswagen Golf SportsVan 2015-20"), ], CAR.JETTA_MK7: [ - VWCarInfo("Volkswagen Jetta 2018-22"), - VWCarInfo("Volkswagen Jetta GLI 2021-22"), + VWCarInfo("Volkswagen Jetta 2018-24"), + VWCarInfo("Volkswagen Jetta GLI 2021-24"), ], CAR.PASSAT_MK8: [ VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), From 90dbe61c7d42d6f25a9e34dc99ae49933ba670db Mon Sep 17 00:00:00 2001 From: Maddog1929 Date: Tue, 6 Feb 2024 03:43:41 -0500 Subject: [PATCH 033/923] Add fingerprint for 2018 Genesis G90 (#31271) * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update fingerprints.py * Update values.py * Update values.py * Update fingerprints.py * Update values.py * Update values.py * Update fingerprints.py changed formatting of FW value to match existing convention and removed extra FW value no longer being shown in carParam logs --- 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 35ee682b4b..f8cc12b349 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -914,12 +914,14 @@ FW_VERSIONS = { (Ecu.transmission, 0x7e1, None): [ 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 ', ], (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', ], (Ecu.engine, 0x7e0, None): [ b'\xf1\x810000000000\x00', From 769c044269b6599e718e5eb93be7f9ea8a786509 Mon Sep 17 00:00:00 2001 From: neverbread <153853262+neverbread@users.noreply.github.com> Date: Tue, 6 Feb 2024 03:56:02 -0500 Subject: [PATCH 034/923] Hyundai: add FW for 2018 Elantra GT Sport (#30732) * Update values.py * we really gotta get fuzzy FP for these date codes * format * rc --------- Co-authored-by: Shane Smiskol --- 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 f8cc12b349..b30fd1199f 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1349,22 +1349,28 @@ FW_VERSIONS = { CAR.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', 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', b'\xf1\x00PD MDPS C 1.00 1.04 56310/G3300 4PDDC104', ], (Ecu.abs, 0x7d1, None): [ b'\xf1\x00PD ESC \t 104\x18\t\x03 58920-G3350', + b'\xf1\x00PD ESC \x0b 103\x17\x110 58920-G3350', b'\xf1\x00PD ESC \x0b 104\x18\t\x03 58920-G3350', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00PD__ SCC F-CUP 1.00 1.00 96400-G3300 ', + b'\xf1\x00PD__ SCC F-CUP 1.01 1.00 96400-G3100 ', b'\xf1\x00PD__ SCC FNCUP 1.01 1.00 96400-G3000 ', ], }, From 75ea3f3e3ab6d32d4f6b0179a5dc8bc8664e64d8 Mon Sep 17 00:00:00 2001 From: dblacknc Date: Tue, 6 Feb 2024 04:10:10 -0500 Subject: [PATCH 035/923] Add fingerprint and car info for 2021 Kia Niro PHEV (#31275) * Add 2021 Kia Niro Plug-in Hybrid * Added CAR.KIA_NIRO_PHEV_2021 * Added CAR.KIA_NIRO_PHEV_2021 Created new block and moved 2022 model to it as well, with correct mass and steerRatio values. * Added 2021 Kia Niro PHEV * Added 2021 Kia Niro PHEV For now, using 2020 Niro EV torque data * Update values.py Add '21 Kia Niro PHEV to HYBRID_CAR for gas signal and DBC info * Test route for 2021 Kia Niro PHEV * Add public test route for 2021 Kia Niro PHEV * Fixed typo in test route for 2021 Kia Niro PHEV * Move '21 Kia Niro PHEV car info under '22 ...and remove other mention of '21 as distinct car * Added '21 Kia Niro PHEV fingerprint under '22 ...and removed separate car definition * Removed '21 Kia Niro PHEV as separate car, now under '22 * Removed '21 Kia Niro PHEV, now under '22 fingerprint * Removed test route for '21 Kia Niro PHEV * Update values.py Missed removing one more reference to '21 Kiro Niro PHEV, consolidating under '22. * Update selfdrive/car/hyundai/interface.py * Update selfdrive/car/hyundai/fingerprints.py * Apply suggestions from code review --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 3 ++- selfdrive/car/hyundai/fingerprints.py | 3 +++ selfdrive/car/hyundai/values.py | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index e31095687e..d82cbe2c96 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. -# 275 Supported Cars +# 276 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -138,6 +138,7 @@ A supported vehicle is one that just works when you install a comma device. All |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|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
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index b30fd1199f..37087cfcf3 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1201,15 +1201,18 @@ FW_VERSIONS = { CAR.KIA_NIRO_PHEV_2022: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x816H6G6051\x00\x00\x00\x00\x00\x00\x00\x00', + b'\xf1\x816H6G5051\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', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 99211-G5500 210428', + b'\xf1\x00DEP MFC AT USA LHD 1.00 1.06 99211-G5000 201028', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DEhe SCC F-CUP 1.00 1.00 99110-G5600 ', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index dfa4f70c2c..f7986fc202 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -248,7 +248,10 @@ CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = { 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])), ], - CAR.KIA_NIRO_PHEV_2022: HyundaiCarInfo("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + CAR.KIA_NIRO_PHEV_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])), + ], CAR.KIA_NIRO_HEV_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])), From d5821c681229fa4fbb0de6bade04e2aa1b736880 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 03:47:51 -0600 Subject: [PATCH 036/923] [bot] Fingerprints: add missing FW versions from new users (#31277) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 3 +++ selfdrive/car/honda/fingerprints.py | 1 + selfdrive/car/hyundai/fingerprints.py | 2 +- selfdrive/car/volkswagen/fingerprints.py | 2 +- 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 940d73c249..0de49f11b9 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -359,6 +359,7 @@ FW_VERSIONS = { b'68294051AG', b'68294051AI', b'68294052AG', + b'68294052AH', b'68294063AG', b'68294063AH', b'68294063AI', @@ -478,10 +479,12 @@ FW_VERSIONS = { b'05149605AE ', b'05149846AA ', b'05149848AA ', + b'05149848AC ', b'05190341AD', b'68378695AJ ', b'68378696AJ ', b'68378701AI ', + b'68378702AI ', b'68378710AL ', b'68378748AL ', b'68378758AM ', diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 0a64a73d72..62843472a3 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -985,6 +985,7 @@ FW_VERSIONS = { b'37805-RLV-F120\x00\x00', b'37805-RLV-L080\x00\x00', b'37805-RLV-L090\x00\x00', + b'37805-RLV-L150\x00\x00', b'37805-RLV-L160\x00\x00', b'37805-RLV-L180\x00\x00', b'37805-RLV-L350\x00\x00', diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 37087cfcf3..5f42ad4918 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1200,8 +1200,8 @@ FW_VERSIONS = { }, CAR.KIA_NIRO_PHEV_2022: { (Ecu.engine, 0x7e0, None): [ - b'\xf1\x816H6G6051\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\x006U3J9051\x00\x00PDE0G16NL3\x00\x00\x00\x00', diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index dd184c85f3..8e5a0667bd 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -346,11 +346,11 @@ FW_VERSIONS = { ], (Ecu.eps, 0x712, None): [ b'\xf1\x873Q0909144M \xf1\x895082\xf1\x82\x0571A10A11A1', + b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x000_A1080_OM', b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521A10A01A1', b'\xf1\x875QM909144B \xf1\x891081\xf1\x82\x0521B00404A1', b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A00642A1', b'\xf1\x875QM909144C \xf1\x891082\xf1\x82\x0521A10A01A1', - b'\xf1\x875QM907144D \xf1\x891063\xf1\x82\x000_A1080_OM', b'\xf1\x875QN909144B \xf1\x895082\xf1\x82\x0571A10A11A1', ], (Ecu.fwdRadar, 0x757, None): [ From 7fe375f158f6d0ed4fdf27c449b90b9d0257ceea Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 6 Feb 2024 11:11:58 -0800 Subject: [PATCH 037/923] [bot] Bump submodules (#31299) bump submodules Co-authored-by: jnewb1 --- cereal | 2 +- panda | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cereal b/cereal index c54369f8ad..80e1e55f0d 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit c54369f8ad4e0bcb18c96feb4334755c6f65e8f1 +Subproject commit 80e1e55f0dd71cea7f596e8b80c7c33865b689f3 diff --git a/panda b/panda index 457e3b262d..f48fc21a17 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 457e3b262d798aa6e400033c92d12a0b0f52a7ed +Subproject commit f48fc21a17079bc04cfb3d8042fd2d67d0aac104 From 88b635c4e10d5a3781bdff3cc34856566598da8e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 15:50:44 -0500 Subject: [PATCH 038/923] jenkins: cleanup stage names for analysis (#31327) fix names --- Jenkinsfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d3b3444991..dffffae7f7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -205,7 +205,7 @@ node { ]) }, 'HW + Unit Tests': { - deviceStage("tici", "tici-common", ["UNSAFE=1"], [ + deviceStage("tici-hardware", "tici-common", ["UNSAFE=1"], [ ["build", "cd selfdrive/manager && ./build.py"], ["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py", ["panda/", "selfdrive/boardd/"]], ["test power draw", "pytest -s system/hardware/tici/tests/test_power_draw.py"], @@ -215,7 +215,7 @@ node { ]) }, 'loopback': { - deviceStage("tici", "tici-loopback", ["UNSAFE=1"], [ + deviceStage("loopback", "tici-loopback", ["UNSAFE=1"], [ ["build openpilot", "cd selfdrive/manager && ./build.py"], ["test boardd loopback", "pytest selfdrive/boardd/tests/test_boardd_loopback.py"], ]) @@ -243,7 +243,7 @@ node { ]) }, 'replay': { - deviceStage("tici", "tici-replay", ["UNSAFE=1"], [ + deviceStage("model-replay", "tici-replay", ["UNSAFE=1"], [ ["build", "cd selfdrive/manager && ./build.py"], ["model replay", "selfdrive/test/process_replay/model_replay.py"], ]) From 0af62eb3b0027ae1081074cb486554a366dff6fc Mon Sep 17 00:00:00 2001 From: dzid26 Date: Tue, 6 Feb 2024 21:19:01 +0000 Subject: [PATCH 039/923] camerastream instructions (#31326) * camerastream instructions * Update README.md * Update tools/README.md --------- Co-authored-by: Adeeb Shihadeh --- tools/README.md | 1 + tools/camerastream/README.md | 66 +++++++++++++++++++++++++++ tools/camerastream/compressed_vipc.py | 4 ++ 3 files changed, 71 insertions(+) create mode 100644 tools/camerastream/README.md diff --git a/tools/README.md b/tools/README.md index 315db3a75f..361a27deda 100644 --- a/tools/README.md +++ b/tools/README.md @@ -68,6 +68,7 @@ Learn about the openpilot ecosystem and tools by playing our [CTF](/tools/CTF.md ├── ubuntu_setup.sh # Setup script for Ubuntu ├── mac_setup.sh # Setup script for macOS ├── cabana/ # View and plot CAN messages from drives or in realtime +├── camerastream/ # Cameras stream over the network ├── joystick/ # Control your car with a joystick ├── lib/ # Libraries to support the tools and reading openpilot logs ├── plotjuggler/ # A tool to plot openpilot logs diff --git a/tools/camerastream/README.md b/tools/camerastream/README.md new file mode 100644 index 0000000000..76133f07cd --- /dev/null +++ b/tools/camerastream/README.md @@ -0,0 +1,66 @@ +# Camera stream + +`compressed_vipc.py` connects to a remote device running openpilot, decodes the video streams, and republishes them over VisionIPC. + +## Usage + +### On the device +SSH into the device and run following in separate terminals: + +`cd /data/openpilot/cereal/messaging && ./bridge` + +`cd /data/openpilot/system/loggerd && ./encoderd` + +`cd /data/openpilot/system/camerad && ./camerad` + +Note that both the device and your PC must be on the same openpilot commit. + +Alternatively paste this as a single command: +``` +( + cd /data/openpilot/cereal/messaging/ + ./bridge & + + cd /data/openpilot/system/camerad/ + ./camerad & + + cd /data/openpilot/system/loggerd/ + ./encoderd & + + wait +) ; trap 'kill $(jobs -p)' SIGINT +``` +Ctrl+C will stop all three processes. + +### On the PC +Decode the stream with `compressed_vipc.py`: + +```cd ~/openpilot/tools/camerastream && ./compressed_vipc.py ``` + +To actually display the stream, run `watch3` in separate terminal: + +```cd ~/openpilot/selfdrive/ui/ && ./watch3``` + +## compressed_vipc.py usage +``` +$ python compressed_vipc.py -h +usage: compressed_vipc.py [-h] [--nvidia] [--cams CAMS] [--silent] addr + +Decode video streams and broadcast on VisionIPC + +positional arguments: + addr Address of comma three + +options: + -h, --help show this help message and exit + --nvidia Use nvidia instead of ffmpeg + --cams CAMS Cameras to decode + --silent Suppress debug output +``` + + +## Example: +``` +cd ~/openpilot/tools/camerastream && ./compressed_vipc.py comma-ffffffff --cams 0 +cd ~/openpilot/selfdrive/ui/ && ./watch3 +``` diff --git a/tools/camerastream/compressed_vipc.py b/tools/camerastream/compressed_vipc.py index 6e4ad3866e..f1a6f230fa 100755 --- a/tools/camerastream/compressed_vipc.py +++ b/tools/camerastream/compressed_vipc.py @@ -12,6 +12,10 @@ from cereal.visionipc import VisionIpcServer, VisionStreamType V4L2_BUF_FLAG_KEYFRAME = 8 +# start encoderd +# also start cereal messaging bridge +# then run this "./compressed_vipc.py " + ENCODE_SOCKETS = { VisionStreamType.VISION_STREAM_ROAD: "roadEncodeData", VisionStreamType.VISION_STREAM_WIDE_ROAD: "wideRoadEncodeData", From 052519570dea002a9c9a5e4b0c7cfc6d3c180e38 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 16:35:08 -0500 Subject: [PATCH 040/923] jenkins: lock device resource first before making container (#31330) lock first --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index dffffae7f7..ef1996d701 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -78,8 +78,8 @@ def deviceStage(String stageName, String deviceType, List extra_env, def steps) def extra = extra_env.collect { "export ${it}" }.join('\n'); def branch = env.BRANCH_NAME ?: 'master'; - docker.image('ghcr.io/commaai/alpine-ssh').inside('--user=root') { - lock(resource: "", label: deviceType, inversePrecedence: true, variable: 'device_ip', quantity: 1, resourceSelectStrategy: 'random') { + lock(resource: "", label: deviceType, inversePrecedence: true, variable: 'device_ip', quantity: 1, resourceSelectStrategy: 'random') { + docker.image('ghcr.io/commaai/alpine-ssh').inside('--user=root') { timeout(time: 20, unit: 'MINUTES') { retry (3) { device(device_ip, "git checkout", extra + "\n" + readFile("selfdrive/test/setup_device_ci.sh")) From 03c183cb052ff1d9da5c7a927f0abbb37434fe2a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 16:51:55 -0500 Subject: [PATCH 041/923] jenkins: limit cpu and memory (#31329) * limit that * we can use 32g * addopts * half --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ef1996d701..392253e845 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -106,7 +106,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}"; + 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 .") From 1185645271705cd93c4c021688c8913aa83a44b2 Mon Sep 17 00:00:00 2001 From: Tico Fortes Date: Wed, 7 Feb 2024 00:55:01 +0100 Subject: [PATCH 042/923] Add fingerprint Hyundai Tucson Hibrid 2022 Europe (#31291) --- 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 5f42ad4918..1f8f85b78f 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1568,6 +1568,7 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 2.02 99211-N9000 14E', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9210 14G', + b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9220 14K', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9240 14Q', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9250 14W', @@ -1578,6 +1579,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00NX4__ 1.00 1.00 99110-N9100 ', b'\xf1\x00NX4__ 1.00 1.01 99110-N9000 ', + b'\xf1\x00NX4__ 1.00 1.02 99110-N9000 ', b'\xf1\x00NX4__ 1.01 1.00 99110-N9100 ', ], }, From 30dd1087ea556febcb0830cbe4b8c425206ef733 Mon Sep 17 00:00:00 2001 From: gaanthony Date: Tue, 6 Feb 2024 19:00:24 -0500 Subject: [PATCH 043/923] Update fingerprints.py - for 2023 Kia Sorento X-Line SX Prestige (#31286) * Update fingerprints.py - for 2023 Kia Sorento X-Line SX Prestige * Update fingerprints.py - fix file for unit tests * Update fingerprints.py trailing --------- Co-authored-by: Justin Newberry --- 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 1f8f85b78f..3096c3e199 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1640,6 +1640,7 @@ FW_VERSIONS = { b'\xf1\x00MQ4_ SCC F-CUP 1.00 1.06 99110-P2000 ', b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.06 99110-P2000 ', b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.08 99110-P2000 ', + b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.00 99110-R5000 ', ], }, CAR.KIA_SORENTO_HEV_4TH_GEN: { From 66dc7030de1b39bd814cc20091d22ec38976523b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 19:50:30 -0500 Subject: [PATCH 044/923] test_models: cleanup by using new logreader (#31267) * cleanup * only check error * this segment only * fix * fix * keep this * fix internal --- selfdrive/car/tests/test_models.py | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 537214d14c..85472c756d 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -23,9 +23,8 @@ from openpilot.selfdrive.car.tests.routes import non_tested_cars, routes, CarTes 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 -from openpilot.tools.lib.comma_car_segments import get_url -from openpilot.tools.lib.logreader import LogReader -from openpilot.tools.lib.route import Route, SegmentName, RouteName +from openpilot.tools.lib.logreader import LogReader, internal_source, openpilotci_source +from openpilot.tools.lib.route import SegmentName from panda.tests.libpanda import libpanda_py @@ -75,14 +74,6 @@ class TestCarModelBase(unittest.TestCase): elm_frame: Optional[int] car_safety_mode_frame: Optional[int] - @classmethod - def get_logreader(cls, seg): - if len(INTERNAL_SEG_LIST): - route_name = RouteName(cls.test_route.route) - return LogReader(f"cd:/{route_name.dongle_id}/{route_name.time_str}/{seg}/rlog.bz2") - else: - return LogReader(get_url(cls.test_route.route, seg)) - @classmethod def get_testing_data_from_logreader(cls, lr): car_fw = [] @@ -133,22 +124,26 @@ class TestCarModelBase(unittest.TestCase): if cls.test_route.segment is not None: test_segs = (cls.test_route.segment,) - # Try the primary method first (CI or internal) + is_internal = len(INTERNAL_SEG_LIST) + for seg in test_segs: + segment_range = f"{cls.test_route.route}/{seg}" + try: - lr = cls.get_logreader(seg) + lr = LogReader(segment_range, default_source=internal_source if is_internal else openpilotci_source) return cls.get_testing_data_from_logreader(lr) except Exception: pass # Route is not in CI bucket, assume either user has access (private), or it is public # test_route_on_ci_bucket will fail when running in CI - if not len(INTERNAL_SEG_LIST): + if not is_internal: cls.test_route_on_bucket = False for seg in test_segs: + segment_range = f"{cls.test_route.route}/{seg}" try: - lr = LogReader(Route(cls.test_route.route).log_paths()[seg]) + lr = LogReader(segment_range) return cls.get_testing_data_from_logreader(lr) except Exception: pass From ceecf39c54e95e1bf973ea221fb3c5e7f215aecb Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 20:11:00 -0500 Subject: [PATCH 045/923] Docker: merge opencl and base images (#31338) * mergeem * don't change workdir --- .github/workflows/selfdrive_tests.yaml | 21 ++------------ .github/workflows/tools_tests.yaml | 7 ----- Dockerfile.openpilot_base | 38 ++++++++++++++++++++++++++ Dockerfile.openpilot_base_cl | 37 ------------------------- selfdrive/test/docker_common.sh | 3 -- tools/sim/Dockerfile.sim | 2 +- tools/sim/build_container.sh | 2 +- 7 files changed, 43 insertions(+), 67 deletions(-) delete mode 100644 Dockerfile.openpilot_base_cl diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 860cfa48f7..37545cf06d 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -14,7 +14,6 @@ concurrency: env: PYTHONWARNINGS: error BASE_IMAGE: openpilot-base - CL_BASE_IMAGE: openpilot-base-cl AZURE_TOKEN: ${{ secrets.AZURE_COMMADATACI_OPENPILOTCI_TOKEN }} DOCKER_LOGIN: docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} @@ -22,10 +21,6 @@ env: RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PRE_COMMIT_HOME=/tmp/pre-commit -e PYTHONWARNINGS=error -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/pre-commit:/tmp/pre-commit -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c - BUILD_CL: selfdrive/test/docker_build.sh cl - - RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PYTHONWARNINGS=error -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c - PYTEST: pytest --continue-on-collection-errors --cov --cov-report=xml --cov-append --durations=0 --durations-min=5 --hypothesis-seed 0 -n logical jobs: @@ -106,11 +101,6 @@ jobs: - uses: ./.github/workflows/setup-with-retry with: docker_hub_pat: ${{ secrets.DOCKER_HUB_PAT }} - - name: Build and push CL Docker image - if: matrix.arch == 'x86_64' - run: | - unset TARGET_ARCHITECTURE - eval "$BUILD_CL" docker_push_multiarch: name: docker push multiarch tag @@ -258,15 +248,13 @@ jobs: key: regen-${{ hashFiles('.github/workflows/selfdrive_tests.yaml', 'selfdrive/test/process_replay/test_regen.py') }} - name: Build base Docker image run: eval "$BUILD" - - name: Build Docker image - run: eval "$BUILD_CL" - name: Build openpilot run: | ${{ env.RUN }} "scons -j$(nproc)" - name: Run regen timeout-minutes: 30 run: | - ${{ env.RUN_CL }} "ONNXCPU=1 $PYTEST selfdrive/test/process_replay/test_regen.py && \ + ${{ env.RUN }} "ONNXCPU=1 $PYTEST selfdrive/test/process_replay/test_regen.py && \ chmod -R 777 /tmp/comma_download_cache" test_modeld: @@ -279,9 +267,6 @@ jobs: - uses: ./.github/workflows/setup-with-retry - name: Build base Docker image run: eval "$BUILD" - - name: Build Docker image - # Sim docker is needed to get the OpenCL drivers - run: eval "$BUILD_CL" - name: Build openpilot run: | ${{ env.RUN }} "scons -j$(nproc)" @@ -289,14 +274,14 @@ jobs: - name: Run model replay with ONNX timeout-minutes: 4 run: | - ${{ env.RUN_CL }} "unset PYTHONWARNINGS && \ + ${{ env.RUN }} "unset PYTHONWARNINGS && \ ONNXCPU=1 NO_NAV=1 coverage run selfdrive/test/process_replay/model_replay.py && \ coverage combine && \ coverage xml" - name: Run unit tests timeout-minutes: 4 run: | - ${{ env.RUN_CL }} "unset PYTHONWARNINGS && \ + ${{ env.RUN }} "unset PYTHONWARNINGS && \ $PYTEST selfdrive/modeld" - name: "Upload coverage to Codecov" uses: codecov/codecov-action@v3 diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index c185fd1d3c..8f92c82339 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -12,17 +12,12 @@ concurrency: env: BASE_IMAGE: openpilot-base - CL_BASE_IMAGE: openpilot-base-cl DOCKER_LOGIN: docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} BUILD: selfdrive/test/docker_build.sh base RUN: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c - BUILD_CL: selfdrive/test/docker_build.sh cl - - RUN_CL: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c - jobs: plotjuggler: @@ -52,8 +47,6 @@ jobs: with: submodules: true - uses: ./.github/workflows/setup-with-retry - - name: Build base cl image - run: eval "$BUILD_CL" - name: Setup to push to repo if: github.ref == 'refs/heads/master' && github.repository == 'commaai/openpilot' run: | diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index d280d2c9ec..a6c4c71790 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -22,6 +22,44 @@ RUN cd /tmp && \ rm -rf arm/ && \ rm -rf thumb/nofp thumb/v6* thumb/v8* thumb/v7+fp thumb/v7-r+fp.sp +# Add OpenCL +RUN apt-get update && apt-get install -y --no-install-recommends \ + apt-utils \ + alien \ + unzip \ + tar \ + curl \ + xz-utils \ + dbus \ + gcc-arm-none-eabi \ + tmux \ + vim \ + lsb-core \ + libx11-6 \ + && rm -rf /var/lib/apt/lists/* + +ARG INTEL_DRIVER=l_opencl_p_18.1.0.015.tgz +ARG INTEL_DRIVER_URL=https://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/15532 +RUN mkdir -p /tmp/opencl-driver-intel + +RUN cd /tmp/opencl-driver-intel && \ + echo INTEL_DRIVER is $INTEL_DRIVER && \ + curl -O $INTEL_DRIVER_URL/$INTEL_DRIVER && \ + tar -xzf $INTEL_DRIVER && \ + for i in $(basename $INTEL_DRIVER .tgz)/rpm/*.rpm; do alien --to-deb $i; done && \ + dpkg -i *.deb && \ + rm -rf $INTEL_DRIVER $(basename $INTEL_DRIVER .tgz) *.deb && \ + mkdir -p /etc/OpenCL/vendors && \ + echo /opt/intel/opencl_compilers_and_libraries_18.1.0.015/linux/compiler/lib/intel64_lin/libintelocl.so > /etc/OpenCL/vendors/intel.icd && \ + cd / && \ + rm -rf /tmp/opencl-driver-intel + +ENV NVIDIA_VISIBLE_DEVICES all +ENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,compute +ENV QTWEBENGINE_DISABLE_SANDBOX 1 + +RUN dbus-uuidgen > /etc/machine-id + ARG USER=batman ARG USER_UID=1000 RUN useradd -m -s /bin/bash -u $USER_UID $USER diff --git a/Dockerfile.openpilot_base_cl b/Dockerfile.openpilot_base_cl deleted file mode 100644 index 4c8ecfc78d..0000000000 --- a/Dockerfile.openpilot_base_cl +++ /dev/null @@ -1,37 +0,0 @@ -FROM ghcr.io/commaai/openpilot-base:latest - -RUN apt-get update && apt-get install -y --no-install-recommends\ - apt-utils \ - alien \ - unzip \ - tar \ - curl \ - xz-utils \ - dbus \ - gcc-arm-none-eabi \ - tmux \ - vim \ - lsb-core \ - libx11-6 \ - && rm -rf /var/lib/apt/lists/* - -# Intel OpenCL driver -ARG INTEL_DRIVER=l_opencl_p_18.1.0.015.tgz -ARG INTEL_DRIVER_URL=https://registrationcenter-download.intel.com/akdlm/irc_nas/vcp/15532 -RUN mkdir -p /tmp/opencl-driver-intel -WORKDIR /tmp/opencl-driver-intel -RUN echo INTEL_DRIVER is $INTEL_DRIVER && \ - curl -O $INTEL_DRIVER_URL/$INTEL_DRIVER && \ - tar -xzf $INTEL_DRIVER && \ - for i in $(basename $INTEL_DRIVER .tgz)/rpm/*.rpm; do alien --to-deb $i; done && \ - dpkg -i *.deb && \ - rm -rf $INTEL_DRIVER $(basename $INTEL_DRIVER .tgz) *.deb && \ - mkdir -p /etc/OpenCL/vendors && \ - echo /opt/intel/opencl_compilers_and_libraries_18.1.0.015/linux/compiler/lib/intel64_lin/libintelocl.so > /etc/OpenCL/vendors/intel.icd && \ - rm -rf /tmp/opencl-driver-intel -ENV NVIDIA_VISIBLE_DEVICES all -ENV NVIDIA_DRIVER_CAPABILITIES graphics,utility,compute -ENV QTWEBENGINE_DISABLE_SANDBOX 1 - -RUN dbus-uuidgen > /etc/machine-id - diff --git a/selfdrive/test/docker_common.sh b/selfdrive/test/docker_common.sh index 92da71ba66..f8a423762d 100644 --- a/selfdrive/test/docker_common.sh +++ b/selfdrive/test/docker_common.sh @@ -7,9 +7,6 @@ elif [ "$1" = "sim" ]; then elif [ "$1" = "prebuilt" ]; then export DOCKER_IMAGE=openpilot-prebuilt export DOCKER_FILE=Dockerfile.openpilot -elif [ "$1" = "cl" ]; then - export DOCKER_IMAGE=openpilot-base-cl - export DOCKER_FILE=Dockerfile.openpilot_base_cl else echo "Invalid docker build image: '$1'" exit 1 diff --git a/tools/sim/Dockerfile.sim b/tools/sim/Dockerfile.sim index a183002589..cb573b33f2 100644 --- a/tools/sim/Dockerfile.sim +++ b/tools/sim/Dockerfile.sim @@ -1,4 +1,4 @@ -FROM ghcr.io/commaai/openpilot-base-cl:latest +FROM ghcr.io/commaai/openpilot-base:latest RUN apt-get update && apt-get install -y --no-install-recommends \ tmux \ diff --git a/tools/sim/build_container.sh b/tools/sim/build_container.sh index 81afb82d83..451277d590 100755 --- a/tools/sim/build_container.sh +++ b/tools/sim/build_container.sh @@ -3,7 +3,7 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" cd $DIR/../../ -docker pull ghcr.io/commaai/openpilot-base-cl:latest +docker pull ghcr.io/commaai/openpilot-base:latest docker build \ --cache-from ghcr.io/commaai/openpilot-sim:latest \ -t ghcr.io/commaai/openpilot-sim:latest \ From aa43252dc5c003e311885d08496e6a77271294f4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 22:16:41 -0500 Subject: [PATCH 046/923] bump opendbc (#31340) bumpitup --- opendbc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opendbc b/opendbc index 7397e466d9..3d1be8427a 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 7397e466d9cfd7f5bc1f49218b8d2afeedec582b +Subproject commit 3d1be8427a7e801e7da4e8506e5d5c2605de9176 From 530902dfadb2cd17d8739cdd9c56b0c0c4192871 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 6 Feb 2024 22:23:37 -0500 Subject: [PATCH 047/923] bump metadrive (#31342) bump --- poetry.lock | 41 +++++++++++++++++++++-------------------- pyproject.toml | 2 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5b0c6c20b2..f4d396985e 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.5.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -2194,13 +2194,13 @@ files = [ [[package]] name = "metadrive-simulator" -version = "0.4.2.2" +version = "0.4.2.3" description = "An open-ended driving simulator with infinite scenes" optional = false python-versions = ">=3.6, <3.12" files = [ - {file = "metadrive-simulator-0.4.2.2.tar.gz", hash = "sha256:dcce9f9c73b6055e70480af8543058b95e8c4f68d2595107f3ef36c9be03f6bb"}, - {file = "metadrive_simulator-0.4.2.2-py3-none-any.whl", hash = "sha256:165ba0b5275313a71090ba0e73d51b7b5e05391b071d3a2114d999ac9287d150"}, + {file = "metadrive-simulator-0.4.2.3.tar.gz", hash = "sha256:bcda7d07146128161b0bc2cc337e01612b9222202706370043b52f7936a8a277"}, + {file = "metadrive_simulator-0.4.2.3-py3-none-any.whl", hash = "sha256:f6fff20b931bb956c55e0e81bf1f6b641169a84a4c853435a8b26bd51c8e9876"}, ] [package.dependencies] @@ -2692,7 +2692,14 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} +numpy = [ + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, +] [[package]] name = "opencv-python-headless" @@ -2711,7 +2718,14 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} +numpy = [ + {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, + {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, + {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, + {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, + {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, +] [[package]] name = "packaging" @@ -3332,8 +3346,6 @@ files = [ {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, - {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, - {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, @@ -6733,7 +6745,6 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6741,16 +6752,8 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {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"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6767,7 +6770,6 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6775,7 +6777,6 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -7829,4 +7830,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "8af315a175ab43dbc5a777f68fca6d76af1443b5b574ab8570ef5dad59f288fc" +content-hash = "cb63112bfe7ee2b3fc194a422479f788c9a8027d445ea51a31f4ee20299beb53" diff --git a/pyproject.toml b/pyproject.toml index 116c034bc9..518d7c969c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -126,7 +126,7 @@ inputs = "*" Jinja2 = "*" lru-dict = "*" matplotlib = "*" -metadrive-simulator = { version = "0.4.2.2", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies +metadrive-simulator = { version = "0.4.2.3", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies mpld3 = "*" mypy = "*" myst-parser = "*" From a07259d7656c2f0d6184f903b8c09ef8e6ef585e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 21:37:15 -0600 Subject: [PATCH 048/923] HKG: mark queries as logging (#31343) * should be logging * fix 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 f7986fc202..84447a485a 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -447,13 +447,14 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), - # CAN-FD debugging queries + # CAN-FD alt request logging queries Request( [HYUNDAI_VERSION_REQUEST_ALT], [HYUNDAI_VERSION_RESPONSE], whitelist_ecus=[Ecu.parkingAdas, Ecu.hvac], bus=0, auxiliary=True, + logging=True, ), Request( [HYUNDAI_VERSION_REQUEST_ALT], @@ -461,6 +462,7 @@ FW_QUERY_CONFIG = FwQueryConfig( whitelist_ecus=[Ecu.parkingAdas, Ecu.hvac], bus=1, auxiliary=True, + logging=True, obd_multiplexing=False, ), ], From 4ec0ed311c4def6106911c24d5a19e6a9b1fbfd2 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 22:10:06 -0600 Subject: [PATCH 049/923] FW query timing test: fix total reference time (#31344) * We never had any bus 0 logging queries for CAN! * should be logging * try all, and try on can fd as well * update refs * oof forgot about hda2 can fd where pt is bus 1 * sheesh * fix the timing * not here * revert * this just simply measured the total time of all the brands with aux queries (1.25s) * clean up --- selfdrive/car/tests/test_fw_fingerprint.py | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 064f2e5651..4c07abb026 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -254,7 +254,7 @@ class TestFwFingerprintTiming(unittest.TestCase): @pytest.mark.timeout(60) def test_fw_query_timing(self): - total_ref_time = 6.8 + total_ref_time = {1: 5.55, 2: 6.05} brand_ref_times = { 1: { 'gm': 0.5, @@ -276,24 +276,27 @@ class TestFwFingerprintTiming(unittest.TestCase): } } - total_time = 0 + total_times = {1: 0.0, 2: 0.0} for num_pandas in (1, 2): for brand, config in FW_QUERY_CONFIGS.items(): with self.subTest(brand=brand, num_pandas=num_pandas): - multi_panda_requests = [r for r in config.requests if r.bus > 3] - if not len(multi_panda_requests) and num_pandas > 1: - raise unittest.SkipTest("No multi-panda FW queries") - avg_time = self._benchmark_brand(brand, num_pandas) - total_time += avg_time + total_times[num_pandas] += avg_time avg_time = round(avg_time, 2) - self._assert_timing(avg_time, brand_ref_times[num_pandas][brand]) + + ref_time = brand_ref_times[num_pandas].get(brand) + if ref_time is None: + # ref time should be same as 1 panda if no aux queries + ref_time = brand_ref_times[num_pandas - 1][brand] + + self._assert_timing(avg_time, ref_time) print(f'{brand=}, {num_pandas=}, {len(config.requests)=}, avg FW query time={avg_time} seconds') - with self.subTest(brand='all_brands'): - total_time = round(total_time, 2) - self._assert_timing(total_time, total_ref_time) - print(f'all brands, total FW query time={total_time} seconds') + for num_pandas in (1, 2): + with self.subTest(brand='all_brands', num_pandas=num_pandas): + total_time = round(total_times[num_pandas], 2) + self._assert_timing(total_time, total_ref_time[num_pandas]) + print(f'all brands, total FW query time={total_time} seconds') if __name__ == "__main__": From bcd29a2b8af7c7364040716926d5c18ccd89ca7c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 6 Feb 2024 22:37:26 -0600 Subject: [PATCH 050/923] Hyundai: add PT queries for all ECUs (#31334) * We never had any bus 0 logging queries for CAN! * should be logging * try all, and try on can fd as well * update refs * oof forgot about hda2 can fd where pt is bus 1 * sheesh * fix the timing * fix ref --- selfdrive/car/hyundai/values.py | 29 ++++++++++++++++++++++ selfdrive/car/tests/test_fw_fingerprint.py | 6 ++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 84447a485a..eef31222fe 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -414,6 +414,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] + FW_QUERY_CONFIG = FwQueryConfig( requests=[ # TODO: minimize shared whitelists for CAN and cornerRadar for CAN-FD @@ -447,6 +449,33 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), + # 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 Request( [HYUNDAI_VERSION_REQUEST_ALT], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 4c07abb026..73472b7a11 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -254,7 +254,7 @@ class TestFwFingerprintTiming(unittest.TestCase): @pytest.mark.timeout(60) def test_fw_query_timing(self): - total_ref_time = {1: 5.55, 2: 6.05} + total_ref_time = {1: 5.85, 2: 6.65} brand_ref_times = { 1: { 'gm': 0.5, @@ -262,7 +262,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'chrysler': 0.3, 'ford': 0.1, 'honda': 0.55, - 'hyundai': 0.65, + 'hyundai': 0.95, 'mazda': 0.1, 'nissan': 0.8, 'subaru': 0.45, @@ -272,7 +272,7 @@ class TestFwFingerprintTiming(unittest.TestCase): }, 2: { 'ford': 0.2, - 'hyundai': 1.05, + 'hyundai': 1.65, } } From 28276a448562d158adb8ea0ffaeaf294bf4219d4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 6 Feb 2024 22:32:37 -0800 Subject: [PATCH 051/923] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index f48fc21a17..ad0f372ada 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit f48fc21a17079bc04cfb3d8042fd2d67d0aac104 +Subproject commit ad0f372adabef438d67340c6b9c76ba7146d0671 From 8a00b30029c80ca71a0596134d1d91db8f5b24f0 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 03:04:27 -0500 Subject: [PATCH 052/923] jenkins: spilt car tests in two steps (#31346) fix --- Jenkinsfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 392253e845..09c893268b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -272,8 +272,9 @@ node { 'car tests': { pcStage("car tests") { sh label: "build", script: "selfdrive/manager/build.py" - sh label: "run car tests", script: "cd selfdrive/car/tests && MAX_EXAMPLES=300 INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 \ - INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt pytest test_models.py test_car_interfaces.py" + sh label: "test_models", script: "INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt \ + pytest selfdrive/car/tests/test_models.py" + sh label: "test_car_interfaces", script: "MAX_EXAMPLES=300 pytest selfdrive/car/tests/test_car_interfaces.py" } }, From fabec9964584ace9063fc92203bf9f6912f47310 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 02:07:01 -0600 Subject: [PATCH 053/923] Hyundai: log camera manufacture date (#31345) * log manufac date * oof * should be safe * update refs --- selfdrive/car/hyundai/values.py | 14 ++++++++++++++ selfdrive/car/tests/test_fw_fingerprint.py | 6 +++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index eef31222fe..20fc29897d 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -396,6 +396,9 @@ HYUNDAI_VERSION_REQUEST_MULTI = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER] 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) + HYUNDAI_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) # Regex patterns for parsing platform code, FW date, and part number from FW versions @@ -449,6 +452,17 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), + # CAN & CAN FD query to understand the three digit date code + # HDA2 cars usually use 6 digit date codes, so skip bus 1 + 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], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 73472b7a11..d8e3296985 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -254,7 +254,7 @@ class TestFwFingerprintTiming(unittest.TestCase): @pytest.mark.timeout(60) def test_fw_query_timing(self): - total_ref_time = {1: 5.85, 2: 6.65} + total_ref_time = {1: 5.95, 2: 6.85} brand_ref_times = { 1: { 'gm': 0.5, @@ -262,7 +262,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'chrysler': 0.3, 'ford': 0.1, 'honda': 0.55, - 'hyundai': 0.95, + 'hyundai': 1.05, 'mazda': 0.1, 'nissan': 0.8, 'subaru': 0.45, @@ -272,7 +272,7 @@ class TestFwFingerprintTiming(unittest.TestCase): }, 2: { 'ford': 0.2, - 'hyundai': 1.65, + 'hyundai': 1.85, } } From 8f5dcb30199faf0e1e89f0b6ad6a3af3880afc1e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 02:23:16 -0600 Subject: [PATCH 054/923] HKG CAN FD: potentially get VIN without OBD port on some platforms (#31348) * add cluster * think this works * update refs not 1 * only add the new address * bb * comment --- selfdrive/car/fw_query_definitions.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 1d6104574e..ed886a69db 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -15,7 +15,9 @@ LiveFwVersions = Dict[AddrType, Set[bytes]] OfflineFwVersions = Dict[str, Dict[EcuAddrSubAddr, List[bytes]]] # A global list of addresses we will only ever consider for VIN responses -STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x18da10f1, 0x18da0ef1] # engine, hybrid controller, Ford abs, 29-bit engine, PGM-FI +# engine, hybrid controller, Ford abs, Hyundai CAN FD cluster, 29-bit engine, PGM-FI +# TODO: move these to each brand's FW query config +STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x7c4, 0x18da10f1, 0x18da0ef1] def p16(val): From 6933d0560aa37e9cdace3a9b8adda85bd774ec6f Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 11:35:32 -0500 Subject: [PATCH 055/923] Pytest: reenable gc in pytest fixture + re-combine jenkins car tests (#31351) * Revert "jenkins: spilt car tests in two steps (#31346)" This reverts commit 8a00b30029c80ca71a0596134d1d91db8f5b24f0. * enable gc * codespell * useless comment --- Jenkinsfile | 5 ++--- conftest.py | 6 ++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 09c893268b..392253e845 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -272,9 +272,8 @@ node { 'car tests': { pcStage("car tests") { sh label: "build", script: "selfdrive/manager/build.py" - sh label: "test_models", script: "INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt \ - pytest selfdrive/car/tests/test_models.py" - sh label: "test_car_interfaces", script: "MAX_EXAMPLES=300 pytest selfdrive/car/tests/test_car_interfaces.py" + sh label: "run car tests", script: "cd selfdrive/car/tests && MAX_EXAMPLES=300 INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 \ + INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt pytest test_models.py test_car_interfaces.py" } }, diff --git a/conftest.py b/conftest.py index e215bb8b4c..544025e180 100644 --- a/conftest.py +++ b/conftest.py @@ -1,3 +1,4 @@ +import gc import os import pytest import random @@ -45,6 +46,11 @@ def openpilot_function_fixture(request): # cleanup any started processes manager.manager_cleanup() + # some processes disable gc for performance, re-enable here + if not gc.isenabled(): + gc.enable() + gc.collect() + # If you use setUpClass, the environment variables won't be cleared properly, # so we need to hook both the function and class pytest fixtures @pytest.fixture(scope="class", autouse=True) From 8f67d3cab9bb7031f3350b0c320606aa843503d5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 14:33:52 -0500 Subject: [PATCH 056/923] jenkins: remove pc / car tests (#31353) * move to scripts * clean first * cant have test_*? * move --- Jenkinsfile | 18 ------------------ selfdrive/car/tests/big_cars_test.sh | 8 ++++++++ selfdrive/test/scons_build_test.sh | 6 ++++++ 3 files changed, 14 insertions(+), 18 deletions(-) create mode 100755 selfdrive/car/tests/big_cars_test.sh create mode 100755 selfdrive/test/scons_build_test.sh diff --git a/Jenkinsfile b/Jenkinsfile index 392253e845..d678535fd4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -259,24 +259,6 @@ node { ]) }, - // *** PC tests *** - 'PC tests': { - pcStage("PC tests") { - // tests that our build system's dependencies are configured properly, - // needs a machine with lots of cores - sh label: "test multi-threaded build", - script: '''#!/bin/bash - scons --no-cache --random -j$(nproc)''' - } - }, - 'car tests': { - pcStage("car tests") { - sh label: "build", script: "selfdrive/manager/build.py" - sh label: "run car tests", script: "cd selfdrive/car/tests && MAX_EXAMPLES=300 INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 \ - INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt pytest test_models.py test_car_interfaces.py" - } - }, - ) } } catch (Exception e) { diff --git a/selfdrive/car/tests/big_cars_test.sh b/selfdrive/car/tests/big_cars_test.sh new file mode 100755 index 0000000000..6142fe8411 --- /dev/null +++ b/selfdrive/car/tests/big_cars_test.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +MAX_EXAMPLES=300 +INTERNAL_SEG_CNT=300 +FILEREADER_CACHE=1 +INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt + +cd selfdrive/car/tests && pytest test_models.py test_car_interfaces.py \ No newline at end of file diff --git a/selfdrive/test/scons_build_test.sh b/selfdrive/test/scons_build_test.sh new file mode 100755 index 0000000000..7614017c55 --- /dev/null +++ b/selfdrive/test/scons_build_test.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# tests that our build system's dependencies are configured properly, +# needs a machine with lots of cores +scons --clean +scons --no-cache --random -j$(nproc) \ No newline at end of file From 879e2521ac59d2440455ef362bce8f8ac643f658 Mon Sep 17 00:00:00 2001 From: Nelson Chen Date: Wed, 7 Feb 2024 11:45:12 -0800 Subject: [PATCH 057/923] Lexus LC 2024 (#31199) * Initial pass * Add physical measurements for LEXUS_LC_2024 * Add new test route for TOYOTA.LEXUS_LC_TSS2 * Add new public-OK test route for TOYOTA.LEXUS_LC_TSS2 * update docs * | not / --------- Co-authored-by: Justin Newberry --- docs/CARS.md | 3 ++- selfdrive/car/tests/routes.py | 1 + selfdrive/car/torque_data/substitute.toml | 1 + selfdrive/car/toyota/fingerprints.py | 17 +++++++++++++++++ selfdrive/car/toyota/interface.py | 6 ++++++ selfdrive/car/toyota/values.py | 6 +++++- 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index d82cbe2c96..96951dc7d9 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. -# 276 Supported Cars +# 277 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -162,6 +162,7 @@ A supported vehicle is one that just works when you install a comma device. All |Lexus|GS F 2016|All|Stock|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
|| |Lexus|IS 2017-19|All|Stock|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
|| |Lexus|IS 2022-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
|| +|Lexus|LC 2024|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
|| |Lexus|NX 2018-19|All|openpilot available[2](#footnotes)|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
|| |Lexus|NX 2020-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
|| |Lexus|NX Hybrid 2018-19|All|openpilot available[2](#footnotes)|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
|| diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 8db950ced0..853c441582 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -207,6 +207,7 @@ routes = [ CarTestRoute("ec429c0f37564e3c|2020-02-01--17-28-12", TOYOTA.LEXUS_NX), # hybrid 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), diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index bab10bc062..d79475fc36 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -11,6 +11,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "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" "KIA OPTIMA 4TH GEN" = "HYUNDAI SONATA 2020" "KIA OPTIMA 4TH GEN FACELIFT" = "HYUNDAI SONATA 2020" diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index fc24f0e72c..46fded6312 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1383,6 +1383,23 @@ FW_VERSIONS = { b'\x028646F7803100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', ], }, + CAR.LEXUS_LC_TSS2: { + (Ecu.engine, 0x7e0, None): [ + b'\x0131130000\x00\x00\x00\x00\x00\x00\x00\x00', + ], + (Ecu.abs, 0x7b0, None): [ + b'F152611390\x00\x00\x00\x00\x00\x00', + ], + (Ecu.eps, 0x7a1, None): [ + b'8965B11091\x00\x00\x00\x00\x00\x00', + ], + (Ecu.fwdRadar, 0x750, 0xf): [ + b'\x018821F6201400\x00\x00\x00\x00', + ], + (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F1105200\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + ], + }, CAR.LEXUS_RC: { (Ecu.engine, 0x700, None): [ b'\x01896632461100\x00\x00\x00\x00', diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 90b2b760fe..db5292a79d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -181,6 +181,12 @@ class CarInterface(CarInterfaceBase): ret.tireStiffnessFactor = 0.444 # not optimized yet ret.mass = 4070 * CV.LB_TO_KG + elif candidate == CAR.LEXUS_LC_TSS2: + ret.wheelbase = 2.87 + ret.steerRatio = 14.7 + ret.tireStiffnessFactor = 0.444 # not optimized yet + ret.mass = 4500 * CV.LB_TO_KG + elif candidate == CAR.PRIUS_TSS2: ret.wheelbase = 2.70002 # from toyota online sepc. ret.steerRatio = 13.4 # True steerRatio from older prius diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 02a9e142d2..ed2b022f43 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -81,6 +81,7 @@ class CAR(StrEnum): LEXUS_IS_TSS2 = "LEXUS IS 2023" LEXUS_NX = "LEXUS NX 2018" LEXUS_NX_TSS2 = "LEXUS NX 2020" + LEXUS_LC_TSS2 = "LEXUS LC 2024" LEXUS_RC = "LEXUS RC 2020" LEXUS_RX = "LEXUS RX 2016" LEXUS_RX_TSS2 = "LEXUS RX 2020" @@ -206,6 +207,7 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { ToyotaCarInfo("Lexus NX 2020-21"), ToyotaCarInfo("Lexus NX Hybrid 2020-21"), ], + CAR.LEXUS_LC_TSS2: ToyotaCarInfo("Lexus LC 2024"), CAR.LEXUS_RC: ToyotaCarInfo("Lexus RC 2018-20"), CAR.LEXUS_RX: [ ToyotaCarInfo("Lexus RX 2016", "Lexus Safety System+"), @@ -444,6 +446,7 @@ DBC = { CAR.PRIUS: dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), CAR.PRIUS_V: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), CAR.COROLLA: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + CAR.LEXUS_LC_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), CAR.LEXUS_RC: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), CAR.LEXUS_RX: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), CAR.LEXUS_RX_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), @@ -480,7 +483,8 @@ EPS_SCALE = defaultdict(lambda: 73, {CAR.PRIUS: 66, CAR.COROLLA: 88, CAR.LEXUS_I # Toyota/Lexus Safety Sense 2.0 and 2.5 TSS2_CAR = {CAR.RAV4_TSS2, CAR.RAV4_TSS2_2022, CAR.RAV4_TSS2_2023, CAR.COROLLA_TSS2, CAR.LEXUS_ES_TSS2, CAR.LEXUS_RX_TSS2, CAR.HIGHLANDER_TSS2, CAR.PRIUS_TSS2, CAR.CAMRY_TSS2, CAR.LEXUS_IS_TSS2, - CAR.MIRAI, CAR.LEXUS_NX_TSS2, CAR.ALPHARD_TSS2, CAR.AVALON_TSS2, CAR.CHR_TSS2} + CAR.MIRAI, CAR.LEXUS_NX_TSS2, CAR.LEXUS_LC_TSS2, CAR.ALPHARD_TSS2, CAR.AVALON_TSS2, + CAR.CHR_TSS2} NO_DSU_CAR = TSS2_CAR | {CAR.CHR, CAR.CAMRY} From b234f5abef1a1858c8b7abb2dea1f0965aeb92ae Mon Sep 17 00:00:00 2001 From: Nelson Chen Date: Wed, 7 Feb 2024 12:34:45 -0800 Subject: [PATCH 058/923] Update Lexus LC Convertible Steer Ratio to 13 (#31354) https://media.lexus.co.uk/wp-content/uploads/sites/3/2021/06/1612190405210201MLCConvertibleTechSpec.pdf Minor follow-up to port --- selfdrive/car/toyota/interface.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index db5292a79d..3d9755c8c9 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -183,7 +183,7 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.LEXUS_LC_TSS2: ret.wheelbase = 2.87 - ret.steerRatio = 14.7 + ret.steerRatio = 13.0 ret.tireStiffnessFactor = 0.444 # not optimized yet ret.mass = 4500 * CV.LB_TO_KG From ff1dd1f4ddcfa56779097b5a229c61775520ea9d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 7 Feb 2024 13:23:58 -0800 Subject: [PATCH 059/923] agnos 9.5 (#31313) * agnos 9.4 * agnos 9.5 --- 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 d86ec63593..7f976a9e59 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.3" + export AGNOS_VERSION="9.5" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index a87f3d278d..627504f2db 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-1cc21f31a7c09772fd759e6f2a614974bf4f2fc320c91a799ffadd11abc1f85f.img.xz", - "hash": "1cc21f31a7c09772fd759e6f2a614974bf4f2fc320c91a799ffadd11abc1f85f", - "hash_raw": "1cc21f31a7c09772fd759e6f2a614974bf4f2fc320c91a799ffadd11abc1f85f", + "url": "https://commadist.azureedge.net/agnosupdate/boot-f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe.img.xz", + "hash": "f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe", + "hash_raw": "f0de74e139b8b99224738d4e72a5b1831758f20b09ff6bb28f3aaaae1c4c1ebe", "size": 15636480, "sparse": false, "full_check": true, @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-38402b90b65729f8a4feb729c8a862cdf306659a85f27431d3ff7e52d4027082.img.xz", - "hash": "5dc1718e21c49e4fa910fbb3b2321381f497b38335a0cf3ca923157d589abe89", - "hash_raw": "38402b90b65729f8a4feb729c8a862cdf306659a85f27431d3ff7e52d4027082", + "url": "https://commadist.azureedge.net/agnosupdate/system-de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85.img.xz", + "hash": "8b7efc3fc218a1b8ee94b756dbafc1c03d2b92d693027f8850a6268924f6f04e", + "hash_raw": "de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "1809e36d8e376e0a0c8348e3f684aba4100fe0382042c051efd0e946af1ce696", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-38402b90b65729f8a4feb729c8a862cdf306659a85f27431d3ff7e52d4027082.img.xz", - "size": 4077270244 + "hash": "a2b2d5307866536894b7cc5af9cb682b7da6f691205c772a2f6287d76da661cf", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85.img.xz", + "size": 4538871788 } } ] \ No newline at end of file From caa9dff61043a27a15f597633bea08f214833f0a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 16:54:46 -0500 Subject: [PATCH 060/923] test_power_draw: wait for power instead of fixed warmup time (#31318) * wait for valid * reuuse that * assert warmup * Wip * fix that * reset * none * timeout * maxlen * consecutive * proc * fix * local * same as before * mean * fixes * SA * this is the real warmup time * this is the real warmup time * Cleanup * Cleanup * monotonic + len * reduce duplication * fix * fix --------- Co-authored-by: Comma Device --- system/hardware/tici/tests/test_power_draw.py | 77 +++++++++++++++---- 1 file changed, 60 insertions(+), 17 deletions(-) diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index db75f79af5..7cc17fa68b 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -1,4 +1,6 @@ #!/usr/bin/env python3 +from collections import defaultdict, deque +import sys import pytest import unittest import time @@ -15,7 +17,8 @@ from openpilot.system.hardware.tici.power_monitor import get_power from openpilot.selfdrive.manager.process_config import managed_processes from openpilot.selfdrive.manager.manager import manager_cleanup -SAMPLE_TIME = 8 # seconds to sample power +SAMPLE_TIME = 8 # seconds to sample power +MAX_WARMUP_TIME = 30 # seconds to wait for SAMPLE_TIME consecutive valid samples @dataclass class Proc: @@ -24,7 +27,6 @@ class Proc: msgs: List[str] rtol: float = 0.05 atol: float = 0.12 - warmup: float = 6. PROCS = [ Proc('camerad', 2.1, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), @@ -48,41 +50,82 @@ class TestPowerDraw(unittest.TestCase): def tearDown(self): manager_cleanup() + def get_expected_messages(self, proc): + return int(sum(SAMPLE_TIME * SERVICE_LIST[msg].frequency for msg in proc.msgs)) + + def valid_msg_count(self, proc, msg_counts): + msgs_received = sum(msg_counts[msg] for msg in proc.msgs) + msgs_expected = self.get_expected_messages(proc) + return np.core.numeric.isclose(msgs_expected, msgs_received, rtol=.02, atol=2) + + def valid_power_draw(self, proc, used): + return np.core.numeric.isclose(used, proc.power, rtol=proc.rtol, atol=proc.atol) + + def tabulate_msg_counts(self, msgs_and_power): + msg_counts = defaultdict(lambda: 0) + for _, counts in msgs_and_power: + for msg, count in counts.items(): + msg_counts[msg] += count + return msg_counts + + def get_power_with_warmup_for_target(self, proc, prev): + socks = {msg: messaging.sub_sock(msg) for msg in proc.msgs} + for sock in socks.values(): + messaging.drain_sock_raw(sock) + + msgs_and_power = deque([], maxlen=SAMPLE_TIME) + + start_time = time.monotonic() + + while (time.monotonic() - start_time) < MAX_WARMUP_TIME: + power = get_power(1) + iteration_msg_counts = {} + for msg,sock in socks.items(): + iteration_msg_counts[msg] = len(messaging.drain_sock_raw(sock)) + msgs_and_power.append((power, iteration_msg_counts)) + + if len(msgs_and_power) < SAMPLE_TIME: + continue + + msg_counts = self.tabulate_msg_counts(msgs_and_power) + now = np.mean([m[0] for m in msgs_and_power]) + + if self.valid_msg_count(proc, msg_counts) and self.valid_power_draw(proc, now - prev): + break + + return now, msg_counts, time.monotonic() - start_time - SAMPLE_TIME + @mock_messages(['liveLocationKalman']) def test_camera_procs(self): baseline = get_power() prev = baseline used = {} + warmup_time = {} msg_counts = {} - for proc in PROCS: - socks = {msg: messaging.sub_sock(msg) for msg in proc.msgs} - managed_processes[proc.name].start() - time.sleep(proc.warmup) - for sock in socks.values(): - messaging.drain_sock_raw(sock) - now = get_power(SAMPLE_TIME) + for proc in PROCS: + managed_processes[proc.name].start() + now, local_msg_counts, warmup_time[proc.name] = self.get_power_with_warmup_for_target(proc, prev) + msg_counts.update(local_msg_counts) + used[proc.name] = now - prev prev = now - for msg,sock in socks.items(): - msg_counts[msg] = len(messaging.drain_sock_raw(sock)) manager_cleanup() - tab = [['process', 'expected (W)', 'measured (W)', '# msgs expected', '# msgs received']] + tab = [['process', 'expected (W)', 'measured (W)', '# msgs expected', '# msgs received', "warmup time (s)"]] for proc in PROCS: cur = used[proc.name] expected = proc.power msgs_received = sum(msg_counts[msg] for msg in proc.msgs) - msgs_expected = int(sum(SAMPLE_TIME * SERVICE_LIST[msg].frequency for msg in proc.msgs)) - tab.append([proc.name, round(expected, 2), round(cur, 2), msgs_expected, msgs_received]) + tab.append([proc.name, round(expected, 2), round(cur, 2), self.get_expected_messages(proc), msgs_received, round(warmup_time[proc.name], 2)]) with self.subTest(proc=proc.name): - np.testing.assert_allclose(msgs_expected, msgs_received, rtol=.02, atol=2) - np.testing.assert_allclose(cur, expected, rtol=proc.rtol, atol=proc.atol) + self.assertTrue(self.valid_msg_count(proc, msg_counts), f"expected {self.get_expected_messages(proc)} msgs, got {msgs_received} msgs") + self.assertTrue(self.valid_power_draw(proc, cur), f"expected {expected:.2f}W, got {cur:.2f}W") print(tabulate(tab)) print(f"Baseline {baseline:.2f}W\n") if __name__ == "__main__": - pytest.main() + pytest.main(sys.argv) From 92025ecbbd628213c2178fcafd3560396930b3e5 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 15:07:21 -0800 Subject: [PATCH 061/923] Add Lexus LC 2024 to release notes --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index aa3a80d56d..cf8d5eaea2 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -11,6 +11,7 @@ Version 0.9.6 (2024-02-XX) * Improved fuzzy fingerprinting for many makes and models * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! +* Lexus LC 2024 support thanks to nelsonjchen! * Toyota RAV4 2023-24 support * Toyota RAV4 Hybrid 2023-24 support From 6a463503a7a2d0c8f2d76c5633b9c9308b3c850c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 18:40:36 -0500 Subject: [PATCH 062/923] add cd for jenkins replacement scripts (#31355) fix dirs --- selfdrive/car/tests/big_cars_test.sh | 4 ++++ selfdrive/test/scons_build_test.sh | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/selfdrive/car/tests/big_cars_test.sh b/selfdrive/car/tests/big_cars_test.sh index 6142fe8411..af45c9cd14 100755 --- a/selfdrive/car/tests/big_cars_test.sh +++ b/selfdrive/car/tests/big_cars_test.sh @@ -1,5 +1,9 @@ #!/bin/bash +SCRIPT_DIR=$(dirname "$0") +BASEDIR=$(realpath "$SCRIPT_DIR/../../../") +cd $BASEDIR + MAX_EXAMPLES=300 INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 diff --git a/selfdrive/test/scons_build_test.sh b/selfdrive/test/scons_build_test.sh index 7614017c55..a3b33f797a 100755 --- a/selfdrive/test/scons_build_test.sh +++ b/selfdrive/test/scons_build_test.sh @@ -1,5 +1,9 @@ #!/bin/bash +SCRIPT_DIR=$(dirname "$0") +BASEDIR=$(realpath "$SCRIPT_DIR/../../") +cd $BASEDIR + # tests that our build system's dependencies are configured properly, # needs a machine with lots of cores scons --clean From 08c3107163e9a9f47df3078d2e8198b29e75d579 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 17:46:58 -0600 Subject: [PATCH 063/923] [bot] Fingerprints: add missing FW versions from new users (#31352) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 1 + selfdrive/car/hyundai/fingerprints.py | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 62843472a3..2616794db5 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -834,6 +834,7 @@ FW_VERSIONS = { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ b'37805-5MR-3050\x00\x00', b'37805-5MR-3250\x00\x00', + b'37805-5MR-4070\x00\x00', b'37805-5MR-4080\x00\x00', b'37805-5MR-4180\x00\x00', b'37805-5MR-A240\x00\x00', diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 3096c3e199..b747dabbe2 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1566,9 +1566,9 @@ FW_VERSIONS = { }, CAR.TUCSON_4TH_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K', b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 2.02 99211-N9000 14E', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9210 14G', - b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N9220 14K', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9220 14K', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9240 14Q', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9250 14W', @@ -1638,9 +1638,9 @@ FW_VERSIONS = { ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00MQ4_ SCC F-CUP 1.00 1.06 99110-P2000 ', + b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.00 99110-R5000 ', b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.06 99110-P2000 ', b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.08 99110-P2000 ', - b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.00 99110-R5000 ', ], }, CAR.KIA_SORENTO_HEV_4TH_GEN: { From 4228b6420bf6ba56bc798239cc05078c9d5d8440 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 7 Feb 2024 16:15:09 -0800 Subject: [PATCH 064/923] agnos 9.6 (#31357) * agnos 9.6 * manifest --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index 7f976a9e59..0c72c54581 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.5" + export AGNOS_VERSION="9.6" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index 627504f2db..b4408d2140 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85.img.xz", - "hash": "8b7efc3fc218a1b8ee94b756dbafc1c03d2b92d693027f8850a6268924f6f04e", - "hash_raw": "de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85", + "url": "https://commadist.azureedge.net/agnosupdate/system-3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db.img.xz", + "hash": "10ac02f18c5f1cde5a888a3411d3701b929c3488753467e77aad6085db058eb9", + "hash_raw": "3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "a2b2d5307866536894b7cc5af9cb682b7da6f691205c772a2f6287d76da661cf", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-de20b4b540657e5edc01e127abd20fdfd402f68b4c89b5478cdc53aa44567a85.img.xz", - "size": 4538871788 + "hash": "a7db41b93b587f8f9c3f83a3313f186445c4bdf07283cd6a5421dfbc0286c9db", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db.img.xz", + "size": 4548131508 } } ] \ No newline at end of file From 768fee7e448652cca27ccbd445447a75b4734c32 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 18:45:03 -0600 Subject: [PATCH 065/923] [bot] Fingerprints: add missing FW versions from new users (#31358) 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 0de49f11b9..c0b038e8f1 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -475,6 +475,7 @@ FW_VERSIONS = { b'05149591AD ', b'05149591AE ', b'05149592AE ', + b'05149599AE ', b'05149600AD ', b'05149605AE ', b'05149846AA ', From 4fea2a343a53ab2523668f0bd08bac2753b76132 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 20:05:43 -0500 Subject: [PATCH 066/923] test_time_to_onroad: log events after onroad/timeout (#31359) * log events * only on fail --- selfdrive/test/test_time_to_onroad.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/selfdrive/test/test_time_to_onroad.py b/selfdrive/test/test_time_to_onroad.py index aec49cb13a..7e8c85c356 100755 --- a/selfdrive/test/test_time_to_onroad.py +++ b/selfdrive/test/test_time_to_onroad.py @@ -21,12 +21,15 @@ def test_time_to_onroad(): sm = messaging.SubMaster(['controlsState', 'deviceState', 'onroadEvents']) try: # wait for onroad - with Timeout(20, "timed out waiting to go onroad"): - while True: - sm.update(1000) - if sm['deviceState'].started: - break - time.sleep(1) + try: + with Timeout(20, "timed out waiting to go onroad"): + while True: + sm.update(1000) + if sm['deviceState'].started: + break + time.sleep(1) + finally: + print(f"onroad events: {sm['onroadEvents']}") # wait for engageability with Timeout(10, "timed out waiting for engageable"): From 2e7ed5bd88d5a1d07855e65553871b32e3b018fa Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 20:07:01 -0500 Subject: [PATCH 067/923] add loop_until_fail helper (#31360) * helper * remove count --- selfdrive/test/loop_until_fail.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 selfdrive/test/loop_until_fail.sh diff --git a/selfdrive/test/loop_until_fail.sh b/selfdrive/test/loop_until_fail.sh new file mode 100755 index 0000000000..b73009dba6 --- /dev/null +++ b/selfdrive/test/loop_until_fail.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -e + +# Loop something forever until it fails, for verifying new tests + +while true; do + $@ +done From e6f42fa6b3914c738341b3830bbcd7c9abf9a965 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 20:25:17 -0500 Subject: [PATCH 068/923] test_time_to_onroad: log events after engagability/timeout (#31362) log engagability Co-authored-by: Comma Device --- selfdrive/test/test_time_to_onroad.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/selfdrive/test/test_time_to_onroad.py b/selfdrive/test/test_time_to_onroad.py index 7e8c85c356..9288188a77 100755 --- a/selfdrive/test/test_time_to_onroad.py +++ b/selfdrive/test/test_time_to_onroad.py @@ -21,23 +21,23 @@ def test_time_to_onroad(): sm = messaging.SubMaster(['controlsState', 'deviceState', 'onroadEvents']) try: # wait for onroad + with Timeout(20, "timed out waiting to go onroad"): + while True: + sm.update(1000) + if sm['deviceState'].started: + break + time.sleep(1) + + # wait for engageability try: - with Timeout(20, "timed out waiting to go onroad"): + with Timeout(10, "timed out waiting for engageable"): while True: sm.update(1000) - if sm['deviceState'].started: + if sm['controlsState'].engageable: break time.sleep(1) finally: print(f"onroad events: {sm['onroadEvents']}") - - # wait for engageability - with Timeout(10, "timed out waiting for engageable"): - while True: - sm.update(1000) - if sm['controlsState'].engageable: - break - time.sleep(1) print(f"engageable after {time.monotonic() - start_time:.2f}s") # once we're enageable, must be for the next few seconds From 75b72c2c4b520d414b4de960441b9c5b61dbb0cc Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:27:16 -0800 Subject: [PATCH 069/923] Fix whitespace (#31361) --- selfdrive/ui/qt/onroad.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 4df0ed81cb..01750eaf2f 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -289,7 +289,7 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { const auto nav_instruction = sm["navInstruction"].getNavInstruction(); // Handle older routes where vCruiseCluster is not set - float v_cruise = cs.getVCruiseCluster() == 0.0 ? cs.getVCruise() : cs.getVCruiseCluster(); + float v_cruise = cs.getVCruiseCluster() == 0.0 ? cs.getVCruise() : cs.getVCruiseCluster(); setSpeed = cs_alive ? v_cruise : SET_SPEED_NA; is_cruise_set = setSpeed > 0 && (int)setSpeed != SET_SPEED_NA; if (is_cruise_set && !s.scene.is_metric) { From d265f5a6ab5fba13289ce6decea5d7c07be4d27e Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:44:57 -0800 Subject: [PATCH 070/923] Re-use existing params declaration in onboarding (#31363) Re-use existing params declarations in onboarding --- selfdrive/ui/qt/offroad/onboarding.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/ui/qt/offroad/onboarding.cc b/selfdrive/ui/qt/offroad/onboarding.cc index d4fcee55ce..b1219055fd 100644 --- a/selfdrive/ui/qt/offroad/onboarding.cc +++ b/selfdrive/ui/qt/offroad/onboarding.cc @@ -199,7 +199,7 @@ OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) { TermsPage* terms = new TermsPage(this); addWidget(terms); connect(terms, &TermsPage::acceptedTerms, [=]() { - Params().put("HasAcceptedTerms", current_terms_version); + params.put("HasAcceptedTerms", current_terms_version); accepted_terms = true; updateActiveScreen(); }); @@ -209,7 +209,7 @@ OnboardingWindow::OnboardingWindow(QWidget *parent) : QStackedWidget(parent) { addWidget(tr); connect(tr, &TrainingGuide::completedTraining, [=]() { training_done = true; - Params().put("CompletedTrainingVersion", current_training_version); + params.put("CompletedTrainingVersion", current_training_version); updateActiveScreen(); }); From 1b0a4746eb085dad56445ffeb0f4e3b020ea3afb Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 19:47:20 -0800 Subject: [PATCH 071/923] test_fw_fingerprint: remove timeout it's fast now --- selfdrive/car/tests/test_fw_fingerprint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index d8e3296985..b355b53c31 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -252,7 +252,6 @@ class TestFwFingerprintTiming(unittest.TestCase): self._assert_timing(self.total_time / self.N, vin_ref_times[name]) print(f'get_vin {name} case, query time={self.total_time / self.N} seconds') - @pytest.mark.timeout(60) def test_fw_query_timing(self): total_ref_time = {1: 5.95, 2: 6.85} brand_ref_times = { From 0355ceaeacff5a3d0e435fbd5e44cb94b3dea37d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 19:57:33 -0800 Subject: [PATCH 072/923] fix static analysis --- selfdrive/car/tests/test_fw_fingerprint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index b355b53c31..906a2d2a61 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -import pytest import random import time import unittest From c79d1e0192d13fe261a2b06893ff58211d78f5d4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 7 Feb 2024 23:52:21 -0500 Subject: [PATCH 073/923] test_manager: ensure test independence (#31364) * ensure independent * still run 10- times * need index --------- Co-authored-by: Comma Device --- selfdrive/manager/test/test_manager.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/selfdrive/manager/test/test_manager.py b/selfdrive/manager/test/test_manager.py index fbeb932a86..04af87d9c8 100755 --- a/selfdrive/manager/test/test_manager.py +++ b/selfdrive/manager/test/test_manager.py @@ -5,6 +5,8 @@ import signal import time import unittest +from parameterized import parameterized + from cereal import car from openpilot.common.params import Params import openpilot.selfdrive.manager.manager as manager @@ -38,13 +40,13 @@ class TestManager(unittest.TestCase): # TODO: ensure there are blacklisted procs until we have a dedicated test self.assertTrue(len(BLACKLIST_PROCS), "No blacklisted procs to test not_run") - def test_startup_time(self): - for _ in range(10): - start = time.monotonic() - os.environ['PREPAREONLY'] = '1' - manager.main() - t = time.monotonic() - start - assert t < MAX_STARTUP_TIME, f"startup took {t}s, expected <{MAX_STARTUP_TIME}s" + @parameterized.expand(range(10)) + def test_startup_time(self, index): + start = time.monotonic() + os.environ['PREPAREONLY'] = '1' + manager.main() + t = time.monotonic() - start + assert t < MAX_STARTUP_TIME, f"startup took {t}s, expected <{MAX_STARTUP_TIME}s" @unittest.skip("this test is flaky the way it's currently written, should be moved to test_onroad") def test_clean_exit(self): From b6d195f0100bfc86ccefa0eed49716eaf57c1c6b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 7 Feb 2024 23:43:52 -0600 Subject: [PATCH 074/923] VIN: fix rx addr (#31369) fix rx vin addr --- selfdrive/car/vin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/vin.py b/selfdrive/car/vin.py index fe451aa9a9..4e554665ef 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -49,7 +49,7 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=3, debug=False): vin = vin[1:18] cloudlog.error(f"got vin with {request=}") - return get_rx_addr_for_tx_addr(addr), bus, vin.decode() + return get_rx_addr_for_tx_addr(addr, rx_offset=rx_offset), bus, vin.decode() except Exception: cloudlog.exception("VIN query exception") From 74ec33f7c7ffe44b48bc738930d3485d38afce09 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 8 Feb 2024 00:53:55 -0600 Subject: [PATCH 075/923] IsoTpParallelQuery: type hinting (#31370) * start typing * fixes * we only plan on using this for lists * sort * this is the correct way to type it * it knows this! * it's getting smarter --- selfdrive/car/fw_versions.py | 6 ++++-- selfdrive/car/isotp_parallel_query.py | 11 +++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 44607d8357..6c02e69503 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 from collections import defaultdict -from typing import Any, DefaultDict, Dict, List, Optional, Set +from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Set, TypeVar from tqdm import tqdm import capnp @@ -24,8 +24,10 @@ VERSIONS = get_interface_attr('FW_VERSIONS', ignore_none=True) MODEL_TO_BRAND = {c: b for b, e in VERSIONS.items() for c in e} REQUESTS = [(brand, config, r) for brand, config in FW_QUERY_CONFIGS.items() for r in config.requests] +T = TypeVar('T') -def chunks(l, n=128): + +def chunks(l: List[T], n: int = 128) -> Iterator[List[T]]: for i in range(0, len(l), n): yield l[i:i + n] diff --git a/selfdrive/car/isotp_parallel_query.py b/selfdrive/car/isotp_parallel_query.py index 696935fd35..678fe9ea46 100644 --- a/selfdrive/car/isotp_parallel_query.py +++ b/selfdrive/car/isotp_parallel_query.py @@ -5,11 +5,14 @@ from functools import partial import cereal.messaging as messaging from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp +from openpilot.selfdrive.car.fw_query_definitions import AddrType from panda.python.uds import CanClient, IsoTpMessage, FUNCTIONAL_ADDRS, get_rx_addr_for_tx_addr class IsoTpParallelQuery: - def __init__(self, sendcan, logcan, bus, addrs, request, response, response_offset=0x8, functional_addrs=None, debug=False, response_pending_timeout=10): + def __init__(self, sendcan: messaging.PubSocket, logcan: messaging.SubSocket, bus: int, addrs: list[int] | list[AddrType], + request: list[bytes], response: list[bytes], response_offset: int = 0x8, + functional_addrs: list[int] | None = None, debug: bool = False, response_pending_timeout: float = 10) -> None: self.sendcan = sendcan self.logcan = logcan self.bus = bus @@ -24,7 +27,7 @@ class IsoTpParallelQuery: assert tx_addr not in FUNCTIONAL_ADDRS, f"Functional address should be defined in functional_addrs: {hex(tx_addr)}" self.msg_addrs = {tx_addr: get_rx_addr_for_tx_addr(tx_addr[0], rx_offset=response_offset) for tx_addr in real_addrs} - self.msg_buffer = defaultdict(list) + self.msg_buffer: dict[int, list[tuple[int, int, bytes, int]]] = defaultdict(list) def rx(self): """Drain can socket and sort messages into buffers based on address""" @@ -63,7 +66,7 @@ class IsoTpParallelQuery: messaging.drain_sock_raw(self.logcan) self.msg_buffer = defaultdict(list) - def _create_isotp_msg(self, tx_addr, sub_addr, rx_addr): + def _create_isotp_msg(self, tx_addr: int, sub_addr: int | None, rx_addr: int): can_client = CanClient(self._can_tx, partial(self._can_rx, rx_addr, sub_addr=sub_addr), tx_addr, rx_addr, self.bus, sub_addr=sub_addr, debug=self.debug) @@ -73,7 +76,7 @@ class IsoTpParallelQuery: # as well as reduces chances we process messages from previous queries return IsoTpMessage(can_client, timeout=0, separation_time=0.01, debug=self.debug, max_len=max_len) - def get_data(self, timeout, total_timeout=60.): + def get_data(self, timeout: float, total_timeout: float = 60.) -> dict[AddrType, bytes]: self._drain_rx() # Create message objects From 595406be67d43512f3a6c72d1cf17631262c5981 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 8 Feb 2024 00:54:40 -0600 Subject: [PATCH 076/923] ruff: fix deprecated top level linter settings (#31367) fix deprecation --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 518d7c969c..51396ca39b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -167,8 +167,8 @@ build-backend = "poetry.core.masonry.api" # https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml [tool.ruff] -select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF008", "RUF100", "A", "B", "TID251"] -ignore = ["E741", "E402", "C408", "ISC003", "B027", "B024"] +lint.select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF008", "RUF100", "A", "B", "TID251"] +lint.ignore = ["E741", "E402", "C408", "ISC003", "B027", "B024"] line-length = 160 target-version="py311" exclude = [ @@ -180,8 +180,8 @@ exclude = [ "teleoprtc_repo", "third_party", ] -flake8-implicit-str-concat.allow-multiline=false -[tool.ruff.flake8-tidy-imports.banned-api] +lint.flake8-implicit-str-concat.allow-multiline=false +[tool.ruff.lint.flake8-tidy-imports.banned-api] "selfdrive".msg = "Use openpilot.selfdrive" "common".msg = "Use openpilot.common" "system".msg = "Use openpilot.system" From fabb739dbec27726f7af0eeb0d938258181884c2 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 8 Feb 2024 02:45:08 -0500 Subject: [PATCH 077/923] HKG: Add missing FW versions for Kia Forte 2023 (#30761) * HKG: Add FW versions for Kia Forte 2023 * more fw --------- Co-authored-by: Shane Smiskol --- 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 b747dabbe2..bc8289fa06 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -974,6 +974,7 @@ FW_VERSIONS = { b'\xf1\x00BD MDPS C 1.00 1.08 56310/M6300 4BDDC108', b'\xf1\x00BD MDPS C 1.00 1.08 56310M6300\x00 4BDDC108', b'\xf1\x00BDm MDPS C A.01 1.03 56310M7800\x00 4BPMC103', + b'\xf1\x00BDm MDPS C A.01 1.01 56310M7800\x00 4BPMC101', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00BD LKAS AT USA LHD 1.00 1.04 95740-M6000 J33', @@ -991,11 +992,13 @@ FW_VERSIONS = { (Ecu.abs, 0x7d1, None): [ 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', + b'\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\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", + b'\xf1\x006V2B0_C2\x00\x006V2C6051\x00\x00CBD0N20NL1\x90@\xc6\xae', ], }, CAR.KIA_K5_2021: { From 85fe673ee881f11467dd68fc5bfe8f979e94db5b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 12:36:33 -0500 Subject: [PATCH 078/923] bump uploader cpu (#31373) --- selfdrive/test/test_onroad.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 036eacfa48..a61d891e04 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -57,7 +57,7 @@ PROCS = { "selfdrive.boardd.pandad": 0, "selfdrive.statsd": 0.4, "selfdrive.navd.navd": 0.4, - "system.loggerd.uploader": (0.5, 10.0), + "system.loggerd.uploader": (0.5, 15.0), "system.loggerd.deleter": 0.1, } From e3028cbdcabb7bd7ee70d00db2ab27698760504e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 12:59:47 -0500 Subject: [PATCH 079/923] jenkins: no changeset (#31374) no changeset Co-authored-by: Comma Device --- Jenkinsfile | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d678535fd4..991c940ad6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -85,10 +85,6 @@ def deviceStage(String stageName, String deviceType, List extra_env, def steps) device(device_ip, "git checkout", extra + "\n" + readFile("selfdrive/test/setup_device_ci.sh")) } steps.each { item -> - if (branch != "master" && item.size() == 3 && !hasDirectoryChanged(item[2])) { - println "Skipped '${item[0]}', no relevant changes were detected." - return; - } device(device_ip, item[0], item[1]) } } @@ -143,20 +139,6 @@ def setupCredentials() { } } -def hasDirectoryChanged(List paths) { - for (change in currentBuild.changeSets) { - for (item in change.items) { - for (affectedPath in item.affectedPaths) { - for (path in paths) { - if (affectedPath.startsWith(path)) { - return true - } - } - } - } - } - return false -} node { env.CI = "1" @@ -207,7 +189,7 @@ node { '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", ["panda/", "selfdrive/boardd/"]], + ["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"], @@ -252,10 +234,10 @@ node { 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", ["panda/", "selfdrive/boardd/"]], + ["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", ["system/qcomgpsd/"]], + ["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py"], ]) }, From ec9f3dcef367e6c29756ededa7e83783ef280cfa Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Thu, 8 Feb 2024 10:24:45 -0800 Subject: [PATCH 080/923] simplify URLFile (#31365) * simplify URLFile * more space --- tools/lib/url_file.py | 48 ++++++++++++++++++++----------------------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/tools/lib/url_file.py b/tools/lib/url_file.py index be9c815c93..77ed063226 100644 --- a/tools/lib/url_file.py +++ b/tools/lib/url_file.py @@ -1,12 +1,10 @@ import logging import os +import socket import time -import threading from hashlib import sha256 -from urllib3 import PoolManager +from urllib3 import PoolManager, Retry from urllib3.util import Timeout -from tenacity import retry, wait_random_exponential, stop_after_attempt -from typing import Optional from openpilot.common.file_helpers import atomic_write_in_dir from openpilot.system.hardware.hw import Paths @@ -25,14 +23,23 @@ class URLFileException(Exception): pass -class URLFile: - _pid: Optional[int] = None - _pool_manager: Optional[PoolManager] = None - _pool_manager_lock = threading.Lock() +def new_pool_manager() -> PoolManager: + socket_options = [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),] + retries = Retry(total=5, backoff_factor=0.5, status_forcelist=[409, 429, 503, 504]) + return PoolManager(num_pools=10, maxsize=100, socket_options=socket_options, retries=retries) - def __init__(self, url, debug=False, cache=None): - self._pool_manager = None + +def set_pool_manager(): + URLFile._pool_manager = new_pool_manager() +os.register_at_fork(after_in_child=set_pool_manager) + + +class URLFile: + _pool_manager = new_pool_manager() + + def __init__(self, url, timeout=10, debug=False, cache=None): self._url = url + self._timeout = Timeout(connect=timeout, read=timeout) self._pos = 0 self._length = None self._local_file = None @@ -54,20 +61,11 @@ class URLFile: self._local_file.close() self._local_file = None - def _http_client(self) -> PoolManager: - if self._pool_manager is None: - pid = os.getpid() - with URLFile._pool_manager_lock: - if URLFile._pid != pid or URLFile._pool_manager is None: # unsafe to share after fork - URLFile._pid = pid - URLFile._pool_manager = PoolManager(num_pools=10, maxsize=10) - self._pool_manager = URLFile._pool_manager - return self._pool_manager + def _request(self, method, url, headers=None): + return URLFile._pool_manager.request(method, url, timeout=self._timeout, headers=headers) - @retry(wait=wait_random_exponential(multiplier=1, max=5), stop=stop_after_attempt(3), reraise=True) def get_length_online(self): - timeout = Timeout(connect=50.0, read=500.0) - response = self._http_client().request('HEAD', self._url, timeout=timeout, preload_content=False) + response = self._request('HEAD', self._url) if not (200 <= response.status <= 299): return -1 length = response.headers.get('content-length', 0) @@ -122,10 +120,9 @@ class URLFile: self._pos = file_end return response - @retry(wait=wait_random_exponential(multiplier=1, max=5), stop=stop_after_attempt(3), reraise=True) def read_aux(self, ll=None): download_range = False - headers = {'Connection': 'keep-alive'} + headers = {} if self._pos != 0 or ll is not None: if ll is None: end = self.get_length() - 1 @@ -139,8 +136,7 @@ class URLFile: if self._debug: t1 = time.time() - timeout = Timeout(connect=50.0, read=500.0) - response = self._http_client().request('GET', self._url, timeout=timeout, preload_content=False, headers=headers) + response = self._request('GET', self._url, headers=headers) ret = response.data if self._debug: From d61b8c90b6d4a654b0a16db1ada2e40f274324d0 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 8 Feb 2024 12:43:06 -0600 Subject: [PATCH 081/923] [bot] Fingerprints: add missing FW versions from new users (#31372) Export fingerprints --- docs/CARS.md | 2 +- selfdrive/car/honda/fingerprints.py | 4 ++++ selfdrive/car/honda/values.py | 2 +- selfdrive/car/hyundai/fingerprints.py | 6 +++--- selfdrive/car/toyota/fingerprints.py | 1 + 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 96951dc7d9..736aaaec13 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|Odyssey 2018-20|Honda Sensing|openpilot|25 mph|0 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|Passport 2019-23|All|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|Pilot 2016-22|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|Ridgeline 2017-23|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|Ridgeline 2017-24|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
|| |Hyundai|Azera 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 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|Azera Hybrid 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 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|Azera Hybrid 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 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/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 2616794db5..a61265491e 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -1207,6 +1207,7 @@ FW_VERSIONS = { b'39990-T6Z-A020\x00\x00', b'39990-T6Z-A030\x00\x00', b'39990-T6Z-A050\x00\x00', + b'39990-T6Z-A110\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36161-T6Z-A020\x00\x00', @@ -1214,6 +1215,7 @@ FW_VERSIONS = { b'36161-T6Z-A420\x00\x00', b'36161-T6Z-A520\x00\x00', b'36161-T6Z-A620\x00\x00', + b'36161-T6Z-A720\x00\x00', b'36161-TJZ-A120\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ @@ -1221,6 +1223,7 @@ FW_VERSIONS = { 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', @@ -1238,6 +1241,7 @@ FW_VERSIONS = { b'57114-T6Z-A120\x00\x00', b'57114-T6Z-A130\x00\x00', b'57114-T6Z-A520\x00\x00', + b'57114-T6Z-A610\x00\x00', b'57114-TJZ-A520\x00\x00', ], }, diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 1d4a174b9b..2878076de7 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -149,7 +149,7 @@ CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { 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), ], - CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-23", min_steer_speed=12. * CV.MPH_TO_MS), + CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS), CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), CAR.HONDA_E: HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), } diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index bc8289fa06..b828950427 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -973,8 +973,8 @@ FW_VERSIONS = { b'\xf1\x00BD MDPS C 1.00 1.02 56310-XX000 4BD2C102', b'\xf1\x00BD MDPS C 1.00 1.08 56310/M6300 4BDDC108', b'\xf1\x00BD MDPS C 1.00 1.08 56310M6300\x00 4BDDC108', - b'\xf1\x00BDm MDPS C A.01 1.03 56310M7800\x00 4BPMC103', b'\xf1\x00BDm MDPS C A.01 1.01 56310M7800\x00 4BPMC101', + b'\xf1\x00BDm MDPS C A.01 1.03 56310M7800\x00 4BPMC103', ], (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00BD LKAS AT USA LHD 1.00 1.04 95740-M6000 J33', @@ -990,15 +990,15 @@ FW_VERSIONS = { 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', - b'\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", - b'\xf1\x006V2B0_C2\x00\x006V2C6051\x00\x00CBD0N20NL1\x90@\xc6\xae', ], }, CAR.KIA_K5_2021: { diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 46fded6312..19cdc53ebd 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1434,6 +1434,7 @@ FW_VERSIONS = { }, CAR.LEXUS_RX: { (Ecu.engine, 0x700, None): [ + b'\x01896630E36100\x00\x00\x00\x00', b'\x01896630E36200\x00\x00\x00\x00', b'\x01896630E36300\x00\x00\x00\x00', b'\x01896630E37100\x00\x00\x00\x00', From 70288d1742c2cc84f4419f3411056d81bad4b59b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 14:31:55 -0500 Subject: [PATCH 082/923] test_power_draw: combine mapsd and navmodeld (#31375) * combine * combine * combine * simpler * nounion --- system/hardware/tici/tests/test_power_draw.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index 7cc17fa68b..f6c0cf21a4 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -22,19 +22,23 @@ MAX_WARMUP_TIME = 30 # seconds to wait for SAMPLE_TIME consecutive valid sample @dataclass class Proc: - name: str + procs: List[str] power: float msgs: List[str] rtol: float = 0.05 atol: float = 0.12 + @property + def name(self): + return '+'.join(self.procs) + + PROCS = [ - Proc('camerad', 2.1, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), - Proc('modeld', 1.12, atol=0.2, msgs=['modelV2']), - Proc('dmonitoringmodeld', 0.4, msgs=['driverStateV2']), - Proc('encoderd', 0.23, msgs=[]), - Proc('mapsd', 0.05, msgs=['mapRenderState']), - Proc('navmodeld', 0.05, msgs=['navModel']), + Proc(['camerad'], 2.1, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']), + 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']), ] @@ -105,7 +109,8 @@ class TestPowerDraw(unittest.TestCase): msg_counts = {} for proc in PROCS: - managed_processes[proc.name].start() + for p in proc.procs: + managed_processes[p].start() now, local_msg_counts, warmup_time[proc.name] = self.get_power_with_warmup_for_target(proc, prev) msg_counts.update(local_msg_counts) From 1c201295c75e3f2d37bf0a5061cddd0acc6faf1a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 14:41:56 -0500 Subject: [PATCH 083/923] test_navd: parameterize random test (#31376) * parameterized * import * dumb --- selfdrive/manager/test/test_manager.py | 2 +- selfdrive/navd/tests/test_navd.py | 12 +++++++----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/selfdrive/manager/test/test_manager.py b/selfdrive/manager/test/test_manager.py index 04af87d9c8..1ae94b26a1 100755 --- a/selfdrive/manager/test/test_manager.py +++ b/selfdrive/manager/test/test_manager.py @@ -40,7 +40,7 @@ class TestManager(unittest.TestCase): # TODO: ensure there are blacklisted procs until we have a dedicated test self.assertTrue(len(BLACKLIST_PROCS), "No blacklisted procs to test not_run") - @parameterized.expand(range(10)) + @parameterized.expand([(i,) for i in range(10)]) def test_startup_time(self, index): start = time.monotonic() os.environ['PREPAREONLY'] = '1' diff --git a/selfdrive/navd/tests/test_navd.py b/selfdrive/navd/tests/test_navd.py index e2a5944c2b..014b1a32a1 100755 --- a/selfdrive/navd/tests/test_navd.py +++ b/selfdrive/navd/tests/test_navd.py @@ -4,6 +4,8 @@ import random import unittest import numpy as np +from parameterized import parameterized + import cereal.messaging as messaging from openpilot.common.params import Params from openpilot.selfdrive.manager.process_config import managed_processes @@ -50,11 +52,11 @@ class TestNavd(unittest.TestCase): } self._check_route(start, end) - def test_random(self): - for _ in range(10): - start = {"latitude": random.uniform(-90, 90), "longitude": random.uniform(-180, 180)} - end = {"latitude": random.uniform(-90, 90), "longitude": random.uniform(-180, 180)} - self._check_route(start, end, check_coords=False) + @parameterized.expand([(i,) for i in range(10)]) + def test_random(self, index): + start = {"latitude": random.uniform(-90, 90), "longitude": random.uniform(-180, 180)} + end = {"latitude": random.uniform(-90, 90), "longitude": random.uniform(-180, 180)} + self._check_route(start, end, check_coords=False) if __name__ == "__main__": From e593ffc28c5900697e679d5a1f1a8fb76c1bfe1c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 14:49:33 -0500 Subject: [PATCH 084/923] bump notebooks timeout (#31377) bump --- .github/workflows/tools_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index 8f92c82339..d15ab8cd60 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -97,6 +97,6 @@ jobs: timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 10 || 30) }} # allow more time when we missed the scons cache run: ${{ env.RUN }} "scons -j$(nproc)" - name: Test notebooks - timeout-minutes: 2 + timeout-minutes: 3 run: | ${{ env.RUN }} "pip install nbmake && pytest --nbmake tools/car_porting/examples/" \ No newline at end of file From 88d0231095babbb1f572b86da060056286818da5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 16:32:40 -0500 Subject: [PATCH 085/923] pytest: fix tici setup fixture (#31379) cleanup Co-authored-by: Comma Device --- conftest.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/conftest.py b/conftest.py index 544025e180..e4dc6640c0 100644 --- a/conftest.py +++ b/conftest.py @@ -63,13 +63,12 @@ def openpilot_class_fixture(): os.environ.update(starting_env) -@pytest.fixture(scope="class") -def tici_setup_fixture(): - """Ensure a consistent state for tests on-device""" +@pytest.fixture(scope="function") +def tici_setup_fixture(openpilot_function_fixture): + """Ensure a consistent state for tests on-device. Needs the openpilot function fixture to run first.""" HARDWARE.initialize_hardware() HARDWARE.set_power_save(False) os.system("pkill -9 -f athena") - os.system("rm /dev/shm/*") @pytest.hookimpl(tryfirst=True) From e87135727d54fc497fa556984bd879023bf0fa9a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 16:36:14 -0500 Subject: [PATCH 086/923] make vipc and msgq prefix paths easier to cleanup (#31378) * ensure order * cleanup cleaner * cleaner * this needs prefix * rm vipc * bump --------- Co-authored-by: Comma Device --- cereal | 2 +- common/prefix.py | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/cereal b/cereal index 80e1e55f0d..6712c46a90 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 80e1e55f0dd71cea7f596e8b80c7c33865b689f3 +Subproject commit 6712c46a907dac5eea982437f7464020ab2516e2 diff --git a/common/prefix.py b/common/prefix.py index d027e3e5a1..484cbec188 100644 --- a/common/prefix.py +++ b/common/prefix.py @@ -5,23 +5,21 @@ import uuid from typing import Optional from openpilot.common.params import Params -from openpilot.system.hardware.hw import Paths -from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT +from openpilot.system.hardware.hw import Paths, DEFAULT_DOWNLOAD_CACHE_ROOT class OpenpilotPrefix: def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) self.msgq_path = os.path.join('/dev/shm', self.prefix) + self.vipc_path = os.path.join('/tmp', f"{self.prefix}") self.clean_dirs_on_exit = clean_dirs_on_exit self.shared_download_cache = shared_download_cache def __enter__(self): self.original_prefix = os.environ.get('OPENPILOT_PREFIX', None) os.environ['OPENPILOT_PREFIX'] = self.prefix - try: - os.mkdir(self.msgq_path) - except FileExistsError: - pass + os.makedirs(self.msgq_path, exist_ok=True) + os.makedirs(self.vipc_path, exist_ok=True) os.makedirs(Paths.log_root(), exist_ok=True) if self.shared_download_cache: @@ -46,6 +44,7 @@ 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(self.vipc_path, ignore_errors=True) 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) From 32f049c2800d6d9a889e128ea102a6eedec4a058 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 16:38:41 -0500 Subject: [PATCH 087/923] Revert "make vipc and msgq prefix paths easier to cleanup" (#31380) Revert "make vipc and msgq prefix paths easier to cleanup (#31378)" This reverts commit e87135727d54fc497fa556984bd879023bf0fa9a. --- cereal | 2 +- common/prefix.py | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/cereal b/cereal index 6712c46a90..80e1e55f0d 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 6712c46a907dac5eea982437f7464020ab2516e2 +Subproject commit 80e1e55f0dd71cea7f596e8b80c7c33865b689f3 diff --git a/common/prefix.py b/common/prefix.py index 484cbec188..d027e3e5a1 100644 --- a/common/prefix.py +++ b/common/prefix.py @@ -5,21 +5,23 @@ import uuid from typing import Optional from openpilot.common.params import Params -from openpilot.system.hardware.hw import Paths, DEFAULT_DOWNLOAD_CACHE_ROOT +from openpilot.system.hardware.hw import Paths +from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT class OpenpilotPrefix: def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) self.msgq_path = os.path.join('/dev/shm', self.prefix) - self.vipc_path = os.path.join('/tmp', f"{self.prefix}") self.clean_dirs_on_exit = clean_dirs_on_exit self.shared_download_cache = shared_download_cache def __enter__(self): self.original_prefix = os.environ.get('OPENPILOT_PREFIX', None) os.environ['OPENPILOT_PREFIX'] = self.prefix - os.makedirs(self.msgq_path, exist_ok=True) - os.makedirs(self.vipc_path, exist_ok=True) + try: + os.mkdir(self.msgq_path) + except FileExistsError: + pass os.makedirs(Paths.log_root(), exist_ok=True) if self.shared_download_cache: @@ -44,7 +46,6 @@ 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(self.vipc_path, ignore_errors=True) 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) From c84e5e2402a2506ea09e7d90ff9e4c7730a8d965 Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Thu, 8 Feb 2024 15:31:21 -0800 Subject: [PATCH 088/923] Revert "Certified Herbalist Model" (#31382) Revert "Certified Herbalist Model (#31294)" This reverts commit 06bdc69a0229bece7b60178c421feda329522585. --- selfdrive/modeld/models/supercombo.onnx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index 1777949cdd..dc93d84135 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:738ef0a3407e1f918d928dd195dc0e2a326f7610a38184c4801a0f717a8255ea +oid sha256:763821410b35b06b598cacfa5bc3e312610b3f8de2729e0d5954d7571b6794be size 48219112 From f0e491e3fa063370b6f7affb2e0b59c847d21478 Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Thu, 8 Feb 2024 15:31:29 -0800 Subject: [PATCH 089/923] Revert "update model replay ref" (#31383) Revert "update model replay ref (#31310)" This reverts commit 7eb9b9a277d374d0e98bc9bb29e50bdbcd41c0fb. --- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 2d886684af..a2f6896307 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -06bdc69a0229bece7b60178c421feda329522585 +fee90bcee1e545c7ec9a39d3c7d4e42cfefb9955 From 135deb43246ec61eeb9c8bce16a59ee8ea58c1e3 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 8 Feb 2024 16:40:43 -0800 Subject: [PATCH 090/923] sensord: fix IRQ affinity (#31384) --- system/sensord/sensors_qcom2.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/system/sensord/sensors_qcom2.cc b/system/sensord/sensors_qcom2.cc index 36d9b4a13e..9cbc24864d 100644 --- a/system/sensord/sensors_qcom2.cc +++ b/system/sensord/sensors_qcom2.cc @@ -134,7 +134,13 @@ int sensor_loop(I2CBus *i2c_bus_imu) { // increase interrupt quality by pinning interrupt and process to core 1 setpriority(PRIO_PROCESS, 0, -18); util::set_core_affinity({1}); - std::system("sudo su -c 'echo 1 > /proc/irq/336/smp_affinity_list'"); + + // TODO: get the IRQ number from gpiochip + std::string irq_path = "/proc/irq/336/smp_affinity_list"; + if (!util::file_exists(irq_path)) { + irq_path = "/proc/irq/335/smp_affinity_list"; + } + std::system(util::string_format("sudo su -c 'echo 1 > %s'", irq_path.c_str()).c_str()); // thread for reading events via interrupts threads.emplace_back(&interrupt_loop, std::ref(sensors_init)); From 1a1f30c4b6a4576e66badd3b7d69a501f3f0d461 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 8 Feb 2024 19:45:55 -0500 Subject: [PATCH 091/923] fix bootlog params copying from other prefix (#31381) * fix * also in prefix * no d * get it from the path --- selfdrive/manager/helpers.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/selfdrive/manager/helpers.py b/selfdrive/manager/helpers.py index 797f4ee92e..047d0ac2d6 100644 --- a/selfdrive/manager/helpers.py +++ b/selfdrive/manager/helpers.py @@ -1,9 +1,10 @@ +import errno +import fcntl import os import sys -import fcntl -import errno -import signal +import pathlib import shutil +import signal import subprocess import tempfile import threading @@ -52,7 +53,9 @@ def write_onroad_params(started, params): def save_bootlog(): # copy current params tmp = tempfile.mkdtemp() - shutil.copytree(Params().get_param_path() + "/..", tmp, dirs_exist_ok=True) + params_dirname = pathlib.Path(Params().get_param_path()).name + params_dir = os.path.join(tmp, params_dirname) + shutil.copytree(Params().get_param_path(), params_dir, dirs_exist_ok=True) def fn(tmpdir): env = os.environ.copy() From 013d4bd4ce0ff7060f4366f504e1bd909d7dc117 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 8 Feb 2024 21:26:07 -0800 Subject: [PATCH 092/923] controlsd: log initializing timeouts --- selfdrive/controls/controlsd.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 7660e5bd3a..a3bec8688a 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -445,6 +445,15 @@ class Controls: self.set_initial_state() self.params.put_bool_nonblocking("ControlsReady", True) + if not all_valid and timed_out: + cloudlog.event( + "controlsd.init_timeout", + canValid=CS.canValid, + invalid=[s for s, valid in self.sm.valid.items() if not valid], + not_alive=[s for s, alive in self.sm.alive.items() if not alive], + not_freq_ok=[s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok], + ) + # Check for CAN timeout if not can_strs: self.can_rcv_timeout_counter += 1 From cf97c69067f0411393440570d06e3dff6b73bf99 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 9 Feb 2024 12:54:41 -0600 Subject: [PATCH 093/923] [bot] Fingerprints: add missing FW versions from new users (#31387) Export fingerprints --- selfdrive/car/toyota/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 19cdc53ebd..f53502f470 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -38,6 +38,7 @@ FW_VERSIONS = { b'F152607180\x00\x00\x00\x00\x00\x00', b'F152641040\x00\x00\x00\x00\x00\x00', b'F152641050\x00\x00\x00\x00\x00\x00', + b'F152641060\x00\x00\x00\x00\x00\x00', b'F152641061\x00\x00\x00\x00\x00\x00', ], (Ecu.dsu, 0x791, None): [ @@ -59,6 +60,7 @@ FW_VERSIONS = { b'\x01896630738000\x00\x00\x00\x00', b'\x02896630724000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', b'\x02896630728000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', + b'\x02896630734000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', b'\x02896630737000\x00\x00\x00\x00897CF3305001\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ From 714e02d0bdb15104a393d5ad8944c75be0f6f82b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 18 Dec 2021 15:10:41 -0800 Subject: [PATCH 094/923] bring this back --- selfdrive/ui/.gitignore | 1 + selfdrive/ui/SConscript | 3 +++ selfdrive/ui/mui.cc | 50 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 selfdrive/ui/mui.cc diff --git a/selfdrive/ui/.gitignore b/selfdrive/ui/.gitignore index 99f9097905..104357f396 100644 --- a/selfdrive/ui/.gitignore +++ b/selfdrive/ui/.gitignore @@ -4,6 +4,7 @@ moc_* translations/main_test_en.* ui +mui watch3 installer/installers/* qt/text diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 4c866332f9..92b43a82b0 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -92,6 +92,9 @@ if GetOption('extras') and arch != "Darwin": # build updater UI qt_env.Program("qt/setup/updater", ["qt/setup/updater.cc", asset_obj], LIBS=qt_libs) + # build mui + qt_env.Program("mui", ["mui.cc"], LIBS=qt_libs) + # build installers senv = qt_env.Clone() senv['LINKFLAGS'].append('-Wl,-strip-debug') diff --git a/selfdrive/ui/mui.cc b/selfdrive/ui/mui.cc new file mode 100644 index 0000000000..98029ee311 --- /dev/null +++ b/selfdrive/ui/mui.cc @@ -0,0 +1,50 @@ +#include +#include +#include + +#include "cereal/messaging/messaging.h" +#include "selfdrive/ui/ui.h" +#include "selfdrive/ui/qt/qt_window.h" + +int main(int argc, char *argv[]) { + QApplication a(argc, argv); + QWidget w; + setMainWindow(&w); + + w.setStyleSheet("background-color: black;"); + + // our beautiful UI + QVBoxLayout *layout = new QVBoxLayout(&w); + QLabel *label = new QLabel("〇"); + layout->addWidget(label, 0, Qt::AlignCenter); + + QTimer timer; + QObject::connect(&timer, &QTimer::timeout, [=]() { + static SubMaster sm({"deviceState", "controlsState"}); + + bool onroad_prev = sm.allAliveAndValid({"deviceState"}) && + sm["deviceState"].getDeviceState().getStarted(); + sm.update(0); + + bool onroad = sm.allAliveAndValid({"deviceState"}) && + sm["deviceState"].getDeviceState().getStarted(); + + if (onroad) { + label->setText("〇"); + auto cs = sm["controlsState"].getControlsState(); + UIStatus status = cs.getEnabled() ? STATUS_ENGAGED : STATUS_DISENGAGED; + label->setStyleSheet(QString("color: %1; font-size: 250px;").arg(bg_colors[status].name())); + } else { + label->setText("offroad"); + label->setStyleSheet("color: grey; font-size: 40px;"); + } + + if ((onroad != onroad_prev) || sm.frame < 2) { + Hardware::set_brightness(50); + Hardware::set_display_power(onroad); + } + }); + timer.start(50); + + return a.exec(); +} From 68899136dd0d6a7ed5a23b8b78ac73a074d7a6ca Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 9 Feb 2024 16:09:01 -0600 Subject: [PATCH 095/923] Honda: add missing FW for CR-V 2018 (#31388) export --- 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 a61265491e..88e70680b7 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -680,6 +680,7 @@ FW_VERSIONS = { b'36802-TLA-A040\x00\x00', b'36802-TLA-A050\x00\x00', b'36802-TLA-A060\x00\x00', + b'36802-TLA-A070\x00\x00', b'36802-TMC-Q040\x00\x00', b'36802-TMC-Q070\x00\x00', b'36802-TNY-A030\x00\x00', From f87322423534a28ef1680bc86ec072b2914fd217 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 9 Feb 2024 18:22:43 -0500 Subject: [PATCH 096/923] LogReader: test auto mode fallback (#31390) * test auto mode * better * slow * better --- tools/lib/tests/test_logreader.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 7a8ea20b76..d04f4ce899 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -9,7 +9,7 @@ import requests from parameterized import parameterized from unittest import mock -from openpilot.tools.lib.logreader import LogIterable, LogReader, parse_indirect, parse_slice, ReadMode +from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, parse_slice, ReadMode from openpilot.tools.lib.route import SegmentRange NUM_SEGS = 17 # number of segments in the test route @@ -137,6 +137,18 @@ class TestLogReader(unittest.TestCase): lr = LogReader(f"{TEST_ROUTE}/0:4") self.assertEqual(len(lr.run_across_segments(4, noop)), len(list(lr))) + @pytest.mark.slow + def test_auto_mode(self): + lr = LogReader(f"{TEST_ROUTE}/0/q") + qlog_len = len(list(lr)) + with mock.patch("openpilot.tools.lib.route.Route.log_paths") as log_paths_mock: + log_paths_mock.return_value = [None] * NUM_SEGS + # Should fall back to qlogs since rlogs are not available + lr = LogReader(f"{TEST_ROUTE}/0/a", default_source=comma_api_source) + log_len = len(list(lr)) + + self.assertEqual(qlog_len, log_len) + if __name__ == "__main__": unittest.main() From e02ec88b1c6f02a7673f19f21afde51fbe460ae3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 9 Feb 2024 19:23:47 -0600 Subject: [PATCH 097/923] Honda Civic & CR-V Bosch: allow fingerprinting without comma power (#31259) * Honda Civic Bosch: remove OBD-reliant ECUs from fingerprinting * eligible to fingerprint with these responses now * same for CRV bosch * add back all FW to test fingerprinting diff on data * set these ECUs as non essential instead * comment * compare old fingerprinting with non essential fingerprinting * clean up * cmt --- selfdrive/car/honda/values.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 2878076de7..300c21d2fe 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -195,10 +195,19 @@ FW_QUERY_CONFIG = FwQueryConfig( [StdQueries.UDS_VERSION_REQUEST], [StdQueries.UDS_VERSION_RESPONSE], bus=1, - logging=True, obd_multiplexing=False, ), ], + # 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.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.transmission: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.vsa: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.combinationMeter: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.gateway: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.electricBrakeBooster: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic (Ecu.unknown, 0x18DAB3F1, None), From ac95838657f060503474e1a4f21ec13f66f2d39d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 9 Feb 2024 17:48:56 -0800 Subject: [PATCH 098/923] radard: cleanup init --- selfdrive/controls/radard.py | 15 ++++----------- selfdrive/test/profiling/profiler.py | 2 -- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index 4acadee7a7..f5f76ec2f0 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -282,7 +282,7 @@ class RadarD: # fuses camera and radar data for best lead detection -def radard_thread(sm: Optional[messaging.SubMaster] = None, pm: Optional[messaging.PubMaster] = None, can_sock: Optional[messaging.SubSocket] = None): +def main(): config_realtime_process(5, Priority.CTRL_LOW) # wait for stats about the car to come in from controls @@ -296,12 +296,9 @@ def radard_thread(sm: Optional[messaging.SubMaster] = None, pm: Optional[messagi RadarInterface = importlib.import_module(f'selfdrive.car.{CP.carName}.radar_interface').RadarInterface # *** setup messaging - if can_sock is None: - can_sock = messaging.sub_sock('can') - if sm is None: - sm = messaging.SubMaster(['modelV2', 'carState'], ignore_avg_freq=['modelV2', 'carState']) # Can't check average frequency, since radar determines timing - if pm is None: - pm = messaging.PubMaster(['radarState', 'liveTracks']) + can_sock = messaging.sub_sock('can') + sm = messaging.SubMaster(['modelV2', 'carState'], ignore_avg_freq=['modelV2', 'carState']) # Can't check average frequency, since radar determines timing + pm = messaging.PubMaster(['radarState', 'liveTracks']) RI = RadarInterface(CP) @@ -323,9 +320,5 @@ def radard_thread(sm: Optional[messaging.SubMaster] = None, pm: Optional[messagi rk.monitor_time() -def main(sm: Optional[messaging.SubMaster] = None, pm: Optional[messaging.PubMaster] = None, can_sock: messaging.SubSocket = None): - radard_thread(sm, pm, can_sock) - - if __name__ == "__main__": main() diff --git a/selfdrive/test/profiling/profiler.py b/selfdrive/test/profiling/profiler.py index 6d0cc204c5..6571825418 100755 --- a/selfdrive/test/profiling/profiler.py +++ b/selfdrive/test/profiling/profiler.py @@ -80,12 +80,10 @@ def profile(proc, func, car='toyota'): if __name__ == '__main__': from openpilot.selfdrive.controls.controlsd import main as controlsd_thread - from openpilot.selfdrive.controls.radard import radard_thread from openpilot.selfdrive.locationd.paramsd import main as paramsd_thread from openpilot.selfdrive.controls.plannerd import main as plannerd_thread procs = { - 'radard': radard_thread, 'controlsd': controlsd_thread, 'paramsd': paramsd_thread, 'plannerd': plannerd_thread, From 664a3c86babf84b64ae7856bc25789b165cf1e83 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 9 Feb 2024 23:06:11 -0500 Subject: [PATCH 099/923] test_caching: use with_http_server (#31393) use http server --- tools/lib/tests/test_caching.py | 31 +++++-------------------------- 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/tools/lib/tests/test_caching.py b/tools/lib/tests/test_caching.py index 294c5a2233..4b73e0a301 100755 --- a/tools/lib/tests/test_caching.py +++ b/tools/lib/tests/test_caching.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 -from functools import wraps +from functools import partial import http.server import os -import threading -import time import unittest from parameterized import parameterized +from openpilot.selfdrive.athena.tests.helpers import with_http_server from openpilot.tools.lib.url_file import URLFile @@ -30,27 +29,7 @@ class CachingTestRequestHandler(http.server.BaseHTTPRequestHandler): self.end_headers() -class CachingTestServer(threading.Thread): - def run(self): - self.server = http.server.HTTPServer(("127.0.0.1", 0), CachingTestRequestHandler) - self.port = self.server.server_port - self.server.serve_forever() - - def stop(self): - self.server.server_close() - self.server.shutdown() - -def with_caching_server(func): - @wraps(func) - def wrapper(*args, **kwargs): - server = CachingTestServer() - server.start() - time.sleep(0.25) # wait for server to get it's port - try: - func(*args, **kwargs, port=server.port) - finally: - server.stop() - return wrapper +with_caching_server = partial(with_http_server, handler=CachingTestRequestHandler) class TestFileDownload(unittest.TestCase): @@ -110,10 +89,10 @@ class TestFileDownload(unittest.TestCase): @parameterized.expand([(True, ), (False, )]) @with_caching_server - def test_recover_from_missing_file(self, cache_enabled, port): + def test_recover_from_missing_file(self, cache_enabled, host): os.environ["FILEREADER_CACHE"] = "1" if cache_enabled else "0" - file_url = f"http://localhost:{port}/test.png" + file_url = f"{host}/test.png" CachingTestRequestHandler.FILE_EXISTS = False length = URLFile(file_url).get_length() From 8416331c15acd2f071b147c5c6ed00c1766b7a1f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 9 Feb 2024 22:29:40 -0600 Subject: [PATCH 100/923] [bot] Fingerprints: add missing FW versions from new users (#31395) Export fingerprints --- selfdrive/car/nissan/fingerprints.py | 1 + selfdrive/car/toyota/fingerprints.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/selfdrive/car/nissan/fingerprints.py b/selfdrive/car/nissan/fingerprints.py index 69e88be898..06386a1815 100644 --- a/selfdrive/car/nissan/fingerprints.py +++ b/selfdrive/car/nissan/fingerprints.py @@ -51,6 +51,7 @@ FW_VERSIONS = { b'5SN2A\xb7A\x05\x02N126F\x15\xb2\x00\x00\x00\x00\x00\x00\x00\x80', ], (Ecu.fwdCamera, 0x707, None): [ + b'6WK2BDB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80', b'6WK2CDB\x04\x18\x00\x00\x00\x00\x00R=1\x18\x99\x10\x00\x00\x00\x80', ], (Ecu.gateway, 0x18dad0f1, None): [ diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index f53502f470..e9c0f5acec 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1363,16 +1363,19 @@ FW_VERSIONS = { b'\x018966378G3000\x00\x00\x00\x00', ], (Ecu.engine, 0x7e0, None): [ + b'\x0237881000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x0237887000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02378A0000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02378F4000\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x7b0, None): [ b'\x01F152678221\x00\x00\x00\x00\x00\x00', + b'F152678200\x00\x00\x00\x00\x00\x00', b'F152678210\x00\x00\x00\x00\x00\x00', b'F152678211\x00\x00\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ + b'8965B78110\x00\x00\x00\x00\x00\x00', b'8965B78120\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ From daceb171bde5aef4ea483e8054456187772afe92 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 9 Feb 2024 21:44:23 -0800 Subject: [PATCH 101/923] bump cereal (#31392) * bump cereal * update those * update refs * bump cereal * bump * bump cereal * bump * fix * bump * typo: --- cereal | 2 +- selfdrive/boardd/tests/test_boardd_loopback.py | 2 +- selfdrive/car/mock/interface.py | 2 +- selfdrive/controls/controlsd.py | 12 ++++++------ selfdrive/monitoring/dmonitoringd.py | 2 +- selfdrive/navd/tests/test_navd.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/test/process_replay/test_processes.py | 6 ++++-- selfdrive/test/test_onroad.py | 2 +- selfdrive/thermald/thermald.py | 2 +- selfdrive/ui/soundd.py | 2 +- system/sensord/tests/test_pigeond.py | 2 +- tools/camerastream/compressed_vipc.py | 2 +- tools/replay/ui.py | 4 ++-- 14 files changed, 23 insertions(+), 21 deletions(-) diff --git a/cereal b/cereal index 80e1e55f0d..e2811732e6 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 80e1e55f0dd71cea7f596e8b80c7c33865b689f3 +Subproject commit e2811732e6d4865a1e7430810a318a161afc5b4f diff --git a/selfdrive/boardd/tests/test_boardd_loopback.py b/selfdrive/boardd/tests/test_boardd_loopback.py index dfce0e3710..148ce9a25d 100755 --- a/selfdrive/boardd/tests/test_boardd_loopback.py +++ b/selfdrive/boardd/tests/test_boardd_loopback.py @@ -32,7 +32,7 @@ class TestBoardd(unittest.TestCase): with Timeout(90, "boardd didn't start"): sm = messaging.SubMaster(['pandaStates']) - while sm.rcv_frame['pandaStates'] < 1 or len(sm['pandaStates']) == 0 or \ + while sm.recv_frame['pandaStates'] < 1 or len(sm['pandaStates']) == 0 or \ any(ps.pandaType == log.PandaState.PandaType.unknown for ps in sm['pandaStates']): sm.update(1000) diff --git a/selfdrive/car/mock/interface.py b/selfdrive/car/mock/interface.py index c7821bdb97..2e4ac43033 100755 --- a/selfdrive/car/mock/interface.py +++ b/selfdrive/car/mock/interface.py @@ -22,7 +22,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): self.sm.update(0) - gps_sock = 'gpsLocationExternal' if self.sm.rcv_frame['gpsLocationExternal'] > 1 else 'gpsLocation' + gps_sock = 'gpsLocationExternal' if self.sm.recv_frame['gpsLocationExternal'] > 1 else 'gpsLocation' ret = car.CarState.new_message() ret.vEgo = self.sm[gps_sock].speed diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index a3bec8688a..a75addc3bf 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -323,7 +323,7 @@ class Controls: num_events = len(self.events) not_running = {p.name for p in self.sm['managerState'].processes if not p.running and p.shouldBeRunning} - if self.sm.rcv_frame['managerState'] and (not_running - IGNORE_PROCESSES): + if self.sm.recv_frame['managerState'] and (not_running - IGNORE_PROCESSES): self.events.add(EventName.processNotRunning) if not_running != self.not_running_prev: cloudlog.event("process_not_running", not_running=not_running, error=True) @@ -380,7 +380,7 @@ class Controls: self.events.add(EventName.paramsdTemporaryError) # conservative HW alert. if the data or frequency are off, locationd will throw an error - if any((self.sm.frame - self.sm.rcv_frame[s])*DT_CTRL > 10. for s in self.sensor_packets): + if any((self.sm.frame - self.sm.recv_frame[s])*DT_CTRL > 10. for s in self.sensor_packets): self.events.add(EventName.sensorDataInvalid) if not REPLAY: @@ -612,7 +612,7 @@ class Controls: if not self.joystick_mode: # accel PID loop pid_accel_limits = self.CI.get_pid_accel_limits(self.CP, CS.vEgo, self.v_cruise_helper.v_cruise_kph * CV.KPH_TO_MS) - t_since_plan = (self.sm.frame - self.sm.rcv_frame['longitudinalPlan']) * DT_CTRL + t_since_plan = (self.sm.frame - self.sm.recv_frame['longitudinalPlan']) * DT_CTRL actuators.accel = self.LoC.update(CC.longActive, CS, long_plan, pid_accel_limits, t_since_plan) # Steering PID loop and lateral MPC @@ -623,9 +623,9 @@ class Controls: self.sm['liveLocationKalman']) else: lac_log = log.ControlsState.LateralDebugState.new_message() - if self.sm.rcv_frame['testJoystick'] > 0: + if self.sm.recv_frame['testJoystick'] > 0: # reset joystick if it hasn't been received in a while - should_reset_joystick = (self.sm.frame - self.sm.rcv_frame['testJoystick'])*DT_CTRL > 0.2 + should_reset_joystick = (self.sm.frame - self.sm.recv_frame['testJoystick'])*DT_CTRL > 0.2 if not should_reset_joystick: joystick_axes = self.sm['testJoystick'].axes else: @@ -700,7 +700,7 @@ class Controls: CC.cruiseControl.override = self.enabled and not CC.longActive and self.CP.openpilotLongitudinalControl CC.cruiseControl.cancel = CS.cruiseState.enabled and (not self.enabled or not self.CP.pcmCruise) - if self.joystick_mode and self.sm.rcv_frame['testJoystick'] > 0 and self.sm['testJoystick'].buttons[0]: + if self.joystick_mode and self.sm.recv_frame['testJoystick'] > 0 and self.sm['testJoystick'].buttons[0]: CC.cruiseControl.cancel = True speeds = self.sm['longitudinalPlan'].speeds diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index 7a24c0107e..8e68c0e3bc 100755 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -43,7 +43,7 @@ def dmonitoringd_thread(): # Get data from dmonitoringmodeld events = Events() - if sm.all_checks(): + if sm.all_checks() and len(sm['liveCalibration'].rpyCalib): driver_status.update_states(sm['driverStateV2'], sm['liveCalibration'].rpyCalib, sm['carState'].vEgo, sm['controlsState'].enabled) # Block engaging after max number of distrations diff --git a/selfdrive/navd/tests/test_navd.py b/selfdrive/navd/tests/test_navd.py index 014b1a32a1..61be6cc387 100755 --- a/selfdrive/navd/tests/test_navd.py +++ b/selfdrive/navd/tests/test_navd.py @@ -26,7 +26,7 @@ class TestNavd(unittest.TestCase): managed_processes['navd'].start() for _ in range(30): self.sm.update(1000) - if all(f > 0 for f in self.sm.rcv_frame.values()): + if all(f > 0 for f in self.sm.recv_frame.values()): break else: raise Exception("didn't get a route") diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index bc79d3be9e..f49776ecc0 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -d9a3a0d4e806b49ec537233d30926bec70308485 \ No newline at end of file +21472c7936cbf3a3b585ddda8c08f1b814fdd6d3 \ 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 407a103232..5323a5280f 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -58,7 +58,7 @@ segments = [ ("VOLKSWAGEN", "regen8BDFE7307A0|2023-10-30--23-19-36--0"), ("MAZDA", "regen2E9F1A15FD5|2023-10-30--23-20-36--0"), ("FORD", "regen6D39E54606E|2023-10-30--23-20-54--0"), - ] +] # dashcamOnly makes don't need to be tested until a full port is done excluded_interfaces = ["mock", "tesla"] @@ -107,7 +107,9 @@ def test_process(cfg, lr, segment, ref_log_path, new_log_path, ignore_fields=Non # check to make sure openpilot is engaged in the route if cfg.proc_name == "controlsd": if not check_openpilot_enabled(log_msgs): - return f"Route did not enable at all or for long enough: {new_log_path}", log_msgs + # FIXME: these segments should work, but the replay enabling logic is too brittle + if segment not in ("regen6CA24BC3035|2023-10-30--23-14-28--0", "regen7D2D3F82D5B|2023-10-30--23-15-55--0"): + return f"Route did not enable at all or for long enough: {new_log_path}", log_msgs try: return compare_logs(ref_log_msgs, log_msgs, ignore_fields + cfg.ignore, ignore_msgs, cfg.tolerance), log_msgs diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index a61d891e04..d5350239fe 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -126,7 +126,7 @@ class TestOnroad(unittest.TestCase): sm = messaging.SubMaster(['carState']) with Timeout(150, "controls didn't start"): - while sm.rcv_frame['carState'] < 0: + while sm.recv_frame['carState'] < 0: sm.update(1000) # make sure we get at least two full segments diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index ab30b1579f..abe686903b 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -233,7 +233,7 @@ def thermald_thread(end_event, hw_queue) -> None: if TICI: fan_controller = TiciFanController() - elif (time.monotonic() - sm.rcv_time['pandaStates']) > DISCONNECT_TIMEOUT: + elif (time.monotonic() - sm.recv_time['pandaStates']) > DISCONNECT_TIMEOUT: if onroad_conditions["ignition"]: onroad_conditions["ignition"] = False cloudlog.error("panda timed out onroad") diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index 01148ec199..11caf809d1 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -42,7 +42,7 @@ sound_list: Dict[int, Tuple[str, Optional[int], float]] = { } def check_controls_timeout_alert(sm): - controls_missing = time.monotonic() - sm.rcv_time['controlsState'] + controls_missing = time.monotonic() - sm.recv_time['controlsState'] if controls_missing > CONTROLS_TIMEOUT: if sm['controlsState'].enabled and (controls_missing - CONTROLS_TIMEOUT) < 10: diff --git a/system/sensord/tests/test_pigeond.py b/system/sensord/tests/test_pigeond.py index f2ab43bbb7..742e20bb90 100755 --- a/system/sensord/tests/test_pigeond.py +++ b/system/sensord/tests/test_pigeond.py @@ -40,7 +40,7 @@ class TestPigeond(unittest.TestCase): sm.update(1 * 1000) if sm.updated['ubloxRaw']: break - assert sm.rcv_frame['ubloxRaw'] > 0, "pigeond didn't start outputting messages in time" + assert sm.recv_frame['ubloxRaw'] > 0, "pigeond didn't start outputting messages in time" et = time.monotonic() - start_time assert et < 5, f"pigeond took {et:.1f}s to start" diff --git a/tools/camerastream/compressed_vipc.py b/tools/camerastream/compressed_vipc.py index f1a6f230fa..f4b8862a84 100755 --- a/tools/camerastream/compressed_vipc.py +++ b/tools/camerastream/compressed_vipc.py @@ -110,7 +110,7 @@ class CompressedVipc: os.environ["ZMQ"] = "1" messaging.context = messaging.Context() sm = messaging.SubMaster([ENCODE_SOCKETS[s] for s in vision_streams], addr=addr) - while min(sm.rcv_frame.values()) == 0: + while min(sm.recv_frame.values()) == 0: sm.update(100) os.environ.pop("ZMQ") messaging.context = messaging.Context() diff --git a/tools/replay/ui.py b/tools/replay/ui.py index 7c95a75f8b..be80166e76 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -154,10 +154,10 @@ def ui_thread(addr): if len(sm['longitudinalPlan'].accels): plot_arr[-1, name_to_arr_idx['a_target']] = sm['longitudinalPlan'].accels[0] - if sm.rcv_frame['modelV2']: + if sm.recv_frame['modelV2']: plot_model(sm['modelV2'], img, calibration, top_down) - if sm.rcv_frame['radarState']: + if sm.recv_frame['radarState']: plot_lead(sm['radarState'], top_down) # draw all radar points From 743c418a6c613bb8145211b8e0717629197a8ece Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 10 Feb 2024 00:24:49 -0600 Subject: [PATCH 102/923] [bot] Fingerprints: add missing FW versions from CAN fingerprinting cars (#31396) Export fingerprints --- selfdrive/car/chrysler/fingerprints.py | 5 +++++ selfdrive/car/nissan/fingerprints.py | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index c0b038e8f1..9511684f88 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -67,6 +67,7 @@ FW_VERSIONS = { (Ecu.engine, 0x7e0, None): [ b'68267018AO ', b'68267020AJ ', + b'68303534AJ ', b'68340762AD ', b'68340764AD ', b'68352652AE ', @@ -299,6 +300,7 @@ FW_VERSIONS = { CAR.JEEP_GRAND_CHEROKEE_2019: { (Ecu.combinationMeter, 0x742, None): [ b'68402703AB', + b'68402704AB', b'68402708AB', b'68402971AD', b'68454144AD', @@ -326,6 +328,7 @@ FW_VERSIONS = { (Ecu.eps, 0x75a, None): [ b'68417279AA', b'68417280AA', + b'68417281AA', b'68453431AA', b'68453433AA', b'68453435AA', @@ -336,6 +339,7 @@ FW_VERSIONS = { (Ecu.engine, 0x7e0, None): [ b'05035674AB ', b'68412635AG ', + b'68412660AD ', b'68422860AB', b'68449435AE ', b'68496223AA ', @@ -346,6 +350,7 @@ FW_VERSIONS = { (Ecu.transmission, 0x7e1, None): [ b'05035707AA', b'68419672AC', + b'68419678AB', b'68423905AB', b'68449258AC', b'68495807AA', diff --git a/selfdrive/car/nissan/fingerprints.py b/selfdrive/car/nissan/fingerprints.py index 06386a1815..6cd0df4c9b 100644 --- a/selfdrive/car/nissan/fingerprints.py +++ b/selfdrive/car/nissan/fingerprints.py @@ -45,16 +45,28 @@ FW_VERSIONS = { }, CAR.LEAF: { (Ecu.abs, 0x740, None): [ + b'476605SA1C', + b'476605SC2D', + b'476606WK7B', b'476606WK9B', ], (Ecu.eps, 0x742, None): [ + b'5SA2A\x99A\x05\x02N123F\x15b\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SA2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80', + b'5SN2A\xb7A\x05\x02N123F\x15\xa2\x00\x00\x00\x00\x00\x00\x00\x80', b'5SN2A\xb7A\x05\x02N126F\x15\xb2\x00\x00\x00\x00\x00\x00\x00\x80', ], (Ecu.fwdCamera, 0x707, None): [ + b'5SA0ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80', + b'5SA2ADB\x04\x18\x00\x00\x00\x00\x00_*6\x04\x94a\x00\x00\x00\x80', + b'6WK2ADB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80', b'6WK2BDB\x04\x18\x00\x00\x00\x00\x00R;1\x18\x99\x10\x00\x00\x00\x80', b'6WK2CDB\x04\x18\x00\x00\x00\x00\x00R=1\x18\x99\x10\x00\x00\x00\x80', ], (Ecu.gateway, 0x18dad0f1, None): [ + b'284U25SA3C', + b'284U25SP1C', + b'284U26WK0A', b'284U26WK0C', ], }, From 667693b8c2ca7ef0b0457823cd76b93b22764038 Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Sat, 10 Feb 2024 00:20:43 -0800 Subject: [PATCH 103/923] logreader: skip internal source if not available (#31400) * logreader: skip internal source if not available * raise exception * but only when appropriate --- tools/lib/filereader.py | 12 ++++++++++++ tools/lib/logreader.py | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/tools/lib/filereader.py b/tools/lib/filereader.py index 1db3207e4b..af3dc5e658 100644 --- a/tools/lib/filereader.py +++ b/tools/lib/filereader.py @@ -1,9 +1,21 @@ import os +import socket +from urllib.parse import urlparse from openpilot.tools.lib.url_file import URLFile DATA_ENDPOINT = os.getenv("DATA_ENDPOINT", "http://data-raw.comma.internal/") +def internal_source_available(): + try: + hostname = urlparse(DATA_ENDPOINT).hostname + if hostname: + socket.gethostbyname(hostname) + return True + except socket.gaierror: + pass + return False + def resolve_name(fn): if fn.startswith("cd:/"): return fn.replace("cd:/", DATA_ENDPOINT) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index decffccd66..4d76f2a38f 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -20,7 +20,7 @@ from cereal import log as capnp_log from openpilot.common.swaglog import cloudlog from openpilot.tools.lib.comma_car_segments import get_url as get_comma_segments_url from openpilot.tools.lib.openpilotci import get_url -from openpilot.tools.lib.filereader import FileReader, file_exists +from openpilot.tools.lib.filereader import FileReader, file_exists, internal_source_available from openpilot.tools.lib.helpers import RE from openpilot.tools.lib.route import Route, SegmentRange @@ -143,6 +143,9 @@ def comma_api_source(sr: SegmentRange, mode: ReadMode): return apply_strategy(mode, rlog_paths, qlog_paths, valid_file=valid_file) def internal_source(sr: SegmentRange, mode: ReadMode): + if not internal_source_available(): + raise Exception("Internal source not available") + segs = parse_slice(sr) def get_internal_url(sr: SegmentRange, seg, file): From 299dbb564dfdc4d9ae1c18aa4dd34ab895f5ebee Mon Sep 17 00:00:00 2001 From: Nelson Chen Date: Sat, 10 Feb 2024 08:26:39 -0800 Subject: [PATCH 104/923] Only run repo-maintenance.yaml on 'commaai/openpilot' (#31401) This otherwise fails and causes a periodic annoying email for users who have forked the repo. --- .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 a59fd0ebf8..445a1cf11c 100644 --- a/.github/workflows/repo-maintenance.yaml +++ b/.github/workflows/repo-maintenance.yaml @@ -11,6 +11,7 @@ jobs: runs-on: ubuntu-20.04 container: image: ghcr.io/commaai/openpilot-base:latest + if: github.repository == 'commaai/openpilot' steps: - uses: actions/checkout@v4 with: @@ -36,6 +37,7 @@ jobs: runs-on: ubuntu-20.04 container: image: ghcr.io/commaai/openpilot-base:latest + if: github.repository == 'commaai/openpilot' steps: - uses: actions/checkout@v4 - name: poetry lock From c9951e9d6c14b860d4b13952fca5540a91ff5813 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Sat, 10 Feb 2024 17:49:45 -0500 Subject: [PATCH 105/923] camerad: assert isp started successfully (#31385) * isp assert * disable this for testing * Revert "disable this for testing" This reverts commit e65cf6d4b457babcc1a980d40079a2d6aa6540b8. * move below --- system/camerad/cameras/camera_qcom2.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/system/camerad/cameras/camera_qcom2.cc b/system/camerad/cameras/camera_qcom2.cc index e17203a7dd..3191b821ac 100644 --- a/system/camerad/cameras/camera_qcom2.cc +++ b/system/camerad/cameras/camera_qcom2.cc @@ -606,6 +606,7 @@ void CameraState::camera_open(MultiCameraState *multi_cam_state_, int camera_num LOGD("start csiphy: %d", ret); ret = device_control(multi_cam_state->isp_fd, CAM_START_DEV, session_handle, isp_dev_handle); LOGD("start isp: %d", ret); + assert(ret == 0); // TODO: this is unneeded, should we be doing the start i2c in a different way? //ret = device_control(sensor_fd, CAM_START_DEV, session_handle, sensor_dev_handle); From 33e6158d9ba488a21c5210438170656f72c53c96 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Sat, 10 Feb 2024 20:47:06 -0500 Subject: [PATCH 106/923] Subaru: add message for angle LKAS (#31402) add angle --- selfdrive/car/subaru/subarucan.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/selfdrive/car/subaru/subarucan.py b/selfdrive/car/subaru/subarucan.py index 290737c3e6..86d39ff885 100644 --- a/selfdrive/car/subaru/subarucan.py +++ b/selfdrive/car/subaru/subarucan.py @@ -13,6 +13,15 @@ def create_steering_control(packer, apply_steer, steer_req): return packer.make_can_msg("ES_LKAS", 0, values) +def create_steering_control_angle(packer, apply_steer, steer_req): + values = { + "LKAS_Output": apply_steer, + "LKAS_Request": steer_req, + "SET_3": 3 + } + return packer.make_can_msg("ES_LKAS_ANGLE", 0, values) + + def create_steering_status(packer): return packer.make_can_msg("ES_LKAS_State", 0, {}) From 3cf7b05a30c92a9412102f3e96d3e1cc8496e479 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 11 Feb 2024 11:56:34 -0600 Subject: [PATCH 107/923] [bot] Fingerprints: add missing FW versions from new users (#31403) 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 88e70680b7..d24838ffbc 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -881,6 +881,7 @@ FW_VERSIONS = { b'28102-5MX-A900\x00\x00', b'28102-5MX-A910\x00\x00', b'28102-5MX-C001\x00\x00', + b'28102-5MX-C910\x00\x00', b'28102-5MX-D001\x00\x00', b'28102-5MX-D710\x00\x00', b'28102-5MX-K610\x00\x00', @@ -918,6 +919,7 @@ FW_VERSIONS = { 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', From 5f087010a9898443628f848bcce7cd7f20bdcdc1 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 12 Feb 2024 09:34:15 -0800 Subject: [PATCH 108/923] [bot] Update Python packages and pre-commit hooks (#31413) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 4 +- poetry.lock | 197 ++++++++++++++++++++-------------------- 2 files changed, 100 insertions(+), 101 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a336bd3378..103bb38e26 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: - --explicit-package-bases exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(xx/)' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.0 + rev: v0.2.1 hooks: - id: ruff exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' @@ -90,6 +90,6 @@ repos: args: - --lock - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.27.4 + rev: 0.28.0 hooks: - id: check-github-workflows diff --git a/poetry.lock b/poetry.lock index f4d396985e..4333f01267 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" @@ -1131,60 +1131,60 @@ files = [ [[package]] name = "fonttools" -version = "4.47.2" +version = "4.48.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b629108351d25512d4ea1a8393a2dba325b7b7d7308116b605ea3f8e1be88df"}, - {file = "fonttools-4.47.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c19044256c44fe299d9a73456aabee4b4d06c6b930287be93b533b4737d70aa1"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8be28c036b9f186e8c7eaf8a11b42373e7e4949f9e9f370202b9da4c4c3f56c"}, - {file = "fonttools-4.47.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f83a4daef6d2a202acb9bf572958f91cfde5b10c8ee7fb1d09a4c81e5d851fd8"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5a5318ba5365d992666ac4fe35365f93004109d18858a3e18ae46f67907670"}, - {file = "fonttools-4.47.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8f57ecd742545362a0f7186774b2d1c53423ed9ece67689c93a1055b236f638c"}, - {file = "fonttools-4.47.2-cp310-cp310-win32.whl", hash = "sha256:a1c154bb85dc9a4cf145250c88d112d88eb414bad81d4cb524d06258dea1bdc0"}, - {file = "fonttools-4.47.2-cp310-cp310-win_amd64.whl", hash = "sha256:3e2b95dce2ead58fb12524d0ca7d63a63459dd489e7e5838c3cd53557f8933e1"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:29495d6d109cdbabe73cfb6f419ce67080c3ef9ea1e08d5750240fd4b0c4763b"}, - {file = "fonttools-4.47.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0a1d313a415eaaba2b35d6cd33536560deeebd2ed758b9bfb89ab5d97dc5deac"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90f898cdd67f52f18049250a6474185ef6544c91f27a7bee70d87d77a8daf89c"}, - {file = "fonttools-4.47.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3480eeb52770ff75140fe7d9a2ec33fb67b07efea0ab5129c7e0c6a639c40c70"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0255dbc128fee75fb9be364806b940ed450dd6838672a150d501ee86523ac61e"}, - {file = "fonttools-4.47.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f791446ff297fd5f1e2247c188de53c1bfb9dd7f0549eba55b73a3c2087a2703"}, - {file = "fonttools-4.47.2-cp311-cp311-win32.whl", hash = "sha256:740947906590a878a4bde7dd748e85fefa4d470a268b964748403b3ab2aeed6c"}, - {file = "fonttools-4.47.2-cp311-cp311-win_amd64.whl", hash = "sha256:63fbed184979f09a65aa9c88b395ca539c94287ba3a364517698462e13e457c9"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4ec558c543609e71b2275c4894e93493f65d2f41c15fe1d089080c1d0bb4d635"}, - {file = "fonttools-4.47.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e040f905d542362e07e72e03612a6270c33d38281fd573160e1003e43718d68d"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd58cc03016b281bd2c74c84cdaa6bd3ce54c5a7f47478b7657b930ac3ed8eb"}, - {file = "fonttools-4.47.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32ab2e9702dff0dd4510c7bb958f265a8d3dd5c0e2547e7b5f7a3df4979abb07"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a808f3c1d1df1f5bf39be869b6e0c263570cdafb5bdb2df66087733f566ea71"}, - {file = "fonttools-4.47.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac71e2e201df041a2891067dc36256755b1229ae167edbdc419b16da78732c2f"}, - {file = "fonttools-4.47.2-cp312-cp312-win32.whl", hash = "sha256:69731e8bea0578b3c28fdb43dbf95b9386e2d49a399e9a4ad736b8e479b08085"}, - {file = "fonttools-4.47.2-cp312-cp312-win_amd64.whl", hash = "sha256:b3e1304e5f19ca861d86a72218ecce68f391646d85c851742d265787f55457a4"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:254d9a6f7be00212bf0c3159e0a420eb19c63793b2c05e049eb337f3023c5ecc"}, - {file = "fonttools-4.47.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eabae77a07c41ae0b35184894202305c3ad211a93b2eb53837c2a1143c8bc952"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a86a5ab2873ed2575d0fcdf1828143cfc6b977ac448e3dc616bb1e3d20efbafa"}, - {file = "fonttools-4.47.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13819db8445a0cec8c3ff5f243af6418ab19175072a9a92f6cc8ca7d1452754b"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4e743935139aa485fe3253fc33fe467eab6ea42583fa681223ea3f1a93dd01e6"}, - {file = "fonttools-4.47.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d49ce3ea7b7173faebc5664872243b40cf88814ca3eb135c4a3cdff66af71946"}, - {file = "fonttools-4.47.2-cp38-cp38-win32.whl", hash = "sha256:94208ea750e3f96e267f394d5588579bb64cc628e321dbb1d4243ffbc291b18b"}, - {file = "fonttools-4.47.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f750037e02beb8b3569fbff701a572e62a685d2a0e840d75816592280e5feae"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3d71606c9321f6701642bd4746f99b6089e53d7e9817fc6b964e90d9c5f0ecc6"}, - {file = "fonttools-4.47.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86e0427864c6c91cf77f16d1fb9bf1bbf7453e824589e8fb8461b6ee1144f506"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a00bd0e68e88987dcc047ea31c26d40a3c61185153b03457956a87e39d43c37"}, - {file = "fonttools-4.47.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5d77479fb885ef38a16a253a2f4096bc3d14e63a56d6246bfdb56365a12b20c"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5465df494f20a7d01712b072ae3ee9ad2887004701b95cb2cc6dcb9c2c97a899"}, - {file = "fonttools-4.47.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4c811d3c73b6abac275babb8aa439206288f56fdb2c6f8835e3d7b70de8937a7"}, - {file = "fonttools-4.47.2-cp39-cp39-win32.whl", hash = "sha256:5b60e3afa9635e3dfd3ace2757039593e3bd3cf128be0ddb7a1ff4ac45fa5a50"}, - {file = "fonttools-4.47.2-cp39-cp39-win_amd64.whl", hash = "sha256:7ee48bd9d6b7e8f66866c9090807e3a4a56cf43ffad48962725a190e0dd774c8"}, - {file = "fonttools-4.47.2-py3-none-any.whl", hash = "sha256:7eb7ad665258fba68fd22228a09f347469d95a97fb88198e133595947a20a184"}, - {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"}, + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f"}, + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2"}, + {file = "fonttools-4.48.1-cp310-cp310-win32.whl", hash = "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec"}, + {file = "fonttools-4.48.1-cp310-cp310-win_amd64.whl", hash = "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48"}, + {file = "fonttools-4.48.1-cp311-cp311-win32.whl", hash = "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e"}, + {file = "fonttools-4.48.1-cp311-cp311-win_amd64.whl", hash = "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092"}, + {file = "fonttools-4.48.1-cp312-cp312-win32.whl", hash = "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d"}, + {file = "fonttools-4.48.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5"}, + {file = "fonttools-4.48.1-cp38-cp38-win32.whl", hash = "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2"}, + {file = "fonttools-4.48.1-cp38-cp38-win_amd64.whl", hash = "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e"}, + {file = "fonttools-4.48.1-cp39-cp39-win32.whl", hash = "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199"}, + {file = "fonttools-4.48.1-cp39-cp39-win_amd64.whl", hash = "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070"}, + {file = "fonttools-4.48.1-py3-none-any.whl", hash = "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e"}, + {file = "fonttools-4.48.1.tar.gz", hash = "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "pycairo", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] @@ -1563,13 +1563,13 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.1)"] [[package]] name = "identify" -version = "2.5.33" +version = "2.5.34" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, - {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, + {file = "identify-2.5.34-py2.py3-none-any.whl", hash = "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed"}, + {file = "identify-2.5.34.tar.gz", hash = "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d"}, ] [package.extras] @@ -2692,14 +2692,7 @@ files = [ ] [package.dependencies] -numpy = [ - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, - {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, - {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, - {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, -] +numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} [[package]] name = "opencv-python-headless" @@ -2718,14 +2711,7 @@ files = [ ] [package.dependencies] -numpy = [ - {version = ">=1.21.2", markers = "python_version >= \"3.10\""}, - {version = ">=1.21.4", markers = "python_version >= \"3.10\" and platform_system == \"Darwin\""}, - {version = ">=1.23.5", markers = "python_version >= \"3.11\""}, - {version = ">=1.19.3", markers = "python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\" or python_version >= \"3.9\""}, - {version = ">=1.17.0", markers = "python_version >= \"3.7\""}, - {version = ">=1.17.3", markers = "python_version >= \"3.8\""}, -] +numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} [[package]] name = "packaging" @@ -3099,13 +3085,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.6.0" +version = "3.6.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.6.0-py2.py3-none-any.whl", hash = "sha256:c255039ef399049a5544b6ce13d135caba8f2c28c3b4033277a788f434308376"}, - {file = "pre_commit-3.6.0.tar.gz", hash = "sha256:d30bad9abf165f7785c15a21a1f46da7d0677cb00ee7ff4c579fd38922efe15d"}, + {file = "pre_commit-3.6.1-py2.py3-none-any.whl", hash = "sha256:9fe989afcf095d2c4796ce7c553cf28d4d4a9b9346de3cda079bcf40748454a4"}, + {file = "pre_commit-3.6.1.tar.gz", hash = "sha256:c90961d8aa706f75d60935aba09469a6b0bcb8345f127c3fbee4bdc5f114cf4b"}, ] [package.dependencies] @@ -3346,6 +3332,8 @@ files = [ {file = "pygame-2.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e24d05184e4195fe5ebcdce8b18ecb086f00182b9ae460a86682d312ce8d31f"}, {file = "pygame-2.5.2-cp311-cp311-win32.whl", hash = "sha256:f02c1c7505af18d426d355ac9872bd5c916b27f7b0fe224749930662bea47a50"}, {file = "pygame-2.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:6d58c8cf937815d3b7cdc0fa9590c5129cb2c9658b72d00e8a4568dea2ff1d42"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1a2a43802bb5e89ce2b3b775744e78db4f9a201bf8d059b946c61722840ceea8"}, + {file = "pygame-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1c289f2613c44fe70a1e40769de4a49c5ab5a29b9376f1692bb1a15c9c1c9bfa"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:074aa6c6e110c925f7f27f00c7733c6303407edc61d738882985091d1eb2ef17"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe0228501ec616779a0b9c4299e837877783e18df294dd690b9ab0eed3d8aaab"}, {file = "pygame-2.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31648d38ecdc2335ffc0e38fb18a84b3339730521505dac68514f83a1092e3f4"}, @@ -6745,6 +6733,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -6752,8 +6741,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {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"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -6770,6 +6767,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -6777,6 +6775,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -6925,28 +6924,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.2.0" +version = "0.2.1" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:638ea3294f800d18bae84a492cb5a245c8d29c90d19a91d8e338937a4c27fca0"}, - {file = "ruff-0.2.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:3ff35433fcf4dff6d610738712152df6b7d92351a1bde8e00bd405b08b3d5759"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf9faafbdcf4f53917019f2c230766da437d4fd5caecd12ddb68bb6a17d74399"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8153a3e4128ed770871c47545f1ae7b055023e0c222ff72a759f5a341ee06483"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a75a98ae989a27090e9c51f763990ad5bbc92d20626d54e9701c7fe597f399"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:87057dd2fdde297130ff99553be8549ca38a2965871462a97394c22ed2dfc19d"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d232f99d3ab00094ebaf88e0fb7a8ccacaa54cc7fa3b8993d9627a11e6aed7a"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d3c641f95f435fc6754b05591774a17df41648f0daf3de0d75ad3d9f099ab92"}, - {file = "ruff-0.2.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3826fb34c144ef1e171b323ed6ae9146ab76d109960addca730756dc19dc7b22"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:eceab7d85d09321b4de18b62d38710cf296cb49e98979960a59c6b9307c18cfe"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:30ad74687e1f4a9ff8e513b20b82ccadb6bd796fe5697f1e417189c5cde6be3e"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:a7e3818698f8460bd0f8d4322bbe99db8327e9bc2c93c789d3159f5b335f47da"}, - {file = "ruff-0.2.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:edf23041242c48b0d8295214783ef543847ef29e8226d9f69bf96592dba82a83"}, - {file = "ruff-0.2.0-py3-none-win32.whl", hash = "sha256:e155147199c2714ff52385b760fe242bb99ea64b240a9ffbd6a5918eb1268843"}, - {file = "ruff-0.2.0-py3-none-win_amd64.whl", hash = "sha256:ba918e01cdd21e81b07555564f40d307b0caafa9a7a65742e98ff244f5035c59"}, - {file = "ruff-0.2.0-py3-none-win_arm64.whl", hash = "sha256:3fbaff1ba9564a2c5943f8f38bc221f04bac687cc7485e45237579fee7ccda79"}, - {file = "ruff-0.2.0.tar.gz", hash = "sha256:63856b91837606c673537d2889989733d7dffde553828d3b0f0bacfa6def54be"}, + {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, + {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, + {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, + {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, + {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, + {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, + {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, + {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, ] [[package]] @@ -7028,13 +7027,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.40.0" +version = "1.40.3" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.40.0.tar.gz", hash = "sha256:34ad8cfc9b877aaa2a8eb86bfe5296a467fffe0619b931a05b181c45f6da59bf"}, - {file = "sentry_sdk-1.40.0-py2.py3-none-any.whl", hash = "sha256:78575620331186d32f34b7ece6edea97ce751f58df822547d3ab85517881a27a"}, + {file = "sentry-sdk-1.40.3.tar.gz", hash = "sha256:3c2b027979bb400cd65a47970e64f8cef8acda86b288a27f42a98692505086cd"}, + {file = "sentry_sdk-1.40.3-py2.py3-none-any.whl", hash = "sha256:73383f28311ae55602bb6cc3b013830811135ba5521e41333a6e68f269413502"}, ] [package.dependencies] @@ -7173,18 +7172,18 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "69.0.3" +version = "69.1.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, + {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, ] [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)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +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)", "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-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -7575,13 +7574,13 @@ files = [ [[package]] name = "tqdm" -version = "4.66.1" +version = "4.66.2" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.1-py3-none-any.whl", hash = "sha256:d302b3c5b53d47bce91fea46679d9c3c6508cf6332229aa1e7d8653723793386"}, - {file = "tqdm-4.66.1.tar.gz", hash = "sha256:d88e651f9db8d8551a62556d3cff9e3034274ca5d66e93197cf2490e2dcb69c7"}, + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, ] [package.dependencies] @@ -7631,13 +7630,13 @@ files = [ [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] From 22c966d8fd20d94a883d80cdd5b7830e1fd35b84 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 12 Feb 2024 11:38:41 -0600 Subject: [PATCH 109/923] [bot] Fingerprints: add missing FW versions from new users (#31414) 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 e9c0f5acec..12a1d46aaf 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -56,6 +56,7 @@ FW_VERSIONS = { b'\x01896630725100\x00\x00\x00\x00', b'\x01896630725200\x00\x00\x00\x00', b'\x01896630725300\x00\x00\x00\x00', + b'\x01896630725400\x00\x00\x00\x00', b'\x01896630735100\x00\x00\x00\x00', b'\x01896630738000\x00\x00\x00\x00', b'\x02896630724000\x00\x00\x00\x00897CF3302002\x00\x00\x00\x00', From 279d2c3b2319bab73bbc9ed103911b6df3b0dc02 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 12 Feb 2024 10:11:37 -0800 Subject: [PATCH 110/923] SubMaster: improve service aliveness checks (#31391) * bump cereal * fix * fixes * single poll * bump * bump --------- Co-authored-by: Comma Device --- cereal | 2 +- selfdrive/controls/controlsd.py | 4 +++- selfdrive/controls/plannerd.py | 3 +-- selfdrive/locationd/calibrationd.py | 2 +- selfdrive/locationd/paramsd.py | 2 +- selfdrive/locationd/torqued.py | 2 +- selfdrive/manager/manager.py | 4 ++-- selfdrive/monitoring/dmonitoringd.py | 2 +- selfdrive/thermald/thermald.py | 2 +- system/webrtc/tests/test_webrtcd.py | 2 +- 10 files changed, 13 insertions(+), 12 deletions(-) diff --git a/cereal b/cereal index e2811732e6..9b573c2be3 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit e2811732e6d4865a1e7430810a318a161afc5b4f +Subproject commit 9b573c2be34b638ff462648308d3c7075d0ff174 diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index a75addc3bf..4af584a9d2 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -80,7 +80,8 @@ class Controls: 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', 'testJoystick'] + self.camera_packets + self.sensor_packets, - ignore_alive=ignore, ignore_avg_freq=['radarState', 'testJoystick'], ignore_valid=['testJoystick', ]) + ignore_alive=ignore, ignore_avg_freq=ignore+['radarState', 'testJoystick'], ignore_valid=['testJoystick', ], + frequency=int(1/DT_CTRL)) if CI is None: # wait for one pandaState and one CAN packet @@ -452,6 +453,7 @@ class Controls: invalid=[s for s, valid in self.sm.valid.items() if not valid], not_alive=[s for s, alive in self.sm.alive.items() if not alive], not_freq_ok=[s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok], + error=True, ) # Check for CAN timeout diff --git a/selfdrive/controls/plannerd.py b/selfdrive/controls/plannerd.py index 5ab4894424..eeeeda050e 100755 --- a/selfdrive/controls/plannerd.py +++ b/selfdrive/controls/plannerd.py @@ -29,11 +29,10 @@ def plannerd_thread(): longitudinal_planner = LongitudinalPlanner(CP) pm = messaging.PubMaster(['longitudinalPlan', 'uiPlan']) sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'radarState', 'modelV2'], - poll=['radarState', 'modelV2'], ignore_avg_freq=['radarState']) + poll='modelV2', ignore_avg_freq=['radarState']) while True: sm.update() - if sm.updated['modelV2']: longitudinal_planner.update(sm) longitudinal_planner.publish(sm, pm) diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index 06be9f031a..da1c4ec37b 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -260,7 +260,7 @@ def main() -> NoReturn: set_realtime_priority(1) pm = messaging.PubMaster(['liveCalibration']) - sm = messaging.SubMaster(['cameraOdometry', 'carState', 'carParams'], poll=['cameraOdometry']) + sm = messaging.SubMaster(['cameraOdometry', 'carState', 'carParams'], poll='cameraOdometry') calibrator = Calibrator(param_put=True) diff --git a/selfdrive/locationd/paramsd.py b/selfdrive/locationd/paramsd.py index 183a8666e8..d124eb5f05 100755 --- a/selfdrive/locationd/paramsd.py +++ b/selfdrive/locationd/paramsd.py @@ -124,7 +124,7 @@ def main(): REPLAY = bool(int(os.getenv("REPLAY", "0"))) pm = messaging.PubMaster(['liveParameters']) - sm = messaging.SubMaster(['liveLocationKalman', 'carState'], poll=['liveLocationKalman']) + sm = messaging.SubMaster(['liveLocationKalman', 'carState'], poll='liveLocationKalman') params_reader = Params() # wait for stats about the car to come in from controls diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index f2c0248afa..51418f9c1e 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -218,7 +218,7 @@ def main(demo=False): config_realtime_process([0, 1, 2, 3], 5) pm = messaging.PubMaster(['liveTorqueParameters']) - sm = messaging.SubMaster(['carControl', 'carState', 'liveLocationKalman'], poll=['liveLocationKalman']) + sm = messaging.SubMaster(['carControl', 'carState', 'liveLocationKalman'], poll='liveLocationKalman') params = Params() with car.CarParams.from_bytes(params.get("CarParams", block=True)) as CP: diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index ddc1200cbc..50ba73f18c 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -127,7 +127,7 @@ def manager_thread() -> None: ignore.append("pandad") ignore += [x for x in os.getenv("BLOCK", "").split(",") if len(x) > 0] - sm = messaging.SubMaster(['deviceState', 'carParams'], poll=['deviceState']) + sm = messaging.SubMaster(['deviceState', 'carParams'], poll='deviceState') pm = messaging.PubMaster(['managerState']) write_onroad_params(False, params) @@ -136,7 +136,7 @@ def manager_thread() -> None: started_prev = False while True: - sm.update() + sm.update(1000) started = sm['deviceState'].started diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index 8e68c0e3bc..579e79093f 100755 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -15,7 +15,7 @@ def dmonitoringd_thread(): params = Params() pm = messaging.PubMaster(['driverMonitoringState']) - sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'controlsState', 'modelV2'], poll=['driverStateV2']) + sm = messaging.SubMaster(['driverStateV2', 'liveCalibration', 'carState', 'controlsState', 'modelV2'], poll='driverStateV2') driver_status = DriverStatus(rhd_saved=params.get_bool("IsRhdDetected")) diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index abe686903b..bfca2ccabb 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -166,7 +166,7 @@ def hw_state_thread(end_event, hw_queue): def thermald_thread(end_event, hw_queue) -> None: pm = messaging.PubMaster(['deviceState']) - sm = messaging.SubMaster(["peripheralState", "gpsLocationExternal", "controlsState", "pandaStates"], poll=["pandaStates"]) + sm = messaging.SubMaster(["peripheralState", "gpsLocationExternal", "controlsState", "pandaStates"], poll="pandaStates") count = 0 diff --git a/system/webrtc/tests/test_webrtcd.py b/system/webrtc/tests/test_webrtcd.py index b48bf6bc19..e92958cc92 100755 --- a/system/webrtc/tests/test_webrtcd.py +++ b/system/webrtc/tests/test_webrtcd.py @@ -24,7 +24,7 @@ class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): async def test_webrtcd(self): mock_request = MagicMock() async def connect(offer): - body = {'sdp': offer.sdp, 'cameras': offer.video, 'bridge_services_in': [], 'bridge_services_out': []} + body = {'sdp': offer.sdp, 'cameras': offer.video, 'bridge_services_in': [], 'bridge_services_out': ['carState']} mock_request.json.side_effect = AsyncMock(return_value=body) response = await get_stream(mock_request) response_json = json.loads(response.text) From 0a92c5bf966530335e804a8f240b10ae982bfcb2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 12 Feb 2024 15:58:25 -0500 Subject: [PATCH 111/923] LogReader: live_logreader helpers (#31416) live helper --- selfdrive/debug/dump.py | 26 +++++++------------------- tools/lib/logreader.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/selfdrive/debug/dump.py b/selfdrive/debug/dump.py index db18f4c622..514a415577 100755 --- a/selfdrive/debug/dump.py +++ b/selfdrive/debug/dump.py @@ -1,14 +1,14 @@ #!/usr/bin/env python3 -import os import sys import argparse import json import codecs -import cereal.messaging as messaging from hexdump import hexdump from cereal import log from cereal.services import SERVICE_LIST +from openpilot.tools.lib.logreader import raw_live_logreader + codecs.register_error("strict", codecs.backslashreplace_errors) @@ -22,32 +22,20 @@ if __name__ == "__main__": parser.add_argument('--no-print', action='store_true') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument('--values', help='values to monitor (instead of entire event)') - parser.add_argument("socket", type=str, nargs='*', help="socket names to dump. defaults to all services defined in cereal") + parser.add_argument("socket", type=str, nargs='*', default=list(SERVICE_LIST.keys()), help="socket names to dump. defaults to all services defined in cereal") args = parser.parse_args() - if args.addr != "127.0.0.1": - os.environ["ZMQ"] = "1" - messaging.context = messaging.Context() - - poller = messaging.Poller() - - for m in args.socket if len(args.socket) > 0 else SERVICE_LIST: - messaging.sub_sock(m, poller, addr=args.addr) + lr = raw_live_logreader(args.socket, args.addr) values = None if args.values: values = [s.strip().split(".") for s in args.values.split(",")] - while 1: - polld = poller.poll(100) - for sock in polld: - msg = sock.receive() - with log.Event.from_bytes(msg) as log_evt: - evt = log_evt - + for msg in lr: + with log.Event.from_bytes(msg) as evt: if not args.no_print: if args.pipe: - sys.stdout.write(msg) + sys.stdout.write(str(msg)) sys.stdout.flush() elif args.raw: hexdump(msg) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 4d76f2a38f..24dfc75d47 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -16,7 +16,8 @@ import warnings from typing import Dict, Iterable, Iterator, List, Type from urllib.parse import parse_qs, urlparse -from cereal import log as capnp_log +from cereal import log as capnp_log, messaging +from cereal.services import SERVICE_LIST from openpilot.common.swaglog import cloudlog from openpilot.tools.lib.comma_car_segments import get_url as get_comma_segments_url from openpilot.tools.lib.openpilotci import get_url @@ -26,6 +27,7 @@ from openpilot.tools.lib.route import Route, SegmentRange LogMessage = Type[capnp._DynamicStructReader] LogIterable = Iterable[LogMessage] +RawLogIterable = Iterable[bytes] class _LogFileReader: @@ -292,6 +294,31 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout return next(self.filter(msg_type), None) +ALL_SERVICES = list(SERVICE_LIST.keys()) + +def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: + if addr != "127.0.0.1": + os.environ["ZMQ"] = "1" + messaging.context = messaging.Context() + + poller = messaging.Poller() + + for m in services: + messaging.sub_sock(m, poller, addr=addr) + + while True: + polld = poller.poll(100) + for sock in polld: + msg = sock.receive() + yield msg + + +def live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: + for m in raw_live_logreader(services, addr): + with capnp_log.Event.from_bytes(m) as evt: + yield evt + + if __name__ == "__main__": import codecs # capnproto <= 0.8.0 throws errors converting byte data to string From 4b004d59f3441f59cc78e6f8494e1e70451cf33e Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 12 Feb 2024 15:00:01 -0800 Subject: [PATCH 112/923] radard: enable avg input service frequency checks (#31404) * radard: enable avg frequency checks * freq * update cpu * fix diff --- cereal | 2 +- selfdrive/controls/radard.py | 15 +++++++-------- selfdrive/test/test_onroad.py | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/cereal b/cereal index 9b573c2be3..70b68f6e3a 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 9b573c2be34b638ff462648308d3c7075d0ff174 +Subproject commit 70b68f6e3a24b046f0f4124a419ee7b841e05281 diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index f5f76ec2f0..b0b9350dec 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -8,7 +8,7 @@ import capnp from cereal import messaging, log, car from openpilot.common.numpy_fast import interp from openpilot.common.params import Params -from openpilot.common.realtime import Ratekeeper, Priority, config_realtime_process +from openpilot.common.realtime import DT_CTRL, Ratekeeper, Priority, config_realtime_process from openpilot.common.swaglog import cloudlog from openpilot.common.simple_kalman import KF1D @@ -201,6 +201,7 @@ class RadarD: self.v_ego = 0.0 self.v_ego_hist = deque([0.0], maxlen=delay+1) + self.last_v_ego_frame = -1 self.radar_state: Optional[capnp._DynamicStructBuilder] = None self.radar_state_valid = False @@ -208,6 +209,7 @@ class RadarD: self.ready = False def update(self, sm: messaging.SubMaster, rr: Optional[car.RadarData]): + self.ready = sm.seen['modelV2'] self.current_time = 1e-9*max(sm.logMonoTime.values()) radar_points = [] @@ -216,11 +218,10 @@ class RadarD: radar_points = rr.points radar_errors = rr.errors - if sm.updated['carState']: + if sm.recv_frame['carState'] != self.last_v_ego_frame: self.v_ego = sm['carState'].vEgo self.v_ego_hist.append(self.v_ego) - if sm.updated['modelV2']: - self.ready = True + self.last_v_ego_frame = sm.recv_frame['carState'] ar_pts = {} for pt in radar_points: @@ -297,7 +298,7 @@ def main(): # *** setup messaging can_sock = messaging.sub_sock('can') - sm = messaging.SubMaster(['modelV2', 'carState'], ignore_avg_freq=['modelV2', 'carState']) # Can't check average frequency, since radar determines timing + sm = messaging.SubMaster(['modelV2', 'carState'], frequency=int(1./DT_CTRL)) pm = messaging.PubMaster(['radarState', 'liveTracks']) RI = RadarInterface(CP) @@ -308,12 +309,10 @@ def main(): while 1: can_strings = messaging.drain_sock_raw(can_sock, wait_for_one=True) rr = RI.update(can_strings) - + sm.update(0) if rr is None: continue - sm.update(0) - RD.update(sm, rr) RD.publish(pm, -rk.remaining*1000.0) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index d5350239fe..c9064df870 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -39,7 +39,7 @@ PROCS = { "./ui": 18.0, "selfdrive.locationd.paramsd": 9.0, "./sensord": 7.0, - "selfdrive.controls.radard": 4.5, + "selfdrive.controls.radard": 7.0, "selfdrive.modeld.modeld": 13.0, "selfdrive.modeld.dmonitoringmodeld": 8.0, "selfdrive.modeld.navmodeld": 1.0, From 7010aae0a905457cb026b20a19e049104f4b45f7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 12 Feb 2024 18:41:04 -0500 Subject: [PATCH 113/923] jenkins: kill subprocesses on exit (#31422) * kill-on-exit * kill all --- Jenkinsfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 991c940ad6..76630393e6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,6 +16,8 @@ ssh -tt -o ConnectTimeout=30 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 set -e +shopt -s huponexit # kill all child processes when the shell exits + export CI=1 export PYTHONWARNINGS=error export LOGPRINT=debug From cabde52ac6124ac2ae4259a51bc67dc1e3769bec Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 12 Feb 2024 21:20:49 -0600 Subject: [PATCH 114/923] Ford: log traction control status (#31424) * not sure which to use * cluster changes a bit earlier andis already used for nonAdaptive --- selfdrive/car/ford/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index 9230d16ef9..ef56d23d79 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -54,7 +54,7 @@ class CarState(CarStateBase): ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > CarControllerParams.STEER_DRIVER_ALLOWANCE, 5) ret.steerFaultTemporary = cp.vl["EPAS_INFO"]["EPAS_Failure"] == 1 ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3) - # ret.espDisabled = False # TODO: find traction control signal + ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode if self.CP.carFingerprint in CANFD_CAR: # this signal is always 0 on non-CAN FD cars From 78e4508e3bc1efc49cbc43e76d6467ca506601e1 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 00:04:53 -0500 Subject: [PATCH 115/923] FCA: car port for Dodge Durango 2021 (#31015) * dodge durango * add dodge Co-authored-by: Shane Smiskol * add comment * more exact --------- Co-authored-by: Shane Smiskol --- RELEASES.md | 1 + docs/CARS.md | 3 ++- selfdrive/car/chrysler/fingerprints.py | 30 +++++++++++++++++++++++ selfdrive/car/chrysler/interface.py | 5 ++-- selfdrive/car/chrysler/values.py | 5 ++++ selfdrive/car/tests/routes.py | 1 + selfdrive/car/torque_data/substitute.toml | 2 ++ 7 files changed, 44 insertions(+), 3 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index cf8d5eaea2..8810e4aef5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -9,6 +9,7 @@ Version 0.9.6 (2024-02-XX) * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models +* Dodge Duranago 2020-21 support * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! * Lexus LC 2024 support thanks to nelsonjchen! diff --git a/docs/CARS.md b/docs/CARS.md index 736aaaec13..33400be4b4 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. -# 277 Supported Cars +# 278 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -33,6 +33,7 @@ A supported vehicle is one that just works when you install a comma device. All |Chrysler|Pacifica Hybrid 2018|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 Hybrid 2019-23|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
|| |comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None|| +|Dodge|Durango 2020-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
|| |Ford|Bronco Sport 2021-22|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|Escape 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Explorer 2020-23|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 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/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 9511684f88..952a297e8f 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -612,4 +612,34 @@ FW_VERSIONS = { b'M2421132MB', ], }, + CAR.DODGE_DURANGO: { + (Ecu.combinationMeter, 0x742, None): [ + b'68454261AD', + b'68471535AE', + ], + (Ecu.srs, 0x744, None): [ + b'68355362AB', + b'68492238AD', + ], + (Ecu.abs, 0x747, None): [ + b'68408639AD', + b'68499978AB', + ], + (Ecu.fwdRadar, 0x753, None): [ + b'68440581AE', + b'68456722AC', + ], + (Ecu.eps, 0x75a, None): [ + b'68453435AA', + b'68498477AA', + ], + (Ecu.engine, 0x7e0, None): [ + b'05035786AE ', + b'68449476AE ', + ], + (Ecu.transmission, 0x7e1, None): [ + b'05035826AC', + b'68449265AC', + ], + }, } diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 10cdd0fd14..32a4f5dfcf 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -28,13 +28,13 @@ 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) + new_eps_platform = candidate in (CAR.PACIFICA_2019_HYBRID, CAR.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): + if candidate in (CAR.PACIFICA_2017_HYBRID, CAR.PACIFICA_2018, CAR.PACIFICA_2018_HYBRID, CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.DODGE_DURANGO): ret.mass = 2242. ret.wheelbase = 3.089 ret.steerRatio = 16.2 # Pacifica Hybrid 2017 @@ -80,6 +80,7 @@ class CarInterface(CarInterfaceBase): if ret.flags & ChryslerFlags.HIGHER_MIN_STEERING_SPEED: # TODO: allow these cars to steer down to 13 m/s if already engaged. + # TODO: Durango 2020 may be able to steer to zero once above 38 kph ret.minSteerSpeed = 17.5 # m/s 17 on the way up, 13 on the way down once engaged. ret.centerToFront = ret.wheelbase * 0.44 diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 34e602562a..94ff1f1d0f 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -23,6 +23,9 @@ class CAR(StrEnum): PACIFICA_2018 = "CHRYSLER PACIFICA 2018" PACIFICA_2020 = "CHRYSLER PACIFICA 2020" + # Dodge + DODGE_DURANGO = "DODGE DURANGO 2021" + # Jeep JEEP_GRAND_CHEROKEE = "JEEP GRAND CHEROKEE V6 2018" # includes 2017 Trailhawk JEEP_GRAND_CHEROKEE_2019 = "JEEP GRAND CHEROKEE 2019" # includes 2020 Trailhawk @@ -74,6 +77,7 @@ CAR_INFO: Dict[str, Optional[Union[ChryslerCarInfo, List[ChryslerCarInfo]]]] = { ], CAR.JEEP_GRAND_CHEROKEE: ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk"), CAR.JEEP_GRAND_CHEROKEE_2019: ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4"), + CAR.DODGE_DURANGO: ChryslerCarInfo("Dodge Durango 2020-21"), CAR.RAM_1500: ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram])), CAR.RAM_HD: [ ChryslerCarInfo("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), @@ -128,6 +132,7 @@ DBC = { CAR.PACIFICA_2020: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), CAR.PACIFICA_2018_HYBRID: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), CAR.PACIFICA_2019_HYBRID: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), + CAR.DODGE_DURANGO: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), CAR.JEEP_GRAND_CHEROKEE: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), CAR.JEEP_GRAND_CHEROKEE_2019: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), CAR.RAM_1500: dbc_dict('chrysler_ram_dt_generated', None), diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 853c441582..a8ab89cd4a 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -46,6 +46,7 @@ routes = [ 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("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), diff --git a/selfdrive/car/torque_data/substitute.toml b/selfdrive/car/torque_data/substitute.toml index d79475fc36..6822ef437b 100644 --- a/selfdrive/car/torque_data/substitute.toml +++ b/selfdrive/car/torque_data/substitute.toml @@ -5,6 +5,8 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "MAZDA CX-5 2022" = "MAZDA CX-9 2021" "MAZDA CX-9" = "MAZDA CX-9 2021" +"DODGE DURANGO 2021" = "CHRYSLER PACIFICA 2020" + "TOYOTA ALPHARD 2020" = "TOYOTA SIENNA 2018" "TOYOTA PRIUS v 2017" = "TOYOTA PRIUS 2017" "LEXUS IS 2018" = "LEXUS NX 2018" From 04ada8e4368bb80db350a1a748d2884d60c6770e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 12 Feb 2024 23:28:16 -0600 Subject: [PATCH 116/923] Toyota: log engine RPM (#31423) * Update carstate.py * 42 is safe * mirai * we hit this after 30 mins: Exceeded message traversal limit. See capnp::ReaderOptions. * too easy to write this bug, no need to be generic yet * Update ref_commit --- selfdrive/car/toyota/carstate.py | 6 ++++++ selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 2461fa9a26..e4ea0d30f9 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -95,6 +95,9 @@ 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: + ret.engineRpm = cp.vl["ENGINE_RPM"]["RPM"] + ret.steeringTorque = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_DRIVER"] ret.steeringTorqueEps = cp.vl["STEER_TORQUE_SENSOR"]["STEER_TORQUE_EPS"] * self.eps_torque_scale # we could use the override bit from dbc, but it's triggered at too high torque values @@ -180,6 +183,9 @@ class CarState(CarStateBase): ("STEER_TORQUE_SENSOR", 50), ] + if CP.carFingerprint != CAR.MIRAI: + messages.append(("ENGINE_RPM", 42)) + if CP.carFingerprint in UNSUPPORTED_DSU_CAR: messages.append(("DSU_CRUISE", 5)) messages.append(("PCM_CRUISE_ALT", 1)) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index f49776ecc0..f5ad6407dd 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -21472c7936cbf3a3b585ddda8c08f1b814fdd6d3 \ No newline at end of file +bd44a98bdb248f3c7b988f81ee130c2542b18ae7 From 416e8253ec5a5c5d509fd3410de76c4fb995e91a Mon Sep 17 00:00:00 2001 From: Eric Brown Date: Mon, 12 Feb 2024 22:35:44 -0700 Subject: [PATCH 117/923] GM: Remove Equinox from dashcam mode (#31257) * Remove Equinox from dashcam mode * Add fingerprint * Set moving backward only if not moving forward * Bump opendbc * Update moving backward definition * Update docs * Bump opendbc * REVERTME: Add assert statement at Shane's request * REVERTME: check unsupported and fault status * Revert "REVERTME: check unsupported and fault status" This reverts commit 5a0ebad66c4dcd33ee4eb5d0c5d3f036244653e2. * Revert "REVERTME: Add assert statement at Shane's request" This reverts commit b4b885eb11ad3079a84033f20f670cc905113bb9. * Use or Co-authored-by: Shane Smiskol * Add comment * Add test route * Use newer fingerprint * Emtpy commit to rerun CI * Empty commit to rerun CI * Update selfdrive/car/gm/fingerprints.py * little more * remove from non-tested * update * add to releases --------- Co-authored-by: Shane Smiskol Co-authored-by: Justin Newberry --- RELEASES.md | 1 + docs/CARS.md | 3 ++- selfdrive/car/gm/fingerprints.py | 4 ++++ selfdrive/car/gm/interface.py | 2 +- selfdrive/car/tests/routes.py | 2 +- selfdrive/car/torque_data/override.toml | 2 +- 6 files changed, 10 insertions(+), 4 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 8810e4aef5..e5f1e76750 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -9,6 +9,7 @@ Version 0.9.6 (2024-02-XX) * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models +* Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire! * Dodge Duranago 2020-21 support * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! diff --git a/docs/CARS.md b/docs/CARS.md index 33400be4b4..48e2e77e62 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. -# 278 Supported Cars +# 279 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -23,6 +23,7 @@ A supported vehicle is one that just works when you install a comma device. All |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
|| diff --git a/selfdrive/car/gm/fingerprints.py b/selfdrive/car/gm/fingerprints.py index c349ee2856..73a205a250 100644 --- a/selfdrive/car/gm/fingerprints.py +++ b/selfdrive/car/gm/fingerprints.py @@ -2,6 +2,7 @@ from openpilot.selfdrive.car.gm.values import CAR # Trailblazer also matches as a SILVERADO, TODO: split with fw versions +# FIXME: There are Equinox users with different message lengths, specifically 304 and 320 FINGERPRINTS = { @@ -52,6 +53,9 @@ FINGERPRINTS = { }], CAR.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 + }, + { + 190: 6, 201: 8, 211: 2, 717: 5, 241: 6, 451: 8, 298: 8, 452: 8, 453: 6, 479: 3, 485: 8, 249: 8, 500: 6, 587: 8, 1611: 8, 289: 8, 481: 7, 193: 8, 197: 8, 209: 7, 455: 7, 489: 8, 309: 8, 413: 8, 501: 8, 608: 8, 609: 6, 610: 6, 611: 6, 612: 8, 613: 8, 311: 8, 510: 8, 528: 5, 532: 6, 715: 8, 560: 8, 562: 8, 707: 8, 789: 5, 869: 4, 880: 6, 761: 7, 840: 5, 842: 5, 844: 8, 313: 8, 381: 8, 386: 8, 810: 8, 322: 7, 384: 4, 800: 6, 1033: 7, 1034: 7, 1296: 4, 753: 5, 388: 8, 288: 5, 497: 8, 463: 3, 304: 3, 977: 8, 1001: 8, 1280: 4, 320: 4, 352: 5, 563: 5, 565: 5, 1221: 5, 1011: 6, 1017: 8, 1020: 8, 1249: 8, 1300: 8, 328: 1, 1217: 8, 1233: 8, 1259: 8, 1261: 7, 1263: 4, 1265: 8, 1267: 1, 1930: 7, 1271: 8 }], } diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 0c78b0061d..05caa28510 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -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, CAR.EQUINOX} or \ + ret.dashcamOnly = candidate in {CAR.CADILLAC_ATS, CAR.HOLDEN_ASTRA, CAR.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. diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index a8ab89cd4a..b874e31b6a 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -20,7 +20,6 @@ non_tested_cars = [ GM.CADILLAC_ATS, GM.HOLDEN_ASTRA, GM.MALIBU, - GM.EQUINOX, HYUNDAI.GENESIS_G90, HONDA.ODYSSEY_CHN, VOLKSWAGEN.CRAFTER_MK2, # need a route from an ACC-equipped Crafter @@ -60,6 +59,7 @@ routes = [ CarTestRoute("7cc2a8365b4dd8a9|2018-12-02--12-10-44", GM.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), diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 86723efb7b..339fc533e5 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -42,7 +42,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "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.0, 2.0, 0.05] +"CHEVROLET EQUINOX 2019" = [2.5, 2.5, 0.05] "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] From cccf28b9cabb5b38e4243bd50ddd2c22ae023ca6 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 14:02:21 -0500 Subject: [PATCH 118/923] jenkins: reduce connection timeouts (#31431) reduce jenkins timeouts --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 76630393e6..d716510bfe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,7 +12,7 @@ def retryWithDelay(int maxRetries, int delay, Closure body) { def device(String ip, String step_label, String cmd) { withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) { def ssh_cmd = """ -ssh -tt -o ConnectTimeout=30 -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o BatchMode=yes -o StrictHostKeyChecking=no -i ${key_file} 'comma@${ip}' /usr/bin/bash <<'END' +ssh -tt -o ConnectTimeout=5 -o ServerAliveInterval=5 -o ServerAliveCountMax=2 -o BatchMode=yes -o StrictHostKeyChecking=no -i ${key_file} 'comma@${ip}' /usr/bin/bash <<'END' set -e From 6f4d3883484d454b629d65a806b558692b890f09 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 14:16:24 -0500 Subject: [PATCH 119/923] test_qcomgpsd: parametize tests (#31430) * parameterize qcomgpsd * one line --- system/qcomgpsd/tests/test_qcomgpsd.py | 31 +++++++++++++------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/system/qcomgpsd/tests/test_qcomgpsd.py b/system/qcomgpsd/tests/test_qcomgpsd.py index 8291f2cc32..9acdacb56a 100755 --- a/system/qcomgpsd/tests/test_qcomgpsd.py +++ b/system/qcomgpsd/tests/test_qcomgpsd.py @@ -6,6 +6,7 @@ import time import datetime import unittest import subprocess +from parameterized import parameterized import cereal.messaging as messaging from openpilot.system.qcomgpsd.qcomgpsd import at_cmd, wait_for_modem @@ -57,24 +58,24 @@ class TestRawgpsd(unittest.TestCase): os.system("sudo systemctl restart ModemManager") assert self._wait_for_output(30) - def test_startup_time(self): - for internet in (True, False): - if not internet: - os.system("sudo systemctl stop systemd-resolved") - with self.subTest(internet=internet): - managed_processes['qcomgpsd'].start() - assert self._wait_for_output(7) - managed_processes['qcomgpsd'].stop() - - def test_turns_off_gnss(self): - for s in (0.1, 1, 5): + @parameterized.expand([(b,) for b in (True, False)]) + def test_startup_time(self, internet): + if not internet: + os.system("sudo systemctl stop systemd-resolved") + with self.subTest(internet=internet): managed_processes['qcomgpsd'].start() - time.sleep(s) + assert self._wait_for_output(7) managed_processes['qcomgpsd'].stop() - ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') - loc_status = json.loads(ls) - assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} + @parameterized.expand([(t,) for t in (0.1, 1, 5)]) + def test_turns_off_gnss(self, runtime): + managed_processes['qcomgpsd'].start() + time.sleep(runtime) + managed_processes['qcomgpsd'].stop() + + ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') + loc_status = json.loads(ls) + assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} def check_assistance(self, should_be_loaded): From b4a11a722955f5ca6dd787cfb3d34aeddc3d5255 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 14:57:08 -0500 Subject: [PATCH 120/923] CI: reduce car tests timeout (#31433) * reduce cars timeout * 10 --- .github/workflows/selfdrive_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 37545cf06d..8b1f256bfb 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -313,7 +313,7 @@ jobs: - name: Build openpilot run: ${{ env.RUN }} "scons -j$(nproc)" - name: Test car models - timeout-minutes: 25 + timeout-minutes: 10 run: | ${{ env.RUN }} "$PYTEST selfdrive/car/tests/test_models.py && \ chmod -R 777 /tmp/comma_download_cache" From e9071f11988f780063e74c01c11bbb2dd7448bee Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 13 Feb 2024 13:01:25 -0800 Subject: [PATCH 121/923] dongle id is only hex (#31426) * dongle id is only hex * so is the count --- tools/lib/helpers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index 423f207b4d..5ec6c62339 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -5,9 +5,9 @@ TIME_FMT = "%Y-%m-%d--%H-%M-%S" # regex patterns class RE: - DONGLE_ID = r'(?P[a-z0-9]{16})' + DONGLE_ID = r'(?P[a-f0-9]{16})' TIMESTAMP = r'(?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' - LOG_ID_V2 = r'(?P[a-z0-9]{8})--(?P[a-z0-9]{10})' + LOG_ID_V2 = r'(?P[a-f0-9]{8})--(?P[a-z0-9]{10})' LOG_ID = r'(?P(?:{}|{}))'.format(TIMESTAMP, LOG_ID_V2) ROUTE_NAME = r'(?P{}[|_/]{})'.format(DONGLE_ID, LOG_ID) SEGMENT_NAME = r'{}(?:--|/)(?P[0-9]+)'.format(ROUTE_NAME) From 7f7f1fd21b293901fa003dce8656db89e15726aa Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 13 Feb 2024 13:23:27 -0800 Subject: [PATCH 122/923] Revert "radard: enable avg input service frequency checks (#31404)" This reverts commit 4b004d59f3441f59cc78e6f8494e1e70451cf33e. --- cereal | 2 +- selfdrive/controls/radard.py | 15 ++++++++------- selfdrive/test/test_onroad.py | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/cereal b/cereal index 70b68f6e3a..9b573c2be3 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 70b68f6e3a24b046f0f4124a419ee7b841e05281 +Subproject commit 9b573c2be34b638ff462648308d3c7075d0ff174 diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index b0b9350dec..f5f76ec2f0 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -8,7 +8,7 @@ import capnp from cereal import messaging, log, car from openpilot.common.numpy_fast import interp from openpilot.common.params import Params -from openpilot.common.realtime import DT_CTRL, Ratekeeper, Priority, config_realtime_process +from openpilot.common.realtime import Ratekeeper, Priority, config_realtime_process from openpilot.common.swaglog import cloudlog from openpilot.common.simple_kalman import KF1D @@ -201,7 +201,6 @@ class RadarD: self.v_ego = 0.0 self.v_ego_hist = deque([0.0], maxlen=delay+1) - self.last_v_ego_frame = -1 self.radar_state: Optional[capnp._DynamicStructBuilder] = None self.radar_state_valid = False @@ -209,7 +208,6 @@ class RadarD: self.ready = False def update(self, sm: messaging.SubMaster, rr: Optional[car.RadarData]): - self.ready = sm.seen['modelV2'] self.current_time = 1e-9*max(sm.logMonoTime.values()) radar_points = [] @@ -218,10 +216,11 @@ class RadarD: radar_points = rr.points radar_errors = rr.errors - if sm.recv_frame['carState'] != self.last_v_ego_frame: + if sm.updated['carState']: self.v_ego = sm['carState'].vEgo self.v_ego_hist.append(self.v_ego) - self.last_v_ego_frame = sm.recv_frame['carState'] + if sm.updated['modelV2']: + self.ready = True ar_pts = {} for pt in radar_points: @@ -298,7 +297,7 @@ def main(): # *** setup messaging can_sock = messaging.sub_sock('can') - sm = messaging.SubMaster(['modelV2', 'carState'], frequency=int(1./DT_CTRL)) + sm = messaging.SubMaster(['modelV2', 'carState'], ignore_avg_freq=['modelV2', 'carState']) # Can't check average frequency, since radar determines timing pm = messaging.PubMaster(['radarState', 'liveTracks']) RI = RadarInterface(CP) @@ -309,10 +308,12 @@ def main(): while 1: can_strings = messaging.drain_sock_raw(can_sock, wait_for_one=True) rr = RI.update(can_strings) - sm.update(0) + if rr is None: continue + sm.update(0) + RD.update(sm, rr) RD.publish(pm, -rk.remaining*1000.0) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index c9064df870..d5350239fe 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -39,7 +39,7 @@ PROCS = { "./ui": 18.0, "selfdrive.locationd.paramsd": 9.0, "./sensord": 7.0, - "selfdrive.controls.radard": 7.0, + "selfdrive.controls.radard": 4.5, "selfdrive.modeld.modeld": 13.0, "selfdrive.modeld.dmonitoringmodeld": 8.0, "selfdrive.modeld.navmodeld": 1.0, From d6762c3035fac31cc9582c685c07441d61da0f83 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 16:29:52 -0500 Subject: [PATCH 123/923] live_logreader to its own file (#31436) own file --- selfdrive/debug/dump.py | 2 +- tools/lib/live_logreader.py | 31 +++++++++++++++++++++++++++++++ tools/lib/logreader.py | 28 +--------------------------- 3 files changed, 33 insertions(+), 28 deletions(-) create mode 100644 tools/lib/live_logreader.py diff --git a/selfdrive/debug/dump.py b/selfdrive/debug/dump.py index 514a415577..787e9bc738 100755 --- a/selfdrive/debug/dump.py +++ b/selfdrive/debug/dump.py @@ -7,7 +7,7 @@ import codecs from hexdump import hexdump from cereal import log from cereal.services import SERVICE_LIST -from openpilot.tools.lib.logreader import raw_live_logreader +from openpilot.tools.lib.live_logreader import raw_live_logreader codecs.register_error("strict", codecs.backslashreplace_errors) diff --git a/tools/lib/live_logreader.py b/tools/lib/live_logreader.py new file mode 100644 index 0000000000..0678fd1d00 --- /dev/null +++ b/tools/lib/live_logreader.py @@ -0,0 +1,31 @@ +import os +from typing import List +from cereal import log as capnp_log, messaging +from cereal.services import SERVICE_LIST + +from openpilot.tools.lib.logreader import LogIterable, RawLogIterable + + +ALL_SERVICES = list(SERVICE_LIST.keys()) + +def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: + if addr != "127.0.0.1": + os.environ["ZMQ"] = "1" + messaging.context = messaging.Context() + + poller = messaging.Poller() + + for m in services: + messaging.sub_sock(m, poller, addr=addr) + + while True: + polld = poller.poll(100) + for sock in polld: + msg = sock.receive() + yield msg + + +def live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: + for m in raw_live_logreader(services, addr): + with capnp_log.Event.from_bytes(m) as evt: + yield evt diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 24dfc75d47..f7548b8c0f 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -16,8 +16,7 @@ import warnings from typing import Dict, Iterable, Iterator, List, Type from urllib.parse import parse_qs, urlparse -from cereal import log as capnp_log, messaging -from cereal.services import SERVICE_LIST +from cereal import log as capnp_log from openpilot.common.swaglog import cloudlog from openpilot.tools.lib.comma_car_segments import get_url as get_comma_segments_url from openpilot.tools.lib.openpilotci import get_url @@ -294,31 +293,6 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout return next(self.filter(msg_type), None) -ALL_SERVICES = list(SERVICE_LIST.keys()) - -def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: - if addr != "127.0.0.1": - os.environ["ZMQ"] = "1" - messaging.context = messaging.Context() - - poller = messaging.Poller() - - for m in services: - messaging.sub_sock(m, poller, addr=addr) - - while True: - polld = poller.poll(100) - for sock in polld: - msg = sock.receive() - yield msg - - -def live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: - for m in raw_live_logreader(services, addr): - with capnp_log.Event.from_bytes(m) as evt: - yield evt - - if __name__ == "__main__": import codecs # capnproto <= 0.8.0 throws errors converting byte data to string From c5739651a241788f9c84ebf705325de57aabfc39 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 13 Feb 2024 14:22:46 -0800 Subject: [PATCH 124/923] timed: publish clocks periodically (#31434) * timed: publish clocks periodically * simplify * Apply suggestions from code review --- cereal | 2 +- system/timed.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cereal b/cereal index 9b573c2be3..e842020c1c 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 9b573c2be34b638ff462648308d3c7075d0ff174 +Subproject commit e842020c1c7a2c43fda17f4075307ae8abb9bc3a diff --git a/system/timed.py b/system/timed.py index 21fb47b680..39acb2ba12 100755 --- a/system/timed.py +++ b/system/timed.py @@ -65,10 +65,15 @@ def main() -> NoReturn: cloudlog.debug("Restoring timezone from param") set_timezone(tz) + pm = messaging.PubMaster(['clocks']) sm = messaging.SubMaster(['liveLocationKalman']) while True: sm.update(1000) + msg = messaging.new_message('clocks', valid=True) + msg.clocks.wallTimeNanos = time.time_ns() + pm.send('clocks', msg) + llk = sm['liveLocationKalman'] if not llk.gpsOK or (time.monotonic() - sm.logMonoTime['liveLocationKalman']/1e9) > 0.2: continue From 3cf845d9521f9062bbcc7ae0db7195576ca632a4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 13 Feb 2024 15:01:32 -0800 Subject: [PATCH 125/923] tici: log SOM ID (#31440) * tici: log SOM ID * no cat --- system/hardware/tici/hardware.h | 1 + 1 file changed, 1 insertion(+) diff --git a/system/hardware/tici/hardware.h b/system/hardware/tici/hardware.h index f6ea86b002..e553a665a8 100644 --- a/system/hardware/tici/hardware.h +++ b/system/hardware/tici/hardware.h @@ -72,6 +72,7 @@ public: std::map ret = { {"/BUILD", util::read_file("/BUILD")}, {"lsblk", util::check_output("lsblk -o NAME,SIZE,STATE,VENDOR,MODEL,REV,SERIAL")}, + {"SOM ID", util::read_file("/sys/devices/platform/vendor/vendor:gpio-som-id/som_id")}, }; std::string bs = util::check_output("abctl --boot_slot"); From 659cdec3d077cbcaba2521f45ecff396cb9f7cfb Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 13 Feb 2024 18:27:36 -0500 Subject: [PATCH 126/923] Revert "test_qcomgpsd: parametize tests" (#31441) Revert "test_qcomgpsd: parametize tests (#31430)" This reverts commit 6f4d3883484d454b629d65a806b558692b890f09. --- system/qcomgpsd/tests/test_qcomgpsd.py | 31 +++++++++++++------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/system/qcomgpsd/tests/test_qcomgpsd.py b/system/qcomgpsd/tests/test_qcomgpsd.py index 9acdacb56a..8291f2cc32 100755 --- a/system/qcomgpsd/tests/test_qcomgpsd.py +++ b/system/qcomgpsd/tests/test_qcomgpsd.py @@ -6,7 +6,6 @@ import time import datetime import unittest import subprocess -from parameterized import parameterized import cereal.messaging as messaging from openpilot.system.qcomgpsd.qcomgpsd import at_cmd, wait_for_modem @@ -58,24 +57,24 @@ class TestRawgpsd(unittest.TestCase): os.system("sudo systemctl restart ModemManager") assert self._wait_for_output(30) - @parameterized.expand([(b,) for b in (True, False)]) - def test_startup_time(self, internet): - if not internet: - os.system("sudo systemctl stop systemd-resolved") - with self.subTest(internet=internet): + def test_startup_time(self): + for internet in (True, False): + if not internet: + os.system("sudo systemctl stop systemd-resolved") + with self.subTest(internet=internet): + managed_processes['qcomgpsd'].start() + assert self._wait_for_output(7) + managed_processes['qcomgpsd'].stop() + + def test_turns_off_gnss(self): + for s in (0.1, 1, 5): managed_processes['qcomgpsd'].start() - assert self._wait_for_output(7) + time.sleep(s) managed_processes['qcomgpsd'].stop() - @parameterized.expand([(t,) for t in (0.1, 1, 5)]) - def test_turns_off_gnss(self, runtime): - managed_processes['qcomgpsd'].start() - time.sleep(runtime) - managed_processes['qcomgpsd'].stop() - - ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') - loc_status = json.loads(ls) - assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} + ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') + loc_status = json.loads(ls) + assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} def check_assistance(self, should_be_loaded): From cff1ad9dd3616985067f26058a1a02fa2d843eb1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 13 Feb 2024 23:11:22 -0600 Subject: [PATCH 127/923] Revert "Hyundai CAN-FD: Panda safety config assignments cleanup (#29733)" (#31443) This reverts commit 8009b11516fdedd964716a414dcefc996dea807a. --- selfdrive/car/hyundai/interface.py | 43 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index a3210f8071..049a63399c 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -11,7 +11,6 @@ from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.disable_ecu import disable_ecu Ecu = car.CarParams.Ecu -SafetyModel = car.CarParams.SafetyModel ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName ENABLE_BUTTONS = (Buttons.RES_ACCEL, Buttons.SET_DECEL, Buttons.CANCEL) @@ -19,17 +18,6 @@ BUTTONS_DICT = {Buttons.RES_ACCEL: ButtonType.accelCruise, Buttons.SET_DECEL: Bu Buttons.GAP_DIST: ButtonType.gapAdjustCruise, Buttons.CANCEL: ButtonType.cancel} -def set_safety_config_hyundai(candidate, CAN, can_fd=False): - platform = SafetyModel.hyundaiCanfd if can_fd else \ - SafetyModel.hyundaiLegacy if candidate in LEGACY_SAFETY_MODE_CAR else \ - SafetyModel.hyundai - cfgs = [get_safety_config(platform), ] - if CAN.ECAN >= 4: - cfgs.insert(0, get_safety_config(SafetyModel.noOutput)) - - return cfgs - - class CarInterface(CarInterfaceBase): @staticmethod def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): @@ -54,6 +42,7 @@ class CarInterface(CarInterfaceBase): # detect HDA2 with ADAS Driving ECU if hda2: + ret.flags |= HyundaiFlags.CANFD_HDA2.value if 0x110 in fingerprint[CAN.CAM]: ret.flags |= HyundaiFlags.CANFD_HDA2_ALT_STEERING.value else: @@ -303,20 +292,30 @@ class CarInterface(CarInterfaceBase): ret.enableBsm = 0x58b in fingerprint[0] # *** panda safety config *** - ret.safetyConfigs = set_safety_config_hyundai(candidate, CAN, can_fd=(candidate in CANFD_CAR)) - - if hda2: - ret.flags |= HyundaiFlags.CANFD_HDA2.value - ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_HDA2 - if candidate in CANFD_CAR: - if hda2 and ret.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING: - ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_HDA2_ALT_STEERING + cfgs = [get_safety_config(car.CarParams.SafetyModel.hyundaiCanfd), ] + if CAN.ECAN >= 4: + cfgs.insert(0, get_safety_config(car.CarParams.SafetyModel.noOutput)) + ret.safetyConfigs = cfgs + + if ret.flags & HyundaiFlags.CANFD_HDA2: + ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_HDA2 + if ret.flags & HyundaiFlags.CANFD_HDA2_ALT_STEERING: + ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_HDA2_ALT_STEERING if ret.flags & HyundaiFlags.CANFD_ALT_BUTTONS: ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CANFD_ALT_BUTTONS + if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC: + ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CAMERA_SCC + else: + if candidate in LEGACY_SAFETY_MODE_CAR: + # these cars require a special panda safety mode due to missing counters and checksums in the messages + ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hyundaiLegacy)] + else: + ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hyundai, 0)] + + if candidate in CAMERA_SCC_CAR: + ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HYUNDAI_CAMERA_SCC - if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC or candidate in CAMERA_SCC_CAR: - ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_CAMERA_SCC if ret.openpilotLongitudinalControl: ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_HYUNDAI_LONG if ret.flags & HyundaiFlags.HYBRID: From 136dc0313acecda44ec0dd4718ef98b614b4936c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 13 Feb 2024 23:49:18 -0600 Subject: [PATCH 128/923] Toyota: fix high driver torque LKAS fault regression (#31448) one latactive --- selfdrive/car/toyota/carcontroller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index e8ed9cfcb2..343b1d3031 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -55,10 +55,10 @@ class CarController: apply_steer = apply_meas_steer_torque_limits(new_steer, self.last_steer, CS.out.steeringTorqueEps, self.params) # >100 degree/sec steering fault prevention - self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, CC.latActive, + self.steer_rate_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringRateDeg) >= MAX_STEER_RATE, lat_active, self.steer_rate_counter, MAX_STEER_RATE_FRAMES) - if not CC.latActive: + if not lat_active: apply_steer = 0 # *** steer angle *** From b163c1f255caa0284e03ec0a2f27a748cdd339e3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 00:02:04 -0600 Subject: [PATCH 129/923] Mazda: fix potential standstill panda mismatch (#31449) * repro mazda standstill mismatch * fix mazda standstill mismatch * clean up --- selfdrive/car/mazda/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/mazda/carstate.py b/selfdrive/car/mazda/carstate.py index 1f7846ca06..c0819592d4 100644 --- a/selfdrive/car/mazda/carstate.py +++ b/selfdrive/car/mazda/carstate.py @@ -32,7 +32,7 @@ class CarState(CarStateBase): # Match panda speed reading speed_kph = cp.vl["ENGINE_DATA"]["SPEED"] - ret.standstill = speed_kph < .1 + ret.standstill = speed_kph <= .1 can_gear = int(cp.vl["GEAR"]["GEAR"]) ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) From 884bd5c7f68018028620821c6b25b5f37e2f7841 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 13 Feb 2024 22:58:44 -0800 Subject: [PATCH 130/923] SegmentRange: define __repr__ --- tools/lib/route.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/lib/route.py b/tools/lib/route.py index f7c3c432c8..55f7d20a3b 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -271,3 +271,6 @@ class SegmentRange: def __str__(self): return f"{self.dongle_id}/{self.timestamp}" + (f"/{self._slice}" if self._slice else "") + (f"/{self.selector}" if self.selector else "") + + def __repr__(self): + return self.__str__() From 9479686fa399ed95232d9419c1e566fb51ce586f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 01:00:44 -0600 Subject: [PATCH 131/923] test models: more examples in CI (#31444) * more examples * how is it so fast?! * 500 * is there a hypothesis cache? all * Revert "is there a hypothesis cache?" This reverts commit e628ba73d5b639e36f95df0ab9049697b34a58b8. * same as jenkins --- selfdrive/car/tests/test_models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 85472c756d..37d59af994 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -36,7 +36,7 @@ NUM_JOBS = int(os.environ.get("NUM_JOBS", "1")) JOB_ID = int(os.environ.get("JOB_ID", "0")) INTERNAL_SEG_LIST = os.environ.get("INTERNAL_SEG_LIST", "") INTERNAL_SEG_CNT = int(os.environ.get("INTERNAL_SEG_CNT", "0")) -MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "50")) +MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "300")) CI = os.environ.get("CI", None) is not None From 0846175f44ac9364527087db4ec54767e6884fca Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 03:56:17 -0600 Subject: [PATCH 132/923] tools/lib: format code (#31454) easier to read. pylint used to catch all this stuff, but it's mostly missing in ruff :'( --- tools/lib/filereader.py | 4 ++++ tools/lib/helpers.py | 3 ++- tools/lib/logreader.py | 38 +++++++++++++++++++++++-------- tools/lib/route.py | 18 +++++++++------ tools/lib/tests/test_logreader.py | 4 ++-- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/tools/lib/filereader.py b/tools/lib/filereader.py index af3dc5e658..e9b8b4b2ce 100644 --- a/tools/lib/filereader.py +++ b/tools/lib/filereader.py @@ -6,6 +6,7 @@ from openpilot.tools.lib.url_file import URLFile DATA_ENDPOINT = os.getenv("DATA_ENDPOINT", "http://data-raw.comma.internal/") + def internal_source_available(): try: hostname = urlparse(DATA_ENDPOINT).hostname @@ -16,17 +17,20 @@ def internal_source_available(): pass return False + def resolve_name(fn): if fn.startswith("cd:/"): return fn.replace("cd:/", DATA_ENDPOINT) return fn + def file_exists(fn): fn = resolve_name(fn) if fn.startswith(("http://", "https://")): return URLFile(fn).get_length_online() != -1 return os.path.exists(fn) + def FileReader(fn, debug=False): fn = resolve_name(fn) if fn.startswith(("http://", "https://")): diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index 5ec6c62339..cc4c5e148e 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -3,9 +3,10 @@ import datetime TIME_FMT = "%Y-%m-%d--%H-%M-%S" + # regex patterns class RE: - DONGLE_ID = r'(?P[a-f0-9]{16})' + DONGLE_ID = r'(?P[a-f0-9]{16})' TIMESTAMP = r'(?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' LOG_ID_V2 = r'(?P[a-f0-9]{8})--(?P[a-z0-9]{10})' LOG_ID = r'(?P(?:{}|{}))'.format(TIMESTAMP, LOG_ID_V2) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index f7548b8c0f..0657a63fbd 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -72,11 +72,12 @@ class _LogFileReader: class ReadMode(enum.StrEnum): - RLOG = "r" # only read rlogs - QLOG = "q" # only read qlogs - SANITIZED = "s" # read from the commaCarSegments database - AUTO = "a" # default to rlogs, fallback to qlogs - AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user + RLOG = "r" # only read rlogs + QLOG = "q" # only read qlogs + SANITIZED = "s" # read from the commaCarSegments database + AUTO = "a" # default to rlogs, fallback to qlogs + AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user + def create_slice_from_string(s: str): m = re.fullmatch(RE.SLICE, s) @@ -90,9 +91,11 @@ def create_slice_from_string(s: str): return start return slice(start, end, step) + def default_valid_file(fn): return fn is not None and file_exists(fn) + def auto_strategy(rlog_paths, qlog_paths, interactive, valid_file): # auto select logs based on availability if any(rlog is None or not valid_file(rlog) for rlog in rlog_paths): @@ -103,9 +106,10 @@ def auto_strategy(rlog_paths, qlog_paths, interactive, valid_file): cloudlog.warning("Some rlogs were not found, falling back to qlogs for those segments...") return [rlog if (valid_file(rlog)) else (qlog if (valid_file(qlog)) else None) - for (rlog, qlog) in zip(rlog_paths, qlog_paths, strict=True)] + for (rlog, qlog) in zip(rlog_paths, qlog_paths, strict=True)] return rlog_paths + def apply_strategy(mode: ReadMode, rlog_paths, qlog_paths, valid_file=default_valid_file): if mode == ReadMode.RLOG: return rlog_paths @@ -116,11 +120,12 @@ def apply_strategy(mode: ReadMode, rlog_paths, qlog_paths, valid_file=default_va elif mode == ReadMode.AUTO_INTERACIVE: return auto_strategy(rlog_paths, qlog_paths, True, valid_file) + def parse_slice(sr: SegmentRange): s = create_slice_from_string(sr._slice) if isinstance(s, slice): - if s.stop is None or s.stop < 0 or (s.start is not None and s.start < 0): # we need the number of segments in order to parse this slice - segs = np.arange(sr.get_max_seg_number()+1) + if s.stop is None or s.stop < 0 or (s.start is not None and s.start < 0): # we need the number of segments in order to parse this slice + segs = np.arange(sr.get_max_seg_number() + 1) else: segs = np.arange(s.stop + 1) return segs[s] @@ -129,6 +134,7 @@ def parse_slice(sr: SegmentRange): s = sr.get_max_seg_number() + s + 1 return [s] + def comma_api_source(sr: SegmentRange, mode: ReadMode): segs = parse_slice(sr) @@ -143,6 +149,7 @@ def comma_api_source(sr: SegmentRange, mode: ReadMode): return apply_strategy(mode, rlog_paths, qlog_paths, valid_file=valid_file) + def internal_source(sr: SegmentRange, mode: ReadMode): if not internal_source_available(): raise Exception("Internal source not available") @@ -153,31 +160,36 @@ def internal_source(sr: SegmentRange, mode: ReadMode): return f"cd:/{sr.dongle_id}/{sr.timestamp}/{seg}/{file}.bz2" rlog_paths = [get_internal_url(sr, seg, "rlog") for seg in segs] - qlog_paths = [get_internal_url(sr, seg, "qlog") for seg in segs] + qlog_paths = [get_internal_url(sr, seg, "qlog") for seg in segs] return apply_strategy(mode, rlog_paths, qlog_paths) + def openpilotci_source(sr: SegmentRange, mode: ReadMode): segs = parse_slice(sr) rlog_paths = [get_url(sr.route_name, seg, "rlog") for seg in segs] - qlog_paths = [get_url(sr.route_name, seg, "qlog") for seg in segs] + qlog_paths = [get_url(sr.route_name, seg, "qlog") for seg in segs] return apply_strategy(mode, rlog_paths, qlog_paths) + def comma_car_segments_source(sr: SegmentRange, mode=ReadMode.RLOG): segs = parse_slice(sr) return [get_comma_segments_url(sr.route_name, seg) for seg in segs] + def direct_source(file_or_url): return [file_or_url] + def get_invalid_files(files): for f in files: if f is None or not file_exists(f): yield f + def check_source(source, *args): try: files = source(*args) @@ -186,6 +198,7 @@ def check_source(source, *args): except Exception as e: return e, None + def auto_source(sr: SegmentRange, mode=ReadMode.RLOG): if mode == ReadMode.SANITIZED: return comma_car_segments_source(sr, mode) @@ -201,23 +214,27 @@ def auto_source(sr: SegmentRange, mode=ReadMode.RLOG): raise Exception(f"auto_source could not find any valid source, exceptions for sources: {exceptions}") + def parse_useradmin(identifier): if "useradmin.comma.ai" in identifier: query = parse_qs(urlparse(identifier).query) return query["onebox"][0] return None + def parse_cabana(identifier): if "cabana.comma.ai" in identifier: query = parse_qs(urlparse(identifier).query) return query["route"][0] return None + def parse_direct(identifier): if identifier.startswith(("http://", "https://", "cd:/")) or pathlib.Path(identifier).exists(): return identifier return None + def parse_indirect(identifier): parsed = parse_useradmin(identifier) or parse_cabana(identifier) @@ -295,6 +312,7 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout if __name__ == "__main__": import codecs + # capnproto <= 0.8.0 throws errors converting byte data to string # below line catches those errors and replaces the bytes with \x__ codecs.register_error("strict", codecs.backslashreplace_errors) diff --git a/tools/lib/route.py b/tools/lib/route.py index 55f7d20a3b..529e42e8e6 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -17,6 +17,7 @@ CAMERA_FILENAMES = ['fcamera.hevc', 'video.hevc'] DCAMERA_FILENAMES = ['dcamera.hevc'] ECAMERA_FILENAMES = ['ecamera.hevc'] + class Route: def __init__(self, name, data_dir=None): self._name = RouteName(name) @@ -37,27 +38,27 @@ class Route: def log_paths(self): log_path_by_seg_num = {s.name.segment_num: s.log_path for s in self._segments} - return [log_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [log_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] def qlog_paths(self): qlog_path_by_seg_num = {s.name.segment_num: s.qlog_path for s in self._segments} - return [qlog_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [qlog_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] def camera_paths(self): camera_path_by_seg_num = {s.name.segment_num: s.camera_path for s in self._segments} - return [camera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [camera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] def dcamera_paths(self): dcamera_path_by_seg_num = {s.name.segment_num: s.dcamera_path for s in self._segments} - return [dcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [dcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] def ecamera_paths(self): ecamera_path_by_seg_num = {s.name.segment_num: s.ecamera_path for s in self._segments} - return [ecamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [ecamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] def qcamera_paths(self): qcamera_path_by_seg_num = {s.name.segment_num: s.qcamera_path for s in self._segments} - return [qcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number+1)] + return [qcamera_path_by_seg_num.get(i, None) for i in range(self.max_seg_number + 1)] # TODO: refactor this, it's super repetitive def _get_segments_remote(self): @@ -159,6 +160,7 @@ class Route: raise ValueError(f'Could not find segments for route {self.name.canonical_name} in data directory {data_dir}') return sorted(segments, key=lambda seg: seg.name.segment_num) + class Segment: def __init__(self, name, log_path, qlog_path, camera_path, dcamera_path, ecamera_path, qcamera_path): self._name = SegmentName(name) @@ -173,6 +175,7 @@ class Segment: def name(self): return self._name + class RouteName: def __init__(self, name_str: str): self._name_str = name_str @@ -194,6 +197,7 @@ class RouteName: def __str__(self) -> str: return self._canonical_name + class SegmentName: # TODO: add constructor that takes dongle_id, time_str, segment_num and then create instances # of this class instead of manually constructing a segment name (use canonical_name prop instead) @@ -206,7 +210,7 @@ class SegmentName: seg_num_delim = "--" if self._name_str.count("--") == 2 else "/" name_parts = self._name_str.rsplit(seg_num_delim, 1) if allow_route_name and len(name_parts) == 1: - name_parts.append("-1") # no segment number + name_parts.append("-1") # no segment number self._route_name = RouteName(name_parts[0]) self._num = int(name_parts[1]) self._canonical_name = f"{self._route_name._dongle_id}|{self._route_name._time_str}--{self._num}" diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index d04f4ce899..5131835017 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -12,7 +12,7 @@ from unittest import mock from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, parse_slice, ReadMode from openpilot.tools.lib.route import SegmentRange -NUM_SEGS = 17 # number of segments in the test route +NUM_SEGS = 17 # number of segments in the test route ALL_SEGS = list(np.arange(NUM_SEGS)) TEST_ROUTE = "344c5c15b34f2d8a/2024-01-03--09-37-12" QLOG_FILE = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2" @@ -110,7 +110,7 @@ class TestLogReader(unittest.TestCase): qlog_len = len(list(LogReader(f"{TEST_ROUTE}/0/q"))) qlog_len_2 = len(list(LogReader([f"{TEST_ROUTE}/0/q", f"{TEST_ROUTE}/0/q"]))) - self.assertEqual(qlog_len*2, qlog_len_2) + self.assertEqual(qlog_len * 2, qlog_len_2) @pytest.mark.slow @mock.patch("openpilot.tools.lib.logreader._LogFileReader") From 82763710097cbfe629502502163a7d2d6319f3fd Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 04:05:55 -0600 Subject: [PATCH 133/923] SegmentRange: type annotations (#31453) * type annotate SegmentRange * proper formatting * oops * numpy? format test too * draft * fixed * clean up * rm * more * clean up * clean up * rm * not here * revert --- tools/lib/route.py | 25 +++++++++++++------------ tools/lib/tests/test_logreader.py | 3 +-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tools/lib/route.py b/tools/lib/route.py index 529e42e8e6..471fa2226f 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -4,7 +4,7 @@ from functools import cache from urllib.parse import urlparse from collections import defaultdict from itertools import chain -from typing import Optional +from typing import Optional, cast from openpilot.tools.lib.auth_config import get_token from openpilot.tools.lib.api import CommaApi @@ -237,44 +237,45 @@ class SegmentName: @cache -def get_max_seg_number_cached(sr: 'SegmentRange'): +def get_max_seg_number_cached(sr: 'SegmentRange') -> int: try: api = CommaApi(get_token()) - return api.get("/v1/route/" + sr.route_name.replace("/", "|"))["segment_numbers"][-1] + return cast(int, api.get("/v1/route/" + sr.route_name.replace("/", "|"))["segment_numbers"][-1]) 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 class SegmentRange: def __init__(self, segment_range: str): - self.m = re.fullmatch(RE.SEGMENT_RANGE, segment_range) - assert self.m, f"Segment range is not valid {segment_range}" + m = re.fullmatch(RE.SEGMENT_RANGE, segment_range) + assert m is not None, f"Segment range is not valid {segment_range}" + self.m = m def get_max_seg_number(self): return get_max_seg_number_cached(self) @property - def route_name(self): + def route_name(self) -> str: return self.m.group("route_name") @property - def dongle_id(self): + def dongle_id(self) -> str: return self.m.group("dongle_id") @property - def timestamp(self): + def timestamp(self) -> str: return self.m.group("timestamp") @property - def _slice(self): + def _slice(self) -> str: return self.m.group("slice") @property - def selector(self): + def selector(self) -> str: return self.m.group("selector") - def __str__(self): + def __str__(self) -> str: return f"{self.dongle_id}/{self.timestamp}" + (f"/{self._slice}" if self._slice else "") + (f"/{self.selector}" if self.selector else "") - def __repr__(self): + def __repr__(self) -> str: return self.__str__() diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 5131835017..c21c94342c 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,6 +1,5 @@ import shutil import tempfile -import numpy as np import os import unittest import pytest @@ -13,7 +12,7 @@ from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_sour from openpilot.tools.lib.route import SegmentRange NUM_SEGS = 17 # number of segments in the test route -ALL_SEGS = list(np.arange(NUM_SEGS)) +ALL_SEGS = list(range(NUM_SEGS)) TEST_ROUTE = "344c5c15b34f2d8a/2024-01-03--09-37-12" QLOG_FILE = "https://commadataci.blob.core.windows.net/openpilotci/0375fdf7b1ce594d/2019-06-13--08-32-25/3/qlog.bz2" From c4f7991bb63ba7953f37eb08f14d227fec8a5524 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 05:29:08 -0600 Subject: [PATCH 134/923] SegmentRange: test API call (#31456) * test * better * better --- tools/lib/tests/test_logreader.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index c21c94342c..5dd7f7fa0d 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -90,6 +90,19 @@ class TestLogReader(unittest.TestCase): sr = SegmentRange(segment_range) parse_slice(sr) + @parameterized.expand([ + (f"{TEST_ROUTE}/0", False), + (f"{TEST_ROUTE}/:2", False), + (f"{TEST_ROUTE}/0:", True), + (f"{TEST_ROUTE}/-1", True), + (f"{TEST_ROUTE}", True), + ]) + def test_slicing_api_call(self, segment_range, api_call): + with mock.patch("openpilot.tools.lib.route.get_max_seg_number_cached") as max_seg_mock: + max_seg_mock.return_value = NUM_SEGS + parse_slice(SegmentRange(segment_range)) + self.assertEqual(api_call, max_seg_mock.called) + @pytest.mark.slow def test_modes(self): qlog_len = len(list(LogReader(f"{TEST_ROUTE}/0", ReadMode.QLOG))) From 8fe9bc7a6977f9f901b1ddf8eb0916ac80224644 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 06:17:03 -0600 Subject: [PATCH 135/923] SegmentRange: simplify slice (#31455) * simplify slicing * rm --- tools/lib/logreader.py | 51 +++++-------------------------- tools/lib/route.py | 22 +++++++++++-- tools/lib/tests/test_logreader.py | 10 +++--- 3 files changed, 30 insertions(+), 53 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 0657a63fbd..f19c0cd7cc 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -4,10 +4,8 @@ from functools import partial import multiprocessing import capnp import enum -import numpy as np import os import pathlib -import re import sys import tqdm import urllib.parse @@ -21,7 +19,6 @@ from openpilot.common.swaglog import cloudlog from openpilot.tools.lib.comma_car_segments import get_url as get_comma_segments_url from openpilot.tools.lib.openpilotci import get_url from openpilot.tools.lib.filereader import FileReader, file_exists, internal_source_available -from openpilot.tools.lib.helpers import RE from openpilot.tools.lib.route import Route, SegmentRange LogMessage = Type[capnp._DynamicStructReader] @@ -79,19 +76,6 @@ class ReadMode(enum.StrEnum): AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user -def create_slice_from_string(s: str): - m = re.fullmatch(RE.SLICE, s) - assert m is not None, f"Invalid slice: {s}" - start, end, step = m.groups() - start = int(start) if start is not None else None - end = int(end) if end is not None else None - step = int(step) if step is not None else None - - if start is not None and ":" not in s and end is None and step is None: - return start - return slice(start, end, step) - - def default_valid_file(fn): return fn is not None and file_exists(fn) @@ -121,27 +105,11 @@ def apply_strategy(mode: ReadMode, rlog_paths, qlog_paths, valid_file=default_va return auto_strategy(rlog_paths, qlog_paths, True, valid_file) -def parse_slice(sr: SegmentRange): - s = create_slice_from_string(sr._slice) - if isinstance(s, slice): - if s.stop is None or s.stop < 0 or (s.start is not None and s.start < 0): # we need the number of segments in order to parse this slice - segs = np.arange(sr.get_max_seg_number() + 1) - else: - segs = np.arange(s.stop + 1) - return segs[s] - else: - if s < 0: - s = sr.get_max_seg_number() + s + 1 - return [s] - - def comma_api_source(sr: SegmentRange, mode: ReadMode): - segs = parse_slice(sr) - route = Route(sr.route_name) - rlog_paths = [route.log_paths()[seg] for seg in segs] - qlog_paths = [route.qlog_paths()[seg] for seg in segs] + rlog_paths = [route.log_paths()[seg] for seg in sr.seg_idxs] + qlog_paths = [route.qlog_paths()[seg] for seg in sr.seg_idxs] # comma api will have already checked if the file exists def valid_file(fn): @@ -154,30 +122,25 @@ def internal_source(sr: SegmentRange, mode: ReadMode): if not internal_source_available(): raise Exception("Internal source not available") - segs = parse_slice(sr) - def get_internal_url(sr: SegmentRange, seg, file): return f"cd:/{sr.dongle_id}/{sr.timestamp}/{seg}/{file}.bz2" - rlog_paths = [get_internal_url(sr, seg, "rlog") for seg in segs] - qlog_paths = [get_internal_url(sr, seg, "qlog") for seg in segs] + rlog_paths = [get_internal_url(sr, seg, "rlog") for seg in sr.seg_idxs] + qlog_paths = [get_internal_url(sr, seg, "qlog") for seg in sr.seg_idxs] return apply_strategy(mode, rlog_paths, qlog_paths) def openpilotci_source(sr: SegmentRange, mode: ReadMode): - segs = parse_slice(sr) - - rlog_paths = [get_url(sr.route_name, seg, "rlog") for seg in segs] - qlog_paths = [get_url(sr.route_name, seg, "qlog") for seg in segs] + rlog_paths = [get_url(sr.route_name, seg, "rlog") for seg in sr.seg_idxs] + qlog_paths = [get_url(sr.route_name, seg, "qlog") for seg in sr.seg_idxs] return apply_strategy(mode, rlog_paths, qlog_paths) def comma_car_segments_source(sr: SegmentRange, mode=ReadMode.RLOG): - segs = parse_slice(sr) + return [get_comma_segments_url(sr.route_name, seg) for seg in sr.seg_idxs] - return [get_comma_segments_url(sr.route_name, seg) for seg in segs] def direct_source(file_or_url): diff --git a/tools/lib/route.py b/tools/lib/route.py index 471fa2226f..eef6642769 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -251,9 +251,6 @@ class SegmentRange: assert m is not None, f"Segment range is not valid {segment_range}" self.m = m - def get_max_seg_number(self): - return get_max_seg_number_cached(self) - @property def route_name(self) -> str: return self.m.group("route_name") @@ -270,6 +267,25 @@ class SegmentRange: def _slice(self) -> str: return self.m.group("slice") + @property + def seg_idxs(self) -> list[int]: + m = re.fullmatch(RE.SLICE, self._slice) + assert m is not None, f"Invalid slice: {self._slice}" + start, end, step = (None if s is None else int(s) for s in m.groups()) + + # one segment specified + if start is not None and end is None and ':' not in self._slice: + if start < 0: + start += get_max_seg_number_cached(self) + 1 + return [start] + + s = slice(start, end, step) + # no specified end or using relative indexing, need number of segments + if end is None or end < 0 or (start is not None and start < 0): + return list(range(get_max_seg_number_cached(self) + 1))[s] + else: + return list(range(end + 1))[s] + @property def selector(self) -> str: return self.m.group("selector") diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 5dd7f7fa0d..1ec04cae78 100644 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -8,7 +8,7 @@ import requests from parameterized import parameterized from unittest import mock -from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, parse_slice, ReadMode +from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, ReadMode from openpilot.tools.lib.route import SegmentRange NUM_SEGS = 17 # number of segments in the test route @@ -50,8 +50,7 @@ class TestLogReader(unittest.TestCase): def test_indirect_parsing(self, identifier, expected): parsed, _, _ = parse_indirect(identifier) sr = SegmentRange(parsed) - segs = parse_slice(sr) - self.assertListEqual(list(segs), expected) + self.assertListEqual(list(sr.seg_idxs), expected, identifier) @parameterized.expand([ (f"{TEST_ROUTE}", f"{TEST_ROUTE}"), @@ -87,8 +86,7 @@ class TestLogReader(unittest.TestCase): ]) def test_bad_ranges(self, segment_range): with self.assertRaises(AssertionError): - sr = SegmentRange(segment_range) - parse_slice(sr) + _ = SegmentRange(segment_range).seg_idxs @parameterized.expand([ (f"{TEST_ROUTE}/0", False), @@ -100,7 +98,7 @@ class TestLogReader(unittest.TestCase): def test_slicing_api_call(self, segment_range, api_call): with mock.patch("openpilot.tools.lib.route.get_max_seg_number_cached") as max_seg_mock: max_seg_mock.return_value = NUM_SEGS - parse_slice(SegmentRange(segment_range)) + _ = SegmentRange(segment_range).seg_idxs self.assertEqual(api_call, max_seg_mock.called) @pytest.mark.slow From 796671fe1a9131275c4ff0d67293bb669d0dcd98 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 06:36:58 -0600 Subject: [PATCH 136/923] SegmentRange: more explicit slice matching (#31451) * more explicit * fix it * use non capturing group * only needed for regex101 * make test_logreader.py executable * fix * stash * passes test * none * type anotate * test * fix * nice for syntax highlighting --- tools/lib/helpers.py | 2 +- tools/lib/route.py | 10 +++++----- tools/lib/tests/test_logreader.py | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) mode change 100644 => 100755 tools/lib/tests/test_logreader.py diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index cc4c5e148e..f0af3d03c5 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -15,7 +15,7 @@ class RE: INDEX = r'-?[0-9]+' SLICE = r'(?P{})?:?(?P{})?:?(?P{})?'.format(INDEX, INDEX, INDEX) - SEGMENT_RANGE = r'{}(?:--|/)?(?P({}))?/?(?P([qras]))?'.format(ROUTE_NAME, SLICE) + SEGMENT_RANGE = r'{}(?:(--|/)(?P({})))?(?:/(?P([qras])))?'.format(ROUTE_NAME, SLICE) BOOTLOG_NAME = ROUTE_NAME diff --git a/tools/lib/route.py b/tools/lib/route.py index eef6642769..aba95718d5 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -265,7 +265,11 @@ class SegmentRange: @property def _slice(self) -> str: - return self.m.group("slice") + return self.m.group("slice") or "" + + @property + def selector(self) -> str | None: + return self.m.group("selector") @property def seg_idxs(self) -> list[int]: @@ -286,10 +290,6 @@ class SegmentRange: else: return list(range(end + 1))[s] - @property - def selector(self) -> str: - return self.m.group("selector") - def __str__(self) -> str: return f"{self.dongle_id}/{self.timestamp}" + (f"/{self._slice}" if self._slice else "") + (f"/{self.selector}" if self.selector else "") diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py old mode 100644 new mode 100755 index 1ec04cae78..70c770427a --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 import shutil import tempfile import os @@ -83,6 +84,9 @@ class TestLogReader(unittest.TestCase): (f"{TEST_ROUTE}/j",), (f"{TEST_ROUTE}/0:1:2:3",), (f"{TEST_ROUTE}/:::3",), + (f"{TEST_ROUTE}3",), + (f"{TEST_ROUTE}-3",), + (f"{TEST_ROUTE}--3a",), ]) def test_bad_ranges(self, segment_range): with self.assertRaises(AssertionError): From beab6e86589d80c51ce18418ff9242af1ec759df Mon Sep 17 00:00:00 2001 From: JJeonbear <153247259+JJeonbear@users.noreply.github.com> Date: Wed, 14 Feb 2024 22:26:25 +0900 Subject: [PATCH 137/923] Ioniq 5 2022 AWD FWD camera update (#31322) * Update fingerprints.py Update IONIQ5 fwdCamera * Update fingerprints.py * Update fingerprints.py --- 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 b828950427..d3b282422c 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1556,6 +1556,7 @@ FW_VERSIONS = { b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.03 99211-GI010 220401', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.05 99211-GI010 220614', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110', + b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', ], }, CAR.IONIQ_6: { From 991d02ba27cf84e7140aedd5ca4173ffe5cb0d58 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Wed, 14 Feb 2024 11:19:20 -0500 Subject: [PATCH 138/923] fix pre-commit install process (#31445) * fix pre-commit install process * only install pre-commit from a git repo --- tools/install_python_dependencies.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/tools/install_python_dependencies.sh b/tools/install_python_dependencies.sh index 6753afffb9..f7ba316480 100755 --- a/tools/install_python_dependencies.sh +++ b/tools/install_python_dependencies.sh @@ -75,12 +75,8 @@ pyenv rehash [ -n "$POETRY_VIRTUALENVS_CREATE" ] && RUN="" || RUN="poetry run" -if [ "$(uname)" != "Darwin" ]; then +if [ "$(uname)" != "Darwin" ] && [ -e "$ROOT/.git" ]; then echo "pre-commit hooks install..." - shopt -s nullglob - for f in .pre-commit-config.yaml */.pre-commit-config.yaml; do - if [ -e "$ROOT/$(dirname $f)/.git" ]; then - $RUN pre-commit install -c "$f" - fi - done + $RUN pre-commit install + $RUN git submodule foreach pre-commit install fi From 1436f576df5f43f78b9253b5b2072fbf1414d9be Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 14 Feb 2024 13:05:25 -0500 Subject: [PATCH 139/923] LogReader: retain old behavior for direct parsing of files (#31419) * maintain exception * test that head is not called * annoying mock * test with cache --- tools/lib/logreader.py | 10 ++++++---- tools/lib/tests/test_logreader.py | 12 +++++++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index f19c0cd7cc..0a555708b7 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -223,7 +223,12 @@ class LogReader: mode = self.default_mode if sr.selector is None else ReadMode(sr.selector) source = self.default_source if source is None else source - return source(sr, mode) + identifiers = source(sr, mode) + + invalid_count = len(list(get_invalid_files(identifiers))) + assert invalid_count == 0, f"{invalid_count}/{len(identifiers)} invalid log(s) found, please ensure all logs \ +are uploaded or auto fallback to qlogs with '/a' selector at the end of the route name." + return identifiers def __init__(self, identifier: str | List[str], default_mode=ReadMode.RLOG, default_source=auto_source, sort_by_time=False, only_union_types=False): self.default_mode = default_mode @@ -258,9 +263,6 @@ class LogReader: def reset(self): self.logreader_identifiers = self._parse_identifiers(self.identifier) - invalid_count = len(list(get_invalid_files(self.logreader_identifiers))) - assert invalid_count == 0, f"{invalid_count}/{len(self.logreader_identifiers)} invalid log(s) found, please ensure all logs \ -are uploaded or auto fallback to qlogs with '/a' selector at the end of the route name." @staticmethod def from_bytes(dat): diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 70c770427a..53b78064ab 100755 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -11,6 +11,7 @@ from unittest import mock from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, ReadMode from openpilot.tools.lib.route import SegmentRange +from openpilot.tools.lib.url_file import URLFileException NUM_SEGS = 17 # number of segments in the test route ALL_SEGS = list(range(NUM_SEGS)) @@ -65,7 +66,10 @@ class TestLogReader(unittest.TestCase): sr = SegmentRange(identifier) self.assertEqual(str(sr), expected) - def test_direct_parsing(self): + @parameterized.expand([(True,), (False,)]) + @mock.patch("openpilot.tools.lib.logreader.file_exists") + def test_direct_parsing(self, cache_enabled, file_exists_mock): + os.environ["FILEREADER_CACHE"] = "1" if cache_enabled else "0" qlog = tempfile.NamedTemporaryFile(mode='wb', delete=False) with requests.get(QLOG_FILE, stream=True) as r: @@ -76,6 +80,12 @@ class TestLogReader(unittest.TestCase): l = len(list(LogReader(f))) self.assertGreater(l, 100) + with self.assertRaises(URLFileException) if not cache_enabled else self.assertRaises(AssertionError): + l = len(list(LogReader(QLOG_FILE.replace("/3/", "/200/")))) + + # file_exists should not be called for direct files + self.assertEqual(file_exists_mock.call_count, 0) + @parameterized.expand([ (f"{TEST_ROUTE}///",), (f"{TEST_ROUTE}---",), From 33cf6bda9ef6b1ed19f3a0fed4a5914a414ae653 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 14 Feb 2024 13:34:17 -0500 Subject: [PATCH 140/923] LogReader: add typing hints (#31464) logreader typing --- tools/lib/logreader.py | 63 ++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 0a555708b7..af2c23ef48 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -11,7 +11,7 @@ import tqdm import urllib.parse import warnings -from typing import Dict, Iterable, Iterator, List, Type +from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type from urllib.parse import parse_qs, urlparse from cereal import log as capnp_log @@ -76,11 +76,16 @@ class ReadMode(enum.StrEnum): AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user -def default_valid_file(fn): +LogPath = Optional[str] +LogPaths = List[LogPath] +ValidFileCallable = Callable[[LogPath], bool] +Source = Callable[[SegmentRange, ReadMode], LogPaths] + +def default_valid_file(fn: LogPath) -> bool: return fn is not None and file_exists(fn) -def auto_strategy(rlog_paths, qlog_paths, interactive, valid_file): +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 interactive: @@ -89,12 +94,12 @@ def auto_strategy(rlog_paths, qlog_paths, interactive, valid_file): else: cloudlog.warning("Some rlogs were not found, falling back to qlogs for those segments...") - return [rlog if (valid_file(rlog)) else (qlog if (valid_file(qlog)) else None) + return [rlog if valid_file(rlog) else (qlog if valid_file(qlog) else None) for (rlog, qlog) in zip(rlog_paths, qlog_paths, strict=True)] return rlog_paths -def apply_strategy(mode: ReadMode, rlog_paths, qlog_paths, valid_file=default_valid_file): +def apply_strategy(mode: ReadMode, rlog_paths: LogPaths, qlog_paths: LogPaths, valid_file: ValidFileCallable = default_valid_file) -> LogPaths: if mode == ReadMode.RLOG: return rlog_paths elif mode == ReadMode.QLOG: @@ -103,9 +108,10 @@ def apply_strategy(mode: ReadMode, rlog_paths, qlog_paths, valid_file=default_va return auto_strategy(rlog_paths, qlog_paths, False, valid_file) elif mode == ReadMode.AUTO_INTERACIVE: return auto_strategy(rlog_paths, qlog_paths, True, valid_file) + raise Exception(f"invalid mode: {mode}") -def comma_api_source(sr: SegmentRange, mode: ReadMode): +def comma_api_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: route = Route(sr.route_name) rlog_paths = [route.log_paths()[seg] for seg in sr.seg_idxs] @@ -118,7 +124,7 @@ def comma_api_source(sr: SegmentRange, mode: ReadMode): return apply_strategy(mode, rlog_paths, qlog_paths, valid_file=valid_file) -def internal_source(sr: SegmentRange, mode: ReadMode): +def internal_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: if not internal_source_available(): raise Exception("Internal source not available") @@ -131,19 +137,18 @@ def internal_source(sr: SegmentRange, mode: ReadMode): return apply_strategy(mode, rlog_paths, qlog_paths) -def openpilotci_source(sr: SegmentRange, mode: ReadMode): +def openpilotci_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: rlog_paths = [get_url(sr.route_name, seg, "rlog") for seg in sr.seg_idxs] qlog_paths = [get_url(sr.route_name, seg, "qlog") for seg in sr.seg_idxs] return apply_strategy(mode, rlog_paths, qlog_paths) -def comma_car_segments_source(sr: SegmentRange, mode=ReadMode.RLOG): +def comma_car_segments_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: return [get_comma_segments_url(sr.route_name, seg) for seg in sr.seg_idxs] - -def direct_source(file_or_url): +def direct_source(file_or_url: str) -> LogPaths: return [file_or_url] @@ -153,52 +158,49 @@ def get_invalid_files(files): yield f -def check_source(source, *args): - try: - files = source(*args) - assert next(get_invalid_files(files), None) is None - return None, files - except Exception as e: - return e, None +def check_source(source: Source, *args) -> LogPaths: + files = source(*args) + assert next(get_invalid_files(files), None) is None + return files -def auto_source(sr: SegmentRange, mode=ReadMode.RLOG): +def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: if mode == ReadMode.SANITIZED: return comma_car_segments_source(sr, mode) + SOURCES: List[Source] = [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source,] exceptions = [] # Automatically determine viable source - for source in [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source]: - exception, ret = check_source(source, sr, mode) - if exception is None: - return ret - else: - exceptions.append(exception) + for source in SOURCES: + try: + return check_source(source, sr, mode) + except Exception as e: + exceptions.append(e) raise Exception(f"auto_source could not find any valid source, exceptions for sources: {exceptions}") -def parse_useradmin(identifier): +def parse_useradmin(identifier: str): if "useradmin.comma.ai" in identifier: query = parse_qs(urlparse(identifier).query) return query["onebox"][0] return None -def parse_cabana(identifier): +def parse_cabana(identifier: str): if "cabana.comma.ai" in identifier: query = parse_qs(urlparse(identifier).query) return query["route"][0] return None -def parse_direct(identifier): +def parse_direct(identifier: str): if identifier.startswith(("http://", "https://", "cd:/")) or pathlib.Path(identifier).exists(): return identifier return None -def parse_indirect(identifier): +def parse_indirect(identifier: str): parsed = parse_useradmin(identifier) or parse_cabana(identifier) if parsed is not None: @@ -230,7 +232,8 @@ class LogReader: are uploaded or auto fallback to qlogs with '/a' selector at the end of the route name." return identifiers - def __init__(self, identifier: str | List[str], default_mode=ReadMode.RLOG, default_source=auto_source, sort_by_time=False, only_union_types=False): + def __init__(self, identifier: str | List[str], default_mode: ReadMode = ReadMode.RLOG, + default_source=auto_source, sort_by_time=False, only_union_types=False): self.default_mode = default_mode self.default_source = default_source self.identifier = identifier From 194bd85905348a66a44ba54a053424dbfcdaeb36 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 14 Feb 2024 11:15:33 -0800 Subject: [PATCH 141/923] log all startups --- selfdrive/controls/controlsd.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 4af584a9d2..3fb19c7da7 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -446,15 +446,16 @@ class Controls: self.set_initial_state() self.params.put_bool_nonblocking("ControlsReady", True) - if not all_valid and timed_out: - cloudlog.event( - "controlsd.init_timeout", - canValid=CS.canValid, - invalid=[s for s, valid in self.sm.valid.items() if not valid], - not_alive=[s for s, alive in self.sm.alive.items() if not alive], - not_freq_ok=[s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok], - error=True, - ) + cloudlog.event( + "controlsd.initialized", + dt=self.sm.frame*DT_CTRL, + timeout=timed_out, + canValid=CS.canValid, + invalid=[s for s, valid in self.sm.valid.items() if not valid], + not_alive=[s for s, alive in self.sm.alive.items() if not alive], + not_freq_ok=[s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok], + error=True, + ) # Check for CAN timeout if not can_strs: From 6f905ed979cb8e217c182c653528df3a6094015b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 14 Feb 2024 13:12:54 -0800 Subject: [PATCH 142/923] radard: remove sleep for cars without radar (#31467) * radard: remove sleep for cars without radar * fix * update refs --- selfdrive/car/interfaces.py | 10 +++++----- selfdrive/car/tests/test_car_interfaces.py | 5 ----- selfdrive/car/tests/test_models.py | 1 - selfdrive/test/process_replay/process_replay.py | 1 - selfdrive/test/process_replay/ref_commit | 2 +- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index b7357d2c93..9767752edb 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -1,6 +1,5 @@ import json import os -import time import numpy as np import tomllib from abc import abstractmethod, ABC @@ -322,13 +321,14 @@ class RadarInterfaceBase(ABC): self.pts = {} self.delay = 0 self.radar_ts = CP.radarTimeStep + self.frame = 0 self.no_radar_sleep = 'NO_RADAR_SLEEP' in os.environ def update(self, can_strings): - ret = car.RadarData.new_message() - if not self.no_radar_sleep: - time.sleep(self.radar_ts) # radard runs on RI updates - return ret + self.frame += 1 + if (self.frame % int(100 * self.radar_ts)) == 0: + return car.RadarData.new_message() + return None class CarStateBase(ABC): diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index 2306cbf456..f2625abe57 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -46,11 +46,6 @@ def get_fuzzy_car_interface_args(draw: DrawType) -> dict: class TestCarInterfaces(unittest.TestCase): - - @classmethod - def setUpClass(cls): - os.environ['NO_RADAR_SLEEP'] = '1' - # FIXME: Due to the lists used in carParams, Phase.target is very slow and will cause # many generated examples to overrun when max_examples > ~20, don't use it @parameterized.expand([(car,) for car in sorted(all_known_cars())]) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 37d59af994..3592fd0baa 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -234,7 +234,6 @@ class TestCarModelBase(unittest.TestCase): self.assertEqual(can_invalid_cnt, 0) def test_radar_interface(self): - os.environ['NO_RADAR_SLEEP'] = "1" RadarInterface = importlib.import_module(f'selfdrive.car.{self.CP.carName}.radar_interface').RadarInterface RI = RadarInterface(self.CP) assert RI diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index a6b2771668..77ac3f551e 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -762,7 +762,6 @@ def generate_environ_config(CP=None, fingerprint=None, log_dir=None) -> Dict[str if log_dir is not None: environ_dict["LOG_ROOT"] = log_dir - environ_dict["NO_RADAR_SLEEP"] = "1" environ_dict["REPLAY"] = "1" # Regen or python process diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index f5ad6407dd..49e3461756 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -bd44a98bdb248f3c7b988f81ee130c2542b18ae7 +7d25b1f7d0bd3b506fa4e72ff893728894eb1a45 \ No newline at end of file From 3cd0e5d43c5cdc00b32d69f021653e3a812427d8 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 14 Feb 2024 13:53:33 -0800 Subject: [PATCH 143/923] Reapply "radard: enable avg input service frequency checks (#31404)" (#31468) This reverts commit 7f7f1fd21b293901fa003dce8656db89e15726aa. --- selfdrive/controls/radard.py | 15 +++++++-------- selfdrive/test/test_onroad.py | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index f5f76ec2f0..b0b9350dec 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -8,7 +8,7 @@ import capnp from cereal import messaging, log, car from openpilot.common.numpy_fast import interp from openpilot.common.params import Params -from openpilot.common.realtime import Ratekeeper, Priority, config_realtime_process +from openpilot.common.realtime import DT_CTRL, Ratekeeper, Priority, config_realtime_process from openpilot.common.swaglog import cloudlog from openpilot.common.simple_kalman import KF1D @@ -201,6 +201,7 @@ class RadarD: self.v_ego = 0.0 self.v_ego_hist = deque([0.0], maxlen=delay+1) + self.last_v_ego_frame = -1 self.radar_state: Optional[capnp._DynamicStructBuilder] = None self.radar_state_valid = False @@ -208,6 +209,7 @@ class RadarD: self.ready = False def update(self, sm: messaging.SubMaster, rr: Optional[car.RadarData]): + self.ready = sm.seen['modelV2'] self.current_time = 1e-9*max(sm.logMonoTime.values()) radar_points = [] @@ -216,11 +218,10 @@ class RadarD: radar_points = rr.points radar_errors = rr.errors - if sm.updated['carState']: + if sm.recv_frame['carState'] != self.last_v_ego_frame: self.v_ego = sm['carState'].vEgo self.v_ego_hist.append(self.v_ego) - if sm.updated['modelV2']: - self.ready = True + self.last_v_ego_frame = sm.recv_frame['carState'] ar_pts = {} for pt in radar_points: @@ -297,7 +298,7 @@ def main(): # *** setup messaging can_sock = messaging.sub_sock('can') - sm = messaging.SubMaster(['modelV2', 'carState'], ignore_avg_freq=['modelV2', 'carState']) # Can't check average frequency, since radar determines timing + sm = messaging.SubMaster(['modelV2', 'carState'], frequency=int(1./DT_CTRL)) pm = messaging.PubMaster(['radarState', 'liveTracks']) RI = RadarInterface(CP) @@ -308,12 +309,10 @@ def main(): while 1: can_strings = messaging.drain_sock_raw(can_sock, wait_for_one=True) rr = RI.update(can_strings) - + sm.update(0) if rr is None: continue - sm.update(0) - RD.update(sm, rr) RD.publish(pm, -rk.remaining*1000.0) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index d5350239fe..c9064df870 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -39,7 +39,7 @@ PROCS = { "./ui": 18.0, "selfdrive.locationd.paramsd": 9.0, "./sensord": 7.0, - "selfdrive.controls.radard": 4.5, + "selfdrive.controls.radard": 7.0, "selfdrive.modeld.modeld": 13.0, "selfdrive.modeld.dmonitoringmodeld": 8.0, "selfdrive.modeld.navmodeld": 1.0, From e59fe0014af6e97485c89502c747d3117f95e91a Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Wed, 14 Feb 2024 14:09:01 -0800 Subject: [PATCH 144/923] URLFile: add typing and internalize pool manager (#31466) * URLFile: add typing and internalize pool manager * cleanup --- tools/lib/url_file.py | 59 ++++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/tools/lib/url_file.py b/tools/lib/url_file.py index 77ed063226..2d3d14ce8a 100644 --- a/tools/lib/url_file.py +++ b/tools/lib/url_file.py @@ -4,6 +4,7 @@ import socket import time from hashlib import sha256 from urllib3 import PoolManager, Retry +from urllib3.response import BaseHTTPResponse from urllib3.util import Timeout from openpilot.common.file_helpers import atomic_write_in_dir @@ -14,7 +15,7 @@ CHUNK_SIZE = 1000 * K logging.getLogger("urllib3").setLevel(logging.WARNING) -def hash_256(link): +def hash_256(link: str) -> str: hsh = str(sha256((link.split("?")[0]).encode('utf-8')).hexdigest()) return hsh @@ -23,26 +24,26 @@ class URLFileException(Exception): pass -def new_pool_manager() -> PoolManager: - socket_options = [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),] - retries = Retry(total=5, backoff_factor=0.5, status_forcelist=[409, 429, 503, 504]) - return PoolManager(num_pools=10, maxsize=100, socket_options=socket_options, retries=retries) - - -def set_pool_manager(): - URLFile._pool_manager = new_pool_manager() -os.register_at_fork(after_in_child=set_pool_manager) - - class URLFile: - _pool_manager = new_pool_manager() + _pool_manager: PoolManager|None = None - def __init__(self, url, timeout=10, debug=False, cache=None): + @staticmethod + def reset() -> None: + URLFile._pool_manager = None + + @staticmethod + def pool_manager() -> PoolManager: + if URLFile._pool_manager is None: + socket_options = [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),] + retries = Retry(total=5, backoff_factor=0.5, status_forcelist=[409, 429, 503, 504]) + URLFile._pool_manager = PoolManager(num_pools=10, maxsize=100, socket_options=socket_options, retries=retries) + return URLFile._pool_manager + + def __init__(self, url: str, timeout: int=10, debug: bool=False, cache: bool|None=None): self._url = url self._timeout = Timeout(connect=timeout, read=timeout) self._pos = 0 - self._length = None - self._local_file = None + self._length: int|None = None self._debug = debug # True by default, false if FILEREADER_CACHE is defined, but can be overwritten by the cache input self._force_download = not int(os.environ.get("FILEREADER_CACHE", "0")) @@ -55,23 +56,20 @@ class URLFile: def __enter__(self): return self - def __exit__(self, exc_type, exc_value, traceback): - if self._local_file is not None: - os.remove(self._local_file.name) - self._local_file.close() - self._local_file = None + def __exit__(self, exc_type, exc_value, traceback) -> None: + pass - def _request(self, method, url, headers=None): - return URLFile._pool_manager.request(method, url, timeout=self._timeout, headers=headers) + def _request(self, method: str, url: str, headers: dict[str, str]|None=None) -> BaseHTTPResponse: + return URLFile.pool_manager().request(method, url, timeout=self._timeout, headers=headers) - def get_length_online(self): + def get_length_online(self) -> int: response = self._request('HEAD', self._url) if not (200 <= response.status <= 299): return -1 length = response.headers.get('content-length', 0) return int(length) - def get_length(self): + def get_length(self) -> int: if self._length is not None: return self._length @@ -88,7 +86,7 @@ class URLFile: file_length.write(str(self._length)) return self._length - def read(self, ll=None): + def read(self, ll: int|None=None) -> bytes: if self._force_download: return self.read_aux(ll=ll) @@ -120,7 +118,7 @@ class URLFile: self._pos = file_end return response - def read_aux(self, ll=None): + def read_aux(self, ll: int|None=None) -> bytes: download_range = False headers = {} if self._pos != 0 or ll is not None: @@ -155,9 +153,12 @@ class URLFile: self._pos += len(ret) return ret - def seek(self, pos): + def seek(self, pos:int) -> None: self._pos = pos @property - def name(self): + def name(self) -> str: return self._url + + +os.register_at_fork(after_in_child=URLFile.reset) From 2f15c878d0365f4a48dc36344e5fa313bd22cb5b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 14 Feb 2024 15:01:02 -0800 Subject: [PATCH 145/923] bump cereal (#31469) * bump cereal * bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index e842020c1c..bd31b25aac 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit e842020c1c7a2c43fda17f4075307ae8abb9bc3a +Subproject commit bd31b25aacc5b39f36cedcb0dabd05db471da59f From 20db82641fa1432760ea518a6e28442c0d802907 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 14 Feb 2024 15:36:54 -0800 Subject: [PATCH 146/923] Update RELEASES.md --- RELEASES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index e5f1e76750..215b975974 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,4 +1,4 @@ -Version 0.9.6 (2024-02-XX) +Version 0.9.6 (2024-02-22) ======================== * New driving model * Vision model trained on more data From 9acc55861cfe5f78bca6d46762b38c4f5903ea6c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 19:08:12 -0600 Subject: [PATCH 147/923] VIN: lower retries (#31471) * lower retries * comment --- selfdrive/car/car_helpers.py | 5 +++-- selfdrive/car/tests/test_fw_fingerprint.py | 2 +- selfdrive/car/vin.py | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 7e96008149..7654475358 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -141,9 +141,10 @@ def fingerprint(logcan, sendcan, num_pandas): cached = True else: cloudlog.warning("Getting VIN & FW versions") - # enable OBD multiplexing for Vin query, also allows time for sendcan subscriber to connect + # enable OBD multiplexing for VIN query + # NOTE: this takes ~0.1s and is relied on to allow sendcan subscriber to connect in time set_obd_multiplexing(params, True) - # Vin query only reliably works through OBDII + # 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) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 906a2d2a61..fa006e51a6 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -225,7 +225,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.5, 'best': 0.5} # best assumes we go through all queries to get a match + vin_ref_times = {'worst': 1.0, 'best': 0.5} # 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 4e554665ef..184455af17 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -15,7 +15,7 @@ def is_valid_vin(vin: str): return re.fullmatch(VIN_RE, vin) is not None -def get_vin(logcan, sendcan, buses, timeout=0.1, retry=3, debug=False): +def get_vin(logcan, sendcan, buses, timeout=0.1, retry=2, debug=False): for i in range(retry): for bus in buses: for request, response, valid_buses, vin_addrs, functional_addrs, rx_offset in ( From c65dfaac68bbf836900dd612a33667cb00cdf854 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 22:06:14 -0600 Subject: [PATCH 148/923] Leaf: get VIN (#31398) * Add Leaf VIN query * add lots of requests * add exception for nissan * no more logging * update refs * lower worst case * Update selfdrive/car/car_helpers.py * update refs * it's the vcm! --- selfdrive/car/fw_query_definitions.py | 3 +++ selfdrive/car/tests/test_fw_fingerprint.py | 2 +- selfdrive/car/vin.py | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index ed886a69db..350c062826 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -65,6 +65,9 @@ class StdQueries: GM_VIN_REQUEST = b'\x1a\x90' GM_VIN_RESPONSE = b'\x5a\x90' + KWP_VIN_REQUEST = b'\x21\x81' + KWP_VIN_RESPONSE = b'\x61\x81' + @dataclass class Request: diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index fa006e51a6..17eba80d2a 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -225,7 +225,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.0, 'best': 0.5} # best assumes we go through all queries to get a match + vin_ref_times = {'worst': 1.2, 'best': 0.6} # 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 184455af17..e668c35f7d 100755 --- a/selfdrive/car/vin.py +++ b/selfdrive/car/vin.py @@ -22,6 +22,7 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=2, debug=False): (StdQueries.UDS_VIN_REQUEST, StdQueries.UDS_VIN_RESPONSE, (0, 1), STANDARD_VIN_ADDRS, FUNCTIONAL_ADDRS, 0x8), (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 ): if bus not in valid_buses: continue @@ -40,8 +41,8 @@ def get_vin(logcan, sendcan, buses, timeout=0.1, retry=2, debug=False): for addr in vin_addrs: vin = results.get((addr, None)) if vin is not None: - # Ford pads with null bytes - if len(vin) == 24: + # Ford and Nissan pads with null bytes + if len(vin) in (19, 24): vin = re.sub(b'\x00*$', b'', vin) # Honda Bosch response starts with a length, trim to correct length From 68fcc955ac69cd9e2d1a58127bbae32a2b6da1e5 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 22:47:30 -0600 Subject: [PATCH 149/923] bump panda (#31472) * bump * fix renames --- panda | 2 +- selfdrive/boardd/boardd.cc | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/panda b/panda index ad0f372ada..ef68fea95e 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ad0f372adabef438d67340c6b9c76ba7146d0671 +Subproject commit ef68fea95ed0633b05752e56b3fb9f43e324a01b diff --git a/selfdrive/boardd/boardd.cc b/selfdrive/boardd/boardd.cc index 9e2a960055..b2b59d3752 100644 --- a/selfdrive/boardd/boardd.cc +++ b/selfdrive/boardd/boardd.cc @@ -362,11 +362,11 @@ std::optional send_panda_states(PubMaster *pm, const std::vector ps.setHeartbeatLost((bool)(health.heartbeat_lost_pkt)); ps.setAlternativeExperience(health.alternative_experience_pkt); ps.setHarnessStatus(cereal::PandaState::HarnessStatus(health.car_harness_status_pkt)); - ps.setInterruptLoad(health.interrupt_load); + ps.setInterruptLoad(health.interrupt_load_pkt); ps.setFanPower(health.fan_power); ps.setFanStallCount(health.fan_stall_count); - ps.setSafetyRxChecksInvalid((bool)(health.safety_rx_checks_invalid)); - ps.setSpiChecksumErrorCount(health.spi_checksum_error_count); + ps.setSafetyRxChecksInvalid((bool)(health.safety_rx_checks_invalid_pkt)); + ps.setSpiChecksumErrorCount(health.spi_checksum_error_count_pkt); ps.setSbu1Voltage(health.sbu1_voltage_mV / 1000.0f); ps.setSbu2Voltage(health.sbu2_voltage_mV / 1000.0f); From 0e94567a181e75243321e05c1397259635697f68 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 23:32:44 -0600 Subject: [PATCH 150/923] Toyota: only read gas interceptor if we're using it (#31473) * we shouldn't be reading from interceptor and not writing/sending gas command * better * add a test! * comment is clear --- selfdrive/car/tests/test_car_interfaces.py | 4 ++++ selfdrive/car/toyota/interface.py | 8 ++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index f2625abe57..a454f616cb 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -74,6 +74,10 @@ 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/interface.py b/selfdrive/car/toyota/interface.py index 3d9755c8c9..3165d15108 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -225,10 +225,6 @@ class CarInterface(CarInterfaceBase): found_ecus = [fw.ecu for fw in car_fw] 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) - ret.enableGasInterceptor = 0x201 in fingerprint[0] - - if ret.enableGasInterceptor: - ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_GAS_INTERCEPTOR # if the smartDSU is detected, openpilot can send ACC_CONTROL and the smartDSU will block it from the DSU or radar. # since we don't yet parse radar on TSS2/TSS-P radar-based ACC cars, gate longitudinal behind experimental toggle @@ -253,10 +249,14 @@ 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 From 55ba64568d1b1be75ce5394352566c3f22cde0ce Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 23:41:01 -0600 Subject: [PATCH 151/923] test_models: add RAV4 route without relay malfunction (#31474) add it back --- selfdrive/car/tests/routes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index b874e31b6a..99a4d0873c 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -187,6 +187,7 @@ routes = [ 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), From 622d099d0001bd1c697af1f4ef7c11304561e575 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 23:55:33 -0600 Subject: [PATCH 152/923] Toyota: check ACC_CONTROL for relay malfunction (#31475) toyota: check acc control for relay malfunction --- panda | 2 +- selfdrive/car/tests/routes.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/panda b/panda index ef68fea95e..27768f5ef3 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ef68fea95ed0633b05752e56b3fb9f43e324a01b +Subproject commit 27768f5ef3b9eeca66bca93d9f49ae368fdd738a diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 99a4d0873c..9618549dea 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -292,7 +292,6 @@ routes = [ # Segments that test specific issues # Controls mismatch due to interceptor threshold CarTestRoute("cfb32f0fb91b173b|2022-04-06--14-54-45", HONDA.CIVIC, segment=21), - CarTestRoute("5a8762b91fc70467|2022-04-14--21-26-20", TOYOTA.RAV4, segment=2), # Controls mismatch due to standstill threshold CarTestRoute("bec2dcfde6a64235|2022-04-08--14-21-32", HONDA.CRV_HYBRID, segment=22), ] From b1f452d42b58336fe24f83f2bc0ac54116a83b2b Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 15 Feb 2024 01:27:07 -0600 Subject: [PATCH 153/923] Toyota TSS2: radar disable support (#29094) * try to disable radar * fix bug and bump panda * prep * always attempt longitudinal for testers * fix rav4 * send ACC_HUD * bump panda * revert * check for failure to disable * fix arg * allow * this has no effect * bump * update docs * bug fix * fix * check relay malfunc for acc control * remove route where SDSU caused a relay malfunction * missing rav4 * bump * use chr route * bump * add back * relay malfunction * bump to master * add to releases --- RELEASES.md | 1 + docs/CARS.md | 12 ++++++------ panda | 2 +- selfdrive/car/tests/routes.py | 2 +- selfdrive/car/toyota/interface.py | 4 ++-- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 215b975974..375a33b867 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -9,6 +9,7 @@ Version 0.9.6 (2024-02-22) * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models +* Alpha longitudinal support for new Toyota models * Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire! * Dodge Duranago 2020-21 support * Hyundai Staria 2023 support thanks to sunnyhaibin! diff --git a/docs/CARS.md b/docs/CARS.md index 48e2e77e62..6d3ee71659 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -216,9 +216,9 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|Avalon Hybrid 2019-21|All|openpilot available[2](#footnotes)|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|Avalon Hybrid 2022|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|C-HR 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 2021|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 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|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 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
|| @@ -244,13 +244,13 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|RAV4 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
|| |Toyota|RAV4 2017-18|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
|| |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|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|RAV4 2023-24|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|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 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|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|RAV4 Hybrid 2023-24|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|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
|| diff --git a/panda b/panda index 27768f5ef3..0a1ec8580e 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 27768f5ef3b9eeca66bca93d9f49ae368fdd738a +Subproject commit 0a1ec8580ecbde1f73b424f63b9fb8fbe29ddf09 diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 9618549dea..f7ae4e038e 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -224,7 +224,7 @@ routes = [ 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("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("202c40641158a6e5|2021-09-21--09-43-24", VOLKSWAGEN.ARTEON_MK1), diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 3165d15108..988b1b4547 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -230,11 +230,11 @@ class CarInterface(CarInterfaceBase): # since we don't yet parse radar on TSS2/TSS-P radar-based ACC cars, gate longitudinal behind experimental toggle use_sdsu = bool(ret.flags & ToyotaFlags.SMART_DSU) if candidate in (RADAR_ACC_CAR | NO_DSU_CAR): - ret.experimentalLongitudinalAvailable = use_sdsu + ret.experimentalLongitudinalAvailable = use_sdsu or candidate in RADAR_ACC_CAR if not use_sdsu: # Disabling radar is only supported on TSS2 radar-ACC cars - if experimental_long and candidate in RADAR_ACC_CAR and False: # TODO: disabling radar isn't supported yet + if experimental_long and candidate in RADAR_ACC_CAR: ret.flags |= ToyotaFlags.DISABLE_RADAR.value else: use_sdsu = use_sdsu and experimental_long From 62c51e2d0cb0ea6d160396c7afede9e75f9219f4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 14 Feb 2024 23:35:59 -0800 Subject: [PATCH 154/923] HKG CAN FD: fix bus 0 VIN addr Added camera addr instead of cluster on accident here: https://github.com/commaai/openpilot/pull/31348 --- selfdrive/car/fw_query_definitions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 350c062826..36e6794d2c 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -17,7 +17,7 @@ OfflineFwVersions = Dict[str, Dict[EcuAddrSubAddr, List[bytes]]] # A global list of addresses we will only ever consider for VIN responses # engine, hybrid controller, Ford abs, Hyundai CAN FD cluster, 29-bit engine, PGM-FI # TODO: move these to each brand's FW query config -STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x7c4, 0x18da10f1, 0x18da0ef1] +STANDARD_VIN_ADDRS = [0x7e0, 0x7e2, 0x760, 0x7c6, 0x18da10f1, 0x18da0ef1] def p16(val): From baa77ced19add6241cdc634840205b7115c584ab Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 15 Feb 2024 02:35:21 -0600 Subject: [PATCH 155/923] TestFwFingerprint: test to prevent mismatches when utilizing non-essential ECUs (#31478) * test * same speed --- selfdrive/car/tests/test_fw_fingerprint.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 17eba80d2a..493efc1bab 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -33,18 +33,29 @@ class TestFwFingerprint(unittest.TestCase): self.assertEqual(len(candidates), 1, f"got more than one candidate: {candidates}") self.assertEqual(candidates[0], expected) - @parameterized.expand([(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) - def test_exact_match(self, brand, car_model, ecus): + @parameterized.expand([(b, c, e[c], n) for b, e in VERSIONS.items() for c in e for n in (True, False)]) + def test_exact_match(self, brand, car_model, ecus, test_non_essential): + config = FW_QUERY_CONFIGS[brand] CP = car.CarParams.new_message() - for _ in range(200): + for _ in range(100): fw = [] for ecu, fw_versions in ecus.items(): + # Assume non-essential ECUs apply to all cars, so we catch cases where Car A with + # missing ECUs won't match to Car B where only Car B has labeled non-essential ECUs + if ecu[0] in config.non_essential_ecus and test_non_essential: + continue + ecu_name, addr, sub_addr = ecu 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) - self.assertFingerprints(matches, car_model) + if not test_non_essential: + self.assertFingerprints(matches, car_model) + else: + # if we're removing ECUs we expect some match loss, but it shouldn't mismatch + if len(matches) != 0: + self.assertFingerprints(matches, car_model) @parameterized.expand([(b, c, e[c]) for b, e in VERSIONS.items() for c in e]) def test_custom_fuzzy_match(self, brand, car_model, ecus): From 8aee0d2af2c9e9c1755afa2b46f68b199958ccdb Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 15 Feb 2024 14:24:27 -0500 Subject: [PATCH 156/923] test_logreader: test interactive mode + fix typo in AUTO_INTERACTIVE (#31481) * fix spelling * test interactive * remove that * test taht * move that --- tools/lib/logreader.py | 4 ++-- tools/lib/tests/test_logreader.py | 19 ++++++++++++++++--- tools/plotjuggler/juggle.py | 2 +- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index af2c23ef48..2269430792 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -73,7 +73,7 @@ class ReadMode(enum.StrEnum): QLOG = "q" # only read qlogs SANITIZED = "s" # read from the commaCarSegments database AUTO = "a" # default to rlogs, fallback to qlogs - AUTO_INTERACIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user + AUTO_INTERACTIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user LogPath = Optional[str] @@ -106,7 +106,7 @@ def apply_strategy(mode: ReadMode, rlog_paths: LogPaths, qlog_paths: LogPaths, v return qlog_paths elif mode == ReadMode.AUTO: return auto_strategy(rlog_paths, qlog_paths, False, valid_file) - elif mode == ReadMode.AUTO_INTERACIVE: + elif mode == ReadMode.AUTO_INTERACTIVE: return auto_strategy(rlog_paths, qlog_paths, True, valid_file) raise Exception(f"invalid mode: {mode}") diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 53b78064ab..974182d638 100755 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import io import shutil import tempfile import os @@ -168,10 +169,22 @@ class TestLogReader(unittest.TestCase): with mock.patch("openpilot.tools.lib.route.Route.log_paths") as log_paths_mock: log_paths_mock.return_value = [None] * NUM_SEGS # Should fall back to qlogs since rlogs are not available - lr = LogReader(f"{TEST_ROUTE}/0/a", default_source=comma_api_source) - log_len = len(list(lr)) - self.assertEqual(qlog_len, log_len) + with self.subTest("interactive_yes"): + with mock.patch("sys.stdin", new=io.StringIO("y\n")): + lr = LogReader(f"{TEST_ROUTE}/0", default_mode=ReadMode.AUTO_INTERACTIVE, default_source=comma_api_source) + log_len = len(list(lr)) + self.assertEqual(qlog_len, log_len) + + with self.subTest("interactive_no"): + with mock.patch("sys.stdin", new=io.StringIO("n\n")): + with self.assertRaises(AssertionError): + lr = LogReader(f"{TEST_ROUTE}/0", default_mode=ReadMode.AUTO_INTERACTIVE, default_source=comma_api_source) + + with self.subTest("non_interactive"): + lr = LogReader(f"{TEST_ROUTE}/0", default_mode=ReadMode.AUTO, default_source=comma_api_source) + log_len = len(list(lr)) + self.assertEqual(qlog_len, log_len) if __name__ == "__main__": diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index cc21095414..dc94062801 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -73,7 +73,7 @@ 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_INTERACIVE) + sr = LogReader(route_or_segment_name, default_mode=ReadMode.AUTO_INTERACTIVE) all_data = sr.run_across_segments(24, partial(process, can)) From d31269f6639b86405708f05c098ac1fd665c3107 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 15 Feb 2024 11:52:57 -0800 Subject: [PATCH 157/923] fix no GPS alert when driving slowly in a tunnel (#31483) --- selfdrive/controls/controlsd.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 3fb19c7da7..adc680ed2a 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -411,9 +411,12 @@ 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): - # Not show in first 1 km to allow for driving out of garage. This event shows after 5 minutes self.events.add(EventName.noGps) + if self.sm['liveLocationKalman'].gpsOK: + self.distance_traveled = 0 + self.distance_traveled += CS.vEgo * DT_CTRL if self.sm['modelV2'].frameDropPerc > 20: self.events.add(EventName.modeldLagging) @@ -476,8 +479,6 @@ class Controls: if ps.safetyModel not in IGNORED_SAFETY_MODES): self.mismatch_counter += 1 - self.distance_traveled += CS.vEgo * DT_CTRL - return CS def state_transition(self, CS): From 16d13395536e84ddf492b2352d827d33befd601e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 15 Feb 2024 15:10:56 -0500 Subject: [PATCH 158/923] test_logreader: test internal scenarios (#31484) * test source scenario * test source scenario * fix --- tools/lib/logreader.py | 6 ++++-- tools/lib/tests/test_logreader.py | 32 ++++++++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 2269430792..7957712aff 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -81,6 +81,8 @@ LogPaths = List[LogPath] ValidFileCallable = Callable[[LogPath], bool] Source = Callable[[SegmentRange, ReadMode], LogPaths] +InternalUnavailableException = Exception("Internal source not available") + def default_valid_file(fn: LogPath) -> bool: return fn is not None and file_exists(fn) @@ -126,7 +128,7 @@ def comma_api_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: def internal_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: if not internal_source_available(): - raise Exception("Internal source not available") + raise InternalUnavailableException def get_internal_url(sr: SegmentRange, seg, file): return f"cd:/{sr.dongle_id}/{sr.timestamp}/{seg}/{file}.bz2" @@ -160,7 +162,7 @@ def get_invalid_files(files): def check_source(source: Source, *args) -> LogPaths: files = source(*args) - assert next(get_invalid_files(files), None) is None + assert next(get_invalid_files(files), False) is False return files diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 974182d638..2141915b87 100755 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import contextlib import io import shutil import tempfile @@ -10,7 +11,7 @@ import requests from parameterized import parameterized from unittest import mock -from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, ReadMode +from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, ReadMode, InternalUnavailableException from openpilot.tools.lib.route import SegmentRange from openpilot.tools.lib.url_file import URLFileException @@ -24,6 +25,24 @@ def noop(segment: LogIterable): return segment +@contextlib.contextmanager +def setup_source_scenario(is_internal=False): + with ( + mock.patch("openpilot.tools.lib.logreader.internal_source") as internal_source_mock, + mock.patch("openpilot.tools.lib.logreader.openpilotci_source") as openpilotci_source_mock, + mock.patch("openpilot.tools.lib.logreader.comma_api_source") as comma_api_source_mock, + ): + if is_internal: + internal_source_mock.return_value = [QLOG_FILE] + else: + internal_source_mock.side_effect = InternalUnavailableException + + openpilotci_source_mock.return_value = [None] + comma_api_source_mock.return_value = [QLOG_FILE] + + yield + + class TestLogReader(unittest.TestCase): @parameterized.expand([ (f"{TEST_ROUTE}", ALL_SEGS), @@ -186,6 +205,17 @@ class TestLogReader(unittest.TestCase): log_len = len(list(lr)) self.assertEqual(qlog_len, log_len) + @parameterized.expand([(True,), (False,)]) + @pytest.mark.slow + def test_auto_source_scenarios(self, is_internal): + lr = LogReader(QLOG_FILE) + qlog_len = len(list(lr)) + + with setup_source_scenario(is_internal=is_internal): + lr = LogReader(f"{TEST_ROUTE}/0/q") + log_len = len(list(lr)) + self.assertEqual(qlog_len, log_len) + if __name__ == "__main__": unittest.main() From c2b9f7163ace207038d4d17096f056b61c7644ba Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 15 Feb 2024 16:12:11 -0500 Subject: [PATCH 159/923] test_qcomgpsd: subtest the gps_runtime scenarios (#31485) * subtest this * runtime --------- Co-authored-by: Comma Device --- system/qcomgpsd/tests/test_qcomgpsd.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/system/qcomgpsd/tests/test_qcomgpsd.py b/system/qcomgpsd/tests/test_qcomgpsd.py index 8291f2cc32..6c93f7dd93 100755 --- a/system/qcomgpsd/tests/test_qcomgpsd.py +++ b/system/qcomgpsd/tests/test_qcomgpsd.py @@ -68,13 +68,14 @@ class TestRawgpsd(unittest.TestCase): def test_turns_off_gnss(self): for s in (0.1, 1, 5): - managed_processes['qcomgpsd'].start() - time.sleep(s) - managed_processes['qcomgpsd'].stop() + with self.subTest(runtime=s): + managed_processes['qcomgpsd'].start() + time.sleep(s) + managed_processes['qcomgpsd'].stop() - ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') - loc_status = json.loads(ls) - assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} + ls = subprocess.check_output("mmcli -m any --location-status --output-json", shell=True, encoding='utf-8') + loc_status = json.loads(ls) + assert set(loc_status['modem']['location']['enabled']) <= {'3gpp-lac-ci'} def check_assistance(self, should_be_loaded): From 64851baea8e61d9e83b7935f3b4727a6409d62ce Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 15 Feb 2024 13:10:33 -0800 Subject: [PATCH 160/923] debug/count_events.py improvements --- selfdrive/debug/count_events.py | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/selfdrive/debug/count_events.py b/selfdrive/debug/count_events.py index 0d545b3153..b40e195939 100755 --- a/selfdrive/debug/count_events.py +++ b/selfdrive/debug/count_events.py @@ -16,28 +16,35 @@ if __name__ == "__main__": cams = [s for s in SERVICE_LIST if s.endswith('CameraState')] cnt_cameras = dict.fromkeys(cams, 0) + events = [] alerts: List[Tuple[float, str]] = [] start_time = math.inf end_time = -math.inf ignition_off = None for msg in LogReader(sys.argv[1], ReadMode.QLOG): + t = (msg.logMonoTime - start_time) / 1e9 end_time = max(end_time, msg.logMonoTime) start_time = min(start_time, msg.logMonoTime) if msg.which() == 'onroadEvents': for e in msg.onroadEvents: cnt_events[e.name] += 1 + + ae = {str(e.name) for e in msg.onroadEvents if e.name not in ('pedalPressed', 'steerOverride', 'gasPressedOverride')} + if len(events) == 0 or ae != events[-1][1]: + events.append((t, ae)) + elif msg.which() == 'controlsState': at = msg.controlsState.alertType if "/override" not in at or "lanechange" in at.lower(): if len(alerts) == 0 or alerts[-1][1] != at: - t = (msg.logMonoTime - start_time) / 1e9 alerts.append((t, at)) elif msg.which() == 'pandaStates': if ignition_off is None: ign = any(ps.ignitionLine or ps.ignitionCan for ps in msg.pandaStates) if not ign: ignition_off = msg.logMonoTime + break elif msg.which() in cams: cnt_cameras[msg.which()] += 1 @@ -64,9 +71,14 @@ if __name__ == "__main__": print("Alerts") for t, a in alerts: print(f"{t:8.2f} {a}") + + print("\n") + print("Events") + for t, a in events: + print(f"{t:8.2f} {a}") + + print("\n") if ignition_off is not None: ignition_off = round((ignition_off - start_time) / 1e9, 2) print("Ignition off at", ignition_off) - - print("\n") print("Route duration", datetime.timedelta(seconds=duration)) From eb5a847dc87fdbf2118aadd670487a5abd950f6c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 15 Feb 2024 13:18:19 -0800 Subject: [PATCH 161/923] Update RELEASES.md --- RELEASES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RELEASES.md b/RELEASES.md index 375a33b867..b3c5b1d6da 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -11,7 +11,7 @@ Version 0.9.6 (2024-02-22) * Improved fuzzy fingerprinting for many makes and models * Alpha longitudinal support for new Toyota models * Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire! -* Dodge Duranago 2020-21 support +* Dodge Durango 2020-21 support * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! * Lexus LC 2024 support thanks to nelsonjchen! From 663f7017f2476f3f50b23bfcbaa89947e4e99fbd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 15 Feb 2024 13:35:33 -0800 Subject: [PATCH 162/923] fix linter --- selfdrive/debug/count_events.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/debug/count_events.py b/selfdrive/debug/count_events.py index b40e195939..567d1a9e07 100755 --- a/selfdrive/debug/count_events.py +++ b/selfdrive/debug/count_events.py @@ -16,7 +16,7 @@ if __name__ == "__main__": cams = [s for s in SERVICE_LIST if s.endswith('CameraState')] cnt_cameras = dict.fromkeys(cams, 0) - events = [] + events: List[Tuple[float, set[str]]] = [] alerts: List[Tuple[float, str]] = [] start_time = math.inf end_time = -math.inf @@ -74,8 +74,8 @@ if __name__ == "__main__": print("\n") print("Events") - for t, a in events: - print(f"{t:8.2f} {a}") + for t, evt in events: + print(f"{t:8.2f} {evt}") print("\n") if ignition_off is not None: From 0cb206cb95ac3aa674d79ce0121893fbf7c68c88 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 15 Feb 2024 16:38:42 -0500 Subject: [PATCH 163/923] conftest: cleanup environment cleaner (#31486) * clean env * no self --- conftest.py | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/conftest.py b/conftest.py index e4dc6640c0..0d2a4a8fc4 100644 --- a/conftest.py +++ b/conftest.py @@ -1,3 +1,4 @@ +import contextlib import gc import os import pytest @@ -25,42 +26,42 @@ def pytest_runtest_call(item): yield -@pytest.fixture(scope="function", autouse=True) -def openpilot_function_fixture(request): +@contextlib.contextmanager +def clean_env(): starting_env = dict(os.environ) - - random.seed(0) - - # setup a clean environment for each test - with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix: - prefix = os.environ["OPENPILOT_PREFIX"] - - yield - - # ensure the test doesn't change the prefix - assert "OPENPILOT_PREFIX" in os.environ and prefix == os.environ["OPENPILOT_PREFIX"] - + yield os.environ.clear() os.environ.update(starting_env) - # cleanup any started processes - manager.manager_cleanup() - # some processes disable gc for performance, re-enable here - if not gc.isenabled(): - gc.enable() - gc.collect() +@pytest.fixture(scope="function", autouse=True) +def openpilot_function_fixture(request): + random.seed(0) + + with clean_env(): + # setup a clean environment for each test + with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix: + prefix = os.environ["OPENPILOT_PREFIX"] + + yield + + # ensure the test doesn't change the prefix + assert "OPENPILOT_PREFIX" in os.environ and prefix == os.environ["OPENPILOT_PREFIX"] + + # cleanup any started processes + manager.manager_cleanup() + + # some processes disable gc for performance, re-enable here + if not gc.isenabled(): + gc.enable() + gc.collect() # If you use setUpClass, the environment variables won't be cleared properly, # so we need to hook both the function and class pytest fixtures @pytest.fixture(scope="class", autouse=True) def openpilot_class_fixture(): - starting_env = dict(os.environ) - - yield - - os.environ.clear() - os.environ.update(starting_env) + with clean_env(): + yield @pytest.fixture(scope="function") From 0a5e994947170dde632c20069b80470e8c8df31e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 15 Feb 2024 23:44:02 -0600 Subject: [PATCH 164/923] [bot] Fingerprints: add missing FW versions from new users (#31489) Export fingerprints --- selfdrive/car/honda/fingerprints.py | 1 + selfdrive/car/hyundai/fingerprints.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index d24838ffbc..fbb1714ea1 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -299,6 +299,7 @@ FW_VERSIONS = { (Ecu.srs, 0x18da53f1, None): [ b'77959-TBA-A030\x00\x00', b'77959-TBA-A040\x00\x00', + b'77959-TBG-A020\x00\x00', b'77959-TBG-A030\x00\x00', b'77959-TEA-Q820\x00\x00', ], diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index d3b282422c..d1fc1faabb 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1549,6 +1549,7 @@ FW_VERSIONS = { b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.06 99211-GI000 210813', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI010 211007', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.02 99211-GI010 211206', + b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.05 99211-GI010 220614', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.00 99211-GI020 230719', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.01 99211-GI010 211007', @@ -1556,7 +1557,6 @@ FW_VERSIONS = { b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.03 99211-GI010 220401', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.05 99211-GI010 220614', b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110', - b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', ], }, CAR.IONIQ_6: { From 5a441ec0c4bf39a5e066e307ee6c9a8b55f8d8b5 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 15 Feb 2024 22:20:00 -0800 Subject: [PATCH 165/923] modeld: fix and cleanup getting carParams (#31488) --- selfdrive/modeld/modeld.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 5b227d08e9..01acca7bcb 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -152,12 +152,8 @@ def main(demo=False): pm = PubMaster(["modelV2", "cameraOdometry"]) sm = SubMaster(["carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel", "navInstruction", "carControl"]) - publish_state = PublishState() params = Params() - with car.CarParams.from_bytes(params.get("CarParams", block=True)) as msg: - steer_delay = msg.steerActuatorDelay + .2 - #steer_delay = 0.4 # setup filter to track dropped frames frame_dropped_filter = FirstOrderFilter(0., 10., 1. / ModelConstants.MODEL_FREQ) @@ -177,13 +173,15 @@ def main(demo=False): if demo: CP = get_demo_car_params() - with car.CarParams.from_bytes(params.get("CarParams", block=True)) as msg: - CP = msg - cloudlog.info("plannerd got CarParams: %s", CP.carName) + else: + with car.CarParams.from_bytes(params.get("CarParams", block=True)) as msg: + CP = msg + cloudlog.info("modeld got CarParams: %s", CP.carName) + # TODO this needs more thought, use .2s extra for now to estimate other delays steer_delay = CP.steerActuatorDelay + .2 - DH = DesireHelper() + DH = DesireHelper() while True: # Keep receiving frames until we are at least 1 frame ahead of previous extra frame From 0a737ba3433b20f0d6a992187f4d1e0b39ee96fc Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 12:41:07 +0000 Subject: [PATCH 166/923] MADS: Display pre-enable events with MADS engaged --- selfdrive/controls/controlsd.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index f48405fb05..2c15a46691 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -595,6 +595,9 @@ class Controls: self.soft_disable_timer = int(SOFT_DISABLE_TIME / DT_CTRL) self.current_alert_types.append(ET.SOFT_DISABLE) + elif self.events.contains(ET.PRE_ENABLE): + self.current_alert_types.append(ET.PRE_ENABLE) + elif self.events.contains(ET.OVERRIDE_LATERAL) or self.events.contains(ET.OVERRIDE_LONGITUDINAL): self.state = State.overriding self.current_alert_types += [ET.OVERRIDE_LATERAL, ET.OVERRIDE_LONGITUDINAL] From efd6c7554bd7e9d38fa3ac98025cd1e65fde3637 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 12:42:10 +0000 Subject: [PATCH 167/923] ui: Feature Status: Fix SLC stuck in "OFF" --- selfdrive/ui/ui.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index b5f1d67fd9..3ac796124d 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -264,6 +264,7 @@ void ui_update_params(UIState *s) { s->scene.speed_limit_warning_type = std::atoi(params.get("SpeedLimitWarningType").c_str()); s->scene.speed_limit_warning_value_offset = std::atoi(params.get("SpeedLimitWarningValueOffset").c_str()); s->scene.driving_model_gen = std::atoi(params.get("DrivingModelGeneration").c_str()); + s->scene.speed_limit_control_enabled = params.getBool("EnableSlc"); // Handle Onroad Screen Off params if (s->scene.onroadScreenOff > 0) { From 9b48a5667c774c90b90df8d4b232a271abef175f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 12:47:06 +0000 Subject: [PATCH 168/923] ui: Add toggles for Feature Status and Onroad Settings --- CHANGELOGS.md | 5 +++++ common/params.cc | 2 ++ selfdrive/manager/manager.py | 2 ++ .../ui/qt/offroad/sunnypilot/visuals_settings.cc | 12 ++++++++++++ selfdrive/ui/qt/onroad.cc | 6 ++++-- selfdrive/ui/qt/onroad.h | 2 ++ selfdrive/ui/qt/onroad_settings.cc | 2 +- selfdrive/ui/ui.cc | 2 ++ selfdrive/ui/ui.h | 3 +++ 9 files changed, 33 insertions(+), 3 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 7f729fc9cf..8a16d8d17e 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -26,6 +26,11 @@ sunnypilot - 0.9.6.0 (2024-xx-xx) * UPDATED: Custom Offsets * Continued support for Legacy Driving Models (e.g., ND, BDv2, BDv1, FV, NS) * Deprecate support for newer Driving Models (e.g., CHv2, CH, LAv2, LAv1) +* UI Updates + * NEW❗: Visuals: Display Feature Status toggle + * Display the statuses of certain features on the driving screen + * NEW❗: Visuals: Enable Onroad Settings toggle + * Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu * FIXED: New comma 3X support * FIXED: New comma eSIM support * Bug fixes and performance improvements diff --git a/common/params.cc b/common/params.cc index 354f6b400f..a72c05f0e4 100644 --- a/common/params.cc +++ b/common/params.cc @@ -253,6 +253,7 @@ std::unordered_map keys = { {"EndToEndLongToggle", PERSISTENT}, {"EnforceTorqueLateral", PERSISTENT}, {"EnhancedScc", PERSISTENT}, + {"FeatureStatus", PERSISTENT}, {"FleetManagerPin", PERSISTENT}, {"GmapKey", PERSISTENT}, {"HandsOnWheelMonitoring", PERSISTENT}, @@ -278,6 +279,7 @@ std::unordered_map keys = { {"OnroadScreenOff", PERSISTENT}, {"OnroadScreenOffBrightness", PERSISTENT}, {"OnroadScreenOffEvent", PERSISTENT}, + {"OnroadSettings", PERSISTENT}, {"OsmLocal", PERSISTENT}, {"OsmLocationName", PERSISTENT}, {"OsmLocationTitle", PERSISTENT}, diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index e39892a13b..e76e5d8839 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -65,6 +65,7 @@ def manager_init() -> None: ("DynamicLaneProfile", "1"), ("EnableMads", "1"), ("EnhancedScc", "0"), + ("FeatureStatus", "1"), ("HandsOnWheelMonitoring", "0"), ("HideVEgoUi", "0"), ("LastSpeedLimitSignTap", "0"), @@ -75,6 +76,7 @@ def manager_init() -> None: ("OnroadScreenOff", "-2"), ("OnroadScreenOffBrightness", "50"), ("OnroadScreenOffEvent", "1"), + ("OnroadSettings", "1"), ("PathOffset", "0"), ("ReverseAccChange", "0"), ("ScreenRecorder", "1"), diff --git a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc index f75b98ac9e..e1061f29bf 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc @@ -27,6 +27,18 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { tr("OSM: Show UI elements that aid debugging."), "../assets/offroad/icon_blank.png", }, + { + "FeatureStatus", + tr("Display Feature Status"), + tr("Display the statuses of certain features on the driving screen."), + "../assets/offroad/icon_blank.png", + }, + { + "OnroadSettings", + tr("Enable Onroad Settings"), + tr("Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu."), + "../assets/offroad/icon_blank.png", + }, { "TrueVEgoUi", tr("Speedometer: Display True Speed"), diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 1a424d45a7..b1930a2495 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -354,7 +354,7 @@ void OnroadSettingsButton::paintEvent(QPaintEvent *event) { void OnroadSettingsButton::updateState(const UIState &s) { const auto cp = (*s.sm)["carParams"].getCarParams(); auto dlp_enabled = true; - bool allow_btn = dlp_enabled || hasLongitudinalControl(cp) || !cp.getPcmCruiseSpeed(); + bool allow_btn = s.scene.onroad_settings_toggle && (dlp_enabled || hasLongitudinalControl(cp) || !cp.getPcmCruiseSpeed()); setVisible(allow_btn); setEnabled(allow_btn); @@ -734,6 +734,8 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { e2eStatus = chime_prompt; e2eState = e2eLStatus; + featureStatusToggle = s.scene.feature_status_toggle; + experimental_btn->setVisible(!(showDebugUI && showVTC)); } @@ -911,7 +913,7 @@ void AnnotatedCameraWidget::drawHud(QPainter &p) { drawE2eStatus(p, UI_BORDER_SIZE * 2 + 190, 45, 150, 150, e2eState); } - if (!hideBottomIcons) { + if (!hideBottomIcons && featureStatusToggle) { drawFeatureStatusText(p, UI_BORDER_SIZE * 2 + 370, rect().bottom() - 160 - uiState()->scene.rn_offset); } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 091a47da88..67d871af93 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -243,6 +243,8 @@ private: QPixmap plus_arrow_up_img; QPixmap minus_arrow_down_img; + bool featureStatusToggle; + protected: void paintGL() override; void initializeGL() override; diff --git a/selfdrive/ui/qt/onroad_settings.cc b/selfdrive/ui/qt/onroad_settings.cc index e33e769f7e..0e56c47de4 100644 --- a/selfdrive/ui/qt/onroad_settings.cc +++ b/selfdrive/ui/qt/onroad_settings.cc @@ -89,7 +89,7 @@ OnroadSettings::OnroadSettings(bool closeable, QWidget *parent) : QFrame(parent) auto *subtitle_heading = new QVBoxLayout; subtitle_heading->setContentsMargins(0, 0, 0, 0); { - auto *subtitle = new QLabel(tr("SUNNYPILOT FEATURES"), this); + auto *subtitle = new QLabel(tr("ONROAD SETTINGS | SUNNYPILOT"), this); subtitle->setStyleSheet("color: #A0A0A0; font-size: 34px; font-weight: 300;"); subtitle_heading->addWidget(subtitle, 0, Qt::AlignCenter); } diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 3ac796124d..d0003e2c85 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -265,6 +265,8 @@ void ui_update_params(UIState *s) { s->scene.speed_limit_warning_value_offset = std::atoi(params.get("SpeedLimitWarningValueOffset").c_str()); s->scene.driving_model_gen = std::atoi(params.get("DrivingModelGeneration").c_str()); s->scene.speed_limit_control_enabled = params.getBool("EnableSlc"); + s->scene.feature_status_toggle = params.getBool("FeatureStatus"); + s->scene.onroad_settings_toggle = params.getBool("OnroadSettings"); // Handle Onroad Screen Off params if (s->scene.onroadScreenOff > 0) { diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 9595357fab..0f3e434181 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -257,6 +257,9 @@ typedef struct UIScene { int speed_limit_warning_value_offset; int driving_model_gen; + + bool feature_status_toggle; + bool onroad_settings_toggle; } UIScene; class UIState : public QObject { From b4a6486380115683344263f9e4ad92925ca74675 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 13:05:41 +0000 Subject: [PATCH 169/923] ui: Onroad optimization --- selfdrive/ui/qt/onroad.cc | 66 +++++++++++++++++++-------------------- selfdrive/ui/qt/onroad.h | 8 +++++ selfdrive/ui/ui.h | 3 -- 3 files changed, 41 insertions(+), 36 deletions(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index b1930a2495..18861e99eb 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -126,8 +126,6 @@ void OnroadWindow::updateState(const UIState &s) { void OnroadWindow::mousePressEvent(QMouseEvent* e) { - bool propagate_event = true; - #ifdef ENABLE_MAPS UIState *s = uiState(); UIScene &scene = s->scene; @@ -147,9 +145,7 @@ void OnroadWindow::mousePressEvent(QMouseEvent* e) { } } // propagation event to parent(HomeWindow) - if (propagate_event) { - QWidget::mousePressEvent(e); - } + QWidget::mousePressEvent(e); } void OnroadWindow::offroadTransition(bool offroad) { @@ -410,11 +406,9 @@ void AnnotatedCameraWidget::mousePressEvent(QMouseEvent* e) { UIState *s = uiState(); UIScene &scene = s->scene; const SubMaster &sm = *(s->sm); - auto longitudinal_plan_sp = sm["longitudinalPlanSP"].getLongitudinalPlanSP(); + const auto longitudinal_plan_sp = sm["longitudinalPlanSP"].getLongitudinalPlanSP(); - QRect speed_limit_touch_rect = scene.sl_sign_rect; - - if (longitudinal_plan_sp.getSpeedLimit() > 0.0 && speed_limit_touch_rect.contains(e->x(), e->y())) { + if (longitudinal_plan_sp.getSpeedLimit() > 0.0 && sl_sign_rect.contains(e->x(), e->y())) { // If touching the speed limit sign area when visible scene.last_speed_limit_sign_tap = seconds_since_boot(); params.putBool("LastSpeedLimitSignTap", true); @@ -444,7 +438,7 @@ void AnnotatedCameraWidget::updateButtonsLayout() { delete item; } - buttons_layout->setContentsMargins(0, 0, 10, uiState()->scene.rn_offset != 0 ? uiState()->scene.rn_offset + 10 : 20); + buttons_layout->setContentsMargins(0, 0, 10, rn_offset != 0 ? rn_offset + 10 : 20); buttons_layout->addSpacing(onroad_settings_btn->isVisible() ? 216 : 0); buttons_layout->addWidget(onroad_settings_btn, 0, Qt::AlignBottom | Qt::AlignLeft); @@ -475,6 +469,7 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { const auto gpsLocation = is_gps_location_external ? sm["gpsLocationExternal"].getGpsLocationExternal() : sm["gpsLocation"].getGpsLocation(); const auto ltp = sm["liveTorqueParameters"].getLiveTorqueParameters(); const auto lateral_plan_sp = sm["lateralPlanSPDEPRECATED"].getLateralPlanSPDEPRECATED(); + car_params = sm["carParams"].getCarParams(); // Handle older routes where vCruiseCluster is not set float v_cruise = cs.getVCruiseCluster() == 0.0 ? cs.getVCruise() : cs.getVCruiseCluster(); @@ -595,6 +590,8 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { const auto lp_sp = sm["longitudinalPlanSP"].getLongitudinalPlanSP(); slcState = lp_sp.getSpeedLimitControlState(); + speedLimitControlToggle = s.scene.speed_limit_control_enabled; + if (sm.frame % (UI_FREQ / 2) == 0) { const auto vtcState = lp_sp.getVisionTurnControllerState(); const float vtc_speed = lp_sp.getVisionTurnSpeed() * (s.scene.is_metric ? MS_TO_KPH : MS_TO_MPH); @@ -616,13 +613,13 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { float speed_limit_slc = lp_sp.getSpeedLimit() * (s.scene.is_metric ? MS_TO_KPH : MS_TO_MPH); const float speed_limit_offset = lp_sp.getSpeedLimitOffset() * (s.scene.is_metric ? MS_TO_KPH : MS_TO_MPH); - const bool sl_force_active = s.scene.speed_limit_control_enabled && + const bool sl_force_active = speedLimitControlToggle && seconds_since_boot() < s.scene.last_speed_limit_sign_tap + 2.0; - const bool sl_inactive = !sl_force_active && (!s.scene.speed_limit_control_enabled || + const bool sl_inactive = !sl_force_active && (!speedLimitControlToggle || slcState == cereal::LongitudinalPlanSP::SpeedLimitControlState::INACTIVE); - const bool sl_temp_inactive = !sl_force_active && (s.scene.speed_limit_control_enabled && + const bool sl_temp_inactive = !sl_force_active && (speedLimitControlToggle && slcState == cereal::LongitudinalPlanSP::SpeedLimitControlState::TEMP_INACTIVE); - const bool sl_pre_active = !sl_force_active && (s.scene.speed_limit_control_enabled && + const bool sl_pre_active = !sl_force_active && (speedLimitControlToggle && slcState == cereal::LongitudinalPlanSP::SpeedLimitControlState::PRE_ACTIVE); const int sl_distance = int(lp_sp.getDistToSpeedLimit() * (s.scene.is_metric ? MS_TO_KPH : MS_TO_MPH) / 10.0) * 10; const QString sl_distance_str(QString::number(sl_distance) + (s.scene.is_metric ? "m" : "f")); @@ -677,6 +674,8 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { reversing = reverse_allowed; + cruiseStateEnabled = car_state.getCruiseState().getEnabled(); + int e2eLStatus = 0; static bool chime_sent = false; static int chime_count = 0; @@ -702,7 +701,7 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { } } - if ((car_state.getCruiseState().getEnabled() || car_state.getBrakeLightsDEPRECATED()) && !car_state.getGasPressed() && car_state.getStandstill()) { + if ((cruiseStateEnabled || car_state.getBrakeLightsDEPRECATED()) && !car_state.getGasPressed() && car_state.getStandstill()) { if (e2eLStatus == 2 && !radar_state.getLeadOne().getStatus()) { if (chime_sent) { chime_count = 0; @@ -733,10 +732,15 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { e2eStatus = chime_prompt; e2eState = e2eLStatus; + e2eLongAlertUi = s.scene.e2e_long_alert_ui; + dynamicExperimentalControlToggle = s.scene.dynamic_experimental_control; + speedLimitWarningFlash = s.scene.speed_limit_warning_flash; + experimentalMode = cs.getExperimentalMode(); featureStatusToggle = s.scene.feature_status_toggle; experimental_btn->setVisible(!(showDebugUI && showVTC)); + drivingModelGen = s.scene.driving_model_gen; } void AnnotatedCameraWidget::drawHud(QPainter &p) { @@ -809,7 +813,7 @@ void AnnotatedCameraWidget::drawHud(QPainter &p) { p.drawText(set_speed_rect.adjusted(0, 77, 0, 0), Qt::AlignTop | Qt::AlignHCenter, setSpeedStr); const QRect sign_rect = set_speed_rect.adjusted(sign_margin, default_size.height(), -sign_margin, -sign_margin); - uiState()->scene.sl_sign_rect = sign_rect; + sl_sign_rect = sign_rect; speedLimitWarning(p, sign_rect, sign_margin); @@ -880,7 +884,7 @@ void AnnotatedCameraWidget::drawHud(QPainter &p) { int rn_btn = 0; rn_btn = !splitPanelVisible && devUiInfo == 2 ? 35 : 0; - uiState()->scene.rn_offset = rn_btn; + rn_offset = rn_btn; // Stand Still Timer if (standStillTimer && standStill && !splitPanelVisible) { @@ -902,19 +906,19 @@ void AnnotatedCameraWidget::drawHud(QPainter &p) { // Turn Speed Sign if (showTurnSpeedLimit) { - QRect rc = uiState()->scene.sl_sign_rect; - rc.moveTop(uiState()->scene.sl_sign_rect.bottom() + UI_BORDER_SIZE); + QRect rc = sign_rect; + rc.moveTop(sign_rect.bottom() + UI_BORDER_SIZE); drawTrunSpeedSign(p, rc, turnSpeedLimit, tscSubText, curveSign, tscActive); } } // E2E Status - if (uiState()->scene.e2e_long_alert_ui && e2eState != 0) { + if (e2eLongAlertUi && e2eState != 0) { drawE2eStatus(p, UI_BORDER_SIZE * 2 + 190, 45, 150, 150, e2eState); } if (!hideBottomIcons && featureStatusToggle) { - drawFeatureStatusText(p, UI_BORDER_SIZE * 2 + 370, rect().bottom() - 160 - uiState()->scene.rn_offset); + drawFeatureStatusText(p, UI_BORDER_SIZE * 2 + 370, rect().bottom() - 160 - rn_offset); } p.restore(); @@ -1551,8 +1555,7 @@ void AnnotatedCameraWidget::drawFeatureStatusText(QPainter &p, int x, int y) { const int w = 16; const int h = 16; - const auto cp = (*uiState()->sm)["carParams"].getCarParams(); - const bool longitudinal = hasLongitudinalControl(cp); + const bool longitudinal = hasLongitudinalControl(car_params); p.setFont(InterFont(32, QFont::Bold)); @@ -1581,16 +1584,13 @@ void AnnotatedCameraWidget::drawFeatureStatusText(QPainter &p, int x, int y) { } // Dynamic Lane Profile - if (uiState()->scene.driving_model_gen == 1) { + if (drivingModelGen == 1) { drawFeatureStatusElement(dynamicLaneProfile, feature_text.dlp_list_text, feature_color.dlp_list_color, true, "OFF", "DLP"); } // TODO: Add toggle variables to cereal, and parse from cereal if (longitudinal) { - bool cruise_enabled = (*uiState()->sm)["carState"].getCarState().getCruiseState().getEnabled(); - bool dec_enabled = uiState()->scene.dynamic_experimental_control; - bool experimental_mode = (*uiState()->sm)["controlsState"].getControlsState().getExperimentalMode(); - QColor dec_color((cruise_enabled && dec_enabled) ? "#4bff66" : "#ffffff"); + QColor dec_color((cruiseStateEnabled && dynamicExperimentalControlToggle) ? "#4bff66" : "#ffffff"); QRect dec_btn(x - eclipse_x_offset, y - eclipse_y_offset, w, h); QRect dec_btn_shadow(x - eclipse_x_offset + drop_shadow_size, y - eclipse_y_offset + drop_shadow_size, w, h); p.setPen(Qt::NoPen); @@ -1599,7 +1599,7 @@ void AnnotatedCameraWidget::drawFeatureStatusText(QPainter &p, int x, int y) { p.setBrush(dec_color); p.drawEllipse(dec_btn); QString dec_status_text; - dec_status_text.sprintf("DEC: %s\n", dec_enabled ? (experimental_mode ? QString(mpcMode).toStdString().c_str() : QString("Inactive").toStdString().c_str()) : "OFF"); + dec_status_text.sprintf("DEC: %s\n", dynamicExperimentalControlToggle ? (experimentalMode ? QString(mpcMode).toStdString().c_str() : QString("Inactive").toStdString().c_str()) : "OFF"); p.setPen(QPen(shadow_color, 2)); p.drawText(x + drop_shadow_size, y + drop_shadow_size, dec_status_text); p.setPen(QPen(text_color, 2)); @@ -1609,8 +1609,8 @@ void AnnotatedCameraWidget::drawFeatureStatusText(QPainter &p, int x, int y) { // TODO: Add toggle variables to cereal, and parse from cereal // Speed Limit Control - if (longitudinal || !cp.getPcmCruiseSpeed()) { - drawFeatureStatusElement(int(slcState), feature_text.slc_list_text, feature_color.slc_list_color, uiState()->scene.speed_limit_control_enabled, "OFF", "SLC"); + if (longitudinal || !car_params.getPcmCruiseSpeed()) { + drawFeatureStatusElement(int(slcState), feature_text.slc_list_text, feature_color.slc_list_color, speedLimitControlToggle, "OFF", "SLC"); } } @@ -1637,7 +1637,7 @@ void AnnotatedCameraWidget::speedLimitWarning(QPainter &p, QRect sign_rect, cons } // current speed over speed limit - else if (overSpeedLimit && uiState()->scene.speed_limit_warning_flash) { + else if (overSpeedLimit && speedLimitWarningFlash) { speed_limit_frame++; speedLimitSignPulse(speed_limit_frame); } @@ -1791,7 +1791,7 @@ void AnnotatedCameraWidget::drawDriverState(QPainter &painter, const UIState *s) // base icon int offset = UI_BORDER_SIZE + btn_size / 2; int x = rightHandDM ? width() - offset : offset; - int y = height() - offset - scene.rn_offset; + int y = height() - offset - rn_offset; float opacity = dmActive ? 0.65 : 0.2; drawIcon(painter, QPoint(x, y), dm_img, blackColor(70), opacity); diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index 67d871af93..aaadd8df01 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -242,9 +242,17 @@ private: bool slcShowSign = true; QPixmap plus_arrow_up_img; QPixmap minus_arrow_down_img; + QRect sl_sign_rect; + int rn_offset = 0; + bool e2eLongAlertUi, dynamicExperimentalControlToggle, speedLimitControlToggle, speedLimitWarningFlash; + cereal::CarParams::Reader car_params; + bool cruiseStateEnabled; + bool experimentalMode; bool featureStatusToggle; + int drivingModelGen; + protected: void paintGL() override; void initializeGL() override; diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 0f3e434181..43f44340b7 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -219,7 +219,6 @@ typedef struct UIScene { bool map_visible; int dev_ui_info; - int rn_offset; bool live_torque_toggle; bool touch_to_wake = false; @@ -246,8 +245,6 @@ typedef struct UIScene { bool dynamic_experimental_control; - QRect sl_sign_rect; - int speed_limit_control_engage_type; bool mapbox_fullscreen; From 47e165dd1619cea5f4df8c776ea364e6bd6f1409 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 13:07:01 +0000 Subject: [PATCH 170/923] DEC: Update logic from dragonpilot-community/dragonpilot:beta3 --- CHANGELOGS.md | 2 ++ .../lib/dynamic_experimental_controller.py | 26 +++++++++++++------ .../controls/lib/longitudinal_planner.py | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 8a16d8d17e..7b2dcf21bf 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,6 +1,8 @@ sunnypilot - 0.9.6.0 (2024-xx-xx) ======================== * UPDATED: Synced with commaai's master commit c9bd4e4 (February 2, 2024) +* UPDATED: Dynamic Experimental Control (DEC) + * Synced with dragonpilot-community/dragonpilot:beta3 commit f4ee52f * NEW❗: Default Driving Model: Los Angeles v2 (January 24, 2024) * UPDATED: Driving Model Selector v3 * NEW❗: Driving Model additions diff --git a/selfdrive/controls/lib/dynamic_experimental_controller.py b/selfdrive/controls/lib/dynamic_experimental_controller.py index aa2e239b38..ef546eb71e 100644 --- a/selfdrive/controls/lib/dynamic_experimental_controller.py +++ b/selfdrive/controls/lib/dynamic_experimental_controller.py @@ -21,7 +21,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # -# Version = 2023-12-13 +# Version = 2024-1-29 from common.numpy_fast import interp from openpilot.selfdrive.controls.lib.lateral_planner import TRAJECTORY_SIZE @@ -30,8 +30,8 @@ LEAD_PROB = 0.6 SLOW_DOWN_WINDOW_SIZE = 5 SLOW_DOWN_PROB = 0.6 -SLOW_DOWN_BP = [0., 10., 20., 30., 40., 50., 55.] -SLOW_DOWN_DIST = [10, 30., 50., 70., 80., 90., 120.] +SLOW_DOWN_BP = [0., 10., 20., 30., 40., 50., 55., 60.] +SLOW_DOWN_DIST = [20, 30., 50., 70., 80., 90., 105., 120.] SLOWNESS_WINDOW_SIZE = 20 SLOWNESS_PROB = 0.6 @@ -97,7 +97,7 @@ class DynamicExperimentalController: self._slowness_gmac = GenericMovingAverageCalculator(window_size=SLOWNESS_WINDOW_SIZE) self._has_slowness = False - self._has_nav_enabled = False + self._has_nav_instruction = False self._dangerous_ttc_gmac = GenericMovingAverageCalculator(window_size=DANGEROUS_TTC_WINDOW_SIZE) self._has_dangerous_ttc = False @@ -120,7 +120,7 @@ class DynamicExperimentalController: self._set_mode_timeout = 0 pass - def _update(self, car_state, lead_one, md, controls_state): + def _update(self, car_state, lead_one, md, controls_state, maneuver_distance): self._v_ego_kph = car_state.vEgo * 3.6 self._v_cruise_kph = controls_state.vCruise self._has_lead = lead_one.status @@ -131,7 +131,7 @@ class DynamicExperimentalController: self._has_mpc_fcw = self._mpc_fcw_gmac.get_moving_average() >= MPC_FCW_PROB # nav enable detection - self._has_nav_enabled = md.navEnabled + self._has_nav_instruction = maneuver_distance / max(car_state.vEgo, 1) < 13 # lead detection self._lead_gmac.add_data(lead_one.status) @@ -185,6 +185,11 @@ class DynamicExperimentalController: self._set_mode('blended') return + # Nav enabled and distance to upcoming turning is 300 or below + if self._has_nav_instruction: + self._set_mode('blended') + return + # when blinker is on and speed is driving below highway cruise speed: blended # we dont want it to switch mode at higher speed, blended may trigger hard brake if self._has_blinkers and self._v_ego_kph < HIGHWAY_CRUISE_KPH: @@ -258,11 +263,16 @@ class DynamicExperimentalController: self._set_mode('acc') return + # Nav enabled and distance to upcoming turning is 300 or below + if self._has_nav_instruction: + self._set_mode('blended') + return + self._set_mode('acc') - def get_mpc_mode(self, radar_unavailable, car_state, lead_one, md, controls_state): + def get_mpc_mode(self, radar_unavailable, car_state, lead_one, md, controls_state, maneuver_distance): if self._is_enabled: - self._update(car_state, lead_one, md, controls_state) + self._update(car_state, lead_one, md, controls_state, maneuver_distance) if radar_unavailable: self._blended_priority_mode() else: diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 295a7341b5..8ccd2cdee1 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -115,7 +115,7 @@ class LongitudinalPlanner: self.read_param() self.param_read_counter += 1 if self.dynamic_experimental_controller.is_enabled() and sm['controlsState'].experimentalMode: - self.mpc.mode = self.dynamic_experimental_controller.get_mpc_mode(self.CP.radarUnavailable, sm['carState'], sm['radarState'].leadOne, sm['modelV2'], sm['controlsState']) + self.mpc.mode = self.dynamic_experimental_controller.get_mpc_mode(self.CP.radarUnavailable, sm['carState'], sm['radarState'].leadOne, sm['modelV2'], sm['controlsState'], sm['navInstruction'].maneuverDistance) else: self.mpc.mode = 'blended' if sm['controlsState'].experimentalMode else 'acc' From 658f0f6249c16db54d16c4b1bec68e17594f3649 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 08:40:54 -0500 Subject: [PATCH 171/923] bump submodules --- cereal | 2 +- opendbc | 2 +- panda | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index 8e00786e2a..e86a48cf41 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 8e00786e2a6065e475daaa801e56033e8753f8a9 +Subproject commit e86a48cf413c48e8d5a0d247f3b64fdcb800096f diff --git a/opendbc b/opendbc index 4d004e78dd..a49eea191e 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 4d004e78dd2847ef9f3a4798eb10b8f3448dee8b +Subproject commit a49eea191e4957fc149178c44ee418d3387194c3 diff --git a/panda b/panda index a48b419df4..30af1bcdaa 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit a48b419df47702272581856d9b2333ffa8c03be4 +Subproject commit 30af1bcdaacb0d1f5173a12585f244965351eb10 From 31f1dc1ffde4c02c7220aa167efad082a35b431f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 08:47:58 -0500 Subject: [PATCH 172/923] Update CHANGELOGS.md --- CHANGELOGS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 7b2dcf21bf..281e708cc7 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,6 +1,6 @@ sunnypilot - 0.9.6.0 (2024-xx-xx) ======================== -* UPDATED: Synced with commaai's master commit c9bd4e4 (February 2, 2024) +* UPDATED: Synced with commaai's master commit 9acc558 (February 14, 2024) * UPDATED: Dynamic Experimental Control (DEC) * Synced with dragonpilot-community/dragonpilot:beta3 commit f4ee52f * NEW❗: Default Driving Model: Los Angeles v2 (January 24, 2024) From 18551612e9f6db37670f3b368a1b37788cd851cf Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 08:50:12 -0500 Subject: [PATCH 173/923] FCR: sync with upstream supported car platforms --- selfdrive/car/sunnypilot_carname.json | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/sunnypilot_carname.json b/selfdrive/car/sunnypilot_carname.json index 79b3176d59..4499799c18 100644 --- a/selfdrive/car/sunnypilot_carname.json +++ b/selfdrive/car/sunnypilot_carname.json @@ -15,6 +15,7 @@ "Cadillac Escalade ESV 2019": "CADILLAC ESCALADE ESV 2019", "Chevrolet Bolt EUV 2022-23": "CHEVROLET BOLT EUV 2022", "Chevrolet Bolt EV 2022-23": "CHEVROLET BOLT EUV 2022", + "Chevrolet Equinox 2019-22": "CHEVROLET EQUINOX 2019", "Chevrolet Silverado 1500 2020-21": "CHEVROLET SILVERADO 1500 2020", "Chevrolet Trailblazer 2021-22": "CHEVROLET TRAILBLAZER 2021", "Chevrolet Volt 2017-18": "CHEVROLET VOLT PREMIER 2017", @@ -24,6 +25,7 @@ "Chrysler Pacifica Hybrid 2017": "CHRYSLER PACIFICA HYBRID 2017", "Chrysler Pacifica Hybrid 2018": "CHRYSLER PACIFICA HYBRID 2018", "Chrysler Pacifica Hybrid 2019-23": "CHRYSLER PACIFICA HYBRID 2019", + "Dodge Durango 2020-21": "DODGE DURANGO 2021", "Ford Bronco Sport 2021-22": "FORD BRONCO SPORT 1ST GEN", "Ford Escape 2020-22": "FORD ESCAPE 4TH GEN", "Ford Explorer 2020-23": "FORD EXPLORER 6TH GEN", @@ -66,7 +68,7 @@ "Honda Odyssey 2018-20": "HONDA ODYSSEY 2018", "Honda Passport 2019-23": "HONDA PILOT 2017", "Honda Pilot 2016-22": "HONDA PILOT 2017", - "Honda Ridgeline 2017-23": "HONDA RIDGELINE 2017", + "Honda Ridgeline 2017-24": "HONDA RIDGELINE 2017", "Hyundai Azera 2022": "HYUNDAI AZERA 6TH GEN", "Hyundai Azera Hybrid 2019": "HYUNDAI AZERA HYBRID 6TH GEN", "Hyundai Azera Hybrid 2020": "HYUNDAI AZERA HYBRID 6TH GEN", @@ -137,6 +139,7 @@ "Kia Niro Hybrid 2023": "KIA NIRO HYBRID 2ND GEN", "Kia Niro Plug-in Hybrid 2018-19": "KIA NIRO HYBRID 2019", "Kia Niro Plug-in Hybrid 2020": "KIA NIRO HYBRID 2019", + "Kia Niro Plug-in Hybrid 2021": "KIA NIRO PLUG-IN HYBRID 2022", "Kia Niro Plug-in Hybrid 2022": "KIA NIRO PLUG-IN HYBRID 2022", "Kia Optima 2017": "KIA OPTIMA 4TH GEN", "Kia Optima 2019-20": "KIA OPTIMA 4TH GEN FACELIFT", @@ -161,6 +164,7 @@ "Lexus GS F 2016": "LEXUS GS F 2016", "Lexus IS 2017-19": "LEXUS IS 2018", "Lexus IS 2022-23": "LEXUS IS 2023", + "Lexus LC 2024": "LEXUS LC 2024", "Lexus NX 2018-19": "LEXUS NX 2018", "Lexus NX 2020-21": "LEXUS NX 2020", "Lexus NX Hybrid 2018-19": "LEXUS NX 2018", @@ -274,8 +278,8 @@ "Volkswagen Golf R 2015-19": "VOLKSWAGEN GOLF 7TH GEN", "Volkswagen Golf SportsVan 2015-20": "VOLKSWAGEN GOLF 7TH GEN", "Volkswagen Grand California 2019-23": "VOLKSWAGEN CRAFTER 2ND GEN", - "Volkswagen Jetta 2018-22": "VOLKSWAGEN JETTA 7TH GEN", - "Volkswagen Jetta GLI 2021-22": "VOLKSWAGEN JETTA 7TH GEN", + "Volkswagen Jetta 2018-24": "VOLKSWAGEN JETTA 7TH GEN", + "Volkswagen Jetta GLI 2021-24": "VOLKSWAGEN JETTA 7TH GEN", "Volkswagen Passat 2015-22": "VOLKSWAGEN PASSAT 8TH GEN", "Volkswagen Passat Alltrack 2015-22": "VOLKSWAGEN PASSAT 8TH GEN", "Volkswagen Passat GTE 2015-22": "VOLKSWAGEN PASSAT 8TH GEN", From 45f21a844a2cebaa954e17fb61c13b6489489c2a Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 16 Feb 2024 15:06:27 -0500 Subject: [PATCH 174/923] Fix upstream merge conflicts --- selfdrive/car/interfaces.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 5ee5752483..4c006c798c 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -2,6 +2,7 @@ import json import operator import os import numpy as np +import time import tomllib from abc import abstractmethod, ABC from difflib import SequenceMatcher From 0723c2bc5f22a079685c1643fa2d72f70eeff087 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 16 Feb 2024 13:19:10 -0800 Subject: [PATCH 175/923] log git commit date (#31490) * log git commit date * unix ts * fix * bump cereal * cleanup --- cereal | 2 +- common/params.cc | 1 + selfdrive/manager/manager.py | 3 ++- system/loggerd/logger.cc | 1 + system/loggerd/tests/test_loggerd.py | 1 + system/version.py | 18 ++++++++++++------ 6 files changed, 18 insertions(+), 8 deletions(-) diff --git a/cereal b/cereal index bd31b25aac..7de3c7111e 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit bd31b25aacc5b39f36cedcb0dabd05db471da59f +Subproject commit 7de3c7111e78d87f9c43e2861a3e18aa59fde956 diff --git a/common/params.cc b/common/params.cc index 3ce2505243..eb75705ca3 100644 --- a/common/params.cc +++ b/common/params.cc @@ -125,6 +125,7 @@ std::unordered_map keys = { {"ForcePowerDown", PERSISTENT}, {"GitBranch", PERSISTENT}, {"GitCommit", PERSISTENT}, + {"GitCommitDate", PERSISTENT}, {"GitDiff", PERSISTENT}, {"GithubSshKeys", PERSISTENT}, {"GithubUsername", PERSISTENT}, diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index 50ba73f18c..bf1eeb8fd0 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -19,7 +19,7 @@ from openpilot.selfdrive.athena.registration import register, UNREGISTERED_DONGL 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, \ get_normalized_origin, terms_version, training_version, \ - is_tested_branch, is_release_branch + is_tested_branch, is_release_branch, get_commit_date @@ -66,6 +66,7 @@ def manager_init() -> None: 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()) diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index 2fc6492ad4..7a829a2f1f 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -44,6 +44,7 @@ kj::Array logger_build_init_data() { std::map params_map = params.readAll(); init.setGitCommit(params_map["GitCommit"]); + init.setGitCommitDate(params_map["GitCommitDate"]); init.setGitBranch(params_map["GitBranch"]); init.setGitRemote(params_map["GitRemote"]); init.setPassive(false); diff --git a/system/loggerd/tests/test_loggerd.py b/system/loggerd/tests/test_loggerd.py index 0cd8548809..963978926d 100755 --- a/system/loggerd/tests/test_loggerd.py +++ b/system/loggerd/tests/test_loggerd.py @@ -107,6 +107,7 @@ class TestLoggerd: # param, initData field, value ("DongleId", "dongleId", dongle), ("GitCommit", "gitCommit", "commit"), + ("GitCommitDate", "gitCommitDate", "date"), ("GitBranch", "gitBranch", "branch"), ("GitRemote", "gitRemote", "remote"), ] diff --git a/system/version.py b/system/version.py index 980a4fcc7c..e34458f16f 100755 --- a/system/version.py +++ b/system/version.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import os import subprocess -from typing import List, Optional, Callable, TypeVar +from typing import List, Callable, TypeVar from functools import lru_cache from openpilot.common.basedir import BASEDIR @@ -22,7 +22,7 @@ def run_cmd(cmd: List[str]) -> str: return subprocess.check_output(cmd, encoding='utf8').strip() -def run_cmd_default(cmd: List[str], default: Optional[str] = None) -> Optional[str]: +def run_cmd_default(cmd: List[str], default: str = "") -> str: try: return run_cmd(cmd) except subprocess.CalledProcessError: @@ -31,17 +31,22 @@ def run_cmd_default(cmd: List[str], default: Optional[str] = None) -> Optional[s @cache def get_commit(branch: str = "HEAD") -> str: - return run_cmd_default(["git", "rev-parse", branch]) or "" + 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"]) or "" + 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}"]) or "" + return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"]) @cache @@ -51,7 +56,7 @@ def get_origin() -> str: 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"]) or "" + return run_cmd_default(["git", "config", "--get", "remote.origin.url"]) @cache @@ -132,3 +137,4 @@ if __name__ == "__main__": print(f"Branch: {get_branch()}") print(f"Short branch: {get_short_branch()}") print(f"Prebuilt: {is_prebuilt()}") + print(f"Commit date: {get_commit_date()}") From b218abcaa3015e6c9202550eddbbc0eff7482729 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 16 Feb 2024 13:35:45 -0800 Subject: [PATCH 176/923] controlsd: increase initializing timeout --- 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 adc680ed2a..cf978ada32 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -434,7 +434,7 @@ class Controls: if not self.initialized: all_valid = CS.canValid and self.sm.all_checks() - timed_out = self.sm.frame * DT_CTRL > (6. if REPLAY else 3.5) + timed_out = self.sm.frame * DT_CTRL > (6. if REPLAY else 4.0) if all_valid or timed_out or (SIMULATION and not REPLAY): available_streams = VisionIpcClient.available_streams("camerad", block=False) if VisionStreamType.VISION_STREAM_ROAD not in available_streams: From 86410a0ef0607ff78ba21ab2f4dc6b5135496e06 Mon Sep 17 00:00:00 2001 From: Mitchell Goff Date: Fri, 16 Feb 2024 22:32:43 +0000 Subject: [PATCH 177/923] Bumped model replay ref for new map tiles (#31493) --- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index a2f6896307..984690e291 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -fee90bcee1e545c7ec9a39d3c7d4e42cfefb9955 +73fe68ba29ad4bbfc9627622f29ac41ead75bc53 From 900300a928bf2029c74a2949e0778c037b355ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Fri, 16 Feb 2024 15:18:26 -0800 Subject: [PATCH 178/923] Calibration Transform: border pad (#31495) --- selfdrive/modeld/transforms/transform.cl | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/selfdrive/modeld/transforms/transform.cl b/selfdrive/modeld/transforms/transform.cl index 357ef87321..2ca25920cd 100644 --- a/selfdrive/modeld/transforms/transform.cl +++ b/selfdrive/modeld/transforms/transform.cl @@ -22,20 +22,20 @@ __kernel void warpPerspective(__global const uchar * src, W = W != 0.0f ? INTER_TAB_SIZE / W : 0.0f; int X = rint(X0 * W), Y = rint(Y0 * W); - short sx = convert_short_sat(X >> INTER_BITS); - short sy = convert_short_sat(Y >> INTER_BITS); + int sx = convert_short_sat(X >> INTER_BITS); + int sy = convert_short_sat(Y >> INTER_BITS); + + short sx_clamp = clamp(sx, 0, src_cols - 1); + short sx_p1_clamp = clamp(sx + 1, 0, src_cols - 1); + short sy_clamp = clamp(sy, 0, src_rows - 1); + short sy_p1_clamp = clamp(sy + 1, 0, src_rows - 1); + int v0 = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_clamp*src_px_stride)]); + int v1 = convert_int(src[mad24(sy_clamp, src_row_stride, src_offset + sx_p1_clamp*src_px_stride)]); + int v2 = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_clamp*src_px_stride)]); + int v3 = convert_int(src[mad24(sy_p1_clamp, src_row_stride, src_offset + sx_p1_clamp*src_px_stride)]); + short ay = (short)(Y & (INTER_TAB_SIZE - 1)); short ax = (short)(X & (INTER_TAB_SIZE - 1)); - - int v0 = (sx >= 0 && sx < src_cols && sy >= 0 && sy < src_rows) ? - convert_int(src[mad24(sy, src_row_stride, src_offset + sx*src_px_stride)]) : 0; - int v1 = (sx+1 >= 0 && sx+1 < src_cols && sy >= 0 && sy < src_rows) ? - convert_int(src[mad24(sy, src_row_stride, src_offset + (sx+1)*src_px_stride)]) : 0; - int v2 = (sx >= 0 && sx < src_cols && sy+1 >= 0 && sy+1 < src_rows) ? - convert_int(src[mad24(sy+1, src_row_stride, src_offset + sx*src_px_stride)]) : 0; - int v3 = (sx+1 >= 0 && sx+1 < src_cols && sy+1 >= 0 && sy+1 < src_rows) ? - convert_int(src[mad24(sy+1, src_row_stride, src_offset + (sx+1)*src_px_stride)]) : 0; - float taby = 1.f/INTER_TAB_SIZE*ay; float tabx = 1.f/INTER_TAB_SIZE*ax; From c5f1f4c67663161d335048238e6dd5506bde3555 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 16 Feb 2024 19:55:15 -0600 Subject: [PATCH 179/923] test_fw_query_on_routes: get first qlog (#31496) * fast * this isn't internal * see --- selfdrive/debug/test_fw_query_on_routes.py | 6 +++++- tools/lib/route.py | 10 +++++----- tools/lib/tests/test_comma_car_segments.py | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/selfdrive/debug/test_fw_query_on_routes.py b/selfdrive/debug/test_fw_query_on_routes.py index dd6243a44c..cc6fc2ae17 100755 --- a/selfdrive/debug/test_fw_query_on_routes.py +++ b/selfdrive/debug/test_fw_query_on_routes.py @@ -44,11 +44,15 @@ if __name__ == "__main__": dongles = [] for route in tqdm(routes): - dongle_id = SegmentRange(route).dongle_id + sr = SegmentRange(route) + dongle_id = sr.dongle_id if dongle_id in dongles: continue + if sr.slice == '' and sr.selector is None: + route += '/0' + lr = LogReader(route, default_mode=ReadMode.QLOG) try: diff --git a/tools/lib/route.py b/tools/lib/route.py index aba95718d5..47ebdc7a51 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -264,7 +264,7 @@ class SegmentRange: return self.m.group("timestamp") @property - def _slice(self) -> str: + def slice(self) -> str: return self.m.group("slice") or "" @property @@ -273,12 +273,12 @@ class SegmentRange: @property def seg_idxs(self) -> list[int]: - m = re.fullmatch(RE.SLICE, self._slice) - assert m is not None, f"Invalid slice: {self._slice}" + m = re.fullmatch(RE.SLICE, self.slice) + assert m is not None, f"Invalid slice: {self.slice}" start, end, step = (None if s is None else int(s) for s in m.groups()) # one segment specified - if start is not None and end is None and ':' not in self._slice: + if start is not None and end is None and ':' not in self.slice: if start < 0: start += get_max_seg_number_cached(self) + 1 return [start] @@ -291,7 +291,7 @@ class SegmentRange: return list(range(end + 1))[s] def __str__(self) -> str: - return f"{self.dongle_id}/{self.timestamp}" + (f"/{self._slice}" if self._slice else "") + (f"/{self.selector}" if self.selector else "") + return f"{self.dongle_id}/{self.timestamp}" + (f"/{self.slice}" if self.slice else "") + (f"/{self.selector}" if self.selector else "") def __repr__(self) -> str: return self.__str__() diff --git a/tools/lib/tests/test_comma_car_segments.py b/tools/lib/tests/test_comma_car_segments.py index 484a4aae08..b355b0fe60 100644 --- a/tools/lib/tests/test_comma_car_segments.py +++ b/tools/lib/tests/test_comma_car_segments.py @@ -25,7 +25,7 @@ class TestCommaCarSegments(unittest.TestCase): sr = SegmentRange(segment) - url = get_url(sr.route_name, sr._slice) + url = get_url(sr.route_name, sr.slice) resp = requests.get(url) self.assertEqual(resp.status_code, 200) From 62f4eecf1646fff65fd6d22f64aeb0603ead3782 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 16 Feb 2024 23:18:51 -0800 Subject: [PATCH 180/923] bump panda (#31498) --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 0a1ec8580e..7bfba5eff2 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 0a1ec8580ecbde1f73b424f63b9fb8fbe29ddf09 +Subproject commit 7bfba5eff21b41a89ef6a7396a6d5d0bc3fa338b From 2e8c62358ce8ab103d0c9ee29501f78d79d7f4cc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 17 Feb 2024 06:03:12 -0600 Subject: [PATCH 181/923] Honda Bosch: detect alternate brake signal (#31500) * Do Accord * add comment * good test * this catches the accord/accordh issue! * as expected, only if both radar&camera have in common FW does the test fail * cmt * clean up * better * Use HondaFlags * detect alt brake * for test * hypothesis isn't installed * test failure * works * Revert " works" This reverts commit bfc0d808abe548630e6507431f13b01e8a1316cb. * Revert "test failure" This reverts commit 10ab6eb63ccd411740751b742f31fd610397fe8e. * Revert "hypothesis isn't installed" This reverts commit d474cc3f0ed7e84fe8bd24f452b3315fd2b8d47c. * Revert "for test" This reverts commit 98e039f4fc0189ccb57c1dae6b344209ef15eb1c. * this is important too * clean up * more clean up * Update ref_commit --- selfdrive/car/car_helpers.py | 2 +- selfdrive/car/honda/carstate.py | 8 ++++---- selfdrive/car/honda/interface.py | 6 ++++-- selfdrive/car/honda/values.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 7654475358..95028e10c5 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -162,7 +162,7 @@ def fingerprint(logcan, sendcan, num_pandas): cloudlog.warning("VIN %s", vin) params.put("CarVin", vin) - # disable OBD multiplexing for potential ECU knockouts + # disable OBD multiplexing for CAN fingerprinting and potential ECU knockouts set_obd_multiplexing(params, False) params.put_bool("FirmwareQueryDone", True) diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 03aedb31d2..9025f72397 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -7,8 +7,8 @@ from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser from openpilot.selfdrive.car.honda.hondacan import get_cruise_speed_conversion, get_pt_bus from openpilot.selfdrive.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, \ - HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_ALT_BRAKE_SIGNAL, \ - HONDA_BOSCH_RADARLESS + HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, \ + HondaFlags from openpilot.selfdrive.car.interfaces import CarStateBase TransmissionType = car.CarParams.TransmissionType @@ -44,7 +44,7 @@ def get_can_messages(CP, gearbox_msg): else: messages.append((gearbox_msg, 100)) - if CP.carFingerprint in HONDA_BOSCH_ALT_BRAKE_SIGNAL: + 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}): @@ -217,7 +217,7 @@ class CarState(CarStateBase): else: ret.cruiseState.speed = cp.vl["CRUISE"]["CRUISE_SPEED_PCM"] * CV.KPH_TO_MS - if self.CP.carFingerprint in HONDA_BOSCH_ALT_BRAKE_SIGNAL: + if self.CP.flags & HondaFlags.BOSCH_ALT_BRAKE: ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0 else: # brake switch has shown some single time step noise, so only considered when diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 9f228cd8fb..153fa1e635 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -3,8 +3,9 @@ from cereal import car 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 get_pt_bus from openpilot.selfdrive.car.honda.values import CarControllerParams, CruiseButtons, HondaFlags, CAR, HONDA_BOSCH, HONDA_NIDEC_ALT_SCM_MESSAGES, \ - HONDA_BOSCH_ALT_BRAKE_SIGNAL, HONDA_BOSCH_RADARLESS + 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 @@ -275,7 +276,8 @@ class CarInterface(CarInterfaceBase): raise ValueError(f"unsupported car {candidate}") # These cars use alternate user brake msg (0x1BE) - if candidate in HONDA_BOSCH_ALT_BRAKE_SIGNAL: + if 0x1BE in fingerprint[get_pt_bus(candidate)] and candidate in HONDA_BOSCH: + ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_ALT_BRAKE # These cars use alternate SCM messages (SCM_FEEDBACK AND SCM_BUTTON) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 300c21d2fe..517d2550a4 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -49,6 +49,7 @@ class CarControllerParams: class HondaFlags(IntFlag): # Bosch models with alternate set of LKAS_HUD messages BOSCH_EXT_HUD = 1 + BOSCH_ALT_BRAKE = 2 # Car button codes @@ -252,5 +253,4 @@ HONDA_NIDEC_ALT_SCM_MESSAGES = {CAR.ACURA_ILX, CAR.ACURA_RDX, CAR.CRV, CAR.CRV_E CAR.PILOT, CAR.RIDGELINE} HONDA_BOSCH = {CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G} -HONDA_BOSCH_ALT_BRAKE_SIGNAL = {CAR.ACCORD, CAR.CRV_5G, CAR.ACURA_RDX_3G, CAR.HRV_3G} HONDA_BOSCH_RADARLESS = {CAR.CIVIC_2022, CAR.HRV_3G} diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 49e3461756..07ab676033 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -7d25b1f7d0bd3b506fa4e72ff893728894eb1a45 \ No newline at end of file +1b16593e2d0c9ff2dae2916293ae5fbc7d6f26df From 07adbd347ffd48927b94ca57ed3d5d22adec9b41 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 17 Feb 2024 04:40:57 -0800 Subject: [PATCH 182/923] Honda Accord: remove unknown ECU Could be the radio/heater controller --- selfdrive/car/honda/fingerprints.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index fbb1714ea1..359ae83b15 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -101,10 +101,6 @@ FW_VERSIONS = { b'39990-TVA-X040\x00\x00', b'39990-TVE-H130\x00\x00', ], - (Ecu.unknown, 0x18da3af1, None): [ - b'39390-TVA-A020\x00\x00', - b'39390-TVA-A120\x00\x00', - ], (Ecu.srs, 0x18da53f1, None): [ b'77959-TBX-H230\x00\x00', b'77959-TVA-A460\x00\x00', From 5989674a1165c07c508e80ea2a2dbdfc782f384f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 17 Feb 2024 20:55:31 +0000 Subject: [PATCH 183/923] DEC: Use modelV2.navEnabled for navigation instruction checks --- selfdrive/controls/lib/dynamic_experimental_controller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/lib/dynamic_experimental_controller.py b/selfdrive/controls/lib/dynamic_experimental_controller.py index ef546eb71e..937458924f 100644 --- a/selfdrive/controls/lib/dynamic_experimental_controller.py +++ b/selfdrive/controls/lib/dynamic_experimental_controller.py @@ -131,7 +131,7 @@ class DynamicExperimentalController: self._has_mpc_fcw = self._mpc_fcw_gmac.get_moving_average() >= MPC_FCW_PROB # nav enable detection - self._has_nav_instruction = maneuver_distance / max(car_state.vEgo, 1) < 13 + self._has_nav_instruction = md.navEnabled and maneuver_distance / max(car_state.vEgo, 1) < 13 # lead detection self._lead_gmac.add_data(lead_one.status) From 8cbfae6eff9b828d4ea0fe718c5783c53108d22b Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 17 Feb 2024 21:01:02 +0000 Subject: [PATCH 184/923] ui: Speed Limit Assist: Fix Speed Limit Warning button behavior --- .../ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc index 5116bf38c7..47a5450eda 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc @@ -71,6 +71,7 @@ void SpeedLimitWarningSettings::updateToggles() { } auto speed_limit_warning_type_param = QString::fromStdString(params.get("SpeedLimitWarningType")); + auto speed_limit_warning_offset_type_param = QString::fromStdString(params.get("SpeedLimitWarningOffsetType")); speed_limit_warning_settings->setDescription(speedLimitWarningDescriptionBuilder("SpeedLimitWarningType", speed_limit_warning_descriptions)); speed_limit_warning_flash->setEnabled(speed_limit_warning_type_param != "0"); @@ -81,7 +82,7 @@ void SpeedLimitWarningSettings::updateToggles() { slwvo->setEnabled(QString::fromStdString(params.get("SpeedLimitWarningOffsetType")) != "0"); speed_limit_warning_offset_settings->setEnabled(speed_limit_warning_type_param != "0"); - slwvo->setEnabled(speed_limit_warning_type_param != "0"); + slwvo->setEnabled(speed_limit_warning_offset_type_param != "0"); } // Speed Limit Control Custom Offset From 25246b1b715f2d5ad7496bc930fd7da045daa593 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 17 Feb 2024 16:30:53 -0500 Subject: [PATCH 185/923] Fleet Manager: Fix Screen Recorder list generation --- system/fleetmanager/fleet_manager.py | 2 +- system/fleetmanager/helpers.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/system/fleetmanager/fleet_manager.py b/system/fleetmanager/fleet_manager.py index 1b3a2355e1..af69c79bd9 100755 --- a/system/fleetmanager/fleet_manager.py +++ b/system/fleetmanager/fleet_manager.py @@ -93,7 +93,7 @@ def footage(): @app.route("/screenrecords") @fleet.login_required def screenrecords(): - rows = fleet.list_files(fleet.SCREENRECORD_PATH) + rows = fleet.list_files(fleet.SCREENRECORD_PATH, True) if not rows: return render_template("error.html", error="no screenrecords found at:

" + fleet.SCREENRECORD_PATH) return render_template("screenrecords.html", rows=rows, clip=rows[0]) diff --git a/system/fleetmanager/helpers.py b/system/fleetmanager/helpers.py index 2271fba6ed..732d203370 100644 --- a/system/fleetmanager/helpers.py +++ b/system/fleetmanager/helpers.py @@ -31,8 +31,9 @@ def login_required(f): return decorated_route -def list_files(path): - return sorted(listdir_by_creation(path), reverse=True) +def list_files(path, single=False): + files = os.listdir(path) if single else listdir_by_creation(path) + return sorted(files, reverse=True) def is_valid_segment(segment): From 79fa3954b743f992cbe7d39d5a265125dffd8d21 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 17 Feb 2024 14:29:25 -0800 Subject: [PATCH 186/923] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 7bfba5eff2..6eed036473 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 7bfba5eff21b41a89ef6a7396a6d5d0bc3fa338b +Subproject commit 6eed0364733d03851bd0df86f9be869592526d7c From d68905831b9578cce59fc78d171027a71ec3ab23 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 17 Feb 2024 23:52:08 +0000 Subject: [PATCH 187/923] FCR: Reset cached param to sync with upstream conflicts --- selfdrive/car/car_helpers.py | 15 +++++++++---- selfdrive/controls/lib/events.py | 2 +- .../qt/offroad/sunnypilot/vehicle_settings.cc | 21 +++++++++++++++---- .../qt/offroad/sunnypilot/vehicle_settings.h | 7 +++++++ 4 files changed, 36 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 76ba22b0fb..9faf03a4f4 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -1,3 +1,4 @@ +import json import os import requests import threading @@ -237,8 +238,13 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): params = Params() if params.get("CarModel") is not None: - car_model = params.get("CarModel") - candidate = car_model.decode("utf-8") + candidate = params.get("CarModel").decode("utf-8") + with open(os.path.join(BASEDIR, "selfdrive/car/sunnypilot_carname.json")) as f: + car_models = json.load(f) + if candidate not in car_models.values(): + candidate = None + params.put("CarModel", "") + params.put("CarModelText", "") if candidate is None: cloudlog.event("car doesn't match any fingerprints", fingerprints=repr(fingerprints), error=True) @@ -246,8 +252,9 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): y = threading.Thread(target=crash_log2, args=(fingerprints, car_fw,)) y.start() - x = threading.Thread(target=crash_log, args=(candidate,)) - x.start() + if candidate != "mock": + x = threading.Thread(target=crash_log, args=(candidate,)) + x.start() CarInterface, CarController, CarState = interfaces[candidate] CP = CarInterface.get_params(candidate, fingerprints, car_fw, experimental_long_allowed, docs=False) diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index 751b0d9496..e49b0067fd 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -424,7 +424,7 @@ EVENTS: Dict[int, Dict[str, Union[Alert, AlertCallbackType]]] = { # See https://github.com/commaai/openpilot/wiki/Fingerprinting for more information EventName.carUnrecognized: { ET.PERMANENT: NormalPermanentAlert("Dashcam Mode", - "Car Unrecognized", + '⚙️ -> "Vehicle" to select your car', priority=Priority.LOWEST), }, diff --git a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc index aafaae58d4..f5d94e062e 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc @@ -6,8 +6,8 @@ VehiclePanel::VehiclePanel(QWidget *parent) : QWidget(parent) { QVBoxLayout* fcr_layout = new QVBoxLayout(home); fcr_layout->setContentsMargins(0, 20, 0, 20); - QString set = QString::fromStdString(params.get("CarModelText")); - QPushButton* setCarBtn = new QPushButton(((set == "=== Not Selected ===") || (set.length() == 0)) ? "Select your car" : set); + set = QString::fromStdString(params.get("CarModelText")); + setCarBtn = new QPushButton(((set == "=== Not Selected ===") || (set.length() == 0)) ? "Select your car" : set); setCarBtn->setObjectName("setCarBtn"); setCarBtn->setStyleSheet("margin-right: 30px;"); connect(setCarBtn, &QPushButton::clicked, [=]() { @@ -17,9 +17,9 @@ VehiclePanel::VehiclePanel(QWidget *parent) : QWidget(parent) { if (!selection.isEmpty()) { params.put("CarModel", cars[selection].toStdString()); params.put("CarModelText", selection.toStdString()); - qApp->exit(18); - watchdog_kick(0); + ConfirmationDialog::alert(tr("Updating this setting takes effect when the car is powered off."), this); } + updateToggles(); }); fcr_layout->addSpacing(10); fcr_layout->addWidget(setCarBtn, 0, Qt::AlignRight); @@ -54,6 +54,19 @@ VehiclePanel::VehiclePanel(QWidget *parent) : QWidget(parent) { toggle_layout->addWidget(toggle_panel); } +void VehiclePanel::showEvent(QShowEvent *event) { + updateToggles(); +} + +void VehiclePanel::updateToggles() { + if (!isVisible()) { + return; + } + + set = QString::fromStdString(params.get("CarModelText")); + setCarBtn->setText(((set == "=== Not Selected ===") || (set.length() == 0)) ? "Select your car" : set); +} + SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidget(parent, false) { setSpacing(50); diff --git a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h index 07e2b2f3ea..06bb9f8fde 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h @@ -13,6 +13,10 @@ class VehiclePanel : public QWidget { public: explicit VehiclePanel(QWidget *parent = nullptr); + void showEvent(QShowEvent *event) override; + +public slots: + void updateToggles(); private: Params params; @@ -20,6 +24,9 @@ private: QStackedLayout* main_layout = nullptr; QWidget* home = nullptr; + QPushButton* setCarBtn; + QString set; + QWidget* home_widget; }; From 5e5b67a33ff24faadcde9f00e042027500fafedb Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 17 Feb 2024 21:18:05 -0500 Subject: [PATCH 188/923] README: New Discord URL (#286) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82a8386ded..ca6221995b 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Table of Contents --- Join the official sunnypilot Discord server to stay up to date with all the latest features and be a part of shaping the future of sunnypilot! -* https://discord.sunnypilot.com +* https://discord.gg/sunnypilot ![](https://dcbadge.vercel.app/api/server/wRW3meAgtx?style=flat) ![Discord Shield](https://discordapp.com/api/guilds/880416502577266699/widget.png?style=shield) From 761f6eb37fddff97a434eceed8a3ba353b008a0a Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sun, 18 Feb 2024 10:22:11 -0500 Subject: [PATCH 189/923] Hyundai non-SCC: Fix upstream merge conflict --- selfdrive/car/hyundai/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 1f3e8d3ae8..262c31789a 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -164,7 +164,7 @@ class CarState(CarStateBase): aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "SCC12" aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct" aeb_warning = cp_cruise.vl[aeb_src]["CF_VSM_Warn"] != 0 - scc_warning = cp_cruise.vl["SCC12"]["TakeOverReq"] == 1 # sometimes only SCC system shows an FCW + scc_warning = False if self.CP.carFingerprint in NON_SCC_CAR else cp_cruise.vl["SCC12"]["TakeOverReq"] == 1 # sometimes only SCC system shows an FCW aeb_braking = cp_cruise.vl[aeb_src]["CF_VSM_DecCmdAct"] != 0 or cp_cruise.vl[aeb_src][aeb_sig] != 0 ret.stockFcw = (aeb_warning or scc_warning) and not aeb_braking ret.stockAeb = aeb_warning and aeb_braking From 49dd8b476cb922062af6500e86c52735d597ba1e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 18 Feb 2024 13:01:01 -0600 Subject: [PATCH 190/923] [bot] Fingerprints: add missing FW versions from CAN fingerprinting cars (#31502) Export fingerprints --- selfdrive/car/nissan/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/nissan/fingerprints.py b/selfdrive/car/nissan/fingerprints.py index 6cd0df4c9b..19267ded46 100644 --- a/selfdrive/car/nissan/fingerprints.py +++ b/selfdrive/car/nissan/fingerprints.py @@ -46,6 +46,7 @@ FW_VERSIONS = { CAR.LEAF: { (Ecu.abs, 0x740, None): [ b'476605SA1C', + b'476605SA7D', b'476605SC2D', b'476606WK7B', b'476606WK9B', @@ -65,6 +66,7 @@ FW_VERSIONS = { ], (Ecu.gateway, 0x18dad0f1, None): [ b'284U25SA3C', + b'284U25SP0C', b'284U25SP1C', b'284U26WK0A', b'284U26WK0C', From b28daef34ad213670418bdbf82ae999f38ac9409 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 18 Feb 2024 14:43:42 -0800 Subject: [PATCH 191/923] controlsd: allow mismatch while boardd reads back mode (#31505) * controlsd: allow mismatch while boardd reads back mode * self --- selfdrive/controls/controlsd.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index cf978ada32..3db936e134 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -312,7 +312,8 @@ class Controls: else: safety_mismatch = pandaState.safetyModel not in IGNORED_SAFETY_MODES - if safety_mismatch or pandaState.safetyRxChecksInvalid or self.mismatch_counter >= 200: + # safety mismatch allows some time for boardd to set the safety mode and publish it back from panda + if (safety_mismatch and self.sm.frame*DT_CTRL > 10.) or pandaState.safetyRxChecksInvalid or self.mismatch_counter >= 200: self.events.add(EventName.controlsMismatch) if log.PandaState.FaultType.relayMalfunction in pandaState.faults: From c6eae405a5ce8dfbeb5a72b4b3651770e849385f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 18 Feb 2024 17:03:33 -0800 Subject: [PATCH 192/923] ensure startup is clean (#31504) * strict * cleanup --------- Co-authored-by: Comma Device --- selfdrive/test/helpers.py | 1 - selfdrive/test/test_onroad.py | 1 + selfdrive/test/test_time_to_onroad.py | 34 ++++++++++++++++----------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index a8b7ca0c4d..0e7912a989 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -11,7 +11,6 @@ from openpilot.system.version import training_version, terms_version def set_params_enabled(): - os.environ['REPLAY'] = "1" os.environ['FINGERPRINT'] = "TOYOTA COROLLA TSS2 2019" os.environ['LOGPRINT'] = "debug" diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index c9064df870..e98cf09b9a 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -114,6 +114,7 @@ class TestOnroad(unittest.TestCase): params = Params() params.remove("CurrentRoute") set_params_enabled() + os.environ['REPLAY'] = '1' os.environ['TESTING_CLOSET'] = '1' if os.path.exists(Paths.log_root()): shutil.rmtree(Paths.log_root()) diff --git a/selfdrive/test/test_time_to_onroad.py b/selfdrive/test/test_time_to_onroad.py index 9288188a77..a983bdf5fb 100755 --- a/selfdrive/test/test_time_to_onroad.py +++ b/selfdrive/test/test_time_to_onroad.py @@ -18,33 +18,39 @@ def test_time_to_onroad(): proc = subprocess.Popen(["python", manager_path]) start_time = time.monotonic() - sm = messaging.SubMaster(['controlsState', 'deviceState', 'onroadEvents']) + sm = messaging.SubMaster(['controlsState', 'deviceState', 'onroadEvents', 'sendcan']) try: - # wait for onroad - with Timeout(20, "timed out waiting to go onroad"): - while True: - sm.update(1000) - if sm['deviceState'].started: - break - time.sleep(1) + # wait for onroad. timeout assumes panda is up to date + with Timeout(10, "timed out waiting to go onroad"): + while not sm['deviceState'].started: + sm.update(100) # wait for engageability try: with Timeout(10, "timed out waiting for engageable"): + sendcan_frame = None while True: - sm.update(1000) - if sm['controlsState'].engageable: + sm.update(100) + + # sendcan is only sent once we're initialized + if sm.seen['controlsState'] and sendcan_frame is None: + sendcan_frame = sm.frame + + if sendcan_frame is not None and sm.recv_frame['sendcan'] > sendcan_frame: + sm.update(100) + assert sm['controlsState'].engageable, f"events: {sm['onroadEvents']}" break - time.sleep(1) finally: print(f"onroad events: {sm['onroadEvents']}") print(f"engageable after {time.monotonic() - start_time:.2f}s") - # once we're enageable, must be for the next few seconds - for _ in range(500): + # once we're enageable, must stay for the next few seconds + st = time.monotonic() + while (time.monotonic() - st) < 10.: sm.update(100) + assert sm.all_alive(), sm.alive assert sm['controlsState'].engageable, f"events: {sm['onroadEvents']}" finally: proc.terminate() - if proc.wait(60) is None: + if proc.wait(20) is None: proc.kill() From 4ded4c53af55eed17cd18fece71a4fcd72ec8237 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 18 Feb 2024 23:04:24 -0800 Subject: [PATCH 193/923] thneed: printf -> cloudlog (#31506) * thneed: printf -> cloudlog * LOGI * Revert "LOGI" This reverts commit e6ab7e45fb7f3678727595f67c1f6c8e2cda734b. --- selfdrive/modeld/thneed/serialize.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/selfdrive/modeld/thneed/serialize.cc b/selfdrive/modeld/thneed/serialize.cc index 6ed5c08e81..3dc2bef414 100644 --- a/selfdrive/modeld/thneed/serialize.cc +++ b/selfdrive/modeld/thneed/serialize.cc @@ -4,13 +4,14 @@ #include "third_party/json11/json11.hpp" #include "common/util.h" #include "common/clutil.h" +#include "common/swaglog.h" #include "selfdrive/modeld/thneed/thneed.h" using namespace json11; extern map g_program_source; void Thneed::load(const char *filename) { - printf("Thneed::load: loading from %s\n", filename); + LOGD("Thneed::load: loading from %s\n", filename); string buf = util::read_file(filename); int jsz = *(int *)buf.data(); @@ -74,8 +75,8 @@ void Thneed::load(const char *filename) { clbuf = clCreateImage(context, CL_MEM_READ_WRITE, &format, &desc, NULL, &errcode); #endif if (clbuf == NULL) { - printf("clError: %s create image %zux%zu rp %zu with buffer %p\n", cl_get_error_string(errcode), - desc.image_width, desc.image_height, desc.image_row_pitch, desc.buffer); + LOGE("clError: %s create image %zux%zu rp %zu with buffer %p\n", cl_get_error_string(errcode), + desc.image_width, desc.image_height, desc.image_row_pitch, desc.buffer); } assert(clbuf != NULL); } @@ -95,11 +96,11 @@ void Thneed::load(const char *filename) { cl_mem aa = real_mem[*(cl_mem*)(mobj["buffer_id"].string_value().data())]; input_clmem.push_back(aa); input_sizes.push_back(sz); - printf("Thneed::load: adding input %s with size %d\n", mobj["name"].string_value().data(), sz); + LOGD("Thneed::load: adding input %s with size %d\n", mobj["name"].string_value().data(), sz); cl_int cl_err; void *ret = clEnqueueMapBuffer(command_queue, aa, CL_TRUE, CL_MAP_WRITE, 0, sz, 0, NULL, NULL, &cl_err); - if (cl_err != CL_SUCCESS) printf("clError: %s map %p %d\n", cl_get_error_string(cl_err), aa, sz); + if (cl_err != CL_SUCCESS) LOGE("clError: %s map %p %d\n", cl_get_error_string(cl_err), aa, sz); assert(cl_err == CL_SUCCESS); inputs.push_back(ret); } @@ -107,7 +108,7 @@ void Thneed::load(const char *filename) { for (auto &obj : jdat["outputs"].array_items()) { auto mobj = obj.object_items(); int sz = mobj["size"].int_value(); - printf("Thneed::save: adding output with size %d\n", sz); + LOGD("Thneed::save: adding output with size %d\n", sz); // TODO: support multiple outputs output = real_mem[*(cl_mem*)(mobj["buffer_id"].string_value().data())]; assert(output != NULL); From 6336a51cb55e34264b44594694e6e0be1d2eefe9 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 19 Feb 2024 17:17:39 +0000 Subject: [PATCH 194/923] Screen Recorder: Fix blank video files --- selfdrive/ui/qt/screenrecorder/screenrecorder.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/selfdrive/ui/qt/screenrecorder/screenrecorder.cc b/selfdrive/ui/qt/screenrecorder/screenrecorder.cc index fa6ac96e20..8f686977fe 100644 --- a/selfdrive/ui/qt/screenrecorder/screenrecorder.cc +++ b/selfdrive/ui/qt/screenrecorder/screenrecorder.cc @@ -131,7 +131,7 @@ void ScreenRecoder::start() { } void ScreenRecoder::encoding_thread_func() { - uint64_t start_time = nanos_since_boot() -1; + uint64_t start_time = nanos_since_boot(); while (recording && encoder) { QImage popImage; @@ -155,10 +155,11 @@ void ScreenRecoder::stop() { recording = false; update(); + if (encoding_thread.joinable()) { + encoding_thread.join(); + } closeEncoder(); image_queue.clear(); - if (encoding_thread.joinable()) - encoding_thread.join(); } } From df87f451903b609aa577377af1bd5de12f34a754 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 19 Feb 2024 17:36:55 +0000 Subject: [PATCH 195/923] ESCC: Forward FCA11 and FCA12 for all stock FCW/AEB commands --- CHANGELOGS.md | 2 ++ selfdrive/car/hyundai/carstate.py | 18 ++++++----- selfdrive/car/hyundai/hyundaican.py | 48 +++++++++++++---------------- 3 files changed, 35 insertions(+), 33 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 281e708cc7..ddae7b8066 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -28,6 +28,8 @@ sunnypilot - 0.9.6.0 (2024-xx-xx) * UPDATED: Custom Offsets * Continued support for Legacy Driving Models (e.g., ND, BDv2, BDv1, FV, NS) * Deprecate support for newer Driving Models (e.g., CHv2, CH, LAv2, LAv1) +* UPDATED: Hyundai/Kia/Genesis - ESCC Radar Interceptor + * Message parsing improvements with the latest firmware update: https://github.com/sunnypilot/panda/tree/test-escc-smdps * UI Updates * NEW❗: Visuals: Display Feature Status toggle * Display the statuses of certain features on the driving screen diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 262c31789a..3782367592 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -169,19 +169,20 @@ class CarState(CarStateBase): ret.stockFcw = (aeb_warning or scc_warning) and not aeb_braking ret.stockAeb = aeb_warning and aeb_braking elif self.CP.spFlags & HyundaiFlagsSP.SP_ENHANCED_SCC: - aeb_src = "ESCC" + aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA else "ESCC" aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct" - aeb_warning_sig = "CF_VSM_Warn_FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "CF_VSM_Warn_SCC12" - aeb_braking_sig = "CF_VSM_DecCmdAct_FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "CF_VSM_DecCmdAct_SCC12" + aeb_warning_sig = "CF_VSM_Warn" if self.CP.flags & HyundaiFlags.USE_FCA.value else "CF_VSM_Warn_SCC12" + aeb_braking_sig = "CF_VSM_DecCmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "CF_VSM_DecCmdAct_SCC12" aeb_braking_cmd = "CR_VSM_DecCmd_FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "CR_VSM_DecCmd_SCC12" aeb_warning = cp.vl[aeb_src][aeb_warning_sig] != 0 aeb_braking = cp.vl[aeb_src][aeb_braking_sig] != 0 or cp.vl[aeb_src][aeb_sig] != 0 ret.stockFcw = aeb_warning and not aeb_braking ret.stockAeb = aeb_warning and aeb_braking - self.escc_aeb_warning = cp.vl[aeb_src][aeb_warning_sig] - self.escc_aeb_dec_cmd_act = cp.vl[aeb_src][aeb_braking_sig] - self.escc_cmd_act = cp.vl[aeb_src][aeb_sig] - self.escc_aeb_dec_cmd = cp.vl[aeb_src][aeb_braking_cmd] + if not self.CP.flags & HyundaiFlags.USE_FCA: + self.escc_aeb_warning = cp.vl[aeb_src][aeb_warning_sig] + self.escc_aeb_dec_cmd_act = cp.vl[aeb_src][aeb_braking_sig] + self.escc_cmd_act = cp.vl[aeb_src][aeb_sig] + self.escc_aeb_dec_cmd = cp.vl[aeb_src][aeb_braking_cmd] if self.CP.enableBsm: ret.leftBlindspot = cp.vl["LCA11"]["CF_Lca_IndLeft"] != 0 @@ -374,6 +375,9 @@ class CarState(CarStateBase): if CP.spFlags & HyundaiFlagsSP.SP_ENHANCED_SCC.value: messages.append(("ESCC", 50)) + if CP.flags & HyundaiFlags.USE_FCA.value and not any([msg[0] == "FCA11" for msg in messages]): + messages.append(("FCA11", 50)) + if CP.spFlags & HyundaiFlagsSP.SP_NAV_MSG: messages.append(("Navi_HU", 5)) diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index 91229478d5..2a624d6099 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -152,18 +152,18 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_distance, "aReqRaw": accel, "aReqValue": accel, # stock ramps up and down respecting jerk limit until it reaches aReqRaw "CR_VSM_Alive": idx % 0xF, - - "AEB_CmdAct": CS.escc_cmd_act, - "CF_VSM_Warn": CS.escc_aeb_warning, - "CF_VSM_DecCmdAct": CS.escc_aeb_dec_cmd_act, - "CR_VSM_DecCmd": CS.escc_aeb_dec_cmd, } # show AEB disabled indicator on dash with SCC12 if not sending FCA messages. # these signals also prevent a TCS fault on non-FCA cars with alpha longitudinal if not use_fca: scc12_values["CF_VSM_ConfMode"] = 1 - scc12_values["AEB_Status"] = 1 # AEB disabled + scc12_values["AEB_Status"] = 2 if escc else 1 # AEB disabled + if escc: + scc12_values["AEB_CmdAct"] = CS.escc_cmd_act + scc12_values["CF_VSM_Warn"] = CS.escc_aeb_warning + scc12_values["CF_VSM_DecCmdAct"] = CS.escc_aeb_dec_cmd_act + scc12_values["CR_VSM_DecCmd"] = CS.escc_aeb_dec_cmd scc12_dat = packer.make_can_msg("SCC12", 0, scc12_values)[2] scc12_values["CR_VSM_ChkSum"] = 0x10 - sum(sum(divmod(i, 16)) for i in scc12_dat) % 0x10 @@ -181,7 +181,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_distance, commands.append(packer.make_can_msg("SCC14", 0, scc14_values)) # Only send FCA11 on cars where it exists on the bus - if use_fca: + if use_fca and not escc: if car_fingerprint in CAMERA_SCC_CAR: fca11_values = CS.fca11 fca11_values["PAINT1_Status"] = 1 @@ -192,14 +192,9 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_distance, # https://github.com/commaai/opendbc/commit/9ddcdb22c4929baf310295e832668e6e7fcfa602 fca11_values = { "CR_FCA_Alive": idx % 0xF, - "PAINT1_Status": 0 if escc else 1, - "FCA_DrvSetStatus": 0 if escc else 1, - "FCA_Status": 0 if escc else 1, # AEB disabled - - "FCA_CmdAct": CS.escc_cmd_act, - "CF_VSM_Warn": CS.escc_aeb_warning, - "CF_VSM_DecCmdAct": CS.escc_aeb_dec_cmd_act, - "CR_VSM_DecCmd": CS.escc_aeb_dec_cmd, + "PAINT1_Status": 1, + "FCA_DrvSetStatus": 1, + "FCA_Status": 1, # AEB disabled } fca11_dat = packer.make_can_msg("FCA11", 0, fca11_values)[2] fca11_values["CR_FCA_ChkSum"] = hyundai_checksum(fca11_dat[:7]) @@ -217,17 +212,18 @@ def create_acc_opt(packer, escc, CS, car_fingerprint): } commands.append(packer.make_can_msg("SCC13", 0, scc13_values)) - # TODO: this needs to be detected and conditionally sent on unsupported long cars - if car_fingerprint in CAMERA_SCC_CAR: - fca12_values = CS.fca12 - fca12_values["FCA_DrvSetState"] = 2 - fca12_values["FCA_USM"] = 1 # AEB disabled, until a route with AEB or FCW trigger is verified - else: - fca12_values = { - "FCA_DrvSetState": 0 if escc else 2, - "FCA_USM": 0 if escc else 1, # AEB disabled - } - commands.append(packer.make_can_msg("FCA12", 0, fca12_values)) + if not escc: + # TODO: this needs to be detected and conditionally sent on unsupported long cars + if car_fingerprint in CAMERA_SCC_CAR: + fca12_values = CS.fca12 + fca12_values["FCA_DrvSetState"] = 2 + fca12_values["FCA_USM"] = 1 # AEB disabled, until a route with AEB or FCW trigger is verified + else: + fca12_values = { + "FCA_DrvSetState": 2, + "FCA_USM": 1, # AEB disabled + } + commands.append(packer.make_can_msg("FCA12", 0, fca12_values)) return commands From be4bbca9a32f3bd3f65eaf26f4f5b65d2fc14608 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 10:45:10 -0800 Subject: [PATCH 196/923] [bot] Update Python packages and pre-commit hooks (#31508) * Update Python packages and pre-commit hooks * remove that --------- Co-authored-by: jnewb1 Co-authored-by: Justin Newberry --- .pre-commit-config.yaml | 2 +- poetry.lock | 420 +++++++++++++++++----------------- system/hardware/tici/agnos.py | 2 +- 3 files changed, 212 insertions(+), 212 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 103bb38e26..30750d6ab7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: - --explicit-package-bases exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(xx/)' - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.1 + rev: v0.2.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 4333f01267..9972cd7732 100644 --- a/poetry.lock +++ b/poetry.lock @@ -825,43 +825,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.2" +version = "42.0.3" 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.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:701171f825dcab90969596ce2af253143b93b08f1a716d4b2a9d2db5084ef7be"}, - {file = "cryptography-42.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:61321672b3ac7aade25c40449ccedbc6db72c7f5f0fdf34def5e2f8b51ca530d"}, - {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea2c3ffb662fec8bbbfce5602e2c159ff097a4631d96235fcf0fb00e59e3ece4"}, - {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b15c678f27d66d247132cbf13df2f75255627bcc9b6a570f7d2fd08e8c081d2"}, - {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:8e88bb9eafbf6a4014d55fb222e7360eef53e613215085e65a13290577394529"}, - {file = "cryptography-42.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a047682d324ba56e61b7ea7c7299d51e61fd3bca7dad2ccc39b72bd0118d60a1"}, - {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:36d4b7c4be6411f58f60d9ce555a73df8406d484ba12a63549c88bd64f7967f1"}, - {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a00aee5d1b6c20620161984f8ab2ab69134466c51f58c052c11b076715e72929"}, - {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b97fe7d7991c25e6a31e5d5e795986b18fbbb3107b873d5f3ae6dc9a103278e9"}, - {file = "cryptography-42.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5fa82a26f92871eca593b53359c12ad7949772462f887c35edaf36f87953c0e2"}, - {file = "cryptography-42.0.2-cp37-abi3-win32.whl", hash = "sha256:4b063d3413f853e056161eb0c7724822a9740ad3caa24b8424d776cebf98e7ee"}, - {file = "cryptography-42.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:841ec8af7a8491ac76ec5a9522226e287187a3107e12b7d686ad354bb78facee"}, - {file = "cryptography-42.0.2-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:55d1580e2d7e17f45d19d3b12098e352f3a37fe86d380bf45846ef257054b242"}, - {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28cb2c41f131a5758d6ba6a0504150d644054fd9f3203a1e8e8d7ac3aea7f73a"}, - {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9097a208875fc7bbeb1286d0125d90bdfed961f61f214d3f5be62cd4ed8a446"}, - {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:44c95c0e96b3cb628e8452ec060413a49002a247b2b9938989e23a2c8291fc90"}, - {file = "cryptography-42.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2f9f14185962e6a04ab32d1abe34eae8a9001569ee4edb64d2304bf0d65c53f3"}, - {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:09a77e5b2e8ca732a19a90c5bca2d124621a1edb5438c5daa2d2738bfeb02589"}, - {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:ad28cff53f60d99a928dfcf1e861e0b2ceb2bc1f08a074fdd601b314e1cc9e0a"}, - {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:130c0f77022b2b9c99d8cebcdd834d81705f61c68e91ddd614ce74c657f8b3ea"}, - {file = "cryptography-42.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:fa3dec4ba8fb6e662770b74f62f1a0c7d4e37e25b58b2bf2c1be4c95372b4a33"}, - {file = "cryptography-42.0.2-cp39-abi3-win32.whl", hash = "sha256:3dbd37e14ce795b4af61b89b037d4bc157f2cb23e676fa16932185a04dfbf635"}, - {file = "cryptography-42.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:8a06641fb07d4e8f6c7dda4fc3f8871d327803ab6542e33831c7ccfdcb4d0ad6"}, - {file = "cryptography-42.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:087887e55e0b9c8724cf05361357875adb5c20dec27e5816b653492980d20380"}, - {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a7ef8dd0bf2e1d0a27042b231a3baac6883cdd5557036f5e8df7139255feaac6"}, - {file = "cryptography-42.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4383b47f45b14459cab66048d384614019965ba6c1a1a141f11b5a551cace1b2"}, - {file = "cryptography-42.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:fbeb725c9dc799a574518109336acccaf1303c30d45c075c665c0793c2f79a7f"}, - {file = "cryptography-42.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:320948ab49883557a256eab46149df79435a22d2fefd6a66fe6946f1b9d9d008"}, - {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5ef9bc3d046ce83c4bbf4c25e1e0547b9c441c01d30922d812e887dc5f125c12"}, - {file = "cryptography-42.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:52ed9ebf8ac602385126c9a2fe951db36f2cb0c2538d22971487f89d0de4065a"}, - {file = "cryptography-42.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:141e2aa5ba100d3788c0ad7919b288f89d1fe015878b9659b307c9ef867d3a65"}, - {file = "cryptography-42.0.2.tar.gz", hash = "sha256:e0ec52ba3c7f1b7d813cd52649a5b3ef1fc0d433219dc8c93827c57eab6cf888"}, + {file = "cryptography-42.0.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:de5086cd475d67113ccb6f9fae6d8fe3ac54a4f9238fd08bfdb07b03d791ff0a"}, + {file = "cryptography-42.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:935cca25d35dda9e7bd46a24831dfd255307c55a07ff38fd1a92119cffc34857"}, + {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20100c22b298c9eaebe4f0b9032ea97186ac2555f426c3e70670f2517989543b"}, + {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb6368d5327d6455f20327fb6159b97538820355ec00f8cc9464d617caecead"}, + {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39d5c93e95bcbc4c06313fc6a500cee414ee39b616b55320c1904760ad686938"}, + {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d96ea47ce6d0055d5b97e761d37b4e84195485cb5a38401be341fabf23bc32a"}, + {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d1998e545081da0ab276bcb4b33cce85f775adb86a516e8f55b3dac87f469548"}, + {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93fbee08c48e63d5d1b39ab56fd3fdd02e6c2431c3da0f4edaf54954744c718f"}, + {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90147dad8c22d64b2ff7331f8d4cddfdc3ee93e4879796f837bdbb2a0b141e0c"}, + {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4dcab7c25e48fc09a73c3e463d09ac902a932a0f8d0c568238b3696d06bf377b"}, + {file = "cryptography-42.0.3-cp37-abi3-win32.whl", hash = "sha256:1e935c2900fb53d31f491c0de04f41110351377be19d83d908c1fd502ae8daa5"}, + {file = "cryptography-42.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:762f3771ae40e111d78d77cbe9c1035e886ac04a234d3ee0856bf4ecb3749d54"}, + {file = "cryptography-42.0.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3ec384058b642f7fb7e7bff9664030011ed1af8f852540c76a1317a9dd0d20"}, + {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35772a6cffd1f59b85cb670f12faba05513446f80352fe811689b4e439b5d89e"}, + {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04859aa7f12c2b5f7e22d25198ddd537391f1695df7057c8700f71f26f47a129"}, + {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3d1f5a1d403a8e640fa0887e9f7087331abb3f33b0f2207d2cc7f213e4a864c"}, + {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df34312149b495d9d03492ce97471234fd9037aa5ba217c2a6ea890e9166f151"}, + {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:de4ae486041878dc46e571a4c70ba337ed5233a1344c14a0790c4c4be4bbb8b4"}, + {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0fab2a5c479b360e5e0ea9f654bcebb535e3aa1e493a715b13244f4e07ea8eec"}, + {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25b09b73db78facdfd7dd0fa77a3f19e94896197c86e9f6dc16bce7b37a96504"}, + {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d5cf11bc7f0b71fb71af26af396c83dfd3f6eed56d4b6ef95d57867bf1e4ba65"}, + {file = "cryptography-42.0.3-cp39-abi3-win32.whl", hash = "sha256:0fea01527d4fb22ffe38cd98951c9044400f6eff4788cf52ae116e27d30a1ba3"}, + {file = "cryptography-42.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:2619487f37da18d6826e27854a7f9d4d013c51eafb066c80d09c63cf24505306"}, + {file = "cryptography-42.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ead69ba488f806fe1b1b4050febafdbf206b81fa476126f3e16110c818bac396"}, + {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:20180da1b508f4aefc101cebc14c57043a02b355d1a652b6e8e537967f1e1b46"}, + {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fbf0f3f0fac7c089308bd771d2c6c7b7d53ae909dce1db52d8e921f6c19bb3a"}, + {file = "cryptography-42.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c23f03cfd7d9826cdcbad7850de67e18b4654179e01fe9bc623d37c2638eb4ef"}, + {file = "cryptography-42.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db0480ffbfb1193ac4e1e88239f31314fe4c6cdcf9c0b8712b55414afbf80db4"}, + {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:6c25e1e9c2ce682d01fc5e2dde6598f7313027343bd14f4049b82ad0402e52cd"}, + {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9541c69c62d7446539f2c1c06d7046aef822940d248fa4b8962ff0302862cc1f"}, + {file = "cryptography-42.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b797099d221df7cce5ff2a1d272761d1554ddf9a987d3e11f6459b38cd300fd"}, + {file = "cryptography-42.0.3.tar.gz", hash = "sha256:069d2ce9be5526a44093a0991c450fe9906cdf069e0e7cd67d9dee49a62b9ebe"}, ] [package.dependencies] @@ -989,22 +989,22 @@ files = [ [[package]] name = "dnspython" -version = "2.5.0" +version = "2.6.1" description = "DNS toolkit" optional = false python-versions = ">=3.8" files = [ - {file = "dnspython-2.5.0-py3-none-any.whl", hash = "sha256:6facdf76b73c742ccf2d07add296f178e629da60be23ce4b0a9c927b1e02c3a6"}, - {file = "dnspython-2.5.0.tar.gz", hash = "sha256:a0034815a59ba9ae888946be7ccca8f7c157b286f8455b379c692efb51022a15"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] [package.extras] -dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=5.0.3)", "mypy (>=1.0.1)", "pylint (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0.0)", "sphinx (>=7.0.0)", "twine (>=4.0.0)", "wheel (>=0.41.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] dnssec = ["cryptography (>=41)"] -doh = ["h2 (>=4.1.0)", "httpcore (>=0.17.3)", "httpx (>=0.25.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1)"] -trio = ["trio (>=0.14)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] wmi = ["wmi (>=1.5.1)"] [[package]] @@ -1131,53 +1131,53 @@ files = [ [[package]] name = "fonttools" -version = "4.48.1" +version = "4.49.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f"}, - {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e"}, - {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738"}, - {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124"}, - {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee"}, - {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2"}, - {file = "fonttools-4.48.1-cp310-cp310-win32.whl", hash = "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec"}, - {file = "fonttools-4.48.1-cp310-cp310-win_amd64.whl", hash = "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703"}, - {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61"}, - {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f"}, - {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7"}, - {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7"}, - {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01"}, - {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48"}, - {file = "fonttools-4.48.1-cp311-cp311-win32.whl", hash = "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e"}, - {file = "fonttools-4.48.1-cp311-cp311-win_amd64.whl", hash = "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a"}, - {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea"}, - {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0"}, - {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252"}, - {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81"}, - {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68"}, - {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092"}, - {file = "fonttools-4.48.1-cp312-cp312-win32.whl", hash = "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d"}, - {file = "fonttools-4.48.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5"}, - {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348"}, - {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a"}, - {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1"}, - {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31"}, - {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac"}, - {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5"}, - {file = "fonttools-4.48.1-cp38-cp38-win32.whl", hash = "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2"}, - {file = "fonttools-4.48.1-cp38-cp38-win_amd64.whl", hash = "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784"}, - {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4"}, - {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95"}, - {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d"}, - {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a"}, - {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814"}, - {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e"}, - {file = "fonttools-4.48.1-cp39-cp39-win32.whl", hash = "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199"}, - {file = "fonttools-4.48.1-cp39-cp39-win_amd64.whl", hash = "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070"}, - {file = "fonttools-4.48.1-py3-none-any.whl", hash = "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e"}, - {file = "fonttools-4.48.1.tar.gz", hash = "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a"}, + {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"}, ] [package.extras] @@ -1563,13 +1563,13 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.1)"] [[package]] name = "identify" -version = "2.5.34" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.34-py2.py3-none-any.whl", hash = "sha256:a4316013779e433d08b96e5eabb7f641e6c7942e4ab5d4c509ebd2e7a8994aed"}, - {file = "identify-2.5.34.tar.gz", hash = "sha256:ee17bc9d499899bc9eaec1ac7bf2dc9eedd480db9d88b96d123d3b64a9d34f5d"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -2116,39 +2116,39 @@ files = [ [[package]] name = "matplotlib" -version = "3.8.2" +version = "3.8.3" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.8.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:09796f89fb71a0c0e1e2f4bdaf63fb2cefc84446bb963ecdeb40dfee7dfa98c7"}, - {file = "matplotlib-3.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6f9c6976748a25e8b9be51ea028df49b8e561eed7809146da7a47dbecebab367"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b78e4f2cedf303869b782071b55fdde5987fda3038e9d09e58c91cc261b5ad18"}, - {file = "matplotlib-3.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e208f46cf6576a7624195aa047cb344a7f802e113bb1a06cfd4bee431de5e31"}, - {file = "matplotlib-3.8.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:46a569130ff53798ea5f50afce7406e91fdc471ca1e0e26ba976a8c734c9427a"}, - {file = "matplotlib-3.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:830f00640c965c5b7f6bc32f0d4ce0c36dfe0379f7dd65b07a00c801713ec40a"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d86593ccf546223eb75a39b44c32788e6f6440d13cfc4750c1c15d0fcb850b63"}, - {file = "matplotlib-3.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9a5430836811b7652991939012f43d2808a2db9b64ee240387e8c43e2e5578c8"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9576723858a78751d5aacd2497b8aef29ffea6d1c95981505877f7ac28215c6"}, - {file = "matplotlib-3.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba9cbd8ac6cf422f3102622b20f8552d601bf8837e49a3afed188d560152788"}, - {file = "matplotlib-3.8.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:03f9d160a29e0b65c0790bb07f4f45d6a181b1ac33eb1bb0dd225986450148f0"}, - {file = "matplotlib-3.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:3773002da767f0a9323ba1a9b9b5d00d6257dbd2a93107233167cfb581f64717"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4c318c1e95e2f5926fba326f68177dee364aa791d6df022ceb91b8221bd0a627"}, - {file = "matplotlib-3.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:091275d18d942cf1ee9609c830a1bc36610607d8223b1b981c37d5c9fc3e46a4"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b0f3b8ea0e99e233a4bcc44590f01604840d833c280ebb8fe5554fd3e6cfe8d"}, - {file = "matplotlib-3.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7b1704a530395aaf73912be741c04d181f82ca78084fbd80bc737be04848331"}, - {file = "matplotlib-3.8.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:533b0e3b0c6768eef8cbe4b583731ce25a91ab54a22f830db2b031e83cca9213"}, - {file = "matplotlib-3.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:0f4fc5d72b75e2c18e55eb32292659cf731d9d5b312a6eb036506304f4675630"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:deaed9ad4da0b1aea77fe0aa0cebb9ef611c70b3177be936a95e5d01fa05094f"}, - {file = "matplotlib-3.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:172f4d0fbac3383d39164c6caafd3255ce6fa58f08fc392513a0b1d3b89c4f89"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d36c2209d9136cd8e02fab1c0ddc185ce79bc914c45054a9f514e44c787917"}, - {file = "matplotlib-3.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5864bdd7da445e4e5e011b199bb67168cdad10b501750367c496420f2ad00843"}, - {file = "matplotlib-3.8.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ef8345b48e95cee45ff25192ed1f4857273117917a4dcd48e3905619bcd9c9b8"}, - {file = "matplotlib-3.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:7c48d9e221b637c017232e3760ed30b4e8d5dfd081daf327e829bf2a72c731b4"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:aa11b3c6928a1e496c1a79917d51d4cd5d04f8a2e75f21df4949eeefdf697f4b"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1095fecf99eeb7384dabad4bf44b965f929a5f6079654b681193edf7169ec20"}, - {file = "matplotlib-3.8.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:bddfb1db89bfaa855912261c805bd0e10218923cc262b9159a49c29a7a1c1afa"}, - {file = "matplotlib-3.8.2.tar.gz", hash = "sha256:01a978b871b881ee76017152f1f1a0cbf6bd5f7b8ff8c96df0df1bd57d8755a1"}, + {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"}, ] [package.dependencies] @@ -3041,17 +3041,17 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "polyline" -version = "2.0.1" +version = "2.0.2" description = "A Python implementation of Google's Encoded Polyline Algorithm Format." optional = false python-versions = ">=3.7" files = [ - {file = "polyline-2.0.1-py3-none-any.whl", hash = "sha256:7b1ff647be393143c1b9268738d9efb98a327dd0b29f9c3b84552dff0e34ea3c"}, - {file = "polyline-2.0.1.tar.gz", hash = "sha256:74cb5cea098dddf09d1a5a1f17af9184d371cbf3e9723de0194e530ec39ca1f6"}, + {file = "polyline-2.0.2-py3-none-any.whl", hash = "sha256:389655c893bdabf2863c6aaa49490cf83dcdcec86ae715f67044ee98be57bef5"}, + {file = "polyline-2.0.2.tar.gz", hash = "sha256:10541e759c5fd51f746ee304e9af94744089a4055b6257b293b3afd1df64e369"}, ] [package.extras] -dev = ["pylint (>=2.15.10,<2.16.0)", "pytest (>=7.0,<8.0)", "pytest-cov (>=4.0,<5.0)", "sphinx (>=4.2.0,<4.3.0)", "sphinx-rtd-theme (>=1.0.0,<1.1.0)", "toml (>=0.10.2,<0.11.0)"] +dev = ["pylint (>=3.0.3,<3.1.0)", "pytest (>=7.0,<8.0)", "pytest-cov (>=4.0,<5.0)", "sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.0,<1.3.0)", "toml (>=0.10.2,<0.11.0)"] publish = ["build (>=0.8,<1.0)", "twine (>=4.0,<5.0)"] [[package]] @@ -3085,13 +3085,13 @@ files = [ [[package]] name = "pre-commit" -version = "3.6.1" +version = "3.6.2" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.6.1-py2.py3-none-any.whl", hash = "sha256:9fe989afcf095d2c4796ce7c553cf28d4d4a9b9346de3cda079bcf40748454a4"}, - {file = "pre_commit-3.6.1.tar.gz", hash = "sha256:c90961d8aa706f75d60935aba09469a6b0bcb8345f127c3fbee4bdc5f114cf4b"}, + {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"}, ] [package.dependencies] @@ -3113,22 +3113,22 @@ files = [ [[package]] name = "protobuf" -version = "4.25.2" +version = "4.25.3" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "protobuf-4.25.2-cp310-abi3-win32.whl", hash = "sha256:b50c949608682b12efb0b2717f53256f03636af5f60ac0c1d900df6213910fd6"}, - {file = "protobuf-4.25.2-cp310-abi3-win_amd64.whl", hash = "sha256:8f62574857ee1de9f770baf04dde4165e30b15ad97ba03ceac65f760ff018ac9"}, - {file = "protobuf-4.25.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2db9f8fa64fbdcdc93767d3cf81e0f2aef176284071507e3ede160811502fd3d"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:10894a2885b7175d3984f2be8d9850712c57d5e7587a2410720af8be56cdaf62"}, - {file = "protobuf-4.25.2-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:fc381d1dd0516343f1440019cedf08a7405f791cd49eef4ae1ea06520bc1c020"}, - {file = "protobuf-4.25.2-cp38-cp38-win32.whl", hash = "sha256:33a1aeef4b1927431d1be780e87b641e322b88d654203a9e9d93f218ee359e61"}, - {file = "protobuf-4.25.2-cp38-cp38-win_amd64.whl", hash = "sha256:47f3de503fe7c1245f6f03bea7e8d3ec11c6c4a2ea9ef910e3221c8a15516d62"}, - {file = "protobuf-4.25.2-cp39-cp39-win32.whl", hash = "sha256:5e5c933b4c30a988b52e0b7c02641760a5ba046edc5e43d3b94a74c9fc57c1b3"}, - {file = "protobuf-4.25.2-cp39-cp39-win_amd64.whl", hash = "sha256:d66a769b8d687df9024f2985d5137a337f957a0916cf5464d1513eee96a63ff0"}, - {file = "protobuf-4.25.2-py3-none-any.whl", hash = "sha256:a8b7a98d4ce823303145bf3c1a8bdb0f2f4642a414b196f04ad9853ed0c8f830"}, - {file = "protobuf-4.25.2.tar.gz", hash = "sha256:fe599e175cb347efc8ee524bcd4b902d11f7262c0e569ececcb89995c15f0a5e"}, + {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"}, ] [[package]] @@ -6468,13 +6468,13 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.0.0" +version = "8.0.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"}, - {file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"}, + {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, + {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, ] [package.dependencies] @@ -6639,12 +6639,12 @@ numpy = ["numpy (>=1.6.0)"] [[package]] name = "pytweening" -version = "1.0.7" +version = "1.1.0" description = "A collection of tweening / easing functions." optional = false python-versions = "*" files = [ - {file = "pytweening-1.0.7.tar.gz", hash = "sha256:767134f1bf57b76c1ce9f692dd1cfc776d9a279de6724e8d04854508fd7ededb"}, + {file = "pytweening-1.1.0.tar.gz", hash = "sha256:0d8e14af529dd816ad4aa4a86757dfb5fe2fc2897e06f5db60183706a9370828"}, ] [[package]] @@ -6924,28 +6924,28 @@ docs = ["furo (==2023.9.10)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.2.1" +version = "0.2.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:dd81b911d28925e7e8b323e8d06951554655021df8dd4ac3045d7212ac4ba080"}, - {file = "ruff-0.2.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:dc586724a95b7d980aa17f671e173df00f0a2eef23f8babbeee663229a938fec"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c92db7101ef5bfc18e96777ed7bc7c822d545fa5977e90a585accac43d22f18a"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:13471684694d41ae0f1e8e3a7497e14cd57ccb7dd72ae08d56a159d6c9c3e30e"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a11567e20ea39d1f51aebd778685582d4c56ccb082c1161ffc10f79bebe6df35"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:00a818e2db63659570403e44383ab03c529c2b9678ba4ba6c105af7854008105"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be60592f9d218b52f03384d1325efa9d3b41e4c4d55ea022cd548547cc42cd2b"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbd2288890b88e8aab4499e55148805b58ec711053588cc2f0196a44f6e3d855"}, - {file = "ruff-0.2.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ef052283da7dec1987bba8d8733051c2325654641dfe5877a4022108098683"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7022d66366d6fded4ba3889f73cd791c2d5621b2ccf34befc752cb0df70f5fad"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0a725823cb2a3f08ee743a534cb6935727d9e47409e4ad72c10a3faf042ad5ba"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0034d5b6323e6e8fe91b2a1e55b02d92d0b582d2953a2b37a67a2d7dedbb7acc"}, - {file = "ruff-0.2.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e5cb5526d69bb9143c2e4d2a115d08ffca3d8e0fddc84925a7b54931c96f5c02"}, - {file = "ruff-0.2.1-py3-none-win32.whl", hash = "sha256:6b95ac9ce49b4fb390634d46d6ece32ace3acdd52814671ccaf20b7f60adb232"}, - {file = "ruff-0.2.1-py3-none-win_amd64.whl", hash = "sha256:e3affdcbc2afb6f5bd0eb3130139ceedc5e3f28d206fe49f63073cb9e65988e0"}, - {file = "ruff-0.2.1-py3-none-win_arm64.whl", hash = "sha256:efababa8e12330aa94a53e90a81eb6e2d55f348bc2e71adbf17d9cad23c03ee6"}, - {file = "ruff-0.2.1.tar.gz", hash = "sha256:3b42b5d8677cd0c72b99fcaf068ffc62abb5a19e71b4a3b9cfa50658a0af02f1"}, + {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"}, ] [[package]] @@ -7027,13 +7027,13 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "sentry-sdk" -version = "1.40.3" +version = "1.40.5" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.40.3.tar.gz", hash = "sha256:3c2b027979bb400cd65a47970e64f8cef8acda86b288a27f42a98692505086cd"}, - {file = "sentry_sdk-1.40.3-py2.py3-none-any.whl", hash = "sha256:73383f28311ae55602bb6cc3b013830811135ba5521e41333a6e68f269413502"}, + {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"}, ] [package.dependencies] @@ -7188,56 +7188,56 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar [[package]] name = "shapely" -version = "2.0.2" +version = "2.0.3" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" files = [ - {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6ca8cffbe84ddde8f52b297b53f8e0687bd31141abb2c373fd8a9f032df415d6"}, - {file = "shapely-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:baa14fc27771e180c06b499a0a7ba697c7988c7b2b6cba9a929a19a4d2762de3"}, - {file = "shapely-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:36480e32c434d168cdf2f5e9862c84aaf4d714a43a8465ae3ce8ff327f0affb7"}, - {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef753200cbffd4f652efb2c528c5474e5a14341a473994d90ad0606522a46a2"}, - {file = "shapely-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a41ff4323fc9d6257759c26eb1cf3a61ebc7e611e024e6091f42977303fd3a"}, - {file = "shapely-2.0.2-cp310-cp310-win32.whl", hash = "sha256:72b5997272ae8c25f0fd5b3b967b3237e87fab7978b8d6cd5fa748770f0c5d68"}, - {file = "shapely-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:34eac2337cbd67650248761b140d2535855d21b969d76d76123317882d3a0c1a"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b0c052709c8a257c93b0d4943b0b7a3035f87e2d6a8ac9407b6a992d206422f"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2d217e56ae067e87b4e1731d0dc62eebe887ced729ba5c2d4590e9e3e9fdbd88"}, - {file = "shapely-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94ac128ae2ab4edd0bffcd4e566411ea7bdc738aeaf92c32a8a836abad725f9f"}, - {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3ee28f5e63a130ec5af4dc3c4cb9c21c5788bb13c15e89190d163b14f9fb89"}, - {file = "shapely-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:737dba15011e5a9b54a8302f1748b62daa207c9bc06f820cd0ad32a041f1c6f2"}, - {file = "shapely-2.0.2-cp311-cp311-win32.whl", hash = "sha256:45ac6906cff0765455a7b49c1670af6e230c419507c13e2f75db638c8fc6f3bd"}, - {file = "shapely-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:dc9342fc82e374130db86a955c3c4525bfbf315a248af8277a913f30911bed9e"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:06f193091a7c6112fc08dfd195a1e3846a64306f890b151fa8c63b3e3624202c"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eebe544df5c018134f3c23b6515877f7e4cd72851f88a8d0c18464f414d141a2"}, - {file = "shapely-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7e92e7c255f89f5cdf777690313311f422aa8ada9a3205b187113274e0135cd8"}, - {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be46d5509b9251dd9087768eaf35a71360de6afac82ce87c636990a0871aa18b"}, - {file = "shapely-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5533a925d8e211d07636ffc2fdd9a7f9f13d54686d00577eeb11d16f00be9c4"}, - {file = "shapely-2.0.2-cp312-cp312-win32.whl", hash = "sha256:084b023dae8ad3d5b98acee9d3bf098fdf688eb0bb9b1401e8b075f6a627b611"}, - {file = "shapely-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:ea84d1cdbcf31e619d672b53c4532f06253894185ee7acb8ceb78f5f33cbe033"}, - {file = "shapely-2.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ed1e99702125e7baccf401830a3b94d810d5c70b329b765fe93451fe14cf565b"}, - {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7d897e6bdc6bc64f7f65155dbbb30e49acaabbd0d9266b9b4041f87d6e52b3a"}, - {file = "shapely-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0521d76d1e8af01e712db71da9096b484f081e539d4f4a8c97342e7971d5e1b4"}, - {file = "shapely-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:5324be299d4c533ecfcfd43424dfd12f9428fd6f12cda38a4316da001d6ef0ea"}, - {file = "shapely-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:78128357a0cee573257a0c2c388d4b7bf13cb7dbe5b3fe5d26d45ebbe2a39e25"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87dc2be34ac3a3a4a319b963c507ac06682978a5e6c93d71917618b14f13066e"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42997ac806e4583dad51c80a32d38570fd9a3d4778f5e2c98f9090aa7db0fe91"}, - {file = "shapely-2.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ccfd5fa10a37e67dbafc601c1ddbcbbfef70d34c3f6b0efc866ddbdb55893a6c"}, - {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7c95d3379ae3abb74058938a9fcbc478c6b2e28d20dace38f8b5c587dde90aa"}, - {file = "shapely-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a21353d28209fb0d8cc083e08ca53c52666e0d8a1f9bbe23b6063967d89ed24"}, - {file = "shapely-2.0.2-cp38-cp38-win32.whl", hash = "sha256:03e63a99dfe6bd3beb8d5f41ec2086585bb969991d603f9aeac335ad396a06d4"}, - {file = "shapely-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:c6fd29fbd9cd76350bd5cc14c49de394a31770aed02d74203e23b928f3d2f1aa"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f217d28ecb48e593beae20a0082a95bd9898d82d14b8fcb497edf6bff9a44d7"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:394e5085b49334fd5b94fa89c086edfb39c3ecab7f669e8b2a4298b9d523b3a5"}, - {file = "shapely-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fd3ad17b64466a033848c26cb5b509625c87d07dcf39a1541461cacdb8f7e91c"}, - {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d41a116fcad58048d7143ddb01285e1a8780df6dc1f56c3b1e1b7f12ed296651"}, - {file = "shapely-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dea9a0651333cf96ef5bb2035044e3ad6a54f87d90e50fe4c2636debf1b77abc"}, - {file = "shapely-2.0.2-cp39-cp39-win32.whl", hash = "sha256:b8eb0a92f7b8c74f9d8fdd1b40d395113f59bd8132ca1348ebcc1f5aece94b96"}, - {file = "shapely-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:794affd80ca0f2c536fc948a3afa90bd8fb61ebe37fe873483ae818e7f21def4"}, - {file = "shapely-2.0.2.tar.gz", hash = "sha256:1713cc04c171baffc5b259ba8531c58acc2a301707b7f021d88a15ed090649e7"}, + {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" +numpy = ">=1.14,<2" [package.extras] docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] @@ -7594,13 +7594,13 @@ telegram = ["requests"] [[package]] name = "types-requests" -version = "2.31.0.20240125" +version = "2.31.0.20240218" description = "Typing stubs for requests" optional = false python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.20240125.tar.gz", hash = "sha256:03a28ce1d7cd54199148e043b2079cdded22d6795d19a2c2a6791a4b2b5e2eb5"}, - {file = "types_requests-2.31.0.20240125-py3-none-any.whl", hash = "sha256:9592a9a4cb92d6d75d9b491a41477272b710e021011a2a3061157e2fb1f1a5d1"}, + {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"}, ] [package.dependencies] @@ -7641,13 +7641,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] diff --git a/system/hardware/tici/agnos.py b/system/hardware/tici/agnos.py index ef7d9adb79..342281b0f8 100755 --- a/system/hardware/tici/agnos.py +++ b/system/hardware/tici/agnos.py @@ -20,7 +20,7 @@ class StreamingDecompressor: def __init__(self, url: str) -> None: self.buf = b"" - self.req = requests.get(url, stream=True, headers={'Accept-Encoding': None}, timeout=60) # type: ignore + self.req = requests.get(url, stream=True, headers={'Accept-Encoding': None}, timeout=60) self.it = self.req.iter_content(chunk_size=1024 * 1024) self.decompressor = lzma.LZMADecompressor(format=lzma.FORMAT_AUTO) self.eof = False From 86184b76d5cf557e0b76efe64913e3dea85f4f4c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 10:46:04 -0800 Subject: [PATCH 197/923] more modeld logging (#31510) --- selfdrive/modeld/modeld.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 01acca7bcb..9305c4302d 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -121,7 +121,9 @@ def main(demo=False): setproctitle(PROCESS_NAME) config_realtime_process(7, 54) + cloudlog.warning("setting up CL context") cl_context = CLContext() + cloudlog.warning("CL context ready; loading model") model = ModelState(cl_context) cloudlog.warning("models loaded, modeld starting") From 37206a83fe40a8f359b9e95d139b1e8b4442781b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 10:54:06 -0800 Subject: [PATCH 198/923] [bot] Bump submodules (#31507) bump submodules Co-authored-by: jnewb1 --- opendbc | 2 +- panda | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/opendbc b/opendbc index 3d1be8427a..951ab07fdc 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 3d1be8427a7e801e7da4e8506e5d5c2605de9176 +Subproject commit 951ab07fdcbce023a5c927f56bbf94e0f2322366 diff --git a/panda b/panda index 6eed036473..b4442a7c93 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 6eed0364733d03851bd0df86f9be869592526d7c +Subproject commit b4442a7c930aac112cdd82cddfc3dd12254a56e1 From 69fb3c2ed5b41858545461466004339325e413a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milan=20Medi=C4=87?= <45833725+belimedo@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:11:56 +0100 Subject: [PATCH 199/923] add Cython static analysis (#31491) * Adding pre-commit hook for cython static analysis * Adding changes to cython files to pass static analysis * Revert "Adding changes to cython files to pass static analysis" This reverts commit 9a0eb733199abd9eef1eac3d024ef2760348d67c. * Adding ignore rule for indentation of 4 spaces (E111) * Fixes for cython-lint static analysis * Revert "Fixes for cython-lint static analysis" This reverts commit 972741735b2bdc73460d65a4d7ea167dfc0f4644. * Adding two new rules into ignore list (2 new lines after difinition of class) * Adding fixes for cython static analysis --- .pre-commit-config.yaml | 8 ++++++++ common/params_pyx.pyx | 2 +- common/transformations/transformations.pxd | 2 +- common/transformations/transformations.pyx | 7 +++---- selfdrive/modeld/models/commonmodel_pyx.pxd | 2 +- selfdrive/modeld/runners/runmodel_pyx.pyx | 1 - 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 30750d6ab7..f98bca6060 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,6 +74,14 @@ repos: # https://google.github.io/styleguide/cppguide.html # 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 + hooks: + - id: cython-lint + exclude: '^(third_party/)|(cereal/)|(body/)|(rednose/)|(rednose_repo/)|(opendbc/)|(panda/)|(generated/)' + args: + - --max-line-length=240 + - --ignore=E111, E302, E305 - repo: local hooks: - id: test_translations diff --git a/common/params_pyx.pyx b/common/params_pyx.pyx index 47d2075df2..535514e521 100644 --- a/common/params_pyx.pyx +++ b/common/params_pyx.pyx @@ -29,7 +29,7 @@ cdef extern from "common/params.h": def ensure_bytes(v): - return v.encode() if isinstance(v, str) else v; + return v.encode() if isinstance(v, str) else v class UnknownKeyName(Exception): pass diff --git a/common/transformations/transformations.pxd b/common/transformations/transformations.pxd index 7af0098701..964adf06ec 100644 --- a/common/transformations/transformations.pxd +++ b/common/transformations/transformations.pxd @@ -1,4 +1,4 @@ -#cython: language_level=3 +# cython: language_level=3 from libcpp cimport bool cdef extern from "orientation.cc": diff --git a/common/transformations/transformations.pyx b/common/transformations/transformations.pyx index c5cb9e0056..ae045c369d 100644 --- a/common/transformations/transformations.pyx +++ b/common/transformations/transformations.pyx @@ -17,7 +17,6 @@ from openpilot.common.transformations.transformations cimport ecef2geodetic as e from openpilot.common.transformations.transformations cimport LocalCoord_c -import cython import numpy as np cimport numpy as np @@ -34,14 +33,14 @@ cdef Matrix3 numpy2matrix(np.ndarray[double, ndim=2, mode="fortran"] m): return Matrix3(m.data) cdef ECEF list2ecef(ecef): - cdef ECEF e; + cdef ECEF e e.x = ecef[0] e.y = ecef[1] e.z = ecef[2] return e cdef NED list2ned(ned): - cdef NED n; + cdef NED n n.n = ned[0] n.e = ned[1] n.d = ned[2] @@ -61,7 +60,7 @@ def euler2quat_single(euler): def quat2euler_single(quat): cdef Quaternion q = Quaternion(quat[0], quat[1], quat[2], quat[3]) - cdef Vector3 e = quat2euler_c(q); + cdef Vector3 e = quat2euler_c(q) return [e(0), e(1), e(2)] def quat2rot_single(quat): diff --git a/selfdrive/modeld/models/commonmodel_pyx.pxd b/selfdrive/modeld/models/commonmodel_pyx.pxd index 21c0716de4..97e3914588 100644 --- a/selfdrive/modeld/models/commonmodel_pyx.pxd +++ b/selfdrive/modeld/models/commonmodel_pyx.pxd @@ -7,7 +7,7 @@ cdef class CLContext(BaseCLContext): pass cdef class CLMem: - cdef cl_mem * mem; + cdef cl_mem * mem @staticmethod cdef create(void*) diff --git a/selfdrive/modeld/runners/runmodel_pyx.pyx b/selfdrive/modeld/runners/runmodel_pyx.pyx index cdc62a79be..e1b201a6a9 100644 --- a/selfdrive/modeld/runners/runmodel_pyx.pyx +++ b/selfdrive/modeld/runners/runmodel_pyx.pyx @@ -2,7 +2,6 @@ # cython: c_string_encoding=ascii from libcpp.string cimport string -from libc.string cimport memcpy from .runmodel cimport USE_CPU_RUNTIME, USE_GPU_RUNTIME, USE_DSP_RUNTIME from selfdrive.modeld.models.commonmodel_pyx cimport CLMem From 1145122b3fea1ddb8aa49a97688f6b52155bd202 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 13:58:36 -0800 Subject: [PATCH 200/923] More startup checks (#31511) * no lag! * kill first --------- Co-authored-by: Comma Device --- selfdrive/manager/process.py | 4 +++- selfdrive/test/test_time_to_onroad.py | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py index 523e1fd209..ac1b4ac68c 100644 --- a/selfdrive/manager/process.py +++ b/selfdrive/manager/process.py @@ -281,11 +281,13 @@ def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None running = [] for p in procs: if p.enabled and p.name not in not_run and p.should_run(started, params, CP): - p.start() running.append(p) else: p.stop(block=False) p.check_watchdog(started) + for p in running: + p.start() + return running diff --git a/selfdrive/test/test_time_to_onroad.py b/selfdrive/test/test_time_to_onroad.py index a983bdf5fb..a3f803e221 100755 --- a/selfdrive/test/test_time_to_onroad.py +++ b/selfdrive/test/test_time_to_onroad.py @@ -50,6 +50,7 @@ def test_time_to_onroad(): sm.update(100) assert sm.all_alive(), sm.alive assert sm['controlsState'].engageable, f"events: {sm['onroadEvents']}" + assert sm['controlsState'].cumLagMs < 10. finally: proc.terminate() if proc.wait(20) is None: From d371fb042c7a7c22f90ba99340ca1dd705f7e22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Mon, 19 Feb 2024 17:07:15 -0800 Subject: [PATCH 201/923] Modeld: cleanup unused variables (#31516) Modeld: cleanup used variables --- selfdrive/modeld/fill_model_msg.py | 2 +- selfdrive/modeld/modeld.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/selfdrive/modeld/fill_model_msg.py b/selfdrive/modeld/fill_model_msg.py index 93d1c7e77b..c76966867a 100644 --- a/selfdrive/modeld/fill_model_msg.py +++ b/selfdrive/modeld/fill_model_msg.py @@ -45,7 +45,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, v_ego: float, steer_delay: float, valid: bool) -> None: + nav_enabled: bool, valid: bool) -> None: frame_age = frame_id - vipc_frame_id if frame_id > vipc_frame_id else 0 msg.valid = valid diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 9305c4302d..09fab93a33 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -219,13 +219,10 @@ def main(demo=False): buf_extra = buf_main meta_extra = meta_main - # TODO: path planner timeout? sm.update(0) desire = DH.desire - v_ego = sm["carState"].vEgo is_rhd = sm["driverMonitoringState"].isRHD frame_id = sm["roadCameraState"].frameId - # TODO add lag lateral_control_params = np.array([sm["carState"].vEgo, steer_delay], dtype=np.float32) if sm.updated["liveCalibration"]: device_from_calib_euler = np.array(sm["liveCalibration"].rpyCalib, dtype=np.float32) @@ -293,7 +290,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, v_ego, steer_delay, live_calib_seen) + meta_main.timestamp_eof, timestamp_llk, model_execution_time, nav_enabled, live_calib_seen) desire_state = modelv2_send.modelV2.meta.desireState l_lane_change_prob = desire_state[log.Desire.laneChangeLeft] From 26481d082fb0db02697691ba6b074e794322c652 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Mon, 19 Feb 2024 17:26:10 -0800 Subject: [PATCH 202/923] Certified Herbalist Model (#31425) * ab9921cb-6e0a-4816-bec5-ebb55d37a7f1/700 * 93532291-a562-4ab8-82d2-34d6e9fdcfbb/700 * Update ref --- 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 dc93d84135..ce346a406a 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:763821410b35b06b598cacfa5bc3e312610b3f8de2729e0d5954d7571b6794be -size 48219112 +oid sha256:c11f99aab832242a604b1bb4c4cf391c9c3d5e90cbc07ab0d4c133473b56a3a4 +size 48193749 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 984690e291..3b7b04df80 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -73fe68ba29ad4bbfc9627622f29ac41ead75bc53 +fd6421f7551573c549480f9d29bb0dee4678344d From 8b5c9e84d2f5ae35925a9187abacd4543c046a8f Mon Sep 17 00:00:00 2001 From: goodchoom <85845724+goodchoom@users.noreply.github.com> Date: Mon, 19 Feb 2024 21:18:20 -0500 Subject: [PATCH 203/923] Alerts: fix inconsistent capitalization (#31514) fix capitalization --- selfdrive/controls/lib/events.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index b366728094..d68c95bcf5 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -767,12 +767,12 @@ EVENTS: Dict[int, Dict[str, Union[Alert, AlertCallbackType]]] = { # is thrown. This can mean a service crashed, did not broadcast a message for # ten times the regular interval, or the average interval is more than 10% too high. EventName.commIssue: { - ET.SOFT_DISABLE: soft_disable_alert("Communication Issue between Processes"), + ET.SOFT_DISABLE: soft_disable_alert("Communication Issue Between Processes"), ET.NO_ENTRY: comm_issue_alert, }, EventName.commIssueAvgFreq: { - ET.SOFT_DISABLE: soft_disable_alert("Low Communication Rate between Processes"), - ET.NO_ENTRY: NoEntryAlert("Low Communication Rate between Processes"), + ET.SOFT_DISABLE: soft_disable_alert("Low Communication Rate Between Processes"), + ET.NO_ENTRY: NoEntryAlert("Low Communication Rate Between Processes"), }, EventName.controlsdLagging: { From 528e5558924ab17c6ea14aed340601ae5c6167e4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 22:33:08 -0800 Subject: [PATCH 204/923] debug: print log messages in relative time --- selfdrive/debug/filter_log_message.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/selfdrive/debug/filter_log_message.py b/selfdrive/debug/filter_log_message.py index 20028f8fd2..9cbab0b41f 100755 --- a/selfdrive/debug/filter_log_message.py +++ b/selfdrive/debug/filter_log_message.py @@ -46,6 +46,7 @@ def print_androidlog(t, msg): if __name__ == "__main__": parser = argparse.ArgumentParser() + parser.add_argument('--absolute', action='store_true') parser.add_argument('--level', default='DEBUG') parser.add_argument('--addr', default='127.0.0.1') parser.add_argument("route", type=str, nargs='*', help="route name + segment number for offline usage") @@ -54,15 +55,18 @@ if __name__ == "__main__": min_level = LEVELS[args.level] if args.route: + st = None if not args.absolute else 0 for route in args.route: - lr = LogReader(route) + lr = LogReader(route, sort_by_time=True) for m in lr: + if st is None: + st = m.logMonoTime if m.which() == 'logMessage': - print_logmessage(m.logMonoTime, m.logMessage, min_level) + print_logmessage(m.logMonoTime-st, m.logMessage, min_level) elif m.which() == 'errorLogMessage': - print_logmessage(m.logMonoTime, m.errorLogMessage, min_level) + print_logmessage(m.logMonoTime-st, m.errorLogMessage, min_level) elif m.which() == 'androidLog': - print_androidlog(m.logMonoTime, m.androidLog) + print_androidlog(m.logMonoTime-st, m.androidLog) else: sm = messaging.SubMaster(['logMessage', 'androidLog'], addr=args.addr) while True: From 675eeb9d1605cb1eeca6e8752fa02b6c24512600 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 22:33:30 -0800 Subject: [PATCH 205/923] modeld: add extra log for startup time debugging --- selfdrive/modeld/modeld.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 09fab93a33..f2842d94b7 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -116,6 +116,8 @@ class ModelState: def main(demo=False): + cloudlog.warning("modeld init") + sentry.set_tag("daemon", PROCESS_NAME) cloudlog.bind(daemon=PROCESS_NAME) setproctitle(PROCESS_NAME) From 5d4dc1dc2ffa5c4066dc33b818e4a2f0497b7043 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 19 Feb 2024 22:34:24 -0800 Subject: [PATCH 206/923] Make ui independent of launch path (#31517) * Make ui independent of launch path * comment --- selfdrive/ui/qt/util.cc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index 16d31ce304..bc3c494fa7 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -5,6 +5,7 @@ #include #include +#include #include #include #include @@ -114,6 +115,11 @@ void initApp(int argc, char *argv[], bool disable_hidpi) { 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); + setQtSurfaceFormat(); } From f87e3dc4337c78b3b6afe254cc3181681a084c0a Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 20 Feb 2024 09:05:56 -0500 Subject: [PATCH 207/923] ui: Update manual brightness in every loop --- selfdrive/ui/ui.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index d0003e2c85..de12b0f05a 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -243,7 +243,6 @@ void ui_update_params(UIState *s) { s->scene.onroadScreenOff = std::atoi(params.get("OnroadScreenOff").c_str()); s->scene.onroadScreenOffBrightness = std::atoi(params.get("OnroadScreenOffBrightness").c_str()); s->scene.onroadScreenOffEvent = params.getBool("OnroadScreenOffEvent"); - s->scene.brightness = std::atoi(params.get("BrightnessControl").c_str()); s->scene.stand_still_timer = params.getBool("StandStillTimer"); s->scene.show_debug_ui = params.getBool("ShowDebugUI"); s->scene.hide_vego_ui = params.getBool("HideVEgoUi"); @@ -381,11 +380,13 @@ void UIState::updateStatus() { if (sm->frame % UI_FREQ == 0) { // Update every 1 Hz scene.sidebar_temp_options = std::atoi(params.get("SidebarTemperatureOptions").c_str()); } + + scene.brightness = std::atoi(params.get("BrightnessControl").c_str()); } UIState::UIState(QObject *parent) : QObject(parent) { sm = std::make_unique>({ - "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", + "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "pandaStates", "carParams", "driverMonitoringState", "carState", "liveLocationKalman", "driverStateV2", "wideRoadCameraState", "managerState", "navInstruction", "navRoute", "uiPlan", "longitudinalPlanSP", "liveMapDataSP", "carControl", "lateralPlanSPDEPRECATED", "gpsLocation", "gpsLocationExternal", "liveParameters", "liveTorqueParameters", "controlsStateSP" From 5e16cba5bb7023a2c4e452a11c054033ee28f959 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 20 Feb 2024 14:22:26 +0000 Subject: [PATCH 208/923] MADS: Enforce pedalPressed when MADS is disabled --- 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 228da8fd2d..1c220542ea 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -310,7 +310,7 @@ class Controls: if (CS.gasPressed and not self.CS_prev.gasPressed and self.disengage_on_accelerator) or \ (CS.brakePressed and (not self.CS_prev.brakePressed or not CS.standstill)) or \ (CS.regenBraking and (not self.CS_prev.regenBraking or not CS.standstill)): - if CS.cruiseState.enabled: + if CS.cruiseState.enabled or not self.enable_mads: self.events.add(EventName.pedalPressed) elif not self.mads_ndlob: self.events.add(EventName.silentPedalPressed) From 4ab41dd6199e6dabe9443fa0886c513f7658ec82 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 20 Feb 2024 10:59:49 -0500 Subject: [PATCH 209/923] Update CHANGELOGS.md --- CHANGELOGS.md | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 1199879492..336500c446 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,3 +1,63 @@ +sunnypilot - 0.9.6.1 (2024-02-22) +======================== +* New driving model + * Vision model trained on more data + * Improved driving performance + * Directly outputs curvature for lateral control +* New driver monitoring model + * Trained on larger dataset +* AGNOS 9 +* comma body streaming and controls over WebRTC +* Improved fuzzy fingerprinting for many makes and models +* Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire! +* Dodge Duranago 2020-21 support +* Hyundai Staria 2023 support thanks to sunnyhaibin! +* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! +* Lexus LC 2024 support thanks to nelsonjchen! +* Toyota RAV4 2023-24 support +* Toyota RAV4 Hybrid 2023-24 support +************************ +* UPDATED: Synced with commaai's openpilot + * master commit 9acc558 (February 14, 2024) + * v0.9.6 release (February 22, 2024) +* UPDATED: Dynamic Experimental Control (DEC) + * Synced with dragonpilot-community/dragonpilot:beta3 commit f4ee52f +* NEW❗: Default Driving Model: Los Angeles v2 (January 24, 2024) +* UPDATED: Driving Model Selector v3 + * NEW❗: Driving Model additions + * Certified Herbalist v2 (February 13, 2024) - CHv2 + * Certified Herbalist (February 5, 2024) - CH + * Los Angeles v2 (January 24, 2024) - LAv2 + * Los Angeles (January 22, 2024) - LAv1 + * NEW❗: Model Caching thanks to DevTekVE! + * Model caching allows the selection of previously downloaded Driving Model + * Users can now access cached versions of selected models, eliminating redundant downloads for previously fetched models + * Legacy Driving Models support + * New Delhi (December 21, 2023) - ND + * Blue Diamond v2 (December 11, 2023) - BDv2 + * Blue Diamond (November 18, 2023) - BDv1 + * Farmville (November 7, 2023) - FV + * Night Strike (October 3, 2023) - NS + * Certain features are deprecated with newer Driving Models + * Dynamic Lane Profile (DLP) + * Custom Offsets +* UPDATED: Dynamic Lane Profile (DLP) + * Continued support for Legacy Driving Models (e.g., ND, BDv2, BDv1, FV, NS) + * Deprecated support for newer Driving Models (e.g., CHv2, CH, LAv2, LAv1) +* UPDATED: Custom Offsets + * Continued support for Legacy Driving Models (e.g., ND, BDv2, BDv1, FV, NS) + * Deprecated support for newer Driving Models (e.g., CHv2, CH, LAv2, LAv1) +* UPDATED: Hyundai/Kia/Genesis - ESCC Radar Interceptor + * Message parsing improvements with the latest firmware update: https://github.com/sunnypilot/panda/tree/test-escc-smdps +* UI Updates + * NEW❗: Visuals: Display Feature Status toggle + * Display the statuses of certain features on the driving screen + * NEW❗: Visuals: Enable Onroad Settings toggle + * Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu +* FIXED: New comma 3X support +* FIXED: New comma eSIM support +* Bug fixes and performance improvements + sunnypilot - 0.9.5.3 (2023-12-24) ======================== * UPDATED: Dynamic Experimental Control (DEC) From 2184da9deb5a04b7651cf50de106bcd121729233 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 20 Feb 2024 10:07:43 -0600 Subject: [PATCH 210/923] [bot] Fingerprints: add missing FW versions from new users (#31518) 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 952a297e8f..1df514e79b 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -401,6 +401,7 @@ FW_VERSIONS = { b'68527383AD', b'68527387AE', b'68527403AC', + b'68546047AF', b'68631938AA', b'68631942AA', ], From a51ef41cf87c5a8b2eaa5301911051a9d5a8d00c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 20 Feb 2024 15:11:42 -0500 Subject: [PATCH 211/923] Simulator: simulate the obd enabled/changed dance (#31519) obd dance --- tools/sim/lib/simulated_car.py | 8 ++++++++ tools/sim/lib/simulated_sensors.py | 2 -- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index 85b4ac2387..f6319dd819 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -2,6 +2,7 @@ import cereal.messaging as messaging 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 @@ -18,6 +19,8 @@ class SimulatedCar: self.sm = messaging.SubMaster(['carControl', 'controlsState', 'carParams']) self.cp = self.get_car_can_parser() self.idx = 0 + self.params = Params() + self.obd_multiplexing = False @staticmethod def get_car_can_parser(): @@ -100,6 +103,11 @@ class SimulatedCar: def send_panda_state(self, simulator_state): self.sm.update(0) + + if self.params.get_bool("ObdMultiplexingEnabled") != self.obd_multiplexing: + self.obd_multiplexing = not self.obd_multiplexing + self.params.put_bool("ObdMultiplexingChanged", True) + dat = messaging.new_message('pandaStates', 1) dat.valid = True dat.pandaStates[0] = { diff --git a/tools/sim/lib/simulated_sensors.py b/tools/sim/lib/simulated_sensors.py index ebbcc6c9e8..df6a0aeeff 100644 --- a/tools/sim/lib/simulated_sensors.py +++ b/tools/sim/lib/simulated_sensors.py @@ -3,7 +3,6 @@ import time from cereal import log import cereal.messaging as messaging -from openpilot.common.params import Params from openpilot.common.realtime import DT_DMON from openpilot.tools.sim.lib.camerad import Camerad @@ -80,7 +79,6 @@ class SimulatedSensors: 'current': 5678, 'fanSpeedRpm': 1000 } - Params().put_bool("ObdMultiplexingEnabled", False) self.pm.send('peripheralState', dat) def send_fake_driver_monitoring(self): From 2cf831a3048c11613396a2e6ca2222cefda30935 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 20 Feb 2024 14:20:49 -0800 Subject: [PATCH 212/923] debug: improve count_events.py output --- selfdrive/debug/count_events.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/selfdrive/debug/count_events.py b/selfdrive/debug/count_events.py index 567d1a9e07..30e9bf8ec5 100755 --- a/selfdrive/debug/count_events.py +++ b/selfdrive/debug/count_events.py @@ -10,7 +10,6 @@ from cereal.services import SERVICE_LIST from openpilot.tools.lib.logreader import LogReader, ReadMode if __name__ == "__main__": - cnt_valid: Counter = Counter() cnt_events: Counter = Counter() cams = [s for s in SERVICE_LIST if s.endswith('CameraState')] @@ -48,17 +47,15 @@ if __name__ == "__main__": elif msg.which() in cams: cnt_cameras[msg.which()] += 1 - if not msg.valid: - cnt_valid[msg.which()] += 1 - duration = (end_time - start_time) / 1e9 print("Events") pprint(cnt_events) print("\n") - print("Not valid") - pprint(cnt_valid) + print("Events") + for t, evt in events: + print(f"{t:8.2f} {evt}") print("\n") print("Cameras") @@ -72,11 +69,6 @@ if __name__ == "__main__": for t, a in alerts: print(f"{t:8.2f} {a}") - print("\n") - print("Events") - for t, evt in events: - print(f"{t:8.2f} {evt}") - print("\n") if ignition_off is not None: ignition_off = round((ignition_off - start_time) / 1e9, 2) From 51e3daf244306637bfc4031ac75756eee2360ee4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 20 Feb 2024 18:02:56 -0500 Subject: [PATCH 213/923] Subaru: add 2024 forester (#31520) * also angle based * 24 forester --- selfdrive/car/subaru/fingerprints.py | 3 +++ selfdrive/car/subaru/values.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/subaru/fingerprints.py b/selfdrive/car/subaru/fingerprints.py index ad8ebe87cd..90fa6093d9 100644 --- a/selfdrive/car/subaru/fingerprints.py +++ b/selfdrive/car/subaru/fingerprints.py @@ -509,17 +509,20 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x787, None): [ b'\x04!\x01\x1eD\x07!\x00\x04,', b'\x04!\x08\x01.\x07!\x08\x022', + b'\r!\x08\x017\n!\x08\x003', ], (Ecu.engine, 0x7e0, None): [ b'\xd5"`0\x07', b'\xd5"a0\x07', b'\xf1"`q\x07', b'\xf1"aq\x07', + b'\xfa"ap\x07', ], (Ecu.transmission, 0x7e1, None): [ b'\x1d\x86B0\x00', b'\x1d\xf6B0\x00', b'\x1e\x86B0\x00', + b'\x1e\x86F0\x00', b'\x1e\xf6D0\x00', ], }, diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index d9d2f78cea..2f7350b966 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -132,7 +132,7 @@ CAR_INFO: Dict[str, Union[SubaruCarInfo, List[SubaruCarInfo]]] = { CAR.LEGACY_PREGLOBAL: SubaruCarInfo("Subaru Legacy 2015-18"), CAR.OUTBACK_PREGLOBAL: SubaruCarInfo("Subaru Outback 2015-17"), CAR.OUTBACK_PREGLOBAL_2018: SubaruCarInfo("Subaru Outback 2018-19"), - CAR.FORESTER_2022: SubaruCarInfo("Subaru Forester 2022-23", "All", car_parts=CarParts.common([CarHarness.subaru_c])), + CAR.FORESTER_2022: SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), CAR.OUTBACK_2023: SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), CAR.ASCENT_2023: SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), } From 272019f73d601fce6d3f0193662117b53de07c25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0dris=20AKBIYIK?= Date: Wed, 21 Feb 2024 00:57:40 +0100 Subject: [PATCH 214/923] Add fingerprints.py for Skoda Octavia MK3 2017 (#30846) * Update fingerprints.py for Skoda Octavia MK2 2017 -Fingerprint values added * Update fingerprints.py Passat Alltrack 4x4 * another PR * format --------- Co-authored-by: Shane Smiskol --- selfdrive/car/volkswagen/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index 8e5a0667bd..eab2bc0090 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -1043,6 +1043,7 @@ FW_VERSIONS = { ], (Ecu.srs, 0x715, None): [ b'\xf1\x873Q0959655AC\xf1\x890200\xf1\x82\r11120011100010022212110200', + b'\xf1\x873Q0959655AK\xf1\x890306\xf1\x82\r31210031210021033733310331', b'\xf1\x873Q0959655AP\xf1\x890305\xf1\x82\r11110011110011213331312131', b'\xf1\x873Q0959655AQ\xf1\x890200\xf1\x82\r11120011100010312212113100', b'\xf1\x873Q0959655AS\xf1\x890200\xf1\x82\r11120011100010022212110200', @@ -1062,6 +1063,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x875Q0907572D \xf1\x890304\xf1\x82\x0101', b'\xf1\x875Q0907572F \xf1\x890400\xf1\x82\x0101', + b'\xf1\x875Q0907572H \xf1\x890620', b'\xf1\x875Q0907572J \xf1\x890654', b'\xf1\x875Q0907572K \xf1\x890402\xf1\x82\x0101', b'\xf1\x875Q0907572P \xf1\x890682', From c645feb1aaf52a1dae58af3c24c7955e4d0600e7 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 20 Feb 2024 16:55:46 -0800 Subject: [PATCH 215/923] pj: gpu usage isn't real --- tools/plotjuggler/layouts/system_lag_debug.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/tools/plotjuggler/layouts/system_lag_debug.xml b/tools/plotjuggler/layouts/system_lag_debug.xml index b1699348cc..a90bba0e27 100644 --- a/tools/plotjuggler/layouts/system_lag_debug.xml +++ b/tools/plotjuggler/layouts/system_lag_debug.xml @@ -16,7 +16,6 @@ - From 1c794b710cdcf682205b3f3724d8858073e5370c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 20 Feb 2024 17:25:12 -0800 Subject: [PATCH 216/923] uploader: sleep more when no files in queue (#31523) * uploader: sleep more when no files in queue * fix test --- system/loggerd/uploader.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 105e830a4c..5c8f25368c 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -207,10 +207,10 @@ class Uploader: return success - def step(self, network_type: int, metered: bool) -> bool: + def step(self, network_type: int, metered: bool) -> Optional[bool]: d = self.next_file_to_upload(metered) if d is None: - return True + return None name, key, fn = d @@ -253,12 +253,15 @@ def main(exit_event: Optional[threading.Event] = None) -> None: continue success = uploader.step(sm['deviceState'].networkType.raw, sm['deviceState'].networkMetered) - if success: + if success is None: + backoff = 60 if offroad else 5 + elif success: backoff = 0.1 - elif allow_sleep: + else: cloudlog.info("upload backoff %r", backoff) backoff = min(backoff*2, 120) - time.sleep(backoff + random.uniform(0, backoff)) + if allow_sleep: + time.sleep(backoff + random.uniform(0, backoff)) if __name__ == "__main__": From 27c56722ccf6fefc3d90d09f30b15bdf053f2bea Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 20 Feb 2024 18:01:28 -0800 Subject: [PATCH 217/923] fix spinner asset paths (#31524) --- selfdrive/ui/.gitignore | 5 +++-- selfdrive/ui/SConscript | 4 ++-- selfdrive/ui/spinner | 6 +++--- selfdrive/ui/text | 6 +++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/selfdrive/ui/.gitignore b/selfdrive/ui/.gitignore index 104357f396..f9724816da 100644 --- a/selfdrive/ui/.gitignore +++ b/selfdrive/ui/.gitignore @@ -3,12 +3,13 @@ moc_* translations/main_test_en.* +_text +_spinner + ui mui watch3 installer/installers/* -qt/text -qt/spinner qt/setup/setup qt/setup/reset qt/setup/wifi diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index 92b43a82b0..ea5734fe6e 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -72,8 +72,8 @@ asset_obj = qt_env.Object("assets", assets) qt_env.SharedLibrary("qt/python_helpers", ["qt/qt_window.cc"], LIBS=qt_libs) # spinner and text window -qt_env.Program("qt/text", ["qt/text.cc"], LIBS=qt_libs) -qt_env.Program("qt/spinner", ["qt/spinner.cc"], LIBS=qt_libs) +qt_env.Program("_text", ["qt/text.cc"], LIBS=qt_libs) +qt_env.Program("_spinner", ["qt/spinner.cc"], LIBS=qt_libs) # build main UI qt_env.Program("ui", qt_src + [asset_obj], LIBS=qt_libs) diff --git a/selfdrive/ui/spinner b/selfdrive/ui/spinner index 35feab3f7e..965c8f581a 100755 --- a/selfdrive/ui/spinner +++ b/selfdrive/ui/spinner @@ -1,7 +1,7 @@ #!/bin/sh -if [ -f /TICI ] && [ ! -f qt/spinner ]; then - cp qt/spinner_larch64 qt/spinner +if [ -f /TICI ] && [ ! -f _spinner ]; then + cp qt/spinner_larch64 _spinner fi -exec ./qt/spinner "$1" +exec ./_spinner "$1" diff --git a/selfdrive/ui/text b/selfdrive/ui/text index b44bec42bd..b12235f4e6 100755 --- a/selfdrive/ui/text +++ b/selfdrive/ui/text @@ -1,7 +1,7 @@ #!/bin/sh -if [ -f /TICI ] && [ ! -f qt/text ]; then - cp qt/text_larch64 qt/text +if [ -f /TICI ] && [ ! -f _text ]; then + cp qt/text_larch64 _text fi -exec ./qt/text "$1" +exec ./_text "$1" From 3e6ac26569cef2dcf78115333cc0f804aa4e9b02 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 20 Feb 2024 20:15:46 -0800 Subject: [PATCH 218/923] thermald: make CPU usage list a constant size (#31526) --- selfdrive/thermald/thermald.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index bfca2ccabb..4c2764a882 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -245,8 +245,10 @@ def thermald_thread(end_event, hw_queue) -> None: msg.deviceState.freeSpacePercent = get_available_percent(default=100.0) msg.deviceState.memoryUsagePercent = int(round(psutil.virtual_memory().percent)) - msg.deviceState.cpuUsagePercent = [int(round(n)) for n in psutil.cpu_percent(percpu=True)] msg.deviceState.gpuUsagePercent = int(round(HARDWARE.get_gpu_usage_percent())) + online_cpu_usage = [int(round(n)) for n in psutil.cpu_percent(percpu=True)] + offline_cpu_usage = [0., ] * (len(msg.deviceState.cpuTempC) - len(online_cpu_usage)) + msg.deviceState.cpuUsagePercent = online_cpu_usage + offline_cpu_usage msg.deviceState.networkType = last_hw_state.network_type msg.deviceState.networkMetered = last_hw_state.network_metered From 4abda1b6bc70ff021bddec87f697cce37e186707 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 20 Feb 2024 23:02:38 -0600 Subject: [PATCH 219/923] thermald: remove instant low voltage check (#31522) remove instant lv check for old bug --- selfdrive/thermald/power_monitoring.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/selfdrive/thermald/power_monitoring.py b/selfdrive/thermald/power_monitoring.py index 8802a82af4..f74118b568 100644 --- a/selfdrive/thermald/power_monitoring.py +++ b/selfdrive/thermald/power_monitoring.py @@ -14,7 +14,6 @@ CAR_BATTERY_CAPACITY_uWh = 30e6 CAR_CHARGING_RATE_W = 45 VBATT_PAUSE_CHARGING = 11.8 # Lower limit on the LPF car battery voltage -VBATT_INSTANT_PAUSE_CHARGING = 7.0 # Lower limit on the instant car battery voltage measurements to avoid triggering on instant power loss MAX_TIME_OFFROAD_S = 30*3600 MIN_ON_TIME_S = 3600 DELAY_SHUTDOWN_TIME_S = 300 # Wait at least DELAY_SHUTDOWN_TIME_S seconds after offroad_time to shutdown. @@ -117,7 +116,6 @@ class PowerMonitoring: should_shutdown = False offroad_time = (now - offroad_timestamp) low_voltage_shutdown = (self.car_voltage_mV < (VBATT_PAUSE_CHARGING * 1e3) and - self.car_voltage_instant_mV > (VBATT_INSTANT_PAUSE_CHARGING * 1e3) and offroad_time > VOLTAGE_SHUTDOWN_MIN_OFFROAD_TIME_S) should_shutdown |= offroad_time > MAX_TIME_OFFROAD_S should_shutdown |= low_voltage_shutdown From c3e3103830ba62d70f45555bdd6fda554594f7a8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 21 Feb 2024 00:30:51 -0600 Subject: [PATCH 220/923] torqued: log raw params if calculable (#31521) * log params when calculable * better * Update ref_commit * this is redundant * this is only used in one place, confusing which to use so remove * better --- selfdrive/locationd/helpers.py | 8 ++++---- selfdrive/locationd/torqued.py | 24 ++++++++++++------------ selfdrive/test/process_replay/ref_commit | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/selfdrive/locationd/helpers.py b/selfdrive/locationd/helpers.py index 93e2929139..c292e9886c 100644 --- a/selfdrive/locationd/helpers.py +++ b/selfdrive/locationd/helpers.py @@ -27,17 +27,17 @@ class PointBuckets: self.buckets_min_points = dict(zip(x_bounds, min_points, strict=True)) self.min_points_total = min_points_total - def bucket_lengths(self) -> List[int]: - return [len(v) for v in self.buckets.values()] - def __len__(self) -> int: - return sum(self.bucket_lengths()) + return sum([len(v) for v in self.buckets.values()]) def is_valid(self) -> bool: individual_buckets_valid = all(len(v) >= min_pts for v, min_pts in zip(self.buckets.values(), self.buckets_min_points.values(), strict=True)) total_points_valid = self.__len__() >= self.min_points_total return individual_buckets_valid and total_points_valid + def is_calculable(self) -> bool: + return all(len(v) > 0 for v in self.buckets.values()) + def add_point(self, x: float, y: float, bucket_val: float) -> None: raise NotImplementedError diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index 51418f9c1e..69bab8d1fa 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -184,23 +184,23 @@ class TorqueEstimator(ParameterEstimator): liveTorqueParameters.version = VERSION liveTorqueParameters.useParams = self.use_params - if self.filtered_points.is_valid(): + # Calculate raw estimates when possible, only update filters when enough points are gathered + if self.filtered_points.is_calculable(): latAccelFactor, latAccelOffset, frictionCoeff = self.estimate_params() liveTorqueParameters.latAccelFactorRaw = float(latAccelFactor) liveTorqueParameters.latAccelOffsetRaw = float(latAccelOffset) liveTorqueParameters.frictionCoefficientRaw = float(frictionCoeff) - if any(val is None or np.isnan(val) for val in [latAccelFactor, latAccelOffset, frictionCoeff]): - cloudlog.exception("Live torque parameters are invalid.") - liveTorqueParameters.liveValid = False - self.reset() - else: - liveTorqueParameters.liveValid = True - latAccelFactor = np.clip(latAccelFactor, self.min_lataccel_factor, self.max_lataccel_factor) - frictionCoeff = np.clip(frictionCoeff, self.min_friction, self.max_friction) - self.update_params({'latAccelFactor': latAccelFactor, 'latAccelOffset': latAccelOffset, 'frictionCoefficient': frictionCoeff}) - else: - liveTorqueParameters.liveValid = False + if self.filtered_points.is_valid(): + if any(val is None or np.isnan(val) for val in [latAccelFactor, latAccelOffset, frictionCoeff]): + cloudlog.exception("Live torque parameters are invalid.") + liveTorqueParameters.liveValid = False + self.reset() + else: + liveTorqueParameters.liveValid = True + latAccelFactor = np.clip(latAccelFactor, self.min_lataccel_factor, self.max_lataccel_factor) + frictionCoeff = np.clip(frictionCoeff, self.min_friction, self.max_friction) + self.update_params({'latAccelFactor': latAccelFactor, 'latAccelOffset': latAccelOffset, 'frictionCoefficient': frictionCoeff}) if with_points: liveTorqueParameters.points = self.filtered_points.get_points()[:, [0, 2]].tolist() diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 07ab676033..fc38f87310 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -1b16593e2d0c9ff2dae2916293ae5fbc7d6f26df +d0cdea7eb15f3cac8a921f7ace3eaa6baebb4fd5 From e7695c3f32e95bbd0ad31e2ef09075c93ba9f65b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 21 Feb 2024 11:12:56 -0800 Subject: [PATCH 221/923] add power cycling to can_replay --- tools/replay/can_replay.py | 56 ++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index ef6864f110..856dd80d49 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -12,43 +12,47 @@ from openpilot.selfdrive.boardd.boardd import can_capnp_to_can_list from openpilot.tools.lib.logreader import LogReader from panda import Panda, PandaJungle -def send_thread(s, flock): - if "Jungle" in str(type(s)): - if "FLASH" in os.environ: - with flock: - s.flash() +# set both to cycle power or ignition +PWR_ON = int(os.getenv("PWR_ON", "0")) +PWR_OFF = int(os.getenv("PWR_OFF", "0")) +IGN_ON = int(os.getenv("ON", "0")) +IGN_OFF = int(os.getenv("OFF", "0")) +ENABLE_IGN = IGN_ON > 0 and IGN_OFF > 0 +ENABLE_PWR = PWR_ON > 0 and PWR_OFF > 0 - for i in [0, 1, 2, 3, 0xFFFF]: - s.can_clear(i) - s.set_can_speed_kbps(i, 500) - s.set_can_data_speed_kbps(i, 500) - s.set_ignition(False) - time.sleep(5) - s.set_ignition(True) - s.set_panda_power(True) - else: - s.set_safety_mode(Panda.SAFETY_ALLOUTPUT) + +def send_thread(s, flock): + if "FLASH" in os.environ: + with flock: + s.flash() + + for i in [0, 1, 2, 3, 0xFFFF]: + s.can_clear(i) + s.set_can_speed_kbps(i, 500) + s.set_can_data_speed_kbps(i, 500) + s.set_ignition(False) + time.sleep(5) + s.set_ignition(True) + s.set_panda_power(True) s.set_can_loopback(False) - idx = 0 - ign = True rk = Ratekeeper(1 / DT_CTRL, print_delay_threshold=None) while True: - # handle ignition cycling + # handle cycling + if ENABLE_PWR: + i = (rk.frame*DT_CTRL) % (PWR_ON + PWR_OFF) < PWR_ON + s.set_panda_power(i) if ENABLE_IGN: i = (rk.frame*DT_CTRL) % (IGN_ON + IGN_OFF) < IGN_ON - if i != ign: - ign = i - s.set_ignition(ign) + s.set_ignition(i) - snd = CAN_MSGS[idx] + snd = CAN_MSGS[rk.frame % len(CAN_MSGS)] snd = list(filter(lambda x: x[-1] <= 2, snd)) try: s.can_send_many(snd) except usb1.USBErrorTimeout: # timeout is fine, just means the CAN TX buffer is full pass - idx = (idx + 1) % len(CAN_MSGS) # Drain panda message buffer s.can_recv() @@ -98,10 +102,8 @@ if __name__ == "__main__": print("Finished loading...") - # set both to cycle ignition - IGN_ON = int(os.getenv("ON", "0")) - IGN_OFF = int(os.getenv("OFF", "0")) - ENABLE_IGN = IGN_ON > 0 and IGN_OFF > 0 + if ENABLE_PWR: + print(f"Cycling power: on for {PWR_ON}s, off for {PWR_OFF}s") if ENABLE_IGN: print(f"Cycling ignition: on for {IGN_ON}s, off for {IGN_OFF}s") From 3f104f3fbd7af6e0d1b59377165e6ae0a347c744 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 21 Feb 2024 11:26:49 -0800 Subject: [PATCH 222/923] fix static analysis --- tools/replay/can_replay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index 856dd80d49..c597df1f66 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -10,7 +10,7 @@ os.environ['FILEREADER_CACHE'] = '1' from openpilot.common.realtime import config_realtime_process, Ratekeeper, DT_CTRL from openpilot.selfdrive.boardd.boardd import can_capnp_to_can_list from openpilot.tools.lib.logreader import LogReader -from panda import Panda, PandaJungle +from panda import PandaJungle # set both to cycle power or ignition PWR_ON = int(os.getenv("PWR_ON", "0")) From 7a2961710849a69e096a827936b571489bebe997 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 21 Feb 2024 11:48:17 -0800 Subject: [PATCH 223/923] tici: ensure DSP permissions are setup on boot (#31530) Co-authored-by: Comma Device --- launch_chffrplus.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh index 9271c15436..a7f61411c8 100755 --- a/launch_chffrplus.sh +++ b/launch_chffrplus.sh @@ -15,6 +15,11 @@ function agnos_init { # set success flag for current boot slot sudo abctl --set_success + # TODO: do this without udev in AGNOS + # udev does this, but sometimes we startup faster + sudo chgrp gpu /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 + sudo chmod 660 /dev/adsprpc-smd /dev/ion /dev/kgsl-3d0 + # Check if AGNOS update is required if [ $(< /VERSION) != "$AGNOS_VERSION" ]; then AGNOS_PY="$DIR/system/hardware/tici/agnos.py" From 0eba392cf24e5ebbd09d7a3ff4acd9f98daeb3bb Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 21 Feb 2024 14:58:04 -0500 Subject: [PATCH 224/923] controlsd: sort imports (#31531) sort imports --- selfdrive/controls/controlsd.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 3db936e134..0251877dfb 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -5,28 +5,33 @@ import time import threading from typing import SupportsFloat -from cereal import car, log -from openpilot.common.numpy_fast import clip -from openpilot.common.realtime import config_realtime_process, Priority, Ratekeeper, DT_CTRL -from openpilot.common.params import Params import cereal.messaging as messaging + +from cereal import car, log from cereal.visionipc import VisionIpcClient, VisionStreamType -from openpilot.common.conversions import Conversions as CV + from panda import ALTERNATIVE_EXPERIENCE + +from openpilot.common.conversions import Conversions as CV +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 from openpilot.common.swaglog import cloudlog -from openpilot.system.version import get_short_branch + from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp from openpilot.selfdrive.car.car_helpers import get_car, get_startup_event, get_one_can +from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert from openpilot.selfdrive.controls.lib.drive_helpers import VCruiseHelper, clip_curvature +from openpilot.selfdrive.controls.lib.events import Events, ET from openpilot.selfdrive.controls.lib.latcontrol import LatControl, MIN_LATERAL_CONTROL_SPEED -from openpilot.selfdrive.controls.lib.longcontrol import LongControl from openpilot.selfdrive.controls.lib.latcontrol_pid import LatControlPID from openpilot.selfdrive.controls.lib.latcontrol_angle import LatControlAngle, STEER_ANGLE_SATURATION_THRESHOLD from openpilot.selfdrive.controls.lib.latcontrol_torque import LatControlTorque -from openpilot.selfdrive.controls.lib.events import Events, ET -from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert +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 From 837b811f9c78628a1c0ba50f9f287bf96e39144d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 21 Feb 2024 16:18:43 -0500 Subject: [PATCH 225/923] Split out can control into new "card" class (#31529) * card v1 * fix car events * fix proc replay * lets keep that the same * no extra space here * move can recv timeouts to card * organize imports * organize imports * slightly bump cpu * not a card! --- selfdrive/controls/controlsd.py | 169 +++++++++++++++++++++----------- selfdrive/test/test_onroad.py | 2 +- 2 files changed, 111 insertions(+), 60 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 0251877dfb..69b7873d20 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -20,6 +20,7 @@ from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp from openpilot.selfdrive.car.car_helpers import get_car, get_startup_event, get_one_can +from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert from openpilot.selfdrive.controls.lib.drive_helpers import VCruiseHelper, clip_curvature from openpilot.selfdrive.controls.lib.events import Events, ET @@ -60,33 +61,19 @@ ACTIVE_STATES = (State.enabled, State.softDisabling, State.overriding) ENABLED_STATES = (State.preEnabled, *ACTIVE_STATES) -class Controls: +class CarD: + CI: CarInterfaceBase + CS: car.CarState + def __init__(self, CI=None): - config_realtime_process(4, Priority.CTRL_HIGH) - - # Ensure the current branch is cached, otherwise the first iteration of controlsd lags - self.branch = get_short_branch() - - # Setup sockets - self.pm = messaging.PubMaster(['sendcan', 'controlsState', 'carState', - 'carControl', 'onroadEvents', 'carParams']) - - self.sensor_packets = ["accelerometer", "gyroscope"] - self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"] - - self.log_sock = messaging.sub_sock('androidLog') self.can_sock = messaging.sub_sock('can', timeout=20) + self.sm = messaging.SubMaster(['pandaStates']) + self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams']) + + self.can_rcv_timeout_counter = 0 # conseuctive timeout count + self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count self.params = Params() - ignore = self.sensor_packets + ['testJoystick'] - if SIMULATION: - ignore += ['driverCameraState', 'managerState'] - self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', - 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', - 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', - 'testJoystick'] + self.camera_packets + self.sensor_packets, - ignore_alive=ignore, ignore_avg_freq=ignore+['radarState', 'testJoystick'], ignore_valid=['testJoystick', ], - frequency=int(1/DT_CTRL)) if CI is None: # wait for one pandaState and one CAN packet @@ -99,6 +86,98 @@ class Controls: else: self.CI, self.CP = CI, CI.CP + def initialize(self): + """Initialize CarInterface, once controls are ready""" + self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) + + def state_update(self, CC: car.CarControl): + """carState update loop, driven by can""" + + # TODO: This should not depend on carControl + + # Update carState from CAN + can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) + self.CS = self.CI.update(CC, can_strs) + + self.sm.update(0) + + can_rcv_valid = len(can_strs) > 0 + + # Check for CAN timeout + if not can_rcv_valid: + self.can_rcv_timeout_counter += 1 + self.can_rcv_cum_timeout_counter += 1 + else: + self.can_rcv_timeout_counter = 0 + + self.can_rcv_timeout = self.can_rcv_timeout_counter >= 5 + + if can_rcv_valid and REPLAY: + self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime + + return self.CS + + def state_publish(self, car_events): + """carState and carParams publish loop""" + + # TODO: carState should be independent of the event loop + + # carState + cs_send = messaging.new_message('carState') + cs_send.valid = self.CS.canValid + cs_send.carState = self.CS + cs_send.carState.events = car_events + self.pm.send('carState', cs_send) + + # carParams - logged every 50 seconds (> 1 per segment) + if (self.sm.frame % int(50. / DT_CTRL) == 0): + cp_send = messaging.new_message('carParams') + cp_send.valid = True + cp_send.carParams = self.CP + self.pm.send('carParams', cp_send) + + def controls_update(self, CC: car.CarControl): + """control update loop, driven by carControl""" + + # send car controls over can + now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) + actuators_output, can_sends = self.CI.apply(CC, now_nanos) + self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=self.CS.canValid)) + + return actuators_output + + +class Controls: + def __init__(self, CI=None): + self.card = CarD(CI) + + self.CP = self.card.CP + self.CI = self.card.CI + + config_realtime_process(4, Priority.CTRL_HIGH) + + # Ensure the current branch is cached, otherwise the first iteration of controlsd lags + self.branch = get_short_branch() + + # Setup sockets + self.pm = messaging.PubMaster(['controlsState', 'carControl', 'onroadEvents']) + + self.sensor_packets = ["accelerometer", "gyroscope"] + self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"] + + self.log_sock = messaging.sub_sock('androidLog') + + self.params = Params() + ignore = self.sensor_packets + ['testJoystick'] + if SIMULATION: + ignore += ['driverCameraState', 'managerState'] + self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', + 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', + 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', + 'testJoystick'] + self.camera_packets + self.sensor_packets, + ignore_alive=ignore, ignore_avg_freq=ignore+['radarState', 'testJoystick'], ignore_valid=['testJoystick', ], + frequency=int(1/DT_CTRL)) + self.joystick_mode = self.params.get_bool("JoystickDebugMode") # set alternative experiences from parameters @@ -164,8 +243,6 @@ class Controls: self.soft_disable_timer = 0 self.mismatch_counter = 0 self.cruise_mismatch_counter = 0 - self.can_rcv_timeout_counter = 0 # conseuctive timeout count - self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count self.last_blinker_frame = 0 self.last_steering_pressed_frame = 0 self.distance_traveled = 0 @@ -353,10 +430,9 @@ class Controls: self.events.add(EventName.canError) # generic catch-all. ideally, a more specific event should be added above instead - can_rcv_timeout = self.can_rcv_timeout_counter >= 5 has_disable_events = self.events.contains(ET.NO_ENTRY) and (self.events.contains(ET.SOFT_DISABLE) or self.events.contains(ET.IMMEDIATE_DISABLE)) no_system_errors = (not has_disable_events) or (len(self.events) == num_events) - if (not self.sm.all_checks() or can_rcv_timeout) and no_system_errors: + if (not self.sm.all_checks() or self.card.can_rcv_timeout) and no_system_errors: if not self.sm.all_alive(): self.events.add(EventName.commIssue) elif not self.sm.all_freq_ok(): @@ -368,7 +444,7 @@ class Controls: 'invalid': [s for s, valid in self.sm.valid.items() if not valid], 'not_alive': [s for s, alive in self.sm.alive.items() if not alive], 'not_freq_ok': [s for s, freq_ok in self.sm.freq_ok.items() if not freq_ok], - 'can_rcv_timeout': can_rcv_timeout, + 'can_rcv_timeout': self.card.can_rcv_timeout, } if logs != self.logged_comm_issue: cloudlog.event("commIssue", error=True, **logs) @@ -430,11 +506,7 @@ class Controls: def data_sample(self): """Receive data from sockets and update carState""" - # Update carState from CAN - can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) - CS = self.CI.update(self.CC, can_strs) - if len(can_strs) and REPLAY: - self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime + CS = self.card.state_update(self.CC) self.sm.update(0) @@ -449,7 +521,7 @@ class Controls: self.sm.ignore_alive.append('wideRoadCameraState') if not self.CP.passive: - self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) + self.card.initialize() self.initialized = True self.set_initial_state() @@ -466,13 +538,6 @@ class Controls: error=True, ) - # Check for CAN timeout - if not can_strs: - self.can_rcv_timeout_counter += 1 - self.can_rcv_cum_timeout_counter += 1 - else: - self.can_rcv_timeout_counter = 0 - # When the panda and controlsd do not agree on controls_allowed # we want to disengage openpilot. However the status from the panda goes through # another socket other than the CAN messages and one can arrive earlier than the other. @@ -761,10 +826,7 @@ class Controls: hudControl.visualAlert = current_alert.visual_alert if not self.CP.passive and self.initialized: - # send car controls over can - now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) - self.last_actuators, can_sends = self.CI.apply(CC, now_nanos) - self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=CS.canValid)) + self.last_actuators = self.card.controls_update(CC) CC.actuatorsOutput = self.last_actuators if self.CP.steerControlType == car.CarParams.SteerControlType.angle: self.steer_limited = abs(CC.actuators.steeringAngleDeg - CC.actuatorsOutput.steeringAngleDeg) > \ @@ -812,7 +874,7 @@ class Controls: controlsState.cumLagMs = -self.rk.remaining * 1000. controlsState.startMonoTime = int(start_time * 1e9) controlsState.forceDecel = bool(force_decel) - controlsState.canErrorCounter = self.can_rcv_cum_timeout_counter + controlsState.canErrorCounter = self.card.can_rcv_cum_timeout_counter controlsState.experimentalMode = self.experimental_mode lat_tuning = self.CP.lateralTuning.which() @@ -827,13 +889,9 @@ class Controls: self.pm.send('controlsState', dat) - # carState car_events = self.events.to_msg() - cs_send = messaging.new_message('carState') - cs_send.valid = CS.canValid - cs_send.carState = CS - cs_send.carState.events = car_events - self.pm.send('carState', cs_send) + + self.card.state_publish(car_events) # onroadEvents - logged every second or on change if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.events.names != self.events_prev): @@ -843,13 +901,6 @@ class Controls: self.pm.send('onroadEvents', ce_send) self.events_prev = self.events.names.copy() - # carParams - logged every 50 seconds (> 1 per segment) - if (self.sm.frame % int(50. / DT_CTRL) == 0): - cp_send = messaging.new_message('carParams') - cp_send.valid = True - cp_send.carParams = self.CP - self.pm.send('carParams', cp_send) - # carControl cc_send = messaging.new_message('carControl') cc_send.valid = CS.canValid diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index e98cf09b9a..de8a4420b3 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -29,7 +29,7 @@ from openpilot.tools.lib.logreader import LogReader # Baseline CPU usage by process PROCS = { - "selfdrive.controls.controlsd": 39.0, + "selfdrive.controls.controlsd": 41.0, "./loggerd": 14.0, "./encoderd": 17.0, "./camerad": 14.5, From 34138d0be9b9b0041dc5e15b81c4f4b9e653a9f3 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 21 Feb 2024 13:57:29 -0800 Subject: [PATCH 226/923] qcomgpsd: use AT helper with retry for all AT commands (#31532) --- system/qcomgpsd/qcomgpsd.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/system/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index 3f72350234..e2a180df86 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -94,11 +94,7 @@ def at_cmd(cmd: str) -> Optional[str]: return subprocess.check_output(f"mmcli -m any --timeout 30 --command='{cmd}'", shell=True, encoding='utf8') def gps_enabled() -> bool: - try: - p = subprocess.check_output("mmcli -m any --command=\"AT+QGPS?\"", shell=True) - return b"QGPS: 1" in p - except subprocess.CalledProcessError as exc: - raise Exception("failed to execute QGPS mmcli command") from exc + return "QGPS: 1" in at_cmd("AT+QGPS?") def download_assistance(): try: From 0b4d08fab8e35a264bc7383e878538f8083c33e5 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 21 Feb 2024 13:57:49 -0800 Subject: [PATCH 227/923] remove deviceState.ambientTempC (#31533) --- cereal | 2 +- selfdrive/thermald/thermald.py | 2 -- system/hardware/base.py | 2 +- system/hardware/pc/hardware.py | 2 +- system/hardware/tici/hardware.py | 1 - 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/cereal b/cereal index 7de3c7111e..2fba1381f4 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 7de3c7111e78d87f9c43e2861a3e18aa59fde956 +Subproject commit 2fba1381f40df2654f42a2e4bed869f2b7d01a52 diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 4c2764a882..e868f2ffdd 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -83,7 +83,6 @@ def read_thermal(thermal_config): dat.deviceState.cpuTempC = [read_tz(z) / thermal_config.cpu[1] for z in thermal_config.cpu[0]] dat.deviceState.gpuTempC = [read_tz(z) / thermal_config.gpu[1] for z in thermal_config.gpu[0]] dat.deviceState.memoryTempC = read_tz(thermal_config.mem[0]) / thermal_config.mem[1] - dat.deviceState.ambientTempC = read_tz(thermal_config.ambient[0]) / thermal_config.ambient[1] dat.deviceState.pmicTempC = [read_tz(z) / thermal_config.pmic[1] for z in thermal_config.pmic[0]] return dat @@ -412,7 +411,6 @@ def thermald_thread(end_event, hw_queue) -> None: for i, temp in enumerate(msg.deviceState.gpuTempC): statlog.gauge(f"gpu{i}_temperature", temp) statlog.gauge("memory_temperature", msg.deviceState.memoryTempC) - statlog.gauge("ambient_temperature", msg.deviceState.ambientTempC) for i, temp in enumerate(msg.deviceState.pmicTempC): statlog.gauge(f"pmic{i}_temperature", temp) for i, temp in enumerate(last_hw_state.nvme_temps): diff --git a/system/hardware/base.py b/system/hardware/base.py index 9c7a618337..7434bb61e8 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -4,7 +4,7 @@ from typing import Dict from cereal import log -ThermalConfig = namedtuple('ThermalConfig', ['cpu', 'gpu', 'mem', 'bat', 'ambient', 'pmic']) +ThermalConfig = namedtuple('ThermalConfig', ['cpu', 'gpu', 'mem', 'bat', 'pmic']) NetworkType = log.DeviceState.NetworkType diff --git a/system/hardware/pc/hardware.py b/system/hardware/pc/hardware.py index 4c2c104f94..719e272aea 100644 --- a/system/hardware/pc/hardware.py +++ b/system/hardware/pc/hardware.py @@ -57,7 +57,7 @@ class Pc(HardwareBase): print("SHUTDOWN!") def get_thermal_config(self): - return ThermalConfig(cpu=((None,), 1), gpu=((None,), 1), mem=(None, 1), bat=(None, 1), ambient=(None, 1), pmic=((None,), 1)) + return ThermalConfig(cpu=((None,), 1), gpu=((None,), 1), mem=(None, 1), bat=(None, 1), pmic=((None,), 1)) def set_screen_brightness(self, percentage): pass diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index f606422028..5bb1032ba9 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -349,7 +349,6 @@ class Tici(HardwareBase): gpu=(("gpu0-usr", "gpu1-usr"), 1000), mem=("ddr-usr", 1000), bat=(None, 1), - ambient=("xo-therm-adc", 1000), pmic=(("pm8998_tz", "pm8005_tz"), 1000)) def set_screen_brightness(self, percentage): From 00315325a38b4be8a4aaa5db5db81e818c2e31ab Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 21 Feb 2024 19:11:00 -0500 Subject: [PATCH 228/923] controlsd: move carParams management to card (#31534) * card-manage * fix * init params * reversed that * can be in the init --- selfdrive/controls/controlsd.py | 51 +++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 69b7873d20..2959c9729c 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -86,6 +86,34 @@ class CarD: else: self.CI, self.CP = CI, CI.CP + # set alternative experiences from parameters + disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") + self.CP.alternativeExperience = 0 + if not disengage_on_accelerator: + self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS + + car_recognized = self.CP.carName != 'mock' + openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") + + controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly + + self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly + if self.CP.passive: + safety_config = car.CarParams.SafetyConfig.new_message() + safety_config.safetyModel = car.CarParams.SafetyModel.noOutput + self.CP.safetyConfigs = [safety_config] + + # Write previous route's CarParams + prev_cp = self.params.get("CarParamsPersistent") + if prev_cp is not None: + self.params.put("CarParamsPrevRoute", prev_cp) + + # Write CarParams for radard + cp_bytes = self.CP.to_bytes() + self.params.put("CarParams", cp_bytes) + self.params.put_nonblocking("CarParamsCache", cp_bytes) + self.params.put_nonblocking("CarParamsPersistent", cp_bytes) + def initialize(self): """Initialize CarInterface, once controls are ready""" self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) @@ -180,13 +208,8 @@ class Controls: self.joystick_mode = self.params.get_bool("JoystickDebugMode") - # set alternative experiences from parameters - self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") - self.CP.alternativeExperience = 0 - if not self.disengage_on_accelerator: - self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS - # read params + self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") @@ -197,22 +220,6 @@ class Controls: car_recognized = self.CP.carName != 'mock' controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly - self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly - if self.CP.passive: - safety_config = car.CarParams.SafetyConfig.new_message() - safety_config.safetyModel = car.CarParams.SafetyModel.noOutput - self.CP.safetyConfigs = [safety_config] - - # Write previous route's CarParams - prev_cp = self.params.get("CarParamsPersistent") - if prev_cp is not None: - self.params.put("CarParamsPrevRoute", prev_cp) - - # Write CarParams for radard - cp_bytes = self.CP.to_bytes() - self.params.put("CarParams", cp_bytes) - self.params.put_nonblocking("CarParamsCache", cp_bytes) - self.params.put_nonblocking("CarParamsPersistent", cp_bytes) # cleanup old params if not self.CP.experimentalLongitudinalAvailable: From d8ce15a86910972bc066aa378a80c499a924de3d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 21 Feb 2024 16:23:43 -0800 Subject: [PATCH 229/923] controlsd: increase initializing timeout (#31535) --- 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 2959c9729c..bd3dd08179 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -519,7 +519,7 @@ class Controls: if not self.initialized: all_valid = CS.canValid and self.sm.all_checks() - timed_out = self.sm.frame * DT_CTRL > (6. if REPLAY else 4.0) + timed_out = self.sm.frame * DT_CTRL > 6. if all_valid or timed_out or (SIMULATION and not REPLAY): available_streams = VisionIpcClient.available_streams("camerad", block=False) if VisionStreamType.VISION_STREAM_ROAD not in available_streams: From 9dde72797462944c8139020d8088cd20030554df Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 21 Feb 2024 21:40:35 -0600 Subject: [PATCH 230/923] Fix athenad reconnect test (#31538) * debugging * this also works * so does this * more similar to existing method * clean up * more * more --- selfdrive/athena/tests/test_athenad_ping.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/athena/tests/test_athenad_ping.py b/selfdrive/athena/tests/test_athenad_ping.py index 5231b0475f..49bd5f1142 100755 --- a/selfdrive/athena/tests/test_athenad_ping.py +++ b/selfdrive/athena/tests/test_athenad_ping.py @@ -55,7 +55,7 @@ class TestAthenadPing(unittest.TestCase): self.exit_event.set() self.athenad.join() - @mock.patch('openpilot.selfdrive.athena.athenad.create_connection', autospec=True) + @mock.patch('openpilot.selfdrive.athena.athenad.create_connection', new_callable=lambda: mock.MagicMock(wraps=athenad.create_connection)) def assertTimeout(self, reconnect_time: float, mock_create_connection: mock.MagicMock) -> None: self.athenad.start() From c0e172e0c08a7e09feb27905b0705ed3df992f21 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 22 Feb 2024 00:08:10 -0600 Subject: [PATCH 231/923] athenad: fix test timeouts and comments (#31540) * these pass in 0.5s since server sends ping on connect * comments * unused * fix * fix these too * check end_event while uploading, throw abort exception if we need to shut down/restart * Revert "check end_event while uploading, throw abort exception if we need to shut down/restart" This reverts commit f0b822fca98cd8e2b3d4d6d5ede6b512d3ed3ec0. * more tol for lte connection --- selfdrive/athena/athenad.py | 3 +++ selfdrive/athena/tests/test_athenad_ping.py | 8 +++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 833bf841f5..ca3a1bafbb 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -746,6 +746,9 @@ def ws_manage(ws: WebSocket, end_event: threading.Event) -> None: onroad_prev = onroad if sock is not None: + # While not sending data, onroad, we can expect to time out in 7 + (7 * 2) = 21s + # offroad, we can expect to time out in 30 + (10 * 3) = 60s + # FIXME: TCP_USER_TIMEOUT is effectively 2x for some reason (32s), so it's mostly unused sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_USER_TIMEOUT, 16000 if onroad else 0) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 7 if onroad else 30) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPINTVL, 7 if onroad else 10) diff --git a/selfdrive/athena/tests/test_athenad_ping.py b/selfdrive/athena/tests/test_athenad_ping.py index 49bd5f1142..7f32f60cb4 100755 --- a/selfdrive/athena/tests/test_athenad_ping.py +++ b/selfdrive/athena/tests/test_athenad_ping.py @@ -12,6 +12,8 @@ from openpilot.selfdrive.athena import athenad from openpilot.selfdrive.manager.helpers import write_onroad_params from openpilot.system.hardware import TICI +TIMEOUT_TOLERANCE = 20 # seconds + def wifi_radio(on: bool) -> None: if not TICI: @@ -63,7 +65,7 @@ class TestAthenadPing(unittest.TestCase): mock_create_connection.assert_called_once() mock_create_connection.reset_mock() - # check normal behaviour + # check normal behaviour, server pings on connection with self.subTest("Wi-Fi: receives ping"), Timeout(70, "no ping received"): while not self._received_ping(): time.sleep(0.1) @@ -92,12 +94,12 @@ class TestAthenadPing(unittest.TestCase): @unittest.skipIf(not TICI, "only run on desk") def test_offroad(self) -> None: write_onroad_params(False, self.params) - self.assertTimeout(100) # expect approx 90s + self.assertTimeout(60 + TIMEOUT_TOLERANCE) # based using TCP keepalive settings @unittest.skipIf(not TICI, "only run on desk") def test_onroad(self) -> None: write_onroad_params(True, self.params) - self.assertTimeout(30) # expect 20-30s + self.assertTimeout(21 + TIMEOUT_TOLERANCE) if __name__ == "__main__": From 3009a51c060b3e660bcb37e5b8c7a49813a832dc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 22 Feb 2024 02:31:24 -0600 Subject: [PATCH 232/923] athenad: check end_event while uploading files (#31541) * check end_event while uploading, throw abort exception if we need to shut down/restart * fix * draft test stash * Revert - there's no easy way to know if it breaks early in upload loop or not yet This reverts commit ad893687e196ebb31d276a114c19e9af963ed02a. * todo for now --- selfdrive/athena/athenad.py | 8 ++++++-- selfdrive/athena/tests/test_athenad.py | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index ca3a1bafbb..cc3ab5e95b 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -206,13 +206,17 @@ def retry_upload(tid: int, end_event: threading.Event, increase_count: bool = Tr break -def cb(sm, item, tid, sz: int, cur: int) -> None: +def cb(sm, item, tid, end_event: threading.Event, sz: int, cur: int) -> None: # Abort transfer if connection changed to metered after starting upload + # or if athenad is shutting down to re-connect the websocket sm.update(0) metered = sm['deviceState'].networkMetered if metered and (not item.allow_cellular): raise AbortTransferException + if end_event.is_set(): + raise AbortTransferException + cur_upload_items[tid] = replace(item, progress=cur / sz if sz else 1) @@ -252,7 +256,7 @@ def upload_handler(end_event: threading.Event) -> None: sz = -1 cloudlog.event("athena.upload_handler.upload_start", fn=fn, sz=sz, network_type=network_type, metered=metered, retry_count=item.retry_count) - response = _do_upload(item, partial(cb, sm, item, tid)) + response = _do_upload(item, partial(cb, sm, item, tid, end_event)) if response.status_code not in (200, 201, 401, 403, 412): cloudlog.event("athena.upload_handler.retry", status_code=response.status_code, fn=fn, sz=sz, network_type=network_type, metered=metered) diff --git a/selfdrive/athena/tests/test_athenad.py b/selfdrive/athena/tests/test_athenad.py index 2fecab1b1b..d59058d7e2 100755 --- a/selfdrive/athena/tests/test_athenad.py +++ b/selfdrive/athena/tests/test_athenad.py @@ -233,6 +233,7 @@ class TestAthenadMethods(unittest.TestCase): time.sleep(0.1) # TODO: verify that upload actually succeeded + # TODO: also check that end_event and metered network raises AbortTransferException self.assertEqual(athenad.upload_queue.qsize(), 0) @parameterized.expand([(500, True), (412, False)]) From a2bda8724d84fa46ab57ce15cd4143985c1b3470 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 22 Feb 2024 03:34:15 -0600 Subject: [PATCH 233/923] Ford: add back OBD queries for logging (#31543) * Revert "Reapply "Ford: don't fingerprint on engine (#31195)" part 2 (#31320)" This reverts commit dd6065c33b66e04b0ba79d78f967349a5cec6a67. * fix refs * mark logging --- selfdrive/car/ford/values.py | 5 +++++ selfdrive/car/tests/test_fw_fingerprint.py | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index c080e02299..979cc6d20a 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -111,6 +111,11 @@ FW_QUERY_CONFIG = FwQueryConfig( requests=[ # CAN and CAN FD queries are combined. # FIXME: For CAN FD, ECUs respond with frames larger than 8 bytes on the powertrain bus + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + logging=True, + ), Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 493efc1bab..e1ebd5cf18 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -263,13 +263,13 @@ 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: 5.95, 2: 6.85} + total_ref_time = {1: 6.05, 2: 6.95} brand_ref_times = { 1: { 'gm': 0.5, 'body': 0.1, 'chrysler': 0.3, - 'ford': 0.1, + 'ford': 0.2, 'honda': 0.55, 'hyundai': 1.05, 'mazda': 0.1, @@ -280,7 +280,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'volkswagen': 0.2, }, 2: { - 'ford': 0.2, + 'ford': 0.3, 'hyundai': 1.85, } } From 43f64ec5005b38b9d2f3ccab9b8bd99a2c1cd6fd Mon Sep 17 00:00:00 2001 From: Greg Hogan Date: Thu, 22 Feb 2024 13:17:02 -0800 Subject: [PATCH 234/923] URLFile: default value test (#31544) * URLFile: default value test * cleanup * fix env * improvements * fix GET response * only delete cache dir if it exists * env pop Co-authored-by: Adeeb Shihadeh --------- Co-authored-by: Adeeb Shihadeh --- tools/lib/tests/test_caching.py | 34 +++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/tools/lib/tests/test_caching.py b/tools/lib/tests/test_caching.py index 4b73e0a301..bc92b01357 100755 --- a/tools/lib/tests/test_caching.py +++ b/tools/lib/tests/test_caching.py @@ -2,11 +2,13 @@ from functools import partial import http.server import os +import shutil +import socket import unittest from parameterized import parameterized from openpilot.selfdrive.athena.tests.helpers import with_http_server - +from openpilot.system.hardware.hw import Paths from openpilot.tools.lib.url_file import URLFile @@ -15,7 +17,7 @@ class CachingTestRequestHandler(http.server.BaseHTTPRequestHandler): def do_GET(self): if self.FILE_EXISTS: - self.send_response(200, b'1234') + self.send_response(206 if "Range" in self.headers else 200, b'1234') else: self.send_response(404) self.end_headers() @@ -34,6 +36,34 @@ with_caching_server = partial(with_http_server, handler=CachingTestRequestHandle class TestFileDownload(unittest.TestCase): + @with_caching_server + def test_pipeline_defaults(self, host): + # TODO: parameterize the defaults so we don't rely on hard-coded values in xx + + self.assertEqual(URLFile.pool_manager().pools._maxsize, 10) # PoolManager num_pools param + pool_manager_defaults = { + "maxsize": 100, + "socket_options": [(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1),], + } + for k, v in pool_manager_defaults.items(): + self.assertEqual(URLFile.pool_manager().connection_pool_kw.get(k), v) + + retry_defaults = { + "total": 5, + "backoff_factor": 0.5, + "status_forcelist": [409, 429, 503, 504], + } + for k, v in retry_defaults.items(): + self.assertEqual(getattr(URLFile.pool_manager().connection_pool_kw["retries"], k), v) + + # ensure caching off by default and cache dir doesn't get created + os.environ.pop("FILEREADER_CACHE", None) + if os.path.exists(Paths.download_cache_root()): + shutil.rmtree(Paths.download_cache_root()) + URLFile(f"{host}/test.txt").get_length() + URLFile(f"{host}/test.txt").read() + self.assertEqual(os.path.exists(Paths.download_cache_root()), False) + def compare_loads(self, url, start=0, length=None): """Compares range between cached and non cached version""" file_cached = URLFile(url, cache=True) From 1ee8c9aa3317460979dfc2a96eccd101b1b70d41 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 22 Feb 2024 18:58:37 -0500 Subject: [PATCH 235/923] cars: introduce "platformconfig" to be a configuration for all relevant car information (#31542) * this is decent * make sure the docs don't change for now * hackery * these can live here --- selfdrive/car/__init__.py | 39 ++++++++++++++++++++++++++++++++++-- selfdrive/car/body/values.py | 24 +++++++++------------- 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index c90ae50ab9..ab0a26ca0c 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,11 +1,14 @@ # functions common among cars from collections import namedtuple -from typing import Dict, List, Optional +from dataclasses import dataclass +from enum import ReprEnum +from typing import Dict, List, Optional, Union import capnp from cereal import car from openpilot.common.numpy_fast import clip, interp +from openpilot.selfdrive.car.docs_definitions import CarInfo # kg of standard extra cargo to count for drive, gas, etc... @@ -73,7 +76,9 @@ def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor return tire_stiffness_front, tire_stiffness_rear -def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> Dict[str, str]: +DbcDict = Dict[str, str] + +def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> DbcDict: return {'pt': pt_dbc, 'radar': radar_dbc, 'chassis': chassis_dbc, 'body': body_dbc} @@ -236,3 +241,33 @@ class CanSignalRateCalculator: self.previous_value = current_value return self.rate + + +CarInfos = Union[CarInfo, List[CarInfo]] + +@dataclass(order=True) +class PlatformConfig: + platform_str: str + car_info: CarInfos + dbc_dict: DbcDict + + def __hash__(self) -> int: + return hash(self.platform_str) + + +class Platforms(str, ReprEnum): + config: PlatformConfig + + def __new__(cls, platform_config: PlatformConfig): + member = str.__new__(cls, platform_config.platform_str) + member.config = platform_config + member._value_ = platform_config.platform_str + return member + + @classmethod + def create_dbc_map(cls) -> Dict[str, DbcDict]: + return {p.config.platform_str: p.config.dbc_dict for p in cls} + + @classmethod + def create_carinfo_map(cls) -> Dict[str, CarInfos]: + return {p.config.platform_str: p.config.car_info for p in cls} diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index 33119bf0fd..441905f28b 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -1,8 +1,5 @@ -from enum import StrEnum -from typing import Dict - from cereal import car -from openpilot.selfdrive.car import dbc_dict +from openpilot.selfdrive.car import PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -22,13 +19,12 @@ class CarControllerParams: pass -class CAR(StrEnum): - BODY = "COMMA BODY" - - -CAR_INFO: Dict[str, CarInfo] = { - CAR.BODY: CarInfo("comma body", package="All"), -} +class CAR(Platforms): + BODY = PlatformConfig( + "COMMA BODY", + CarInfo("comma body", package="All"), + dbc_dict('comma_body', None), + ) FW_QUERY_CONFIG = FwQueryConfig( @@ -41,7 +37,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - -DBC = { - CAR.BODY: dbc_dict('comma_body', None), -} +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From 968eaf1cb2c30a2361c0993a67e720d7dc89f6ec Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 22 Feb 2024 16:12:28 -0800 Subject: [PATCH 236/923] bump to 0.9.7 --- RELEASES.md | 6 +++++- common/version.h | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index b3c5b1d6da..096fa691ac 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,4 +1,8 @@ -Version 0.9.6 (2024-02-22) +Version 0.9.7 (2024-XX-XX) +======================== +* New driving model + +Version 0.9.6 (2024-02-27) ======================== * New driving model * Vision model trained on more data diff --git a/common/version.h b/common/version.h index 787bc897d7..177882e31d 100644 --- a/common/version.h +++ b/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "0.9.6" +#define COMMA_VERSION "0.9.7" From db57a21c8878602d86fbf4ec23bfe49e17e8b543 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 22 Feb 2024 17:15:53 -0800 Subject: [PATCH 237/923] pandad: wait until USB is up before panda recovery (#31549) --- selfdrive/boardd/pandad.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index 672678778b..a87613c803 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -93,6 +93,11 @@ def main() -> NoReturn: cloudlog.event("pandad.flash_and_connect", count=count) params.remove("PandaSignatures") + # TODO: remove this in the next AGNOS + # wait until USB is up before counting + if time.monotonic() < 25.: + no_internal_panda_count = 0 + # Handle missing internal panda if no_internal_panda_count > 0: if no_internal_panda_count == 3: From 015eed5d61c583328d419a7990ffac0eee97edd4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 22 Feb 2024 20:17:00 -0500 Subject: [PATCH 238/923] Subaru: move to PlatformConfig (#31547) * subaru platform config * forester wrong dbc * spacing --- selfdrive/car/subaru/values.py | 156 +++++++++++++++++++-------------- 1 file changed, 90 insertions(+), 66 deletions(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 2f7350b966..580408df0c 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -1,10 +1,10 @@ from dataclasses import dataclass, field -from enum import Enum, IntFlag, StrEnum -from typing import Dict, List, Union +from enum import Enum, IntFlag +from typing import List from cereal import car from panda.python import uds -from openpilot.selfdrive.car import dbc_dict +from openpilot.selfdrive.car import DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Tool, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -68,27 +68,6 @@ class CanBus: camera = 2 -class CAR(StrEnum): - # Global platform - ASCENT = "SUBARU ASCENT LIMITED 2019" - ASCENT_2023 = "SUBARU ASCENT 2023" - IMPREZA = "SUBARU IMPREZA LIMITED 2019" - IMPREZA_2020 = "SUBARU IMPREZA SPORT 2020" - FORESTER = "SUBARU FORESTER 2019" - OUTBACK = "SUBARU OUTBACK 6TH GEN" - CROSSTREK_HYBRID = "SUBARU CROSSTREK HYBRID 2020" - FORESTER_HYBRID = "SUBARU FORESTER HYBRID 2020" - LEGACY = "SUBARU LEGACY 7TH GEN" - FORESTER_2022 = "SUBARU FORESTER 2022" - OUTBACK_2023 = "SUBARU OUTBACK 7TH GEN" - - # Pre-global - FORESTER_PREGLOBAL = "SUBARU FORESTER 2017 - 2018" - LEGACY_PREGLOBAL = "SUBARU LEGACY 2015 - 2018" - OUTBACK_PREGLOBAL = "SUBARU OUTBACK 2015 - 2017" - OUTBACK_PREGLOBAL_2018 = "SUBARU OUTBACK 2018 - 2019" - - class Footnote(Enum): GLOBAL = CarFootnote( "In the non-US market, openpilot requires the car to come equipped with EyeSight with Lane Keep Assistance.", @@ -110,32 +89,92 @@ class SubaruCarInfo(CarInfo): if CP.experimentalLongitudinalAvailable: self.footnotes.append(Footnote.EXP_LONG) -CAR_INFO: Dict[str, Union[SubaruCarInfo, List[SubaruCarInfo]]] = { - CAR.ASCENT: SubaruCarInfo("Subaru Ascent 2019-21", "All"), - CAR.OUTBACK: SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), - CAR.LEGACY: SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), - CAR.IMPREZA: [ - 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"), - ], - CAR.IMPREZA_2020: [ - SubaruCarInfo("Subaru Impreza 2020-22"), - SubaruCarInfo("Subaru Crosstrek 2020-23"), - SubaruCarInfo("Subaru XV 2020-21"), - ], + +@dataclass +class SubaruPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('subaru_global_2017_generated', None)) + + +class CAR(Platforms): + # Global platform + ASCENT = SubaruPlatformConfig( + "SUBARU ASCENT LIMITED 2019", + SubaruCarInfo("Subaru Ascent 2019-21", "All"), + ) + OUTBACK = SubaruPlatformConfig( + "SUBARU OUTBACK 6TH GEN", + SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + ) + LEGACY = SubaruPlatformConfig( + "SUBARU LEGACY 7TH GEN", + SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + ) + 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"), + ], + ) + IMPREZA_2020 = SubaruPlatformConfig( + "SUBARU IMPREZA SPORT 2020", + [ + SubaruCarInfo("Subaru Impreza 2020-22"), + SubaruCarInfo("Subaru Crosstrek 2020-23"), + SubaruCarInfo("Subaru XV 2020-21"), + ], + ) # TODO: is there an XV and Impreza too? - CAR.CROSSTREK_HYBRID: SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b])), - CAR.FORESTER_HYBRID: SubaruCarInfo("Subaru Forester Hybrid 2020"), - CAR.FORESTER: SubaruCarInfo("Subaru Forester 2019-21", "All"), - CAR.FORESTER_PREGLOBAL: SubaruCarInfo("Subaru Forester 2017-18"), - CAR.LEGACY_PREGLOBAL: SubaruCarInfo("Subaru Legacy 2015-18"), - CAR.OUTBACK_PREGLOBAL: SubaruCarInfo("Subaru Outback 2015-17"), - CAR.OUTBACK_PREGLOBAL_2018: SubaruCarInfo("Subaru Outback 2018-19"), - CAR.FORESTER_2022: SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), - CAR.OUTBACK_2023: SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), - CAR.ASCENT_2023: SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), -} + CROSSTREK_HYBRID = SubaruPlatformConfig( + "SUBARU CROSSTREK HYBRID 2020", + SubaruCarInfo("Subaru Crosstrek Hybrid 2020", car_parts=CarParts.common([CarHarness.subaru_b])), + dbc_dict('subaru_global_2020_hybrid_generated', None), + ) + FORESTER_HYBRID = SubaruPlatformConfig( + "SUBARU FORESTER HYBRID 2020", + SubaruCarInfo("Subaru Forester Hybrid 2020"), + dbc_dict('subaru_global_2020_hybrid_generated', None), + ) + FORESTER = SubaruPlatformConfig( + "SUBARU FORESTER 2019", + SubaruCarInfo("Subaru Forester 2019-21", "All"), + ) + # Pre-global + FORESTER_PREGLOBAL = SubaruPlatformConfig( + "SUBARU FORESTER 2017 - 2018", + SubaruCarInfo("Subaru Forester 2017-18"), + dbc_dict('subaru_forester_2017_generated', None), + ) + LEGACY_PREGLOBAL = SubaruPlatformConfig( + "SUBARU LEGACY 2015 - 2018", + SubaruCarInfo("Subaru Legacy 2015-18"), + dbc_dict('subaru_outback_2015_generated', None), + ) + OUTBACK_PREGLOBAL = SubaruPlatformConfig( + "SUBARU OUTBACK 2015 - 2017", + SubaruCarInfo("Subaru Outback 2015-17"), + dbc_dict('subaru_outback_2015_generated', None), + ) + OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( + "SUBARU OUTBACK 2018 - 2019", + SubaruCarInfo("Subaru Outback 2018-19"), + dbc_dict('subaru_outback_2019_generated', None), + ) + # Angle LKAS + FORESTER_2022= SubaruPlatformConfig( + "SUBARU FORESTER 2022", + SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), + ) + OUTBACK_2023 = SubaruPlatformConfig( + "SUBARU OUTBACK 7TH GEN", + SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), + ) + ASCENT_2023 = SubaruPlatformConfig( + "SUBARU ASCENT 2023", + SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])) + ) + LKAS_ANGLE = {CAR.FORESTER_2022, CAR.OUTBACK_2023, CAR.ASCENT_2023} GLOBAL_GEN2 = {CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023, CAR.ASCENT_2023} @@ -186,20 +225,5 @@ FW_QUERY_CONFIG = FwQueryConfig( } ) -DBC = { - CAR.ASCENT: dbc_dict('subaru_global_2017_generated', None), - CAR.ASCENT_2023: dbc_dict('subaru_global_2017_generated', None), - CAR.IMPREZA: dbc_dict('subaru_global_2017_generated', None), - CAR.IMPREZA_2020: dbc_dict('subaru_global_2017_generated', None), - CAR.FORESTER: dbc_dict('subaru_global_2017_generated', None), - CAR.FORESTER_2022: dbc_dict('subaru_global_2017_generated', None), - CAR.OUTBACK: dbc_dict('subaru_global_2017_generated', None), - CAR.FORESTER_HYBRID: dbc_dict('subaru_global_2020_hybrid_generated', None), - CAR.CROSSTREK_HYBRID: dbc_dict('subaru_global_2020_hybrid_generated', None), - CAR.OUTBACK_2023: dbc_dict('subaru_global_2017_generated', None), - CAR.LEGACY: dbc_dict('subaru_global_2017_generated', None), - CAR.FORESTER_PREGLOBAL: dbc_dict('subaru_forester_2017_generated', None), - CAR.LEGACY_PREGLOBAL: dbc_dict('subaru_outback_2015_generated', None), - CAR.OUTBACK_PREGLOBAL: dbc_dict('subaru_outback_2015_generated', None), - CAR.OUTBACK_PREGLOBAL_2018: dbc_dict('subaru_outback_2019_generated', None), -} +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From 73a497ded8b4ae7f1e2d3b5a7c4a2f57c748ff1c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 22 Feb 2024 20:49:27 -0500 Subject: [PATCH 239/923] cleanup PlatformConfig (#31551) cleanup --- selfdrive/car/__init__.py | 2 ++ selfdrive/car/subaru/values.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index ab0a26ca0c..ad21c694cc 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -78,6 +78,7 @@ def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor DbcDict = Dict[str, str] + def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> DbcDict: return {'pt': pt_dbc, 'radar': radar_dbc, 'chassis': chassis_dbc, 'body': body_dbc} @@ -245,6 +246,7 @@ class CanSignalRateCalculator: CarInfos = Union[CarInfo, List[CarInfo]] + @dataclass(order=True) class PlatformConfig: platform_str: str diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 580408df0c..7de083f4a2 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -109,7 +109,7 @@ class CAR(Platforms): "SUBARU LEGACY 7TH GEN", SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), ) - IMPREZA= SubaruPlatformConfig( + IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", [ SubaruCarInfo("Subaru Impreza 2017-19"), @@ -162,7 +162,7 @@ class CAR(Platforms): dbc_dict('subaru_outback_2019_generated', None), ) # Angle LKAS - FORESTER_2022= SubaruPlatformConfig( + FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), ) From c9c2ab9cc858bc2bc1ce16a3f4b04545582fcb1d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 22 Feb 2024 21:34:42 -0500 Subject: [PATCH 240/923] pre-commit: run ruff first (#31548) move ruff up --- .pre-commit-config.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f98bca6060..335ccae456 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -32,6 +32,11 @@ repos: # if you've got a short variable name that's getting flagged, add it here - -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 + hooks: + - id: ruff + exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' - repo: local hooks: - id: mypy @@ -43,11 +48,6 @@ repos: - --local-partial-types - --explicit-package-bases exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(xx/)' -- repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.2.2 - hooks: - - id: ruff - exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' - repo: local hooks: - id: cppcheck From 72a7f008ab3c4d0f86605860579926911815a103 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 23 Feb 2024 06:00:28 -0600 Subject: [PATCH 241/923] Volkswagen: log FW on non-OBD buses (#31556) * log lots * update refs * cmt --- selfdrive/car/tests/test_fw_fingerprint.py | 4 ++-- selfdrive/car/volkswagen/values.py | 15 +++++++++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index e1ebd5cf18..1a745b4447 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: 6.05, 2: 6.95} + total_ref_time = {1: 6.5, 2: 7.4} brand_ref_times = { 1: { 'gm': 0.5, @@ -277,7 +277,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'subaru': 0.45, 'tesla': 0.2, 'toyota': 1.6, - 'volkswagen': 0.2, + 'volkswagen': 0.65, }, 2: { 'ford': 0.3, diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 35cb3607ec..b09cbc5d8a 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -293,17 +293,24 @@ VOLKSWAGEN_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + VOLKSWAGEN_RX_OFFSET = 0x6a FW_QUERY_CONFIG = FwQueryConfig( - requests=[ + # 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], [VOLKSWAGEN_VERSION_RESPONSE], - whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar], + # whitelist_ecus=[Ecu.srs, Ecu.eps, Ecu.fwdRadar], rx_offset=VOLKSWAGEN_RX_OFFSET, + bus=bus, + logging=(bus != 1 or not obd_multiplexing), + obd_multiplexing=obd_multiplexing, ), 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 556f9738960526d6eeaab9fe639d0340a6d5d6c9 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 23 Feb 2024 14:50:33 -0500 Subject: [PATCH 242/923] segment range docs update (#31560) * the format * cleaner --- tools/lib/README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/lib/README.md b/tools/lib/README.md index a0c4a0863b..af1ad0de22 100644 --- a/tools/lib/README.md +++ b/tools/lib/README.md @@ -34,10 +34,16 @@ for msg in lr: ### Segment Ranges -We also support a new format called a "segment range", where you can specify which segments from a route to load. +We also support a new format called a "segment range": + +``` +344c5c15b34f2d8a / 2024-01-03--09-37-12 / 2:6 / q +[ dongle id ] [ timestamp ] [ selector ] [ query type] +``` + +you can specify which segments from a route to load ```python - lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4") # 4th segment lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/4:6") # 4th and 5th segment lr = LogReader("a2a0ccea32023010|2023-07-27--13-01-19/-1") # last segment From 1161d33c1892b32980a222b7c5b2ad9d6b05621e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 23 Feb 2024 16:23:40 -0500 Subject: [PATCH 243/923] Subaru: move carspecs to PlatformConfig (#31550) * subaru platform config * forester wrong dbc * spacing * subaru car specs * someday! * more red diff * all brands can be done like this * but this should be done first and thats subaru specific * that seems very low but we shouldn't change it here * as long as it subclasses str its fine * fix --- selfdrive/car/__init__.py | 13 ++++++++-- selfdrive/car/interfaces.py | 12 +++++++-- selfdrive/car/subaru/interface.py | 40 +++--------------------------- selfdrive/car/subaru/values.py | 27 +++++++++++++++----- selfdrive/car/tests/test_models.py | 2 +- 5 files changed, 47 insertions(+), 47 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index ad21c694cc..8f2c8bd451 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -247,12 +247,21 @@ class CanSignalRateCalculator: CarInfos = Union[CarInfo, List[CarInfo]] +@dataclass +class CarSpecs: + mass: float + wheelbase: float + steerRatio: float + + @dataclass(order=True) class PlatformConfig: platform_str: str car_info: CarInfos dbc_dict: DbcDict + specs: Optional[CarSpecs] = None + def __hash__(self) -> int: return hash(self.platform_str) @@ -268,8 +277,8 @@ class Platforms(str, ReprEnum): @classmethod def create_dbc_map(cls) -> Dict[str, DbcDict]: - return {p.config.platform_str: p.config.dbc_dict for p in cls} + return {p: p.config.dbc_dict for p in cls} @classmethod def create_carinfo_map(cls) -> Dict[str, CarInfos]: - return {p.config.platform_str: p.config.car_info for p in cls} + return {p: p.config.car_info for p in cls} diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 9767752edb..2b0b148ccf 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -4,7 +4,7 @@ import numpy as np import tomllib from abc import abstractmethod, ABC from enum import StrEnum -from typing import Any, Dict, Optional, Tuple, List, Callable, NamedTuple +from typing import Any, Dict, Optional, Tuple, List, Callable, NamedTuple, cast from cereal import car from openpilot.common.basedir import BASEDIR @@ -12,7 +12,7 @@ from openpilot.common.conversions import Conversions as CV 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 import PlatformConfig, apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG 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 @@ -109,6 +109,14 @@ 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): ret = CarInterfaceBase.get_std_params(candidate) + + if hasattr(candidate, "config"): + platform_config = cast(PlatformConfig, candidate.config) + if platform_config.specs is not None: + ret.mass = platform_config.specs.mass + ret.wheelbase = platform_config.specs.wheelbase + ret.steerRatio = platform_config.specs.steerRatio + ret = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) # Vehicle mass is published curb weight plus assumed payload such as a human driver; notCars have no assumed payload diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 1296aead5e..edf07ac2ef 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -40,11 +40,10 @@ class CarInterface(CarInterfaceBase): else: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + + ret.centerToFront = ret.wheelbase * 0.5 + if candidate in (CAR.ASCENT, CAR.ASCENT_2023): - ret.mass = 2031. - ret.wheelbase = 2.89 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 13.5 ret.steerActuatorDelay = 0.3 # end-to-end angle controller ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.00003 @@ -52,10 +51,6 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.0025, 0.1], [0.00025, 0.01]] elif candidate == CAR.IMPREZA: - ret.mass = 1568. - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 15 ret.steerActuatorDelay = 0.4 # end-to-end angle controller ret.lateralTuning.init('pid') ret.lateralTuning.pid.kf = 0.00005 @@ -63,58 +58,31 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2, 0.3], [0.02, 0.03]] elif candidate == CAR.IMPREZA_2020: - ret.mass = 1480. - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 17 # learned, 14 stock 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: - ret.mass = 1668. - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 17 ret.steerActuatorDelay = 0.1 elif candidate in (CAR.FORESTER, CAR.FORESTER_2022, CAR.FORESTER_HYBRID): - ret.mass = 1568. - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 17 # learned, 14 stock 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): - ret.mass = 1568. - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 17 ret.steerActuatorDelay = 0.1 elif candidate in (CAR.FORESTER_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018): ret.safetyConfigs[0].safetyParam = Panda.FLAG_SUBARU_PREGLOBAL_REVERSED_DRIVER_TORQUE # Outback 2018-2019 and Forester have reversed driver torque signal - ret.mass = 1568 - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 20 # learned, 14 stock elif candidate == CAR.LEGACY_PREGLOBAL: - ret.mass = 1568 - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 12.5 # 14.5 stock ret.steerActuatorDelay = 0.15 elif candidate == CAR.OUTBACK_PREGLOBAL: - ret.mass = 1568 - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 20 # learned, 14 stock + pass else: raise ValueError(f"unknown car: {candidate}") diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 7de083f4a2..b871a919e3 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -4,7 +4,7 @@ from typing import List from cereal import car from panda.python import uds -from openpilot.selfdrive.car import DbcDict, PlatformConfig, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -100,14 +100,17 @@ class CAR(Platforms): ASCENT = SubaruPlatformConfig( "SUBARU ASCENT LIMITED 2019", SubaruCarInfo("Subaru Ascent 2019-21", "All"), + specs=CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) OUTBACK = SubaruPlatformConfig( "SUBARU OUTBACK 6TH GEN", SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) LEGACY = SubaruPlatformConfig( "SUBARU LEGACY 7TH GEN", SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), + specs=OUTBACK.specs, ) IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", @@ -116,6 +119,7 @@ class CAR(Platforms): 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"), ], + specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), ) IMPREZA_2020 = SubaruPlatformConfig( "SUBARU IMPREZA SPORT 2020", @@ -124,55 +128,66 @@ class CAR(Platforms): SubaruCarInfo("Subaru Crosstrek 2020-23"), SubaruCarInfo("Subaru XV 2020-21"), ], + specs=CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), ) # 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])), dbc_dict('subaru_global_2020_hybrid_generated', None), + specs=CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), + ) + FORESTER = SubaruPlatformConfig( + "SUBARU FORESTER 2019", + SubaruCarInfo("Subaru Forester 2019-21", "All"), + specs=CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), ) FORESTER_HYBRID = SubaruPlatformConfig( "SUBARU FORESTER HYBRID 2020", SubaruCarInfo("Subaru Forester Hybrid 2020"), dbc_dict('subaru_global_2020_hybrid_generated', None), - ) - FORESTER = SubaruPlatformConfig( - "SUBARU FORESTER 2019", - SubaruCarInfo("Subaru Forester 2019-21", "All"), + specs=FORESTER.specs, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( "SUBARU FORESTER 2017 - 2018", SubaruCarInfo("Subaru Forester 2017-18"), dbc_dict('subaru_forester_2017_generated', None), + specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), ) LEGACY_PREGLOBAL = SubaruPlatformConfig( "SUBARU LEGACY 2015 - 2018", SubaruCarInfo("Subaru Legacy 2015-18"), dbc_dict('subaru_outback_2015_generated', None), + specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( "SUBARU OUTBACK 2015 - 2017", SubaruCarInfo("Subaru Outback 2015-17"), dbc_dict('subaru_outback_2015_generated', None), + specs=FORESTER_PREGLOBAL.specs, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( "SUBARU OUTBACK 2018 - 2019", SubaruCarInfo("Subaru Outback 2018-19"), dbc_dict('subaru_outback_2019_generated', None), + specs=FORESTER_PREGLOBAL.specs, ) # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), + specs=FORESTER.specs, ) OUTBACK_2023 = SubaruPlatformConfig( "SUBARU OUTBACK 7TH GEN", SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), + specs=OUTBACK.specs, ) ASCENT_2023 = SubaruPlatformConfig( "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])), + specs=ASCENT.specs, ) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 3592fd0baa..ec7527713d 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -50,7 +50,7 @@ def get_test_cases() -> List[Tuple[str, Optional[CarTestRoute]]]: for i, c in enumerate(sorted(all_known_cars())): if i % NUM_JOBS == JOB_ID: - test_cases.extend(sorted((c.value, r) for r in routes_by_car.get(c, (None,)))) + test_cases.extend(sorted((c, r) for r in routes_by_car.get(c, (None,)))) else: segment_list = read_segment_list(os.path.join(BASEDIR, INTERNAL_SEG_LIST)) From b75a6cea34864d097ebd22a713db445180c72732 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Fri, 23 Feb 2024 19:35:21 -0600 Subject: [PATCH 244/923] VW PQ: Consolidate and cleanup tuning (#31566) consolidate and cleanup PQ configs --- selfdrive/car/volkswagen/interface.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 710e779d0a..544d104d33 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -72,14 +72,18 @@ class CarInterface(CarInterfaceBase): # Global lateral tuning defaults, can be overridden per-vehicle - ret.steerActuatorDelay = 0.1 - ret.steerLimitTimer = 0.4 ret.steerRatio = 15.6 # Let the params learner figure this out - ret.lateralTuning.pid.kpBP = [0.] - ret.lateralTuning.pid.kiBP = [0.] - ret.lateralTuning.pid.kf = 0.00006 - ret.lateralTuning.pid.kpV = [0.6] - ret.lateralTuning.pid.kiV = [0.2] + ret.steerLimitTimer = 0.4 + if candidate in PQ_CARS: + ret.steerActuatorDelay = 0.2 + CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) + else: + ret.steerActuatorDelay = 0.1 + ret.lateralTuning.pid.kpBP = [0.] + ret.lateralTuning.pid.kiBP = [0.] + ret.lateralTuning.pid.kf = 0.00006 + ret.lateralTuning.pid.kpV = [0.6] + ret.lateralTuning.pid.kiV = [0.2] # Global longitudinal tuning defaults, can be overridden per-vehicle @@ -131,8 +135,6 @@ class CarInterface(CarInterfaceBase): ret.wheelbase = 2.80 ret.minEnableSpeed = 20 * CV.KPH_TO_MS # ACC "basic", no FtS ret.minSteerSpeed = 50 * CV.KPH_TO_MS - ret.steerActuatorDelay = 0.2 - CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.POLO_MK6: ret.mass = 1230 @@ -142,7 +144,6 @@ class CarInterface(CarInterfaceBase): ret.mass = 1639 ret.wheelbase = 2.92 ret.minSteerSpeed = 50 * CV.KPH_TO_MS - ret.steerActuatorDelay = 0.2 elif candidate == CAR.TAOS_MK1: ret.mass = 1498 From 92475d653bcb94a907d20701a697118fbe8815ef Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 23 Feb 2024 17:41:03 -0800 Subject: [PATCH 245/923] agnos 9.7 (#31564) * agnos 9.7 * update --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index 0c72c54581..6859afb0d4 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.6" + export AGNOS_VERSION="9.7" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index b4408d2140..e69842cfec 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db.img.xz", - "hash": "10ac02f18c5f1cde5a888a3411d3701b929c3488753467e77aad6085db058eb9", - "hash_raw": "3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db", + "url": "https://commadist.azureedge.net/agnosupdate/system-0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2.img.xz", + "hash": "4858385ba6284bcaa179ab77ac4263486e4d8670df921e4ac400464dc1dde59c", + "hash_raw": "0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "a7db41b93b587f8f9c3f83a3313f186445c4bdf07283cd6a5421dfbc0286c9db", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-3bfb0f3a6bf677bdc8a6227f49ce3258025e1886dc81533e3fbacb356b5601db.img.xz", - "size": 4548131508 + "hash": "42658a6fff660d9b6abb9cb9fbb3481071259c9a9598718af6b1edff2b556009", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-0f69173d5f3058f7197c139442a6556be59e52f15402a263215a329ba5ec41e2.img.xz", + "size": 4548292756 } } ] \ No newline at end of file From adb7e2e2297ecfc00e333155d4c8d0666c2c9205 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 23 Feb 2024 23:54:48 -0500 Subject: [PATCH 246/923] CI: Retry multiarch build (#31570) hardware --- .github/workflows/selfdrive_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 8b1f256bfb..d1dff147f2 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -117,7 +117,7 @@ jobs: - name: Merge x64 and arm64 tags run: | export PUSH_IMAGE=true - selfdrive/test/docker_tag_multiarch.sh base x86_64 aarch64 + scripts/retry.sh selfdrive/test/docker_tag_multiarch.sh base x86_64 aarch64 static_analysis: name: static analysis From 378ba114f9d4852374d76c7ebc0318a80cd29c43 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 23 Feb 2024 23:22:34 -0600 Subject: [PATCH 247/923] Ford: support hybrid Q3 platforms (#31568) * bump * ford: remove dynamic dashcam lockout for hybrids * releases? * Revert "releases?" This reverts commit 88d950043d79b8c00535f48ed84b854bc2ab2557. * bump * Reapply "releases?" This reverts commit db5079dc3f1a6bce70bd04430be45704d8604e76. * 097 --- RELEASES.md | 1 + panda | 2 +- selfdrive/car/ford/carstate.py | 7 ------- selfdrive/car/ford/interface.py | 2 -- 4 files changed, 2 insertions(+), 10 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 096fa691ac..d0fd530db1 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,6 +1,7 @@ Version 0.9.7 (2024-XX-XX) ======================== * New driving model +* Support for many hybrid Ford models Version 0.9.6 (2024-02-27) ======================== diff --git a/panda b/panda index b4442a7c93..6aa4b55033 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit b4442a7c930aac112cdd82cddfc3dd12254a56e1 +Subproject commit 6aa4b550336136bc20a6abb307cf310e876eba28 diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index ef56d23d79..34006e8da4 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -18,17 +18,10 @@ class CarState(CarStateBase): self.shifter_values = can_define.dv["Gear_Shift_by_Wire_FD1"]["TrnRng_D_RqGsm"] self.vehicle_sensors_valid = False - self.unsupported_platform = False def update(self, cp, cp_cam): ret = car.CarState.new_message() - # Ford Q3 hybrid variants experience a bug where a message from the PCM sends invalid checksums, - # this must be root-caused before enabling support. Ford Q4 hybrids do not have this problem. - # TrnAin_Tq_Actl and its quality flag are only set on ICE platform variants - self.unsupported_platform = (cp.vl["VehicleOperatingModes"]["TrnAinTq_D_Qf"] == 0 and - self.CP.carFingerprint not in CANFD_CAR) - # Occasionally on startup, the ABS module recalibrates the steering pinion offset, so we need to block engagement # The vehicle usually recovers out of this state within a minute of normal driving self.vehicle_sensors_valid = cp.vl["SteeringPinion_Data"]["StePinCompAnEst_D_Qf"] == 3 diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index cc013fb54b..685a2a27ad 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -109,8 +109,6 @@ class CarInterface(CarInterfaceBase): events = self.create_common_events(ret, extra_gears=[GearShifter.manumatic]) if not self.CS.vehicle_sensors_valid: events.add(car.CarEvent.EventName.vehicleSensorsInvalid) - if self.CS.unsupported_platform: - events.add(car.CarEvent.EventName.startupNoControl) ret.events = events.to_msg() From df79d31a6bd056c166248880c8b655ca46ce9cf6 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 24 Feb 2024 09:41:01 -0500 Subject: [PATCH 248/923] ui: Remove device ambient temperature from Sidebar Temperature selector --- CHANGELOGS.md | 1 + selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc | 2 +- selfdrive/ui/qt/sidebar.cc | 9 +++------ 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 336500c446..40e834024f 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -54,6 +54,7 @@ sunnypilot - 0.9.6.1 (2024-02-22) * Display the statuses of certain features on the driving screen * NEW❗: Visuals: Enable Onroad Settings toggle * Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu + * REMOVED: "Device ambient" temperature option on the sidebar * FIXED: New comma 3X support * FIXED: New comma eSIM support * Bug fixes and performance improvements diff --git a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc index e1061f29bf..1d812444cb 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc @@ -106,7 +106,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { } } - std::vector sidebar_temp_texts{tr("Off"), tr("Ambient"), tr("RAM"), tr("CPU"), tr("GPU"), tr("Max")}; + std::vector sidebar_temp_texts{tr("Off"), tr("RAM"), tr("CPU"), tr("GPU"), tr("Max")}; sidebar_temp_setting = new ButtonParamControl( "SidebarTemperatureOptions", "Display Temperature on Sidebar", "", "../assets/offroad/icon_blank.png", diff --git a/selfdrive/ui/qt/sidebar.cc b/selfdrive/ui/qt/sidebar.cc index f79745dca9..6b0ef8c7f7 100644 --- a/selfdrive/ui/qt/sidebar.cc +++ b/selfdrive/ui/qt/sidebar.cc @@ -97,12 +97,9 @@ void Sidebar::updateState(const UIState &s) { case 0: break; case 1: - sidebar_temp = QString::number((int)deviceState.getAmbientTempC()); - break; - case 2: sidebar_temp = QString::number((int)deviceState.getMemoryTempC()); break; - case 3: { + case 2: { const auto& cpu_temp_list = deviceState.getCpuTempC(); float max_cpu_temp = std::numeric_limits::lowest(); @@ -115,7 +112,7 @@ void Sidebar::updateState(const UIState &s) { } break; } - case 4: { + case 3: { const auto& gpu_temp_list = deviceState.getGpuTempC(); float max_gpu_temp = std::numeric_limits::lowest(); @@ -128,7 +125,7 @@ void Sidebar::updateState(const UIState &s) { } break; } - case 5: + case 4: sidebar_temp = QString::number((int)deviceState.getMaxTempC()); break; default: From b049836943b76912d2fdf3ed312261b9a340fb58 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 24 Feb 2024 09:48:18 -0500 Subject: [PATCH 249/923] Update CHANGELOGS.md --- CHANGELOGS.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 336500c446..1339df9800 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,4 +1,4 @@ -sunnypilot - 0.9.6.1 (2024-02-22) +sunnypilot - 0.9.6.1 (2024-02-27) ======================== * New driving model * Vision model trained on more data @@ -9,8 +9,9 @@ sunnypilot - 0.9.6.1 (2024-02-22) * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models +* Alpha longitudinal support for new Toyota models * Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire! -* Dodge Duranago 2020-21 support +* Dodge Durango 2020-21 support * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! * Lexus LC 2024 support thanks to nelsonjchen! From 6ed72b362698a4ceef4eff5d9a9ed6ce5ec002be Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sat, 24 Feb 2024 18:01:02 +0000 Subject: [PATCH 250/923] Ford: add hybrid variants to docs (#31575) * Ford: add hybrid variants to docs Following up on https://github.com/commaai/openpilot/pull/31568 | CarInfoPlatform | ElectrificationLevel | ModelYear | Series | Trim | |:-----------------------------|:-----------------------|:-----------------------|:--------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------| | FORD BRONCO SPORT 1ST GEN | ICE | 2021, 2022 | BADLANDS, BASE, BIG BEND, FIRST EDITION, OUTER BANKS | | | FORD ESCAPE 4TH GEN | FHEV | 2020, 2021, 2022 | SE, SEL, Titanium | | | FORD ESCAPE 4TH GEN | ICE | 2020, 2021, 2022 | S, SE, SEL, Titanium | | | FORD ESCAPE 4TH GEN | PHEV | 2020, 2021, 2022 | SE, SEL, Titanium | | | FORD EXPLORER 6TH GEN | HEV | 2020, 2021, 2022, 2023 | Limited, Platinum | | | FORD EXPLORER 6TH GEN | ICE | 2020, 2021, 2022, 2023 | Base, Black Label, King Ranch, Limited, Platinum, Reserve, ST, ST-Line, Standard, Timberline, XLT | | | FORD EXPLORER 6TH GEN | PHEV | 2020, 2021 | Black Label Grand Touring, Blk Label Grand Touring, Grand Touring | | | FORD F-150 14TH GEN | HEV | 2021, 2022, 2023 | , F-Series | SuperCrew | | FORD F-150 14TH GEN | ICE | 2021, 2022, 2023 | , F-Series | , Regular Cab, SuperCab, SuperCrew, SuperCrew-Raptor, SuperCrew-SSV | | FORD F-150 LIGHTNING 1ST GEN | BEV | 2022, 2023 | | SuperCrew | | FORD MAVERICK 1ST GEN | HEV | 2022, 2023 | SUPERCREW, XL XLT Lariat | , SUPERCREW | | FORD MAVERICK 1ST GEN | ICE | 2022, 2023 | SUPERCREW, XL XLT Lariat, XLT Lariat | , SUPERCREW | | FORD MUSTANG MACH-E 1ST GEN | BEV | 2021, 2022, 2023 | California Route 1, GT, Premium, Select | | Data from NHTSA database and https://www.ford.co.uk/cars. * revert F-150 model year change --- docs/CARS.md | 13 +++++++++++-- selfdrive/car/ford/values.py | 20 +++++++++++++++++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 6d3ee71659..7ad12189cb 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. -# 279 Supported Cars +# 288 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -37,11 +37,19 @@ A supported vehicle is one that just works when you install a comma device. All |Dodge|Durango 2020-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
|| |Ford|Bronco Sport 2021-22|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|Escape 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Escape Hybrid 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Escape Plug-in Hybrid 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Explorer 2020-23|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Ford|Explorer Hybrid 2020-23|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Focus 2018[3](#footnotes)|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|Focus Hybrid 2018[3](#footnotes)|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 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 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 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
|| |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
|| @@ -177,7 +185,8 @@ A supported vehicle is one that just works when you install a comma device. All |Lexus|RX Hybrid 2017-19|All|openpilot available[2](#footnotes)|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
|| |Lexus|RX Hybrid 2020-22|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
|| |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-21|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 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
|| |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
|| diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 979cc6d20a..8704a7b724 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -91,19 +91,33 @@ CAR_INFO: Dict[str, Union[CarInfo, List[CarInfo]]] = { CAR.BRONCO_SPORT_MK1: FordCarInfo("Ford Bronco Sport 2021-22"), CAR.ESCAPE_MK4: [ 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"), ], CAR.EXPLORER_MK6: [ FordCarInfo("Ford Explorer 2020-23"), - FordCarInfo("Lincoln Aviator 2020-21", "Co-Pilot360 Plus"), + 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 + ], + CAR.F_150_MK14: [ + FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), + FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"), ], - CAR.F_150_MK14: FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), CAR.F_150_LIGHTNING_MK1: FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), CAR.MUSTANG_MACH_E_MK1: FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), - CAR.FOCUS_MK4: FordCarInfo("Ford Focus 2018", "Adaptive Cruise Control with Lane Centering", footnotes=[Footnote.FOCUS]), + CAR.FOCUS_MK4: [ + 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 + ], CAR.MAVERICK_MK1: [ 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"), ], } From 995250ae4967943ee33a3699a1d89a7a770d95e9 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 25 Feb 2024 00:41:23 +0000 Subject: [PATCH 251/923] use pyupgrade to update to new typing syntax (#31580) * add pyupgrade hook * run pyupgrade (pre-commit run -a) * ruff --fix * Revert "add pyupgrade hook" This reverts commit 56ec18bb6b8602a0b612f3803d96cdad14b52066. * revert changes to third_party/ * manual type fixes * explicit Optional wrapping capnp objects --- common/file_helpers.py | 3 +- common/gpio.py | 7 +- common/mock/__init__.py | 5 +- common/prefix.py | 3 +- common/realtime.py | 7 +- common/transformations/orientation.py | 2 +- openpilot/__init__.py | 3 - selfdrive/athena/athenad.py | 57 ++++++------ selfdrive/athena/registration.py | 9 +- selfdrive/athena/tests/test_athenad.py | 3 +- selfdrive/athena/tests/test_athenad_ping.py | 6 +- selfdrive/boardd/pandad.py | 4 +- selfdrive/car/__init__.py | 19 ++-- selfdrive/car/car_helpers.py | 6 +- selfdrive/car/chrysler/values.py | 3 +- selfdrive/car/docs.py | 15 ++-- selfdrive/car/docs_definitions.py | 33 ++++--- selfdrive/car/ecu_addrs.py | 13 ++- selfdrive/car/ford/tests/test_ford.py | 4 +- selfdrive/car/ford/values.py | 5 +- selfdrive/car/fw_query_definitions.py | 26 +++--- selfdrive/car/fw_versions.py | 27 +++--- selfdrive/car/gm/values.py | 5 +- selfdrive/car/honda/values.py | 3 +- selfdrive/car/hyundai/values.py | 9 +- selfdrive/car/interfaces.py | 23 ++--- selfdrive/car/mazda/values.py | 3 +- selfdrive/car/mock/values.py | 3 +- selfdrive/car/nissan/values.py | 3 +- selfdrive/car/subaru/values.py | 3 +- selfdrive/car/tesla/values.py | 3 +- selfdrive/car/tests/routes.py | 6 +- selfdrive/car/tests/test_docs.py | 4 +- selfdrive/car/tests/test_fingerprints.py | 3 +- selfdrive/car/tests/test_lateral_limits.py | 3 +- selfdrive/car/tests/test_models.py | 15 ++-- selfdrive/car/toyota/values.py | 7 +- selfdrive/car/volkswagen/values.py | 5 +- selfdrive/controls/lib/alertmanager.py | 11 ++- selfdrive/controls/lib/events.py | 18 ++-- selfdrive/controls/lib/vehicle_model.py | 3 +- selfdrive/controls/radard.py | 12 +-- selfdrive/debug/can_print_changes.py | 5 +- selfdrive/debug/check_freq.py | 6 +- selfdrive/debug/check_lag.py | 3 +- selfdrive/debug/check_timings.py | 4 +- selfdrive/debug/count_events.py | 6 +- selfdrive/debug/cpu_usage_stat.py | 4 +- selfdrive/debug/format_fingerprints.py | 2 +- .../internal/measure_modeld_packet_drop.py | 3 +- selfdrive/debug/live_cpu_and_temp.py | 7 +- selfdrive/locationd/calibrationd.py | 18 ++-- selfdrive/locationd/helpers.py | 10 +-- selfdrive/locationd/models/car_kf.py | 4 +- selfdrive/manager/build.py | 3 +- selfdrive/manager/manager.py | 7 +- selfdrive/manager/process.py | 12 +-- selfdrive/modeld/dmonitoringmodeld.py | 5 +- selfdrive/modeld/fill_model_msg.py | 5 +- selfdrive/modeld/get_model_metadata.py | 3 +- selfdrive/modeld/modeld.py | 9 +- selfdrive/modeld/navmodeld.py | 5 +- selfdrive/modeld/parse_model_outputs.py | 3 +- selfdrive/modeld/runners/onnxmodel.py | 4 +- selfdrive/navd/helpers.py | 16 ++-- selfdrive/statsd.py | 6 +- selfdrive/test/ciui.py | 4 +- selfdrive/test/fuzzy_generation.py | 17 ++-- selfdrive/test/helpers.py | 2 +- selfdrive/test/process_replay/capture.py | 4 +- selfdrive/test/process_replay/compare_logs.py | 3 +- .../test/process_replay/process_replay.py | 87 ++++++++++--------- selfdrive/test/process_replay/regen.py | 11 +-- selfdrive/test/process_replay/test_debayer.py | 2 +- .../test/process_replay/test_processes.py | 6 +- selfdrive/test/update_ci_routes.py | 6 +- selfdrive/thermald/power_monitoring.py | 5 +- selfdrive/thermald/thermald.py | 19 ++-- selfdrive/ui/soundd.py | 5 +- selfdrive/ui/tests/test_translations.py | 6 +- selfdrive/ui/translations/create_badges.py | 4 +- selfdrive/ui/update_translations.py | 2 +- selfdrive/updated.py | 11 ++- system/hardware/base.py | 3 +- system/hardware/tici/agnos.py | 6 +- system/hardware/tici/amplifier.py | 5 +- system/hardware/tici/casync.py | 18 ++-- system/hardware/tici/power_monitor.py | 3 +- system/hardware/tici/precise_power_measure.py | 2 +- .../tici/tests/compare_casync_manifest.py | 3 +- system/hardware/tici/tests/test_power_draw.py | 7 +- system/loggerd/deleter.py | 3 +- system/loggerd/tests/loggerd_tests_common.py | 5 +- system/loggerd/tests/test_deleter.py | 2 +- system/loggerd/tests/test_loggerd.py | 3 +- system/loggerd/tests/test_uploader.py | 5 +- system/loggerd/uploader.py | 15 ++-- system/loggerd/xattr_cache.py | 5 +- system/qcomgpsd/nmeaport.py | 2 +- system/qcomgpsd/qcomgpsd.py | 6 +- system/sensord/pigeond.py | 7 +- system/ubloxd/tests/ubloxd.py | 2 +- system/version.py | 7 +- system/webrtc/device/audio.py | 7 +- system/webrtc/device/video.py | 3 +- system/webrtc/schema.py | 8 +- system/webrtc/tests/test_webrtcd.py | 2 +- system/webrtc/webrtcd.py | 16 ++-- tools/bodyteleop/web.py | 4 +- tools/car_porting/auto_fingerprint.py | 3 +- tools/car_porting/test_car_model.py | 3 +- tools/latencylogger/latency_logger.py | 2 +- tools/lib/auth.py | 4 +- tools/lib/azure_container.py | 6 +- tools/lib/bootlog.py | 5 +- tools/lib/helpers.py | 14 +-- tools/lib/live_logreader.py | 5 +- tools/lib/logreader.py | 16 ++-- tools/lib/route.py | 4 +- tools/lib/tests/test_comma_car_segments.py | 2 - tools/lib/vidindex.py | 7 +- tools/replay/lib/ui_helpers.py | 4 +- tools/sim/bridge/common.py | 3 +- .../sim/bridge/metadrive/metadrive_bridge.py | 6 +- tools/sim/lib/manual_ctrl.py | 10 +-- 125 files changed, 464 insertions(+), 525 deletions(-) diff --git a/common/file_helpers.py b/common/file_helpers.py index dea298a529..417776b87c 100644 --- a/common/file_helpers.py +++ b/common/file_helpers.py @@ -1,7 +1,6 @@ import os import tempfile import contextlib -from typing import Optional class CallbackReader: @@ -24,7 +23,7 @@ class CallbackReader: @contextlib.contextmanager -def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: Optional[str] = None, newline: Optional[str] = None, +def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, overwrite: bool = False): """Write to a file atomically using a temporary file in the same directory as the destination file.""" dir_name = os.path.dirname(path) diff --git a/common/gpio.py b/common/gpio.py index 88a9479a60..68932cb87a 100644 --- a/common/gpio.py +++ b/common/gpio.py @@ -1,6 +1,5 @@ import os from functools import lru_cache -from typing import Optional, List def gpio_init(pin: int, output: bool) -> None: try: @@ -16,7 +15,7 @@ def gpio_set(pin: int, high: bool) -> None: except Exception as e: print(f"Failed to set gpio {pin} value: {e}") -def gpio_read(pin: int) -> Optional[bool]: +def gpio_read(pin: int) -> bool | None: val = None try: with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f: @@ -37,7 +36,7 @@ def gpio_export(pin: int) -> None: print(f"Failed to export gpio {pin}") @lru_cache(maxsize=None) -def get_irq_action(irq: int) -> List[str]: +def get_irq_action(irq: int) -> list[str]: try: with open(f"/sys/kernel/irq/{irq}/actions") as f: actions = f.read().strip().split(',') @@ -45,7 +44,7 @@ def get_irq_action(irq: int) -> List[str]: except FileNotFoundError: return [] -def get_irqs_for_action(action: str) -> List[str]: +def get_irqs_for_action(action: str) -> list[str]: ret = [] with open("/proc/interrupts") as f: for l in f.readlines(): diff --git a/common/mock/__init__.py b/common/mock/__init__.py index e0dbf45c74..8c86bbd394 100644 --- a/common/mock/__init__.py +++ b/common/mock/__init__.py @@ -6,7 +6,6 @@ example in common/tests/test_mock.py import functools import threading -from typing import List, Union from cereal.messaging import PubMaster from cereal.services import SERVICE_LIST from openpilot.common.mock.generators import generate_liveLocationKalman @@ -18,7 +17,7 @@ MOCK_GENERATOR = { } -def generate_messages_loop(services: List[str], done: threading.Event): +def generate_messages_loop(services: list[str], done: threading.Event): pm = PubMaster(services) rk = Ratekeeper(100) i = 0 @@ -32,7 +31,7 @@ def generate_messages_loop(services: List[str], done: threading.Event): rk.keep_time() -def mock_messages(services: Union[List[str], str]): +def mock_messages(services: list[str] | str): if isinstance(services, str): services = [services] diff --git a/common/prefix.py b/common/prefix.py index d027e3e5a1..40f2f34b74 100644 --- a/common/prefix.py +++ b/common/prefix.py @@ -2,14 +2,13 @@ import os import shutil import uuid -from typing import Optional from openpilot.common.params import Params from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT class OpenpilotPrefix: - def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): + def __init__(self, prefix: str | None = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) self.msgq_path = os.path.join('/dev/shm', self.prefix) self.clean_dirs_on_exit = clean_dirs_on_exit diff --git a/common/realtime.py b/common/realtime.py index a398146166..6b8587ff06 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -3,7 +3,6 @@ import gc import os import time from collections import deque -from typing import Optional, List, Union from setproctitle import getproctitle @@ -33,12 +32,12 @@ def set_realtime_priority(level: int) -> None: os.sched_setscheduler(0, os.SCHED_FIFO, os.sched_param(level)) -def set_core_affinity(cores: List[int]) -> None: +def set_core_affinity(cores: list[int]) -> None: if not PC: os.sched_setaffinity(0, cores) -def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None: +def config_realtime_process(cores: int | list[int], priority: int) -> None: gc.disable() set_realtime_priority(priority) c = cores if isinstance(cores, list) else [cores, ] @@ -46,7 +45,7 @@ def config_realtime_process(cores: Union[int, List[int]], priority: int) -> None class Ratekeeper: - def __init__(self, rate: float, print_delay_threshold: Optional[float] = 0.0) -> None: + def __init__(self, rate: float, print_delay_threshold: float | None = 0.0) -> None: """Rate in Hz for ratekeeping. print_delay_threshold must be nonnegative.""" self._interval = 1. / rate self._next_frame_time = time.monotonic() + self._interval diff --git a/common/transformations/orientation.py b/common/transformations/orientation.py index ce4378738d..86e6a6c347 100644 --- a/common/transformations/orientation.py +++ b/common/transformations/orientation.py @@ -1,5 +1,5 @@ import numpy as np -from typing import Callable +from collections.abc import Callable from openpilot.common.transformations.transformations import (ecef_euler_from_ned_single, euler2quat_single, diff --git a/openpilot/__init__.py b/openpilot/__init__.py index b28b04f643..e69de29bb2 100644 --- a/openpilot/__init__.py +++ b/openpilot/__init__.py @@ -1,3 +0,0 @@ - - - diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index cc3ab5e95b..9480d2b8ec 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -19,7 +19,8 @@ from dataclasses import asdict, dataclass, replace from datetime import datetime from functools import partial from queue import Queue -from typing import Callable, Dict, List, Optional, Set, Union, cast +from typing import cast +from collections.abc import Callable import requests from jsonrpc import JSONRPCResponseManager, dispatcher @@ -55,17 +56,17 @@ WS_FRAME_SIZE = 4096 NetworkType = log.DeviceState.NetworkType -UploadFileDict = Dict[str, Union[str, int, float, bool]] -UploadItemDict = Dict[str, Union[str, bool, int, float, Dict[str, str]]] +UploadFileDict = dict[str, str | int | float | bool] +UploadItemDict = dict[str, str | bool | int | float | dict[str, str]] -UploadFilesToUrlResponse = Dict[str, Union[int, List[UploadItemDict], List[str]]] +UploadFilesToUrlResponse = dict[str, int | list[UploadItemDict] | list[str]] @dataclass class UploadFile: fn: str url: str - headers: Dict[str, str] + headers: dict[str, str] allow_cellular: bool @classmethod @@ -77,9 +78,9 @@ class UploadFile: class UploadItem: path: str url: str - headers: Dict[str, str] + headers: dict[str, str] created_at: int - id: Optional[str] + id: str | None retry_count: int = 0 current: bool = False progress: float = 0 @@ -97,9 +98,9 @@ send_queue: Queue[str] = queue.Queue() upload_queue: Queue[UploadItem] = queue.Queue() low_priority_send_queue: Queue[str] = queue.Queue() log_recv_queue: Queue[str] = queue.Queue() -cancelled_uploads: Set[str] = set() +cancelled_uploads: set[str] = set() -cur_upload_items: Dict[int, Optional[UploadItem]] = {} +cur_upload_items: dict[int, UploadItem | None] = {} def strip_bz2_extension(fn: str) -> str: @@ -127,14 +128,14 @@ class UploadQueueCache: @staticmethod def cache(upload_queue: Queue[UploadItem]) -> None: try: - queue: List[Optional[UploadItem]] = list(upload_queue.queue) + queue: list[UploadItem | None] = list(upload_queue.queue) items = [asdict(i) for i in queue if i is not None and (i.id not in cancelled_uploads)] Params().put("AthenadUploadQueue", json.dumps(items)) except Exception: cloudlog.exception("athena.UploadQueueCache.cache.exception") -def handle_long_poll(ws: WebSocket, exit_event: Optional[threading.Event]) -> None: +def handle_long_poll(ws: WebSocket, exit_event: threading.Event | None) -> None: end_event = threading.Event() threads = [ @@ -278,7 +279,7 @@ def upload_handler(end_event: threading.Event) -> None: cloudlog.exception("athena.upload_handler.exception") -def _do_upload(upload_item: UploadItem, callback: Optional[Callable] = None) -> requests.Response: +def _do_upload(upload_item: UploadItem, callback: Callable | None = None) -> requests.Response: path = upload_item.path compress = False @@ -317,7 +318,7 @@ def getMessage(service: str, timeout: int = 1000) -> dict: @dispatcher.add_method -def getVersion() -> Dict[str, str]: +def getVersion() -> dict[str, str]: return { "version": get_version(), "remote": get_normalized_origin(), @@ -327,7 +328,7 @@ def getVersion() -> Dict[str, str]: @dispatcher.add_method -def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: Optional[str] = None, place_details: Optional[str] = None) -> Dict[str, int]: +def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: str | None = None, place_details: str | None = None) -> dict[str, int]: destination = { "latitude": latitude, "longitude": longitude, @@ -339,7 +340,7 @@ def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: Optiona return {"success": 1} -def scan_dir(path: str, prefix: str) -> List[str]: +def scan_dir(path: str, prefix: str) -> list[str]: files = [] # only walk directories that match the prefix # (glob and friends traverse entire dir tree) @@ -359,12 +360,12 @@ def scan_dir(path: str, prefix: str) -> List[str]: return files @dispatcher.add_method -def listDataDirectory(prefix='') -> List[str]: +def listDataDirectory(prefix='') -> list[str]: return scan_dir(Paths.log_root(), prefix) @dispatcher.add_method -def uploadFileToUrl(fn: str, url: str, headers: Dict[str, str]) -> UploadFilesToUrlResponse: +def uploadFileToUrl(fn: str, url: str, headers: dict[str, str]) -> UploadFilesToUrlResponse: # this is because mypy doesn't understand that the decorator doesn't change the return type response: UploadFilesToUrlResponse = uploadFilesToUrls([{ "fn": fn, @@ -375,11 +376,11 @@ def uploadFileToUrl(fn: str, url: str, headers: Dict[str, str]) -> UploadFilesTo @dispatcher.add_method -def uploadFilesToUrls(files_data: List[UploadFileDict]) -> UploadFilesToUrlResponse: +def uploadFilesToUrls(files_data: list[UploadFileDict]) -> UploadFilesToUrlResponse: files = map(UploadFile.from_dict, files_data) - items: List[UploadItemDict] = [] - failed: List[str] = [] + items: list[UploadItemDict] = [] + failed: list[str] = [] for file in files: if len(file.fn) == 0 or file.fn[0] == '/' or '..' in file.fn or len(file.url) == 0: failed.append(file.fn) @@ -418,13 +419,13 @@ def uploadFilesToUrls(files_data: List[UploadFileDict]) -> UploadFilesToUrlRespo @dispatcher.add_method -def listUploadQueue() -> List[UploadItemDict]: +def listUploadQueue() -> list[UploadItemDict]: items = list(upload_queue.queue) + list(cur_upload_items.values()) return [asdict(i) for i in items if (i is not None) and (i.id not in cancelled_uploads)] @dispatcher.add_method -def cancelUpload(upload_id: Union[str, List[str]]) -> Dict[str, Union[int, str]]: +def cancelUpload(upload_id: str | list[str]) -> dict[str, int | str]: if not isinstance(upload_id, list): upload_id = [upload_id] @@ -437,7 +438,7 @@ def cancelUpload(upload_id: Union[str, List[str]]) -> Dict[str, Union[int, str]] return {"success": 1} @dispatcher.add_method -def setRouteViewed(route: str) -> Dict[str, Union[int, str]]: +def setRouteViewed(route: str) -> dict[str, int | str]: # maintain a list of the last 10 routes viewed in connect params = Params() @@ -452,7 +453,7 @@ def setRouteViewed(route: str) -> Dict[str, Union[int, str]]: return {"success": 1} -def startLocalProxy(global_end_event: threading.Event, remote_ws_uri: str, local_port: int) -> Dict[str, int]: +def startLocalProxy(global_end_event: threading.Event, remote_ws_uri: str, local_port: int) -> dict[str, int]: try: if local_port not in LOCAL_PORT_WHITELIST: raise Exception("Requested local port not whitelisted") @@ -486,7 +487,7 @@ def startLocalProxy(global_end_event: threading.Event, remote_ws_uri: str, local @dispatcher.add_method -def getPublicKey() -> Optional[str]: +def getPublicKey() -> str | None: if not os.path.isfile(Paths.persist_root() + '/comma/id_rsa.pub'): return None @@ -526,7 +527,7 @@ def getNetworks(): @dispatcher.add_method -def takeSnapshot() -> Optional[Union[str, Dict[str, str]]]: +def takeSnapshot() -> str | dict[str, str] | None: from openpilot.system.camerad.snapshot.snapshot import jpeg_write, snapshot ret = snapshot() if ret is not None: @@ -543,7 +544,7 @@ def takeSnapshot() -> Optional[Union[str, Dict[str, str]]]: raise Exception("not available while camerad is started") -def get_logs_to_send_sorted() -> List[str]: +def get_logs_to_send_sorted() -> list[str]: # TODO: scan once then use inotify to detect file creation/deletion curr_time = int(time.time()) logs = [] @@ -766,7 +767,7 @@ def backoff(retries: int) -> int: return random.randrange(0, min(128, int(2 ** retries))) -def main(exit_event: Optional[threading.Event] = None): +def main(exit_event: threading.Event | None = None): try: set_core_affinity([0, 1, 2, 3]) except Exception: diff --git a/selfdrive/athena/registration.py b/selfdrive/athena/registration.py index 7db94c28c8..6574d9ac20 100755 --- a/selfdrive/athena/registration.py +++ b/selfdrive/athena/registration.py @@ -3,7 +3,6 @@ import time import json import jwt from pathlib import Path -from typing import Optional from datetime import datetime, timedelta from openpilot.common.api import api_get @@ -23,12 +22,12 @@ def is_registered_device() -> bool: return dongle not in (None, UNREGISTERED_DONGLE_ID) -def register(show_spinner=False) -> Optional[str]: +def register(show_spinner=False) -> str | None: params = Params() IMEI = params.get("IMEI", encoding='utf8') HardwareSerial = params.get("HardwareSerial", encoding='utf8') - dongle_id: Optional[str] = params.get("DongleId", encoding='utf8') + dongle_id: str | None = params.get("DongleId", encoding='utf8') needs_registration = None in (IMEI, HardwareSerial, dongle_id) pubkey = Path(Paths.persist_root()+"/comma/id_rsa.pub") @@ -48,8 +47,8 @@ def register(show_spinner=False) -> Optional[str]: # Block until we get the imei serial = HARDWARE.get_serial() start_time = time.monotonic() - imei1: Optional[str] = None - imei2: Optional[str] = None + imei1: str | None = None + imei2: str | None = None while imei1 is None and imei2 is None: try: imei1, imei2 = HARDWARE.get_imei(0), HARDWARE.get_imei(1) diff --git a/selfdrive/athena/tests/test_athenad.py b/selfdrive/athena/tests/test_athenad.py index d59058d7e2..8d09661f01 100755 --- a/selfdrive/athena/tests/test_athenad.py +++ b/selfdrive/athena/tests/test_athenad.py @@ -12,7 +12,6 @@ import unittest from dataclasses import asdict, replace from datetime import datetime, timedelta from parameterized import parameterized -from typing import Optional from unittest import mock from websocket import ABNF @@ -97,7 +96,7 @@ class TestAthenadMethods(unittest.TestCase): break @staticmethod - def _create_file(file: str, parent: Optional[str] = None, data: bytes = b'') -> str: + def _create_file(file: str, parent: str | None = None, data: bytes = b'') -> str: fn = os.path.join(Paths.log_root() if parent is None else parent, file) os.makedirs(os.path.dirname(fn), exist_ok=True) with open(fn, 'wb') as f: diff --git a/selfdrive/athena/tests/test_athenad_ping.py b/selfdrive/athena/tests/test_athenad_ping.py index 7f32f60cb4..f56fcac8b5 100755 --- a/selfdrive/athena/tests/test_athenad_ping.py +++ b/selfdrive/athena/tests/test_athenad_ping.py @@ -3,7 +3,7 @@ import subprocess import threading import time import unittest -from typing import cast, Optional +from typing import cast from unittest import mock from openpilot.common.params import Params @@ -29,8 +29,8 @@ class TestAthenadPing(unittest.TestCase): athenad: threading.Thread exit_event: threading.Event - def _get_ping_time(self) -> Optional[str]: - return cast(Optional[str], self.params.get("LastAthenaPingTime", encoding="utf-8")) + def _get_ping_time(self) -> str | None: + return cast(str | None, self.params.get("LastAthenaPingTime", encoding="utf-8")) def _clear_ping_time(self) -> None: self.params.remove("LastAthenaPingTime") diff --git a/selfdrive/boardd/pandad.py b/selfdrive/boardd/pandad.py index a87613c803..988d1a2409 100755 --- a/selfdrive/boardd/pandad.py +++ b/selfdrive/boardd/pandad.py @@ -4,7 +4,7 @@ import os import usb1 import time import subprocess -from typing import List, NoReturn +from typing import NoReturn from functools import cmp_to_key from panda import Panda, PandaDFU, PandaProtocolMismatch, FW_PATH @@ -124,7 +124,7 @@ def main() -> NoReturn: cloudlog.info(f"{len(panda_serials)} panda(s) found, connecting - {panda_serials}") # Flash pandas - pandas: List[Panda] = [] + pandas: list[Panda] = [] for serial in panda_serials: pandas.append(flash_panda(serial)) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 8f2c8bd451..7544796b93 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -2,7 +2,6 @@ from collections import namedtuple from dataclasses import dataclass from enum import ReprEnum -from typing import Dict, List, Optional, Union import capnp @@ -27,9 +26,9 @@ def apply_hysteresis(val: float, val_steady: float, hyst_gap: float) -> float: return val_steady -def create_button_events(cur_btn: int, prev_btn: int, buttons_dict: Dict[int, capnp.lib.capnp._EnumModule], - unpressed_btn: int = 0) -> List[capnp.lib.capnp._DynamicStructBuilder]: - events: List[capnp.lib.capnp._DynamicStructBuilder] = [] +def create_button_events(cur_btn: int, prev_btn: int, buttons_dict: dict[int, capnp.lib.capnp._EnumModule], + unpressed_btn: int = 0) -> list[capnp.lib.capnp._DynamicStructBuilder]: + events: list[capnp.lib.capnp._DynamicStructBuilder] = [] if cur_btn == prev_btn: return events @@ -76,7 +75,7 @@ def scale_tire_stiffness(mass, wheelbase, center_to_front, tire_stiffness_factor return tire_stiffness_front, tire_stiffness_rear -DbcDict = Dict[str, str] +DbcDict = dict[str, str] def dbc_dict(pt_dbc, radar_dbc, chassis_dbc=None, body_dbc=None) -> DbcDict: @@ -214,7 +213,7 @@ def get_safety_config(safety_model, safety_param = None): class CanBusBase: offset: int - def __init__(self, CP, fingerprint: Optional[Dict[int, Dict[int, int]]]) -> None: + def __init__(self, CP, fingerprint: dict[int, dict[int, int]] | None) -> None: if CP is None: assert fingerprint is not None num = max([k for k, v in fingerprint.items() if len(v)], default=0) // 4 + 1 @@ -244,7 +243,7 @@ class CanSignalRateCalculator: return self.rate -CarInfos = Union[CarInfo, List[CarInfo]] +CarInfos = CarInfo | list[CarInfo] @dataclass @@ -260,7 +259,7 @@ class PlatformConfig: car_info: CarInfos dbc_dict: DbcDict - specs: Optional[CarSpecs] = None + specs: CarSpecs | None = None def __hash__(self) -> int: return hash(self.platform_str) @@ -276,9 +275,9 @@ class Platforms(str, ReprEnum): return member @classmethod - def create_dbc_map(cls) -> Dict[str, DbcDict]: + def create_dbc_map(cls) -> dict[str, DbcDict]: return {p: p.config.dbc_dict for p in cls} @classmethod - def create_carinfo_map(cls) -> Dict[str, CarInfos]: + def create_carinfo_map(cls) -> dict[str, CarInfos]: return {p: p.config.car_info for p in cls} diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 95028e10c5..fe4c0e885c 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -1,6 +1,6 @@ import os import time -from typing import Callable, Dict, List, Optional, Tuple +from collections.abc import Callable from cereal import car from openpilot.common.params import Params @@ -63,7 +63,7 @@ def load_interfaces(brand_names): return ret -def _get_interface_names() -> Dict[str, List[str]]: +def _get_interface_names() -> dict[str, list[str]]: # returns a dict of brand name and its respective models brand_names = {} for brand_name, brand_models in get_interface_attr("CAR").items(): @@ -77,7 +77,7 @@ interface_names = _get_interface_names() interfaces = load_interfaces(interface_names) -def can_fingerprint(next_can: Callable) -> Tuple[Optional[str], Dict[int, dict]]: +def can_fingerprint(next_can: Callable) -> tuple[str | None, dict[int, dict]]: finger = gen_empty_fingerprint() candidate_cars = {i: all_legacy_fingerprint_cars() for i in [0, 1]} # attempt fingerprint on both bus 0 and 1 frame = 0 diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 94ff1f1d0f..a7eec8fe5a 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -1,6 +1,5 @@ from enum import IntFlag, StrEnum from dataclasses import dataclass, field -from typing import Dict, List, Optional, Union from cereal import car from panda.python import uds @@ -66,7 +65,7 @@ class ChryslerCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) -CAR_INFO: Dict[str, Optional[Union[ChryslerCarInfo, List[ChryslerCarInfo]]]] = { +CAR_INFO: dict[str, ChryslerCarInfo | list[ChryslerCarInfo] | None] = { CAR.PACIFICA_2017_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2017"), CAR.PACIFICA_2018_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2018"), CAR.PACIFICA_2019_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23"), diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index 8475a69d8a..caa79a8f87 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -5,7 +5,6 @@ import jinja2 import os from enum import Enum from natsort import natsorted -from typing import Dict, List from cereal import car from openpilot.common.basedir import BASEDIR @@ -14,7 +13,7 @@ from openpilot.selfdrive.car.docs_definitions import CarInfo, Column, CommonFoot from openpilot.selfdrive.car.car_helpers import interfaces, get_interface_attr -def get_all_footnotes() -> Dict[Enum, int]: +def get_all_footnotes() -> dict[Enum, int]: all_footnotes = list(CommonFootnote) for footnotes in get_interface_attr("Footnote", ignore_none=True).values(): all_footnotes.extend(footnotes) @@ -25,8 +24,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[CarInfo]: + all_car_info: list[CarInfo] = [] footnotes = get_all_footnotes() for model, car_info in get_interface_attr("CAR_INFO", combine_brands=True).items(): # If available, uses experimental longitudinal limits for the docs @@ -47,19 +46,19 @@ 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[CarInfo] = 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[CarInfo]) -> dict[str, list[CarInfo]]: 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: - with open(template_fn, "r") as f: +def generate_cars_md(all_car_info: list[CarInfo], 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()] diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index f2ce743607..03ed1f32cb 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -3,7 +3,6 @@ from collections import namedtuple import copy from dataclasses import dataclass, field from enum import Enum -from typing import Dict, List, Optional, Tuple, Union from cereal import car from openpilot.common.conversions import Conversions as CV @@ -35,7 +34,7 @@ class Star(Enum): @dataclass class BasePart: name: str - parts: List[Enum] = field(default_factory=list) + parts: list[Enum] = field(default_factory=list) def all_parts(self): # Recursively get all parts @@ -76,7 +75,7 @@ class Accessory(EnumBase): @dataclass class BaseCarHarness(BasePart): - parts: List[Enum] = field(default_factory=lambda: [Accessory.harness_box, Accessory.comma_power_v2, Cable.rj45_cable_7ft]) + parts: list[Enum] = field(default_factory=lambda: [Accessory.harness_box, Accessory.comma_power_v2, Cable.rj45_cable_7ft]) has_connector: bool = True # without are hidden on the harness connector page @@ -149,18 +148,18 @@ class PartType(Enum): tool = Tool -DEFAULT_CAR_PARTS: List[EnumBase] = [Device.threex] +DEFAULT_CAR_PARTS: list[EnumBase] = [Device.threex] @dataclass class CarParts: - parts: List[EnumBase] = field(default_factory=list) + parts: list[EnumBase] = field(default_factory=list) def __call__(self): return copy.deepcopy(self) @classmethod - def common(cls, add: Optional[List[EnumBase]] = None, remove: Optional[List[EnumBase]] = None): + def common(cls, add: list[EnumBase] | None = None, remove: list[EnumBase] | None = None): p = [part for part in (add or []) + DEFAULT_CAR_PARTS if part not in (remove or [])] return cls(p) @@ -186,7 +185,7 @@ class CommonFootnote(Enum): Column.LONGITUDINAL) -def get_footnotes(footnotes: List[Enum], column: Column) -> List[Enum]: +def get_footnotes(footnotes: list[Enum], column: Column) -> list[Enum]: # Returns applicable footnotes given current column return [fn for fn in footnotes if fn.value.column == column] @@ -209,7 +208,7 @@ def get_year_list(years): return years_list -def split_name(name: str) -> Tuple[str, str, str]: +def split_name(name: str) -> tuple[str, str, str]: make, model = name.split(" ", 1) years = "" match = re.search(MODEL_YEARS_RE, model) @@ -233,13 +232,13 @@ class CarInfo: # the minimum compatibility requirements for this model, regardless # of market. can be a package, trim, or list of features - requirements: Optional[str] = None + requirements: str | None = None - video_link: Optional[str] = None - footnotes: List[Enum] = field(default_factory=list) - min_steer_speed: Optional[float] = None - min_enable_speed: Optional[float] = None - auto_resume: Optional[bool] = None + video_link: str | None = None + footnotes: list[Enum] = field(default_factory=list) + min_steer_speed: float | None = None + min_enable_speed: float | None = None + auto_resume: bool | None = None # all the parts needed for the supported car car_parts: CarParts = field(default_factory=CarParts) @@ -248,7 +247,7 @@ class CarInfo: self.make, self.model, self.years = split_name(self.name) self.year_list = get_year_list(self.years) - def init(self, CP: car.CarParams, all_footnotes: Dict[Enum, int]): + def init(self, CP: car.CarParams, all_footnotes: dict[Enum, int]): self.car_name = CP.carName self.car_fingerprint = CP.carFingerprint @@ -293,7 +292,7 @@ class CarInfo: if len(tools_docs): hardware_col += f'
Tools{display_func(tools_docs)}
' - self.row: Dict[Enum, Union[str, Star]] = { + self.row: dict[Enum, str | Star] = { Column.MAKE: self.make, Column.MODEL: self.model, Column.PACKAGE: self.package, @@ -352,7 +351,7 @@ class CarInfo: raise Exception(f"This notCar does not have a detail sentence: {CP.carFingerprint}") def get_column(self, column: Column, star_icon: str, video_icon: str, footnote_tag: str) -> str: - item: Union[str, Star] = self.row[column] + item: str | Star = self.row[column] if isinstance(item, Star): item = star_icon.format(item.value) elif column == Column.MODEL and len(self.years): diff --git a/selfdrive/car/ecu_addrs.py b/selfdrive/car/ecu_addrs.py index 13f7926def..6d6fa333a5 100755 --- a/selfdrive/car/ecu_addrs.py +++ b/selfdrive/car/ecu_addrs.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import capnp import time -from typing import Optional, Set import cereal.messaging as messaging from panda.python.uds import SERVICE_TYPE @@ -20,7 +19,7 @@ def make_tester_present_msg(addr, bus, subaddr=None): return make_can_msg(addr, bytes(dat), bus) -def is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subaddr: Optional[int] = None) -> bool: +def is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subaddr: int | None = None) -> bool: # ISO-TP messages are always padded to 8 bytes # tester present response is always a single frame dat_offset = 1 if subaddr is not None else 0 @@ -34,16 +33,16 @@ def is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subadd return False -def get_all_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, bus: int, timeout: float = 1, debug: bool = True) -> Set[EcuAddrBusType]: +def get_all_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, bus: int, timeout: float = 1, debug: bool = True) -> set[EcuAddrBusType]: addr_list = [0x700 + i for i in range(256)] + [0x18da00f1 + (i << 8) for i in range(256)] - queries: Set[EcuAddrBusType] = {(addr, None, bus) for addr in addr_list} + queries: set[EcuAddrBusType] = {(addr, None, bus) for addr in addr_list} responses = queries return get_ecu_addrs(logcan, sendcan, queries, responses, timeout=timeout, debug=debug) -def get_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, queries: Set[EcuAddrBusType], - responses: Set[EcuAddrBusType], timeout: float = 1, debug: bool = False) -> Set[EcuAddrBusType]: - ecu_responses: Set[EcuAddrBusType] = set() # set((addr, subaddr, bus),) +def get_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, queries: set[EcuAddrBusType], + responses: set[EcuAddrBusType], timeout: float = 1, debug: bool = False) -> set[EcuAddrBusType]: + ecu_responses: set[EcuAddrBusType] = set() # set((addr, subaddr, bus),) try: msgs = [make_tester_present_msg(addr, bus, subaddr) for addr, subaddr, bus in queries] diff --git a/selfdrive/car/ford/tests/test_ford.py b/selfdrive/car/ford/tests/test_ford.py index dff29629f6..fb5d07f4bf 100755 --- a/selfdrive/car/ford/tests/test_ford.py +++ b/selfdrive/car/ford/tests/test_ford.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import unittest from parameterized import parameterized -from typing import Dict, Iterable, Optional, Tuple +from collections.abc import Iterable import capnp @@ -50,7 +50,7 @@ class TestFordFW(unittest.TestCase): self.assertIsNone(subaddr, "Unexpected ECU subaddress") @parameterized.expand(FW_VERSIONS.items()) - def test_fw_versions(self, car_model: str, fw_versions: Dict[Tuple[capnp.lib.capnp._EnumModule, int, Optional[int]], Iterable[bytes]]): + def test_fw_versions(self, car_model: str, fw_versions: dict[tuple[capnp.lib.capnp._EnumModule, int, int | None], Iterable[bytes]]): for (ecu, addr, subaddr), fws in fw_versions.items(): self.assertIn(ecu, ECU_FW_CORE, "Unexpected ECU") self.assertEqual(addr, ECU_ADDRESSES[ecu], "ECU address mismatch") diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 8704a7b724..3ad39d715f 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,7 +1,6 @@ from collections import defaultdict from dataclasses import dataclass from enum import Enum, StrEnum -from typing import Dict, List, Union from cereal import car from openpilot.selfdrive.car import AngleRateLimit, dbc_dict @@ -59,7 +58,7 @@ class RADAR: DELPHI_MRR = 'FORD_CADS' -DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict("ford_lincoln_base_pt", RADAR.DELPHI_MRR)) +DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict("ford_lincoln_base_pt", RADAR.DELPHI_MRR)) # F-150 radar is not yet supported DBC[CAR.F_150_MK14] = dbc_dict("ford_lincoln_base_pt", None) @@ -87,7 +86,7 @@ class FordCarInfo(CarInfo): self.car_parts = CarParts([Device.threex, harness]) -CAR_INFO: Dict[str, Union[CarInfo, List[CarInfo]]] = { +CAR_INFO: dict[str, CarInfo | list[CarInfo]] = { CAR.BRONCO_SPORT_MK1: FordCarInfo("Ford Bronco Sport 2021-22"), CAR.ESCAPE_MK4: [ FordCarInfo("Ford Escape 2020-22"), diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 36e6794d2c..80492b4177 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -3,16 +3,16 @@ import capnp import copy from dataclasses import dataclass, field import struct -from typing import Callable, Dict, List, Optional, Set, Tuple +from collections.abc import Callable import panda.python.uds as uds -AddrType = Tuple[int, Optional[int]] -EcuAddrBusType = Tuple[int, Optional[int], int] -EcuAddrSubAddr = Tuple[int, int, Optional[int]] +AddrType = tuple[int, int | None] +EcuAddrBusType = tuple[int, int | None, int] +EcuAddrSubAddr = tuple[int, int, int | None] -LiveFwVersions = Dict[AddrType, Set[bytes]] -OfflineFwVersions = Dict[str, Dict[EcuAddrSubAddr, List[bytes]]] +LiveFwVersions = dict[AddrType, set[bytes]] +OfflineFwVersions = dict[str, dict[EcuAddrSubAddr, list[bytes]]] # A global list of addresses we will only ever consider for VIN responses # engine, hybrid controller, Ford abs, Hyundai CAN FD cluster, 29-bit engine, PGM-FI @@ -71,9 +71,9 @@ class StdQueries: @dataclass class Request: - request: List[bytes] - response: List[bytes] - whitelist_ecus: List[int] = field(default_factory=list) + request: list[bytes] + response: list[bytes] + whitelist_ecus: list[int] = field(default_factory=list) rx_offset: int = 0x8 bus: int = 1 # Whether this query should be run on the first auxiliary panda (CAN FD cars for example) @@ -86,15 +86,15 @@ class Request: @dataclass class FwQueryConfig: - requests: List[Request] + requests: list[Request] # TODO: make this automatic and remove hardcoded lists, or do fingerprinting with ecus # Overrides and removes from essential ecus for specific models and ecus (exact matching) - non_essential_ecus: Dict[capnp.lib.capnp._EnumModule, List[str]] = field(default_factory=dict) + 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, Optional[int]]] = field(default_factory=list) + 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, # returns set of candidates. Only will match if one candidate is returned - match_fw_to_car_fuzzy: Optional[Callable[[LiveFwVersions, OfflineFwVersions], Set[str]]] = None + match_fw_to_car_fuzzy: Callable[[LiveFwVersions, 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 6c02e69503..1cf4cecd3e 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 from collections import defaultdict -from typing import Any, DefaultDict, Dict, Iterator, List, Optional, Set, TypeVar +from typing import Any, TypeVar +from collections.abc import Iterator from tqdm import tqdm import capnp @@ -27,19 +28,19 @@ REQUESTS = [(brand, config, r) for brand, config in FW_QUERY_CONFIGS.items() for T = TypeVar('T') -def chunks(l: List[T], n: int = 128) -> Iterator[List[T]]: +def chunks(l: list[T], n: int = 128) -> Iterator[list[T]]: for i in range(0, len(l), n): yield l[i:i + n] -def is_brand(brand: str, filter_brand: Optional[str]) -> bool: +def is_brand(brand: str, filter_brand: str | None) -> bool: """Returns if brand matches filter_brand or no brand filter is specified""" return filter_brand is None or brand == filter_brand -def build_fw_dict(fw_versions: List[capnp.lib.capnp._DynamicStructBuilder], - filter_brand: Optional[str] = None) -> Dict[AddrType, Set[bytes]]: - fw_versions_dict: DefaultDict[AddrType, Set[bytes]] = defaultdict(set) +def build_fw_dict(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], + filter_brand: str | None = None) -> dict[AddrType, set[bytes]]: + fw_versions_dict: defaultdict[AddrType, set[bytes]] = defaultdict(set) for fw in fw_versions: if is_brand(fw.brand, filter_brand) and not fw.logging: sub_addr = fw.subAddress if fw.subAddress != 0 else None @@ -97,7 +98,7 @@ def match_fw_to_car_fuzzy(live_fw_versions, match_brand=None, log=True, exclude= return set() -def match_fw_to_car_exact(live_fw_versions, match_brand=None, log=True, extra_fw_versions=None) -> Set[str]: +def match_fw_to_car_exact(live_fw_versions, match_brand=None, log=True, extra_fw_versions=None) -> set[str]: """Do an exact FW match. Returns all cars that match the given FW versions for a list of "essential" ECUs. If an ECU is not considered essential the FW version can be missing to get a fingerprint, but if it's present it @@ -164,11 +165,11 @@ def match_fw_to_car(fw_versions, allow_exact=True, allow_fuzzy=True, log=True): return True, set() -def get_present_ecus(logcan, sendcan, num_pandas=1) -> Set[EcuAddrBusType]: +def get_present_ecus(logcan, sendcan, num_pandas=1) -> set[EcuAddrBusType]: params = Params() # queries are split by OBD multiplexing mode - queries: Dict[bool, List[List[EcuAddrBusType]]] = {True: [], False: []} - parallel_queries: Dict[bool, List[EcuAddrBusType]] = {True: [], False: []} + queries: dict[bool, list[list[EcuAddrBusType]]] = {True: [], False: []} + parallel_queries: dict[bool, list[EcuAddrBusType]] = {True: [], False: []} responses = set() for brand, config, r in REQUESTS: @@ -203,7 +204,7 @@ def get_present_ecus(logcan, sendcan, num_pandas=1) -> Set[EcuAddrBusType]: return ecu_responses -def get_brand_ecu_matches(ecu_rx_addrs: Set[EcuAddrBusType]) -> dict[str, set[AddrType]]: +def get_brand_ecu_matches(ecu_rx_addrs: set[EcuAddrBusType]) -> dict[str, set[AddrType]]: """Returns dictionary of brands and matches with ECUs in their FW versions""" brand_addrs = {brand: {(addr, subaddr) for _, addr, subaddr in config.get_all_ecus(VERSIONS[brand])} for @@ -231,7 +232,7 @@ def set_obd_multiplexing(params: Params, obd_multiplexing: bool): def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, num_pandas=1, debug=False, progress=False) -> \ - List[capnp.lib.capnp._DynamicStructBuilder]: + list[capnp.lib.capnp._DynamicStructBuilder]: """Queries for FW versions ordering brands by likelihood, breaks when exact match is found""" all_car_fw = [] @@ -254,7 +255,7 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, num_pand def get_fw_versions(logcan, sendcan, query_brand=None, extra=None, timeout=0.1, num_pandas=1, debug=False, progress=False) -> \ - List[capnp.lib.capnp._DynamicStructBuilder]: + list[capnp.lib.capnp._DynamicStructBuilder]: versions = VERSIONS.copy() params = Params() diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 8188ad4e6e..5c4d572fdb 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -1,7 +1,6 @@ from collections import defaultdict from dataclasses import dataclass from enum import Enum, StrEnum -from typing import Dict, List, Union from cereal import car from openpilot.selfdrive.car import dbc_dict @@ -98,7 +97,7 @@ class GMCarInfo(CarInfo): self.footnotes.append(Footnote.OBD_II) -CAR_INFO: Dict[str, Union[GMCarInfo, List[GMCarInfo]]] = { +CAR_INFO: dict[str, GMCarInfo | list[GMCarInfo]] = { CAR.HOLDEN_ASTRA: GMCarInfo("Holden Astra 2017"), CAR.VOLT: GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ"), CAR.CADILLAC_ATS: GMCarInfo("Cadillac ATS Premium Performance 2018"), @@ -181,7 +180,7 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x24b, None)], ) -DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis')) +DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis')) EV_CAR = {CAR.VOLT, CAR.BOLT_EUV} diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 517d2550a4..a2ef757d15 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -1,6 +1,5 @@ from dataclasses import dataclass from enum import Enum, IntFlag, StrEnum -from typing import Dict, List, Optional, Union from cereal import car from openpilot.common.conversions import Conversions as CV @@ -116,7 +115,7 @@ class HondaCarInfo(CarInfo): self.car_parts = CarParts.common([CarHarness.nidec]) -CAR_INFO: Dict[str, Optional[Union[HondaCarInfo, List[HondaCarInfo]]]] = { +CAR_INFO: dict[str, HondaCarInfo | list[HondaCarInfo] | None] = { CAR.ACCORD: [ 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), diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 20fc29897d..76ff0b39ce 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -1,7 +1,6 @@ import re from dataclasses import dataclass from enum import Enum, IntFlag, StrEnum -from typing import Dict, List, Optional, Set, Tuple, Union from cereal import car from panda.python import uds @@ -157,7 +156,7 @@ class HyundaiCarInfo(CarInfo): self.footnotes.insert(0, Footnote.CANFD) -CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = { +CAR_INFO: dict[str, HyundaiCarInfo | list[HyundaiCarInfo] | None] = { CAR.AZERA_6TH_GEN: HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), CAR.AZERA_HEV_6TH_GEN: [ HyundaiCarInfo("Hyundai Azera Hybrid 2019", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), @@ -316,7 +315,7 @@ class Buttons: CANCEL = 4 # on newer models, this is a pause/resume button -def get_platform_codes(fw_versions: List[bytes]) -> Set[Tuple[bytes, Optional[bytes]]]: +def get_platform_codes(fw_versions: list[bytes]) -> set[tuple[bytes, bytes | None]]: # Returns unique, platform-specific identification codes for a set of versions codes = set() # (code-Optional[part], date) for fw in fw_versions: @@ -335,12 +334,12 @@ def get_platform_codes(fw_versions: List[bytes]) -> Set[Tuple[bytes, Optional[by 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, 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. fuzzy_platform_blacklist = {str(c) for c in (CANFD_CAR - EV_CAR - CANFD_FUZZY_WHITELIST)} - candidates: Set[str] = set() + candidates: set[str] = set() for candidate, fws in offline_fw_versions.items(): # Keep track of ECUs which pass all checks (platform codes, within date range) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 2b0b148ccf..05610a6dd6 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -4,7 +4,8 @@ import numpy as np import tomllib from abc import abstractmethod, ABC from enum import StrEnum -from typing import Any, Dict, Optional, Tuple, List, Callable, NamedTuple, cast +from typing import Any, NamedTuple, cast +from collections.abc import Callable from cereal import car from openpilot.common.basedir import BASEDIR @@ -107,7 +108,7 @@ class CarInterfaceBase(ABC): return cls.get_params(candidate, gen_empty_fingerprint(), list(), False, False) @classmethod - def get_params(cls, candidate: str, fingerprint: Dict[int, Dict[int, int]], car_fw: List[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): ret = CarInterfaceBase.get_std_params(candidate) if hasattr(candidate, "config"): @@ -131,8 +132,8 @@ class CarInterfaceBase(ABC): @staticmethod @abstractmethod - def _get_params(ret: car.CarParams, candidate: str, fingerprint: Dict[int, Dict[int, int]], - car_fw: List[car.CarParams.CarFw], experimental_long: bool, docs: bool): + def _get_params(ret: car.CarParams, candidate: str, fingerprint: dict[int, dict[int, int]], + car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): raise NotImplementedError @staticmethod @@ -212,7 +213,7 @@ class CarInterfaceBase(ABC): def _update(self, c: car.CarControl) -> car.CarState: pass - def update(self, c: car.CarControl, can_strings: List[bytes]) -> car.CarState: + def update(self, c: car.CarControl, can_strings: list[bytes]) -> car.CarState: # parse can for cp in self.can_parsers: if cp is not None: @@ -246,7 +247,7 @@ class CarInterfaceBase(ABC): return reader @abstractmethod - def apply(self, c: car.CarControl, now_nanos: int) -> Tuple[car.CarControl.Actuators, List[bytes]]: + 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, @@ -417,11 +418,11 @@ class CarStateBase(ABC): return bool(left_blinker_stalk or self.left_blinker_cnt > 0), bool(right_blinker_stalk or self.right_blinker_cnt > 0) @staticmethod - def parse_gear_shifter(gear: Optional[str]) -> car.CarState.GearShifter: + def parse_gear_shifter(gear: str | None) -> car.CarState.GearShifter: if gear is None: return GearShifter.unknown - d: Dict[str, car.CarState.GearShifter] = { + d: dict[str, car.CarState.GearShifter] = { 'P': GearShifter.park, 'PARK': GearShifter.park, 'R': GearShifter.reverse, 'REVERSE': GearShifter.reverse, 'N': GearShifter.neutral, 'NEUTRAL': GearShifter.neutral, @@ -458,7 +459,7 @@ INTERFACE_ATTR_FILE = { # interface-specific helpers -def get_interface_attr(attr: str, combine_brands: bool = False, ignore_none: bool = False) -> Dict[str | StrEnum, Any]: +def get_interface_attr(attr: str, combine_brands: bool = False, ignore_none: bool = False) -> dict[str | StrEnum, Any]: # read all the folders in selfdrive/car and return a dict where: # - keys are all the car models or brand names # - values are attr values from all car folders @@ -491,7 +492,7 @@ class NanoFFModel: self.load_weights(platform) def load_weights(self, platform: str): - with open(self.weights_loc, 'r') as fob: + with open(self.weights_loc) as fob: self.weights = {k: np.array(v) for k, v in json.load(fob)[platform].items()} def relu(self, x: np.ndarray): @@ -506,7 +507,7 @@ class NanoFFModel: x = np.dot(x, self.weights['w_4']) + self.weights['b_4'] return x - def predict(self, x: List[float], do_sample: bool = False): + def predict(self, x: list[float], do_sample: bool = False): x = self.forward(np.array(x)) if do_sample: pred = np.random.laplace(x[0], np.exp(x[1]) / self.weights['temperature']) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index b43ab3df66..eaf76d6a72 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -1,6 +1,5 @@ from dataclasses import dataclass, field from enum import StrEnum -from typing import Dict, List, Union from cereal import car from openpilot.selfdrive.car import dbc_dict @@ -41,7 +40,7 @@ class MazdaCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) -CAR_INFO: Dict[str, Union[MazdaCarInfo, List[MazdaCarInfo]]] = { +CAR_INFO: dict[str, MazdaCarInfo | list[MazdaCarInfo]] = { CAR.CX5: MazdaCarInfo("Mazda CX-5 2017-21"), CAR.CX9: MazdaCarInfo("Mazda CX-9 2016-20"), CAR.MAZDA3: MazdaCarInfo("Mazda 3 2017-18"), diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index c6c96579b4..e75665c98f 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -1,5 +1,4 @@ from enum import StrEnum -from typing import Dict, List, Optional, Union from openpilot.selfdrive.car.docs_definitions import CarInfo @@ -8,6 +7,6 @@ class CAR(StrEnum): MOCK = 'mock' -CAR_INFO: Dict[str, Optional[Union[CarInfo, List[CarInfo]]]] = { +CAR_INFO: dict[str, CarInfo | list[CarInfo] | None] = { CAR.MOCK: None, } diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index d064ce894d..c0308f9e0d 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -1,6 +1,5 @@ from dataclasses import dataclass, field from enum import StrEnum -from typing import Dict, List, Optional, Union from cereal import car from panda.python import uds @@ -37,7 +36,7 @@ class NissanCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a])) -CAR_INFO: Dict[str, Optional[Union[NissanCarInfo, List[NissanCarInfo]]]] = { +CAR_INFO: dict[str, NissanCarInfo | list[NissanCarInfo] | None] = { CAR.XTRAIL: NissanCarInfo("Nissan X-Trail 2017"), CAR.LEAF: NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY"), CAR.LEAF_IC: None, # same platforms diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index b871a919e3..e496f43628 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -1,6 +1,5 @@ from dataclasses import dataclass, field from enum import Enum, IntFlag -from typing import List from cereal import car from panda.python import uds @@ -81,7 +80,7 @@ class Footnote(Enum): class SubaruCarInfo(CarInfo): 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]) + footnotes: list[Enum] = field(default_factory=lambda: [Footnote.GLOBAL]) def init_make(self, CP: car.CarParams): self.car_parts.parts.extend([Tool.socket_8mm_deep, Tool.pry_tool]) diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 12877f1344..2a51d15da8 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -1,6 +1,5 @@ from collections import namedtuple from enum import StrEnum -from typing import Dict, List, Union from cereal import car from openpilot.selfdrive.car import AngleRateLimit, dbc_dict @@ -17,7 +16,7 @@ class CAR(StrEnum): AP2_MODELS = 'TESLA AP2 MODEL S' -CAR_INFO: Dict[str, Union[CarInfo, List[CarInfo]]] = { +CAR_INFO: dict[str, CarInfo | list[CarInfo]] = { CAR.AP1_MODELS: CarInfo("Tesla AP1 Model S", "All"), CAR.AP2_MODELS: CarInfo("Tesla AP2 Model S", "All"), } diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index f7ae4e038e..9c14c0d252 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -from typing import NamedTuple, Optional +from typing import NamedTuple from openpilot.selfdrive.car.chrysler.values import CAR as CHRYSLER from openpilot.selfdrive.car.gm.values import CAR as GM @@ -29,8 +29,8 @@ non_tested_cars = [ class CarTestRoute(NamedTuple): route: str - car_model: Optional[str] - segment: Optional[int] = None + car_model: str | None + segment: int | None = None routes = [ diff --git a/selfdrive/car/tests/test_docs.py b/selfdrive/car/tests/test_docs.py index d9d67fe87d..0cafb508f7 100755 --- a/selfdrive/car/tests/test_docs.py +++ b/selfdrive/car/tests/test_docs.py @@ -20,7 +20,7 @@ class TestCarDocs(unittest.TestCase): def test_generator(self): generated_cars_md = generate_cars_md(self.all_cars, CARS_MD_TEMPLATE) - with open(CARS_MD_OUT, "r") as f: + with open(CARS_MD_OUT) as f: current_cars_md = f.read() self.assertEqual(generated_cars_md, current_cars_md, @@ -45,7 +45,7 @@ class TestCarDocs(unittest.TestCase): all_car_info_platforms = get_interface_attr("CAR_INFO", combine_brands=True).keys() for platform in sorted(interfaces.keys()): with self.subTest(platform=platform): - self.assertTrue(platform in all_car_info_platforms, "Platform: {} doesn't exist in CarInfo".format(platform)) + self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't exist in CarInfo") def test_naming_conventions(self): # Asserts market-standard car naming conventions by brand diff --git a/selfdrive/car/tests/test_fingerprints.py b/selfdrive/car/tests/test_fingerprints.py index 61e9a4d165..34f30bc703 100755 --- a/selfdrive/car/tests/test_fingerprints.py +++ b/selfdrive/car/tests/test_fingerprints.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import os import sys -from typing import Dict, List from openpilot.common.basedir import BASEDIR @@ -64,7 +63,7 @@ def check_can_ignition_conflicts(fingerprints, brands): if __name__ == "__main__": fingerprints = _get_fingerprints() - fingerprints_flat: List[Dict] = [] + fingerprints_flat: list[dict] = [] car_names = [] brand_names = [] for brand in fingerprints: diff --git a/selfdrive/car/tests/test_lateral_limits.py b/selfdrive/car/tests/test_lateral_limits.py index 10e24ff4c5..083cdd5a5e 100755 --- a/selfdrive/car/tests/test_lateral_limits.py +++ b/selfdrive/car/tests/test_lateral_limits.py @@ -3,7 +3,6 @@ from collections import defaultdict import importlib from parameterized import parameterized_class import sys -from typing import DefaultDict, Dict import unittest from openpilot.common.realtime import DT_CTRL @@ -29,7 +28,7 @@ ABOVE_LIMITS_CARS = [ SUBARU.OUTBACK, ] -car_model_jerks: DefaultDict[str, Dict[str, float]] = defaultdict(dict) +car_model_jerks: defaultdict[str, dict[str, float]] = defaultdict(dict) @parameterized_class('car_model', [(c,) for c in sorted(CAR_MODELS)]) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index ec7527713d..2b29c14f72 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -8,7 +8,6 @@ import unittest from collections import defaultdict, Counter import hypothesis.strategies as st from hypothesis import Phase, given, settings -from typing import List, Optional, Tuple from parameterized import parameterized_class from cereal import messaging, log, car @@ -40,7 +39,7 @@ MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "300")) CI = os.environ.get("CI", None) is not None -def get_test_cases() -> List[Tuple[str, Optional[CarTestRoute]]]: +def get_test_cases() -> list[tuple[str, CarTestRoute | None]]: # build list of test cases test_cases = [] if not len(INTERNAL_SEG_LIST): @@ -65,14 +64,14 @@ def get_test_cases() -> List[Tuple[str, Optional[CarTestRoute]]]: @pytest.mark.slow @pytest.mark.shared_download_cache class TestCarModelBase(unittest.TestCase): - car_model: Optional[str] = None - test_route: Optional[CarTestRoute] = None + car_model: str | None = None + test_route: CarTestRoute | None = None test_route_on_bucket: bool = True # whether the route is on the preserved CI bucket - can_msgs: List[capnp.lib.capnp._DynamicStructReader] + can_msgs: list[capnp.lib.capnp._DynamicStructReader] fingerprint: dict[int, dict[int, int]] - elm_frame: Optional[int] - car_safety_mode_frame: Optional[int] + elm_frame: int | None + car_safety_mode_frame: int | None @classmethod def get_testing_data_from_logreader(cls, lr): @@ -408,7 +407,7 @@ class TestCarModelBase(unittest.TestCase): controls_allowed_prev = False CS_prev = car.CarState.new_message() - checks = defaultdict(lambda: 0) + checks = defaultdict(int) controlsd = Controls(CI=self.CI) controlsd.initialized = True for idx, can in enumerate(self.can_msgs): diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index ed2b022f43..011d153f70 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -2,7 +2,6 @@ import re from collections import defaultdict from dataclasses import dataclass, field from enum import Enum, IntFlag, StrEnum -from typing import Dict, List, Set, Union from cereal import car from openpilot.common.conversions import Conversions as CV @@ -100,7 +99,7 @@ class ToyotaCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a])) -CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { +CAR_INFO: dict[str, ToyotaCarInfo | list[ToyotaCarInfo]] = { # Toyota CAR.ALPHARD_TSS2: [ ToyotaCarInfo("Toyota Alphard 2019-20"), @@ -253,7 +252,7 @@ STATIC_DSU_MSGS = [ ] -def get_platform_codes(fw_versions: List[bytes]) -> Dict[bytes, Set[bytes]]: +def get_platform_codes(fw_versions: list[bytes]) -> dict[bytes, set[bytes]]: # Returns sub versions in a dict so comparisons can be made within part-platform-major_version combos codes = defaultdict(set) # Optional[part]-platform-major_version: set of sub_version for fw in fw_versions: @@ -297,7 +296,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, offline_fw_versions) -> set[str]: candidates = set() for candidate, fws in offline_fw_versions.items(): diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index b09cbc5d8a..e49b9850be 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,7 +1,6 @@ from collections import defaultdict, namedtuple from dataclasses import dataclass, field from enum import Enum, IntFlag, StrEnum -from typing import Dict, List, Union from cereal import car from panda.python import uds @@ -151,7 +150,7 @@ class CAR(StrEnum): PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} -DBC: Dict[str, Dict[str, str]] = defaultdict(lambda: dbc_dict("vw_mqb_2010", None)) +DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict("vw_mqb_2010", None)) for car_type in PQ_CARS: DBC[car_type] = dbc_dict("vw_golf_mk4", None) @@ -191,7 +190,7 @@ class VWCarInfo(CarInfo): self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) -CAR_INFO: Dict[str, Union[VWCarInfo, List[VWCarInfo]]] = { +CAR_INFO: dict[str, VWCarInfo | list[VWCarInfo]] = { CAR.ARTEON_MK1: [ VWCarInfo("Volkswagen Arteon 2018-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarInfo("Volkswagen Arteon R 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), diff --git a/selfdrive/controls/lib/alertmanager.py b/selfdrive/controls/lib/alertmanager.py index 6abcf4cbba..8034c8ebbc 100644 --- a/selfdrive/controls/lib/alertmanager.py +++ b/selfdrive/controls/lib/alertmanager.py @@ -3,7 +3,6 @@ import os import json from collections import defaultdict from dataclasses import dataclass -from typing import List, Dict, Optional from openpilot.common.basedir import BASEDIR from openpilot.common.params import Params @@ -14,7 +13,7 @@ with open(os.path.join(BASEDIR, "selfdrive/controls/lib/alerts_offroad.json")) a OFFROAD_ALERTS = json.load(f) -def set_offroad_alert(alert: str, show_alert: bool, extra_text: Optional[str] = None) -> None: +def set_offroad_alert(alert: str, show_alert: bool, extra_text: str | None = None) -> None: if show_alert: a = copy.copy(OFFROAD_ALERTS[alert]) a['extra'] = extra_text or '' @@ -25,7 +24,7 @@ def set_offroad_alert(alert: str, show_alert: bool, extra_text: Optional[str] = @dataclass class AlertEntry: - alert: Optional[Alert] = None + alert: Alert | None = None start_frame: int = -1 end_frame: int = -1 @@ -34,9 +33,9 @@ class AlertEntry: class AlertManager: def __init__(self): - self.alerts: Dict[str, AlertEntry] = defaultdict(AlertEntry) + self.alerts: dict[str, AlertEntry] = defaultdict(AlertEntry) - def add_many(self, frame: int, alerts: List[Alert]) -> None: + def add_many(self, frame: int, alerts: list[Alert]) -> None: for alert in alerts: entry = self.alerts[alert.alert_type] entry.alert = alert @@ -45,7 +44,7 @@ class AlertManager: min_end_frame = entry.start_frame + alert.duration entry.end_frame = max(frame + 1, min_end_frame) - def process_alerts(self, frame: int, clear_event_types: set) -> Optional[Alert]: + def process_alerts(self, frame: int, clear_event_types: set) -> Alert | None: current_alert = AlertEntry() for v in self.alerts.values(): if not v.alert: diff --git a/selfdrive/controls/lib/events.py b/selfdrive/controls/lib/events.py index d68c95bcf5..c5228ef7f2 100755 --- a/selfdrive/controls/lib/events.py +++ b/selfdrive/controls/lib/events.py @@ -2,7 +2,7 @@ import math import os from enum import IntEnum -from typing import Dict, Union, Callable, List, Optional +from collections.abc import Callable from cereal import log, car import cereal.messaging as messaging @@ -48,12 +48,12 @@ EVENT_NAME = {v: k for k, v in EventName.schema.enumerants.items()} class Events: def __init__(self): - self.events: List[int] = [] - self.static_events: List[int] = [] + self.events: list[int] = [] + self.static_events: list[int] = [] self.events_prev = dict.fromkeys(EVENTS.keys(), 0) @property - def names(self) -> List[int]: + def names(self) -> list[int]: return self.events def __len__(self) -> int: @@ -71,7 +71,7 @@ class Events: def contains(self, event_type: str) -> bool: return any(event_type in EVENTS.get(e, {}) for e in self.events) - def create_alerts(self, event_types: List[str], callback_args=None): + def create_alerts(self, event_types: list[str], callback_args=None): if callback_args is None: callback_args = [] @@ -132,7 +132,7 @@ class Alert: self.creation_delay = creation_delay self.alert_type = "" - self.event_type: Optional[str] = None + self.event_type: str | None = None def __str__(self) -> str: return f"{self.alert_text_1}/{self.alert_text_2} {self.priority} {self.visual_alert} {self.audible_alert}" @@ -333,7 +333,7 @@ def joystick_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, -EVENTS: Dict[int, Dict[str, Union[Alert, AlertCallbackType]]] = { +EVENTS: dict[int, dict[str, Alert | AlertCallbackType]] = { # ********** events with no alerts ********** EventName.stockFcw: {}, @@ -965,7 +965,7 @@ if __name__ == '__main__': from collections import defaultdict event_names = {v: k for k, v in EventName.schema.enumerants.items()} - alerts_by_type: Dict[str, Dict[Priority, List[str]]] = defaultdict(lambda: defaultdict(list)) + alerts_by_type: dict[str, dict[Priority, list[str]]] = defaultdict(lambda: defaultdict(list)) CP = car.CarParams.new_message() CS = car.CarState.new_message() @@ -977,7 +977,7 @@ if __name__ == '__main__': alert = alert(CP, CS, sm, False, 1) alerts_by_type[et][alert.priority].append(event_names[i]) - all_alerts: Dict[str, List[tuple[Priority, List[str]]]] = {} + all_alerts: dict[str, list[tuple[Priority, list[str]]]] = {} for et, priority_alerts in alerts_by_type.items(): all_alerts[et] = sorted(priority_alerts.items(), key=lambda x: x[0], reverse=True) diff --git a/selfdrive/controls/lib/vehicle_model.py b/selfdrive/controls/lib/vehicle_model.py index 0750384918..b6f50b4ba8 100755 --- a/selfdrive/controls/lib/vehicle_model.py +++ b/selfdrive/controls/lib/vehicle_model.py @@ -12,7 +12,6 @@ x_dot = A*x + B*u A depends on longitudinal speed, u [m/s], and vehicle parameters CP """ -from typing import Tuple import numpy as np from numpy.linalg import solve @@ -169,7 +168,7 @@ def kin_ss_sol(sa: float, u: float, VM: VehicleModel) -> np.ndarray: return K * sa -def create_dyn_state_matrices(u: float, VM: VehicleModel) -> Tuple[np.ndarray, np.ndarray]: +def create_dyn_state_matrices(u: float, VM: VehicleModel) -> tuple[np.ndarray, np.ndarray]: """Returns the A and B matrix for the dynamics system Args: diff --git a/selfdrive/controls/radard.py b/selfdrive/controls/radard.py index b0b9350dec..4de4208e9d 100755 --- a/selfdrive/controls/radard.py +++ b/selfdrive/controls/radard.py @@ -2,7 +2,7 @@ import importlib import math from collections import deque -from typing import Optional, Dict, Any +from typing import Any, Optional import capnp from cereal import messaging, log, car @@ -125,7 +125,7 @@ def laplacian_pdf(x: float, mu: float, b: float): return math.exp(-abs(x-mu)/b) -def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, tracks: Dict[int, Track]): +def match_vision_to_track(v_ego: float, lead: capnp._DynamicStructReader, tracks: dict[int, Track]): offset_vision_dist = lead.x[0] - RADAR_TO_CAMERA def prob(c): @@ -166,8 +166,8 @@ def get_RadarState_from_vision(lead_msg: capnp._DynamicStructReader, v_ego: floa } -def get_lead(v_ego: float, ready: bool, tracks: Dict[int, Track], lead_msg: capnp._DynamicStructReader, - model_v_ego: float, low_speed_override: bool = True) -> Dict[str, Any]: +def get_lead(v_ego: float, ready: bool, tracks: dict[int, Track], lead_msg: capnp._DynamicStructReader, + model_v_ego: float, low_speed_override: bool = True) -> dict[str, Any]: # Determine leads, this is where the essential logic happens if len(tracks) > 0 and ready and lead_msg.prob > .5: track = match_vision_to_track(v_ego, lead_msg, tracks) @@ -196,14 +196,14 @@ class RadarD: def __init__(self, radar_ts: float, delay: int = 0): self.current_time = 0.0 - self.tracks: Dict[int, Track] = {} + self.tracks: dict[int, Track] = {} self.kalman_params = KalmanParams(radar_ts) self.v_ego = 0.0 self.v_ego_hist = deque([0.0], maxlen=delay+1) self.last_v_ego_frame = -1 - self.radar_state: Optional[capnp._DynamicStructBuilder] = None + self.radar_state: capnp._DynamicStructBuilder | None = None self.radar_state_valid = False self.ready = False diff --git a/selfdrive/debug/can_print_changes.py b/selfdrive/debug/can_print_changes.py index 810e45cfc6..97d60b2b05 100755 --- a/selfdrive/debug/can_print_changes.py +++ b/selfdrive/debug/can_print_changes.py @@ -3,7 +3,6 @@ import argparse import binascii import time from collections import defaultdict -from typing import Optional import cereal.messaging as messaging from openpilot.selfdrive.debug.can_table import can_table @@ -96,8 +95,8 @@ if __name__ == "__main__": args = parser.parse_args() - init_lr: Optional[LogIterable] = None - new_lr: Optional[LogIterable] = None + init_lr: LogIterable | None = None + new_lr: LogIterable | None = None if args.init: if args.init == '': diff --git a/selfdrive/debug/check_freq.py b/selfdrive/debug/check_freq.py index 7e7b05e950..1765aeb86b 100755 --- a/selfdrive/debug/check_freq.py +++ b/selfdrive/debug/check_freq.py @@ -3,7 +3,7 @@ import argparse import numpy as np import time from collections import defaultdict, deque -from typing import DefaultDict, Deque, MutableSequence +from collections.abc import MutableSequence import cereal.messaging as messaging @@ -19,8 +19,8 @@ if __name__ == "__main__": socket_names = args.socket sockets = {} - rcv_times: DefaultDict[str, MutableSequence[float]] = defaultdict(lambda: deque(maxlen=100)) - valids: DefaultDict[str, Deque[bool]] = defaultdict(lambda: deque(maxlen=100)) + rcv_times: defaultdict[str, MutableSequence[float]] = defaultdict(lambda: deque(maxlen=100)) + valids: defaultdict[str, deque[bool]] = defaultdict(lambda: deque(maxlen=100)) t = time.monotonic() for name in socket_names: diff --git a/selfdrive/debug/check_lag.py b/selfdrive/debug/check_lag.py index 72d11d6eda..341ae79c8b 100755 --- a/selfdrive/debug/check_lag.py +++ b/selfdrive/debug/check_lag.py @@ -1,5 +1,4 @@ #!/usr/bin/env python3 -from typing import Dict import cereal.messaging as messaging from cereal.services import SERVICE_LIST @@ -10,7 +9,7 @@ TO_CHECK = ['carState'] if __name__ == "__main__": sm = messaging.SubMaster(TO_CHECK) - prev_t: Dict[str, float] = {} + prev_t: dict[str, float] = {} while True: sm.update() diff --git a/selfdrive/debug/check_timings.py b/selfdrive/debug/check_timings.py index fb8467a3c4..3de6b8eb66 100755 --- a/selfdrive/debug/check_timings.py +++ b/selfdrive/debug/check_timings.py @@ -3,13 +3,13 @@ import sys import time import numpy as np -from typing import DefaultDict, MutableSequence +from collections.abc import MutableSequence from collections import defaultdict, deque import cereal.messaging as messaging socks = {s: messaging.sub_sock(s, conflate=False) for s in sys.argv[1:]} -ts: DefaultDict[str, MutableSequence[float]] = defaultdict(lambda: deque(maxlen=100)) +ts: defaultdict[str, MutableSequence[float]] = defaultdict(lambda: deque(maxlen=100)) if __name__ == "__main__": while True: diff --git a/selfdrive/debug/count_events.py b/selfdrive/debug/count_events.py index 30e9bf8ec5..5942054757 100755 --- a/selfdrive/debug/count_events.py +++ b/selfdrive/debug/count_events.py @@ -4,7 +4,7 @@ import math import datetime from collections import Counter from pprint import pprint -from typing import List, Tuple, cast +from typing import cast from cereal.services import SERVICE_LIST from openpilot.tools.lib.logreader import LogReader, ReadMode @@ -15,8 +15,8 @@ if __name__ == "__main__": cams = [s for s in SERVICE_LIST if s.endswith('CameraState')] cnt_cameras = dict.fromkeys(cams, 0) - events: List[Tuple[float, set[str]]] = [] - alerts: List[Tuple[float, str]] = [] + events: list[tuple[float, set[str]]] = [] + alerts: list[tuple[float, str]] = [] start_time = math.inf end_time = -math.inf ignition_off = None diff --git a/selfdrive/debug/cpu_usage_stat.py b/selfdrive/debug/cpu_usage_stat.py index 9050fbb064..ec9d02e8f4 100755 --- a/selfdrive/debug/cpu_usage_stat.py +++ b/selfdrive/debug/cpu_usage_stat.py @@ -66,12 +66,12 @@ if __name__ == "__main__": for p in psutil.process_iter(): if p == psutil.Process(): continue - matched = any(l for l in p.cmdline() if any(pn for pn in monitored_proc_names if re.match(r'.*{}.*'.format(pn), l, re.M | re.I))) + matched = any(l for l in p.cmdline() if any(pn for pn in monitored_proc_names if re.match(fr'.*{pn}.*', l, re.M | re.I))) if matched: k = ' '.join(p.cmdline()) print('Add monitored proc:', k) stats[k] = {'cpu_samples': defaultdict(list), 'min': defaultdict(lambda: None), 'max': defaultdict(lambda: None), - 'avg': defaultdict(lambda: 0.0), 'last_cpu_times': None, 'last_sys_time': None} + 'avg': defaultdict(float), 'last_cpu_times': None, 'last_sys_time': None} stats[k]['last_sys_time'] = timer() stats[k]['last_cpu_times'] = p.cpu_times() monitored_procs.append(p) diff --git a/selfdrive/debug/format_fingerprints.py b/selfdrive/debug/format_fingerprints.py index bd5822729a..2a5e4e6080 100755 --- a/selfdrive/debug/format_fingerprints.py +++ b/selfdrive/debug/format_fingerprints.py @@ -67,7 +67,7 @@ def format_brand_fw_versions(brand, extra_fw_versions: None | dict[str, dict[tup extra_fw_versions = extra_fw_versions or {} fingerprints_file = os.path.join(BASEDIR, f"selfdrive/car/{brand}/fingerprints.py") - with open(fingerprints_file, "r") as f: + with open(fingerprints_file) as f: comments = [line for line in f.readlines() if line.startswith("#") and "noqa" not in line] with open(fingerprints_file, "w") as f: diff --git a/selfdrive/debug/internal/measure_modeld_packet_drop.py b/selfdrive/debug/internal/measure_modeld_packet_drop.py index 6b7f7dbd13..9814942ce2 100755 --- a/selfdrive/debug/internal/measure_modeld_packet_drop.py +++ b/selfdrive/debug/internal/measure_modeld_packet_drop.py @@ -1,12 +1,11 @@ #!/usr/bin/env python3 import cereal.messaging as messaging -from typing import Optional if __name__ == "__main__": modeld_sock = messaging.sub_sock("modelV2") last_frame_id = None - start_t: Optional[int] = None + start_t: int | None = None frame_cnt = 0 dropped = 0 diff --git a/selfdrive/debug/live_cpu_and_temp.py b/selfdrive/debug/live_cpu_and_temp.py index 06f1be0b00..8549b92665 100755 --- a/selfdrive/debug/live_cpu_and_temp.py +++ b/selfdrive/debug/live_cpu_and_temp.py @@ -5,7 +5,6 @@ from collections import defaultdict from cereal.messaging import SubMaster from openpilot.common.numpy_fast import mean -from typing import Optional, Dict def cputime_total(ct): return ct.user + ct.nice + ct.system + ct.idle + ct.iowait + ct.irq + ct.softirq @@ -42,8 +41,8 @@ if __name__ == "__main__": total_times = [0.]*8 busy_times = [0.]*8 - prev_proclog: Optional[capnp._DynamicStructReader] = None - prev_proclog_t: Optional[int] = None + prev_proclog: capnp._DynamicStructReader | None = None + prev_proclog_t: int | None = None while True: sm.update() @@ -76,7 +75,7 @@ if __name__ == "__main__": print(f"CPU {100.0 * mean(cores):.2f}% - RAM: {last_mem:.2f}% - Temp {last_temp:.2f}C") if args.cpu and prev_proclog is not None and prev_proclog_t is not None: - procs: Dict[str, float] = defaultdict(float) + procs: dict[str, float] = defaultdict(float) dt = (sm.logMonoTime['procLog'] - prev_proclog_t) / 1e9 for proc in m.procs: try: diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index da1c4ec37b..1456bf16f5 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -10,7 +10,7 @@ import gc import os import capnp import numpy as np -from typing import List, NoReturn, Optional +from typing import NoReturn from cereal import log import cereal.messaging as messaging @@ -89,7 +89,7 @@ class Calibrator: valid_blocks: int = 0, wide_from_device_euler_init: np.ndarray = WIDE_FROM_DEVICE_EULER_INIT, height_init: np.ndarray = HEIGHT_INIT, - smooth_from: Optional[np.ndarray] = None) -> None: + smooth_from: np.ndarray | None = None) -> None: if not np.isfinite(rpy_init).all(): self.rpy = RPY_INIT.copy() else: @@ -125,7 +125,7 @@ class Calibrator: self.old_rpy = smooth_from self.old_rpy_weight = 1.0 - def get_valid_idxs(self) -> List[int]: + def get_valid_idxs(self) -> list[int]: # exclude current block_idx from validity window before_current = list(range(self.block_idx)) after_current = list(range(min(self.valid_blocks, self.block_idx + 1), self.valid_blocks)) @@ -175,12 +175,12 @@ class Calibrator: else: return self.rpy - def handle_cam_odom(self, trans: List[float], - rot: List[float], - wide_from_device_euler: List[float], - trans_std: List[float], - road_transform_trans: List[float], - road_transform_trans_std: List[float]) -> Optional[np.ndarray]: + def handle_cam_odom(self, trans: list[float], + rot: list[float], + wide_from_device_euler: list[float], + trans_std: list[float], + road_transform_trans: list[float], + road_transform_trans_std: list[float]) -> np.ndarray | None: self.old_rpy_weight = max(0.0, self.old_rpy_weight - 1/SMOOTH_CYCLES) straight_and_fast = ((self.v_ego > MIN_SPEED_FILTER) and (trans[0] > MIN_SPEED_FILTER) and (abs(rot[2]) < MAX_YAW_RATE_FILTER)) diff --git a/selfdrive/locationd/helpers.py b/selfdrive/locationd/helpers.py index c292e9886c..c273ba87b3 100644 --- a/selfdrive/locationd/helpers.py +++ b/selfdrive/locationd/helpers.py @@ -1,5 +1,5 @@ import numpy as np -from typing import List, Optional, Tuple, Any +from typing import Any from cereal import log @@ -12,7 +12,7 @@ class NPQueue: def __len__(self) -> int: return len(self.arr) - def append(self, pt: List[float]) -> None: + def append(self, pt: list[float]) -> None: if len(self.arr) < self.maxlen: self.arr = np.append(self.arr, [pt], axis=0) else: @@ -21,7 +21,7 @@ class NPQueue: class PointBuckets: - def __init__(self, x_bounds: List[Tuple[float, float]], min_points: List[float], min_points_total: int, points_per_bucket: int, rowsize: int) -> None: + def __init__(self, x_bounds: list[tuple[float, float]], min_points: list[float], min_points_total: int, points_per_bucket: int, rowsize: int) -> None: self.x_bounds = x_bounds self.buckets = {bounds: NPQueue(maxlen=points_per_bucket, rowsize=rowsize) for bounds in x_bounds} self.buckets_min_points = dict(zip(x_bounds, min_points, strict=True)) @@ -41,13 +41,13 @@ class PointBuckets: def add_point(self, x: float, y: float, bucket_val: float) -> None: raise NotImplementedError - def get_points(self, num_points: Optional[int] = None) -> Any: + def get_points(self, num_points: int | None = None) -> Any: points = np.vstack([x.arr for x in self.buckets.values()]) if num_points is None: return points return points[np.random.choice(np.arange(len(points)), min(len(points), num_points), replace=False)] - def load_points(self, points: List[List[float]]) -> None: + def load_points(self, points: list[list[float]]) -> None: for point in points: self.add_point(*point) diff --git a/selfdrive/locationd/models/car_kf.py b/selfdrive/locationd/models/car_kf.py index 9230cb48f0..1f3e447a19 100755 --- a/selfdrive/locationd/models/car_kf.py +++ b/selfdrive/locationd/models/car_kf.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 import math import sys -from typing import Any, Dict +from typing import Any import numpy as np @@ -70,7 +70,7 @@ class CarKalman(KalmanFilter): ]) P_initial = Q.copy() - obs_noise: Dict[int, Any] = { + obs_noise: dict[int, Any] = { ObservationKind.STEER_ANGLE: np.atleast_2d(math.radians(0.05)**2), ObservationKind.ANGLE_OFFSET_FAST: np.atleast_2d(math.radians(10.0)**2), ObservationKind.ROAD_ROLL: np.atleast_2d(math.radians(1.0)**2), diff --git a/selfdrive/manager/build.py b/selfdrive/manager/build.py index f2758cf32b..067e1b5a1e 100755 --- a/selfdrive/manager/build.py +++ b/selfdrive/manager/build.py @@ -2,7 +2,6 @@ import os import subprocess from pathlib import Path -from typing import List # NOTE: Do NOT import anything here that needs be built (e.g. params) from openpilot.common.basedir import BASEDIR @@ -29,7 +28,7 @@ def build(spinner: Spinner, dirty: bool = False, minimal: bool = False) -> None: # building with all cores can result in using too # much memory, so retry with less parallelism - compile_output: List[bytes] = [] + compile_output: list[bytes] = [] for n in (nproc, nproc/2, 1): compile_output.clear() scons: subprocess.Popen = subprocess.Popen(["scons", f"-j{int(n)}", "--cache-populate", *extra_args], cwd=BASEDIR, env=env, stderr=subprocess.PIPE) diff --git a/selfdrive/manager/manager.py b/selfdrive/manager/manager.py index bf1eeb8fd0..24dceaaf08 100755 --- a/selfdrive/manager/manager.py +++ b/selfdrive/manager/manager.py @@ -4,7 +4,6 @@ import os import signal import sys import traceback -from typing import List, Tuple, Union from cereal import log import cereal.messaging as messaging @@ -33,7 +32,7 @@ def manager_init() -> None: if is_release_branch(): params.clear_all(ParamKeyType.DEVELOPMENT_ONLY) - default_params: List[Tuple[str, Union[str, bytes]]] = [ + default_params: list[tuple[str, str | bytes]] = [ ("CompletedTrainingVersion", "0"), ("DisengageOnAccelerator", "0"), ("GsmMetered", "1"), @@ -121,7 +120,7 @@ def manager_thread() -> None: params = Params() - ignore: List[str] = [] + ignore: list[str] = [] if params.get("DongleId", encoding='utf8') in (None, UNREGISTERED_DONGLE_ID): ignore += ["manage_athenad", "uploader"] if os.getenv("NOBOARD") is not None: @@ -154,7 +153,7 @@ def manager_thread() -> None: ensure_running(managed_processes.values(), started, params=params, CP=sm['carParams'], not_run=ignore) - running = ' '.join("%s%s\u001b[0m" % ("\u001b[32m" if p.proc.is_alive() else "\u001b[31m", p.name) + running = ' '.join("{}{}\u001b[0m".format("\u001b[32m" if p.proc.is_alive() else "\u001b[31m", p.name) for p in managed_processes.values() if p.proc) print(running) cloudlog.debug(running) diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py index ac1b4ac68c..46fb68f89c 100644 --- a/selfdrive/manager/process.py +++ b/selfdrive/manager/process.py @@ -4,7 +4,7 @@ import signal import struct import time import subprocess -from typing import Optional, Callable, List, ValuesView +from collections.abc import Callable, ValuesView from abc import ABC, abstractmethod from multiprocessing import Process @@ -47,7 +47,7 @@ def launcher(proc: str, name: str) -> None: raise -def nativelauncher(pargs: List[str], cwd: str, name: str) -> None: +def nativelauncher(pargs: list[str], cwd: str, name: str) -> None: os.environ['MANAGER_DAEMON'] = name # exec the process @@ -67,12 +67,12 @@ class ManagerProcess(ABC): daemon = False sigkill = False should_run: Callable[[bool, Params, car.CarParams], bool] - proc: Optional[Process] = None + proc: Process | None = None enabled = True name = "" last_watchdog_time = 0 - watchdog_max_dt: Optional[int] = None + watchdog_max_dt: int | None = None watchdog_seen = False shutting_down = False @@ -109,7 +109,7 @@ class ManagerProcess(ABC): else: self.watchdog_seen = True - def stop(self, retry: bool = True, block: bool = True, sig: Optional[signal.Signals] = None) -> Optional[int]: + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None) -> int | None: if self.proc is None: return None @@ -274,7 +274,7 @@ class DaemonProcess(ManagerProcess): def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None, CP: car.CarParams=None, - not_run: Optional[List[str]]=None) -> List[ManagerProcess]: + not_run: list[str] | None=None) -> list[ManagerProcess]: if not_run is None: not_run = [] diff --git a/selfdrive/modeld/dmonitoringmodeld.py b/selfdrive/modeld/dmonitoringmodeld.py index 1e25964702..ef403b44fc 100755 --- a/selfdrive/modeld/dmonitoringmodeld.py +++ b/selfdrive/modeld/dmonitoringmodeld.py @@ -6,7 +6,6 @@ import time import ctypes import numpy as np from pathlib import Path -from typing import Tuple, Dict from cereal import messaging from cereal.messaging import PubMaster, SubMaster @@ -53,7 +52,7 @@ class DMonitoringModelResult(ctypes.Structure): ("wheel_on_right_prob", ctypes.c_float)] class ModelState: - inputs: Dict[str, np.ndarray] + inputs: dict[str, np.ndarray] output: np.ndarray model: ModelRunner @@ -68,7 +67,7 @@ class ModelState: self.model.addInput("input_img", None) self.model.addInput("calib", self.inputs['calib']) - def run(self, buf:VisionBuf, calib:np.ndarray) -> Tuple[np.ndarray, float]: + def run(self, buf:VisionBuf, calib:np.ndarray) -> tuple[np.ndarray, float]: self.inputs['calib'][:] = calib v_offset = buf.height - MODEL_HEIGHT diff --git a/selfdrive/modeld/fill_model_msg.py b/selfdrive/modeld/fill_model_msg.py index c76966867a..c39ec2da3d 100644 --- a/selfdrive/modeld/fill_model_msg.py +++ b/selfdrive/modeld/fill_model_msg.py @@ -1,7 +1,6 @@ import os import capnp import numpy as np -from typing import Dict from cereal import log from openpilot.selfdrive.modeld.constants import ModelConstants, Plan, Meta @@ -42,7 +41,7 @@ def fill_xyvat(builder, t, x, y, v, a, x_std=None, y_std=None, v_std=None, a_std if a_std is not None: builder.aStd = a_std.tolist() -def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: Dict[str, np.ndarray], publish_state: PublishState, +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: @@ -174,7 +173,7 @@ def fill_model_msg(msg: capnp._DynamicStructBuilder, net_output_data: Dict[str, if SEND_RAW_PRED: modelV2.rawPredictions = net_output_data['raw_pred'].tobytes() -def fill_pose_msg(msg: capnp._DynamicStructBuilder, net_output_data: Dict[str, np.ndarray], +def fill_pose_msg(msg: capnp._DynamicStructBuilder, net_output_data: dict[str, np.ndarray], vipc_frame_id: int, vipc_dropped_frames: int, timestamp_eof: int, live_calib_seen: bool) -> None: msg.valid = live_calib_seen & (vipc_dropped_frames < 1) cameraOdometry = msg.cameraOdometry diff --git a/selfdrive/modeld/get_model_metadata.py b/selfdrive/modeld/get_model_metadata.py index 187f83399b..144860204f 100755 --- a/selfdrive/modeld/get_model_metadata.py +++ b/selfdrive/modeld/get_model_metadata.py @@ -4,9 +4,8 @@ import pathlib import onnx import codecs import pickle -from typing import Tuple -def get_name_and_shape(value_info:onnx.ValueInfoProto) -> Tuple[str, Tuple[int,...]]: +def get_name_and_shape(value_info:onnx.ValueInfoProto) -> tuple[str, tuple[int,...]]: shape = tuple([int(dim.dim_value) for dim in value_info.type.tensor_type.shape.dim]) name = value_info.name return name, shape diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index f2842d94b7..e086b8aaf8 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -6,7 +6,6 @@ import numpy as np import cereal.messaging as messaging from cereal import car, log from pathlib import Path -from typing import Dict, Optional from setproctitle import setproctitle from cereal.messaging import PubMaster, SubMaster from cereal.visionipc import VisionIpcClient, VisionStreamType, VisionBuf @@ -45,7 +44,7 @@ class FrameMeta: class ModelState: frame: ModelFrame wide_frame: ModelFrame - inputs: Dict[str, np.ndarray] + inputs: dict[str, np.ndarray] output: np.ndarray prev_desire: np.ndarray # for tracking the rising edge of the pulse model: ModelRunner @@ -78,14 +77,14 @@ class ModelState: for k,v in self.inputs.items(): self.model.addInput(k, v) - def slice_outputs(self, model_outputs: np.ndarray) -> Dict[str, np.ndarray]: + def slice_outputs(self, model_outputs: np.ndarray) -> dict[str, np.ndarray]: parsed_model_outputs = {k: model_outputs[np.newaxis, v] for k,v in self.output_slices.items()} if SEND_RAW_PRED: parsed_model_outputs['raw_pred'] = model_outputs.copy() return parsed_model_outputs def run(self, buf: VisionBuf, wbuf: VisionBuf, transform: np.ndarray, transform_wide: np.ndarray, - inputs: Dict[str, np.ndarray], prepare_only: bool) -> Optional[Dict[str, np.ndarray]]: + inputs: dict[str, np.ndarray], prepare_only: bool) -> dict[str, np.ndarray] | None: # Model decides when action is completed, so desire input is just a pulse triggered on rising edge inputs['desire'][0] = 0 self.inputs['desire'][:-ModelConstants.DESIRE_LEN] = self.inputs['desire'][ModelConstants.DESIRE_LEN:] @@ -276,7 +275,7 @@ def main(demo=False): if prepare_only: cloudlog.error(f"skipping model eval. Dropped {vipc_dropped_frames} frames") - inputs:Dict[str, np.ndarray] = { + inputs:dict[str, np.ndarray] = { 'desire': vec_desire, 'traffic_convention': traffic_convention, 'lateral_control_params': lateral_control_params, diff --git a/selfdrive/modeld/navmodeld.py b/selfdrive/modeld/navmodeld.py index ed0b597dfe..4672734681 100755 --- a/selfdrive/modeld/navmodeld.py +++ b/selfdrive/modeld/navmodeld.py @@ -5,7 +5,6 @@ import time import ctypes import numpy as np from pathlib import Path -from typing import Tuple, Dict from cereal import messaging from cereal.messaging import PubMaster, SubMaster @@ -41,7 +40,7 @@ class NavModelResult(ctypes.Structure): ("features", ctypes.c_float*NAV_FEATURE_LEN)] class ModelState: - inputs: Dict[str, np.ndarray] + inputs: dict[str, np.ndarray] output: np.ndarray model: ModelRunner @@ -52,7 +51,7 @@ class ModelState: 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]: + def run(self, buf:np.ndarray) -> tuple[np.ndarray, float]: self.inputs['input_img'][:] = buf t1 = time.perf_counter() diff --git a/selfdrive/modeld/parse_model_outputs.py b/selfdrive/modeld/parse_model_outputs.py index 01cba29d1c..af57e11d03 100644 --- a/selfdrive/modeld/parse_model_outputs.py +++ b/selfdrive/modeld/parse_model_outputs.py @@ -1,5 +1,4 @@ import numpy as np -from typing import Dict from openpilot.selfdrive.modeld.constants import ModelConstants def sigmoid(x): @@ -82,7 +81,7 @@ class Parser: outs[name] = pred_mu_final.reshape(final_shape) outs[name + '_stds'] = pred_std_final.reshape(final_shape) - def parse_outputs(self, outs: Dict[str, np.ndarray]) -> Dict[str, np.ndarray]: + def parse_outputs(self, outs: dict[str, np.ndarray]) -> dict[str, np.ndarray]: self.parse_mdn('plan', outs, in_N=ModelConstants.PLAN_MHP_N, out_N=ModelConstants.PLAN_MHP_SELECTION, out_shape=(ModelConstants.IDX_N,ModelConstants.PLAN_WIDTH)) self.parse_mdn('lane_lines', outs, in_N=0, out_N=0, out_shape=(ModelConstants.NUM_LANE_LINES,ModelConstants.IDX_N,ModelConstants.LANE_LINES_WIDTH)) diff --git a/selfdrive/modeld/runners/onnxmodel.py b/selfdrive/modeld/runners/onnxmodel.py index f86bee3878..69b44a5a97 100644 --- a/selfdrive/modeld/runners/onnxmodel.py +++ b/selfdrive/modeld/runners/onnxmodel.py @@ -3,7 +3,7 @@ import itertools import os import sys import numpy as np -from typing import Tuple, Dict, Union, Any +from typing import Any from openpilot.selfdrive.modeld.runners.runmodel_pyx import RunModel @@ -38,7 +38,7 @@ def create_ort_session(path, fp16_to_fp32): options = ort.SessionOptions() options.graph_optimization_level = ort.GraphOptimizationLevel.ORT_DISABLE_ALL - provider: Union[str, Tuple[str, Dict[Any, Any]]] + provider: str | tuple[str, dict[Any, Any]] if 'OpenVINOExecutionProvider' in ort.get_available_providers() and 'ONNXCPU' not in os.environ: provider = 'OpenVINOExecutionProvider' elif 'CUDAExecutionProvider' in ort.get_available_providers() and 'ONNXCPU' not in os.environ: diff --git a/selfdrive/navd/helpers.py b/selfdrive/navd/helpers.py index 55c3f88a9a..5b0f5b7e85 100644 --- a/selfdrive/navd/helpers.py +++ b/selfdrive/navd/helpers.py @@ -2,7 +2,7 @@ from __future__ import annotations import json import math -from typing import Any, Dict, List, Optional, Tuple, Union, cast +from typing import Any, cast from openpilot.common.conversions import Conversions from openpilot.common.numpy_fast import clip @@ -22,13 +22,13 @@ class Coordinate: def __init__(self, latitude: float, longitude: float) -> None: self.latitude = latitude self.longitude = longitude - self.annotations: Dict[str, float] = {} + self.annotations: dict[str, float] = {} @classmethod - def from_mapbox_tuple(cls, t: Tuple[float, float]) -> Coordinate: + def from_mapbox_tuple(cls, t: tuple[float, float]) -> Coordinate: return cls(t[1], t[0]) - def as_dict(self) -> Dict[str, float]: + def as_dict(self) -> dict[str, float]: return {'latitude': self.latitude, 'longitude': self.longitude} def __str__(self) -> str: @@ -83,7 +83,7 @@ def minimum_distance(a: Coordinate, b: Coordinate, p: Coordinate): return projection.distance_to(p) -def distance_along_geometry(geometry: List[Coordinate], pos: Coordinate) -> float: +def distance_along_geometry(geometry: list[Coordinate], pos: Coordinate) -> float: if len(geometry) <= 2: return geometry[0].distance_to(pos) @@ -106,7 +106,7 @@ def distance_along_geometry(geometry: List[Coordinate], pos: Coordinate) -> floa return total_distance_closest -def coordinate_from_param(param: str, params: Optional[Params] = None) -> Optional[Coordinate]: +def coordinate_from_param(param: str, params: Params | None = None) -> Coordinate | None: if params is None: params = Params() @@ -130,7 +130,7 @@ def string_to_direction(direction: str) -> str: return 'none' -def maxspeed_to_ms(maxspeed: Dict[str, Union[str, float]]) -> float: +def maxspeed_to_ms(maxspeed: dict[str, str | float]) -> float: unit = cast(str, maxspeed['unit']) speed = cast(float, maxspeed['speed']) return SPEED_CONVERSIONS[unit] * speed @@ -140,7 +140,7 @@ def field_valid(dat: dict, field: str) -> bool: return field in dat and dat[field] is not None -def parse_banner_instructions(banners: Any, distance_to_maneuver: float = 0.0) -> Optional[Dict[str, Any]]: +def parse_banner_instructions(banners: Any, distance_to_maneuver: float = 0.0) -> dict[str, Any] | None: if not len(banners): return None diff --git a/selfdrive/statsd.py b/selfdrive/statsd.py index 94572b82c7..299aa295d7 100755 --- a/selfdrive/statsd.py +++ b/selfdrive/statsd.py @@ -5,7 +5,7 @@ import time from pathlib import Path from collections import defaultdict from datetime import datetime, timezone -from typing import NoReturn, Union, List, Dict +from typing import NoReturn from openpilot.common.params import Params from cereal.messaging import SubMaster @@ -61,7 +61,7 @@ class StatLog: def main() -> NoReturn: dongle_id = Params().get("DongleId", encoding='utf-8') - def get_influxdb_line(measurement: str, value: Union[float, Dict[str, float]], timestamp: datetime, tags: dict) -> str: + def get_influxdb_line(measurement: str, value: float | dict[str, float], timestamp: datetime, tags: dict) -> str: res = f"{measurement}" for k, v in tags.items(): res += f",{k}={str(v)}" @@ -102,7 +102,7 @@ def main() -> NoReturn: idx = 0 last_flush_time = time.monotonic() gauges = {} - samples: Dict[str, List[float]] = defaultdict(list) + samples: dict[str, list[float]] = defaultdict(list) try: while True: started_prev = sm['deviceState'].started diff --git a/selfdrive/test/ciui.py b/selfdrive/test/ciui.py index 3f33847b29..f3b0c1a98f 100755 --- a/selfdrive/test/ciui.py +++ b/selfdrive/test/ciui.py @@ -11,7 +11,7 @@ from openpilot.selfdrive.ui.qt.python_helpers import set_main_window class Window(QWidget): def __init__(self, parent=None): - super(Window, self).__init__(parent) + super().__init__(parent) layout = QVBoxLayout() self.setLayout(layout) @@ -47,7 +47,7 @@ class Window(QWidget): def update(self): for cmd, label in self.labels.items(): - out = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, + out = subprocess.run(cmd, capture_output=True, shell=True, check=False, encoding='utf8').stdout label.setText(out.strip()) diff --git a/selfdrive/test/fuzzy_generation.py b/selfdrive/test/fuzzy_generation.py index 28c70a0ff4..00e98fadc1 100644 --- a/selfdrive/test/fuzzy_generation.py +++ b/selfdrive/test/fuzzy_generation.py @@ -1,6 +1,7 @@ import capnp import hypothesis.strategies as st -from typing import Any, Callable, Dict, List, Optional, Union +from typing import Any +from collections.abc import Callable from cereal import log @@ -12,7 +13,7 @@ class FuzzyGenerator: self.draw = draw self.real_floats = real_floats - def generate_native_type(self, field: str) -> st.SearchStrategy[Union[bool, int, float, str, bytes]]: + def generate_native_type(self, field: str) -> st.SearchStrategy[bool | int | float | str | bytes]: def floats(**kwargs) -> st.SearchStrategy[float]: allow_nan = not self.real_floats allow_infinity = not self.real_floats @@ -67,18 +68,18 @@ class FuzzyGenerator: else: return self.generate_struct(field.schema) - def generate_struct(self, schema: capnp.lib.capnp._StructSchema, event: Optional[str] = None) -> st.SearchStrategy[Dict[str, Any]]: - full_fill: List[str] = list(schema.non_union_fields) - single_fill: List[str] = [event] if event else [self.draw(st.sampled_from(schema.union_fields))] if schema.union_fields else [] + def generate_struct(self, schema: capnp.lib.capnp._StructSchema, event: str | None = None) -> st.SearchStrategy[dict[str, Any]]: + full_fill: list[str] = list(schema.non_union_fields) + single_fill: list[str] = [event] if event else [self.draw(st.sampled_from(schema.union_fields))] if schema.union_fields else [] return st.fixed_dictionaries({field: self.generate_field(schema.fields[field]) for field in full_fill + single_fill}) @classmethod - def get_random_msg(cls, draw: DrawType, struct: capnp.lib.capnp._StructModule, real_floats: bool = False) -> Dict[str, Any]: + def get_random_msg(cls, draw: DrawType, struct: capnp.lib.capnp._StructModule, real_floats: bool = False) -> dict[str, Any]: fg = cls(draw, real_floats=real_floats) - data: Dict[str, Any] = draw(fg.generate_struct(struct.schema)) + data: dict[str, Any] = draw(fg.generate_struct(struct.schema)) return data @classmethod - def get_random_event_msg(cls, draw: DrawType, events: List[str], real_floats: bool = False) -> List[Dict[str, Any]]: + def get_random_event_msg(cls, draw: DrawType, events: list[str], real_floats: bool = False) -> list[dict[str, Any]]: fg = cls(draw, real_floats=real_floats) return [draw(fg.generate_struct(log.Event.schema, e)) for e in sorted(events)] diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 0e7912a989..a62f7ede85 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -72,7 +72,7 @@ def noop(*args, **kwargs): def read_segment_list(segment_list_path): - with open(segment_list_path, "r") as f: + with open(segment_list_path) as f: seg_list = f.read().splitlines() return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] diff --git a/selfdrive/test/process_replay/capture.py b/selfdrive/test/process_replay/capture.py index 28206c6b91..90c279ef35 100644 --- a/selfdrive/test/process_replay/capture.py +++ b/selfdrive/test/process_replay/capture.py @@ -1,7 +1,7 @@ import os import sys -from typing import Tuple, no_type_check +from typing import no_type_check class FdRedirect: def __init__(self, file_prefix: str, fd: int): @@ -53,7 +53,7 @@ class ProcessOutputCapture: self.stdout_redirect.link() self.stderr_redirect.link() - def read_outerr(self) -> Tuple[str, str]: + def read_outerr(self) -> tuple[str, str]: out_str = self.stdout_redirect.read().decode() err_str = self.stderr_redirect.read().decode() return out_str, err_str diff --git a/selfdrive/test/process_replay/compare_logs.py b/selfdrive/test/process_replay/compare_logs.py index dbb7c223f5..673f3b484c 100755 --- a/selfdrive/test/process_replay/compare_logs.py +++ b/selfdrive/test/process_replay/compare_logs.py @@ -5,7 +5,6 @@ import capnp import numbers import dictdiffer from collections import Counter -from typing import Dict from openpilot.tools.lib.logreader import LogReader @@ -97,7 +96,7 @@ def format_process_diff(diff): diff_short += f" {diff}\n" diff_long += f"\t{diff}\n" else: - cnt: Dict[str, int] = {} + cnt: dict[str, int] = {} for d in diff: diff_long += f"\t{str(d)}\n" diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 77ac3f551e..b760548fd7 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -8,7 +8,8 @@ import signal import platform from collections import OrderedDict from dataclasses import dataclass, field -from typing import Dict, List, Optional, Callable, Union, Any, Iterable, Tuple +from typing import Any +from collections.abc import Callable, Iterable from tqdm import tqdm import capnp @@ -36,9 +37,9 @@ FAKEDATA = os.path.join(PROC_REPLAY_DIR, "fakedata/") class DummySocket: def __init__(self): - self.data: List[bytes] = [] + self.data: list[bytes] = [] - def receive(self, non_blocking: bool = False) -> Optional[bytes]: + def receive(self, non_blocking: bool = False) -> bytes | None: if non_blocking: return None @@ -128,21 +129,21 @@ class ReplayContext: @dataclass class ProcessConfig: proc_name: str - pubs: List[str] - subs: List[str] - ignore: List[str] - config_callback: Optional[Callable] = None - init_callback: Optional[Callable] = None - should_recv_callback: Optional[Callable] = None - tolerance: Optional[float] = None + pubs: list[str] + subs: list[str] + ignore: list[str] + config_callback: Callable | None = None + init_callback: Callable | None = None + should_recv_callback: Callable | None = None + tolerance: float | None = None processing_time: float = 0.001 timeout: int = 30 simulation: bool = True - main_pub: Optional[str] = None + main_pub: str | None = None main_pub_drained: bool = True - vision_pubs: List[str] = field(default_factory=list) - ignore_alive_pubs: List[str] = field(default_factory=list) - unlocked_pubs: List[str] = field(default_factory=list) + vision_pubs: list[str] = field(default_factory=list) + ignore_alive_pubs: list[str] = field(default_factory=list) + unlocked_pubs: list[str] = field(default_factory=list) class ProcessContainer: @@ -150,25 +151,25 @@ class ProcessContainer: self.prefix = OpenpilotPrefix(clean_dirs_on_exit=False) self.cfg = copy.deepcopy(cfg) self.process = copy.deepcopy(managed_processes[cfg.proc_name]) - self.msg_queue: List[capnp._DynamicStructReader] = [] + self.msg_queue: list[capnp._DynamicStructReader] = [] self.cnt = 0 - self.pm: Optional[messaging.PubMaster] = None - self.sockets: Optional[List[messaging.SubSocket]] = None - self.rc: Optional[ReplayContext] = None - self.vipc_server: Optional[VisionIpcServer] = None - self.environ_config: Optional[Dict[str, Any]] = None - self.capture: Optional[ProcessOutputCapture] = None + self.pm: messaging.PubMaster | None = None + self.sockets: list[messaging.SubSocket] | None = None + self.rc: ReplayContext | None = None + self.vipc_server: VisionIpcServer | None = None + self.environ_config: dict[str, Any] | None = None + self.capture: ProcessOutputCapture | None = None @property def has_empty_queue(self) -> bool: return len(self.msg_queue) == 0 @property - def pubs(self) -> List[str]: + def pubs(self) -> list[str]: return self.cfg.pubs @property - def subs(self) -> List[str]: + def subs(self) -> list[str]: return self.cfg.subs def _clean_env(self): @@ -180,7 +181,7 @@ class ProcessContainer: if k in os.environ: del os.environ[k] - def _setup_env(self, params_config: Dict[str, Any], environ_config: Dict[str, Any]): + def _setup_env(self, params_config: dict[str, Any], environ_config: dict[str, Any]): for k, v in environ_config.items(): if len(v) != 0: os.environ[k] = v @@ -202,7 +203,7 @@ class ProcessContainer: self.environ_config = environ_config - def _setup_vision_ipc(self, all_msgs: LogIterable, frs: Dict[str, Any]): + def _setup_vision_ipc(self, all_msgs: LogIterable, frs: dict[str, Any]): assert len(self.cfg.vision_pubs) != 0 vipc_server = VisionIpcServer("camerad") @@ -223,9 +224,9 @@ class ProcessContainer: self.process.start() def start( - self, params_config: Dict[str, Any], environ_config: Dict[str, Any], - all_msgs: LogIterable, frs: Optional[Dict[str, BaseFrameReader]], - fingerprint: Optional[str], capture_output: bool + self, params_config: dict[str, Any], environ_config: dict[str, Any], + all_msgs: LogIterable, frs: dict[str, BaseFrameReader] | None, + fingerprint: str | None, capture_output: bool ): with self.prefix as p: self._setup_env(params_config, environ_config) @@ -266,7 +267,7 @@ class ProcessContainer: self.prefix.clean_dirs() self._clean_env() - def run_step(self, msg: capnp._DynamicStructReader, frs: Optional[Dict[str, BaseFrameReader]]) -> List[capnp._DynamicStructReader]: + def run_step(self, msg: capnp._DynamicStructReader, frs: dict[str, BaseFrameReader] | None) -> list[capnp._DynamicStructReader]: assert self.rc and self.pm and self.sockets and self.process.proc output_msgs = [] @@ -580,7 +581,7 @@ def get_process_config(name: str) -> ProcessConfig: raise Exception(f"Cannot find process config with name: {name}") from ex -def get_custom_params_from_lr(lr: LogIterable, initial_state: str = "first") -> Dict[str, Any]: +def get_custom_params_from_lr(lr: LogIterable, initial_state: str = "first") -> dict[str, Any]: """ Use this to get custom params dict based on provided logs. Useful when replaying following processes: calibrationd, paramsd, torqued @@ -614,7 +615,7 @@ def get_custom_params_from_lr(lr: LogIterable, initial_state: str = "first") -> return custom_params -def replay_process_with_name(name: Union[str, Iterable[str]], lr: LogIterable, *args, **kwargs) -> List[capnp._DynamicStructReader]: +def replay_process_with_name(name: str | Iterable[str], lr: LogIterable, *args, **kwargs) -> list[capnp._DynamicStructReader]: if isinstance(name, str): cfgs = [get_process_config(name)] elif isinstance(name, Iterable): @@ -626,10 +627,10 @@ def replay_process_with_name(name: Union[str, Iterable[str]], lr: LogIterable, * def replay_process( - cfg: Union[ProcessConfig, Iterable[ProcessConfig]], lr: LogIterable, frs: Optional[Dict[str, BaseFrameReader]] = None, - fingerprint: Optional[str] = None, return_all_logs: bool = False, custom_params: Optional[Dict[str, Any]] = None, - captured_output_store: Optional[Dict[str, Dict[str, str]]] = None, disable_progress: bool = False -) -> List[capnp._DynamicStructReader]: + cfg: ProcessConfig | Iterable[ProcessConfig], lr: LogIterable, frs: dict[str, BaseFrameReader] | None = None, + fingerprint: str | None = None, return_all_logs: bool = False, custom_params: dict[str, Any] | None = None, + captured_output_store: dict[str, dict[str, str]] | None = None, disable_progress: bool = False +) -> list[capnp._DynamicStructReader]: if isinstance(cfg, Iterable): cfgs = list(cfg) else: @@ -654,9 +655,9 @@ def replay_process( def _replay_multi_process( - cfgs: List[ProcessConfig], lr: LogIterable, frs: Optional[Dict[str, BaseFrameReader]], fingerprint: Optional[str], - custom_params: Optional[Dict[str, Any]], captured_output_store: Optional[Dict[str, Dict[str, str]]], disable_progress: bool -) -> List[capnp._DynamicStructReader]: + cfgs: list[ProcessConfig], lr: LogIterable, frs: dict[str, BaseFrameReader] | None, fingerprint: str | None, + custom_params: dict[str, Any] | None, captured_output_store: dict[str, dict[str, str]] | None, disable_progress: bool +) -> list[capnp._DynamicStructReader]: if fingerprint is not None: params_config = generate_params_config(lr=lr, fingerprint=fingerprint, custom_params=custom_params) env_config = generate_environ_config(fingerprint=fingerprint) @@ -690,10 +691,10 @@ def _replay_multi_process( pub_msgs = [msg for msg in all_msgs if msg.which() in lr_pubs] # external queue for messages taken from logs; internal queue for messages generated by processes, which will be republished - external_pub_queue: List[capnp._DynamicStructReader] = pub_msgs.copy() - internal_pub_queue: List[capnp._DynamicStructReader] = [] + external_pub_queue: list[capnp._DynamicStructReader] = pub_msgs.copy() + internal_pub_queue: list[capnp._DynamicStructReader] = [] # heap for maintaining the order of messages generated by processes, where each element: (logMonoTime, index in internal_pub_queue) - internal_pub_index_heap: List[Tuple[int, int]] = [] + internal_pub_index_heap: list[tuple[int, int]] = [] pbar = tqdm(total=len(external_pub_queue), disable=disable_progress) while len(external_pub_queue) != 0 or (len(internal_pub_index_heap) != 0 and not all(c.has_empty_queue for c in containers)): @@ -723,7 +724,7 @@ def _replay_multi_process( return log_msgs -def generate_params_config(lr=None, CP=None, fingerprint=None, custom_params=None) -> Dict[str, Any]: +def generate_params_config(lr=None, CP=None, fingerprint=None, custom_params=None) -> dict[str, Any]: params_dict = { "OpenpilotEnabledToggle": True, "DisengageOnAccelerator": True, @@ -755,7 +756,7 @@ def generate_params_config(lr=None, CP=None, fingerprint=None, custom_params=Non return params_dict -def generate_environ_config(CP=None, fingerprint=None, log_dir=None) -> Dict[str, Any]: +def generate_environ_config(CP=None, fingerprint=None, log_dir=None) -> dict[str, Any]: environ_dict = {} if platform.system() != "Darwin": environ_dict["PARAMS_ROOT"] = "/dev/shm/params" diff --git a/selfdrive/test/process_replay/regen.py b/selfdrive/test/process_replay/regen.py index 245b5b2709..3bb51d0b65 100755 --- a/selfdrive/test/process_replay/regen.py +++ b/selfdrive/test/process_replay/regen.py @@ -5,7 +5,8 @@ import time import capnp import numpy as np -from typing import Union, Iterable, Optional, List, Any, Dict, Tuple +from typing import Any +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 @@ -40,9 +41,9 @@ class DummyFrameReader(BaseFrameReader): def regen_segment( - lr: LogIterable, frs: Optional[Dict[str, Any]] = None, + lr: LogIterable, frs: dict[str, Any] | None = None, processes: Iterable[ProcessConfig] = CONFIGS, disable_tqdm: bool = False -) -> List[capnp._DynamicStructReader]: +) -> list[capnp._DynamicStructReader]: all_msgs = sorted(lr, key=lambda m: m.logMonoTime) custom_params = get_custom_params_from_lr(all_msgs) @@ -57,7 +58,7 @@ def regen_segment( def setup_data_readers( route: str, sidx: int, use_route_meta: bool, needs_driver_cam: bool = True, needs_road_cam: bool = True, dummy_driver_cam: bool = False -) -> Tuple[LogReader, Dict[str, Any]]: +) -> tuple[LogReader, dict[str, Any]]: if use_route_meta: r = Route(route) lr = LogReader(r.log_paths()[sidx]) @@ -92,7 +93,7 @@ def setup_data_readers( def regen_and_save( - route: str, sidx: int, processes: Union[str, Iterable[str]] = "all", outdir: str = FAKEDATA, + route: str, sidx: int, processes: str | Iterable[str] = "all", outdir: str = FAKEDATA, upload: bool = False, use_route_meta: bool = False, disable_tqdm: bool = False, dummy_driver_cam: bool = False ) -> str: if not isinstance(processes, str) and not hasattr(processes, "__iter__"): diff --git a/selfdrive/test/process_replay/test_debayer.py b/selfdrive/test/process_replay/test_debayer.py index bea1b1fb00..edf2cbd469 100755 --- a/selfdrive/test/process_replay/test_debayer.py +++ b/selfdrive/test/process_replay/test_debayer.py @@ -30,7 +30,7 @@ def get_frame_fn(ref_commit, test_route, tici=True): def bzip_frames(frames): - data = bytes() + data = b'' for y, u, v in frames: data += y.tobytes() data += u.tobytes() diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 5323a5280f..2b917b0f61 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -5,7 +5,7 @@ import os import sys from collections import defaultdict from tqdm import tqdm -from typing import Any, DefaultDict, Dict +from typing import Any from openpilot.selfdrive.car.car_helpers import interface_names from openpilot.tools.lib.openpilotci import get_url, upload_file @@ -172,11 +172,11 @@ if __name__ == "__main__": untested = (set(interface_names) - set(excluded_interfaces)) - {c.lower() for c in tested_cars} assert len(untested) == 0, f"Cars missing routes: {str(untested)}" - log_paths: DefaultDict[str, Dict[str, Dict[str, str]]] = defaultdict(lambda: defaultdict(dict)) + log_paths: defaultdict[str, dict[str, dict[str, str]]] = defaultdict(lambda: defaultdict(dict)) with concurrent.futures.ProcessPoolExecutor(max_workers=args.jobs) as pool: if not args.upload_only: download_segments = [seg for car, seg in segments if car in tested_cars] - log_data: Dict[str, LogReader] = {} + log_data: dict[str, LogReader] = {} p1 = pool.map(get_log_data, download_segments) for segment, lr in tqdm(p1, desc="Getting Logs", total=len(download_segments)): log_data[segment] = lr diff --git a/selfdrive/test/update_ci_routes.py b/selfdrive/test/update_ci_routes.py index 5ab5042b2b..bdfefb78d1 100755 --- a/selfdrive/test/update_ci_routes.py +++ b/selfdrive/test/update_ci_routes.py @@ -3,7 +3,7 @@ import os import re import subprocess import sys -from typing import Iterable, List, Optional +from collections.abc import Iterable from tqdm import tqdm @@ -12,14 +12,14 @@ from openpilot.selfdrive.test.process_replay.test_processes import source_segmen from openpilot.tools.lib.azure_container import AzureContainer from openpilot.tools.lib.openpilotcontainers import DataCIContainer, DataProdContainer, OpenpilotCIContainer -SOURCES: List[AzureContainer] = [ +SOURCES: list[AzureContainer] = [ DataProdContainer, DataCIContainer ] DEST = OpenpilotCIContainer -def upload_route(path: str, exclude_patterns: Optional[Iterable[str]] = None) -> None: +def upload_route(path: str, exclude_patterns: Iterable[str] | None = None) -> None: if exclude_patterns is None: exclude_patterns = [r'dcamera\.hevc'] diff --git a/selfdrive/thermald/power_monitoring.py b/selfdrive/thermald/power_monitoring.py index f74118b568..073589edb7 100644 --- a/selfdrive/thermald/power_monitoring.py +++ b/selfdrive/thermald/power_monitoring.py @@ -1,6 +1,5 @@ import time import threading -from typing import Optional from openpilot.common.params import Params from openpilot.system.hardware import HARDWARE @@ -38,7 +37,7 @@ class PowerMonitoring: self.car_battery_capacity_uWh = max((CAR_BATTERY_CAPACITY_uWh / 10), int(car_battery_capacity_uWh)) # Calculation tick - def calculate(self, voltage: Optional[int], ignition: bool): + def calculate(self, voltage: int | None, ignition: bool): try: now = time.monotonic() @@ -108,7 +107,7 @@ class PowerMonitoring: return int(self.car_battery_capacity_uWh) # See if we need to shutdown - def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: Optional[float], started_seen: bool): + def should_shutdown(self, ignition: bool, in_car: bool, offroad_timestamp: float | None, started_seen: bool): if offroad_timestamp is None: return False diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index e868f2ffdd..93ebd3ab87 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -6,7 +6,6 @@ import threading import time from collections import OrderedDict, namedtuple from pathlib import Path -from typing import Dict, Optional, Tuple import psutil @@ -50,9 +49,9 @@ THERMAL_BANDS = OrderedDict({ # Override to highest thermal band when offroad and above this temp OFFROAD_DANGER_TEMP = 75 -prev_offroad_states: Dict[str, Tuple[bool, Optional[str]]] = {} +prev_offroad_states: dict[str, tuple[bool, str | None]] = {} -tz_by_type: Optional[Dict[str, int]] = None +tz_by_type: dict[str, int] | None = None def populate_tz_by_type(): global tz_by_type tz_by_type = {} @@ -87,7 +86,7 @@ def read_thermal(thermal_config): return dat -def set_offroad_alert_if_changed(offroad_alert: str, show_alert: bool, extra_text: Optional[str]=None): +def set_offroad_alert_if_changed(offroad_alert: str, show_alert: bool, extra_text: str | None=None): if prev_offroad_states.get(offroad_alert, None) == (show_alert, extra_text): return prev_offroad_states[offroad_alert] = (show_alert, extra_text) @@ -169,16 +168,16 @@ def thermald_thread(end_event, hw_queue) -> None: count = 0 - onroad_conditions: Dict[str, bool] = { + onroad_conditions: dict[str, bool] = { "ignition": False, } - startup_conditions: Dict[str, bool] = {} - startup_conditions_prev: Dict[str, bool] = {} + startup_conditions: dict[str, bool] = {} + startup_conditions_prev: dict[str, bool] = {} - off_ts: Optional[float] = None - started_ts: Optional[float] = None + off_ts: float | None = None + started_ts: float | None = None started_seen = False - startup_blocked_ts: Optional[float] = None + startup_blocked_ts: float | None = None thermal_status = ThermalStatus.yellow last_hw_state = HardwareState( diff --git a/selfdrive/ui/soundd.py b/selfdrive/ui/soundd.py index 11caf809d1..0550a7db9e 100644 --- a/selfdrive/ui/soundd.py +++ b/selfdrive/ui/soundd.py @@ -3,7 +3,6 @@ import numpy as np import time import wave -from typing import Dict, Optional, Tuple from cereal import car, messaging from openpilot.common.basedir import BASEDIR @@ -27,7 +26,7 @@ DB_SCALE = 30 # AMBIENT_DB + DB_SCALE is where MAX_VOLUME is applied AudibleAlert = car.CarControl.HUDControl.AudibleAlert -sound_list: Dict[int, Tuple[str, Optional[int], float]] = { +sound_list: dict[int, tuple[str, int | None, float]] = { # AudibleAlert, file name, play count (none for infinite) AudibleAlert.engage: ("engage.wav", 1, MAX_VOLUME), AudibleAlert.disengage: ("disengage.wav", 1, MAX_VOLUME), @@ -64,7 +63,7 @@ class Soundd: self.spl_filter_weighted = FirstOrderFilter(0, 2.5, FILTER_DT, initialized=False) def load_sounds(self): - self.loaded_sounds: Dict[int, np.ndarray] = {} + self.loaded_sounds: dict[int, np.ndarray] = {} # Load all sounds for sound in sound_list: diff --git a/selfdrive/ui/tests/test_translations.py b/selfdrive/ui/tests/test_translations.py index 9ba9054ea1..8e50695e70 100755 --- a/selfdrive/ui/tests/test_translations.py +++ b/selfdrive/ui/tests/test_translations.py @@ -12,7 +12,7 @@ from parameterized import parameterized_class from openpilot.selfdrive.ui.update_translations import TRANSLATIONS_DIR, LANGUAGES_FILE, update_translations -with open(LANGUAGES_FILE, "r") as f: +with open(LANGUAGES_FILE) as f: translation_files = json.load(f) UNFINISHED_TRANSLATION_TAG = " None: t = datetime.datetime.utcnow() params.put(param, t.isoformat().encode('utf8')) -def read_time_from_param(params, param) -> Optional[datetime.datetime]: +def read_time_from_param(params, param) -> datetime.datetime | None: t = params.get(param, encoding='utf8') try: return datetime.datetime.fromisoformat(t) @@ -72,7 +71,7 @@ def read_time_from_param(params, param) -> Optional[datetime.datetime]: pass return None -def run(cmd: List[str], cwd: Optional[str] = None) -> str: +def run(cmd: list[str], cwd: str | None = None) -> str: return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding='utf8') @@ -234,7 +233,7 @@ def handle_agnos_update() -> None: class Updater: def __init__(self): self.params = Params() - self.branches = defaultdict(lambda: '') + self.branches = defaultdict(str) self._has_internet: bool = False @property @@ -243,7 +242,7 @@ class Updater: @property def target_branch(self) -> str: - b: Union[str, None] = self.params.get("UpdaterTargetBranch", encoding='utf-8') + b: str | None = self.params.get("UpdaterTargetBranch", encoding='utf-8') if b is None: b = self.get_branch(BASEDIR) return b @@ -272,7 +271,7 @@ class Updater: def get_commit_hash(self, path: str = OVERLAY_MERGED) -> str: return run(["git", "rev-parse", "HEAD"], path).rstrip() - def set_params(self, update_success: bool, failed_count: int, exception: Optional[str]) -> None: + 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) diff --git a/system/hardware/base.py b/system/hardware/base.py index 7434bb61e8..6cdb4a4d64 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -1,6 +1,5 @@ from abc import abstractmethod, ABC from collections import namedtuple -from typing import Dict from cereal import log @@ -10,7 +9,7 @@ NetworkType = log.DeviceState.NetworkType class HardwareBase(ABC): @staticmethod - def get_cmdline() -> Dict[str, str]: + def get_cmdline() -> dict[str, str]: with open('/proc/cmdline') as f: cmdline = f.read() return {kv[0]: kv[1] for kv in [s.split('=') for s in cmdline.split(' ')] if len(kv) == 2} diff --git a/system/hardware/tici/agnos.py b/system/hardware/tici/agnos.py index 342281b0f8..502295be07 100755 --- a/system/hardware/tici/agnos.py +++ b/system/hardware/tici/agnos.py @@ -6,7 +6,7 @@ import os import struct import subprocess import time -from typing import Dict, Generator, List, Tuple, Union +from collections.abc import Generator import requests @@ -117,7 +117,7 @@ def get_raw_hash(path: str, partition_size: int) -> str: return raw_hash.hexdigest().lower() -def verify_partition(target_slot_number: int, partition: Dict[str, Union[str, int]], force_full_check: bool = False) -> bool: +def verify_partition(target_slot_number: int, partition: dict[str, str | int], force_full_check: bool = False) -> bool: full_check = partition['full_check'] or force_full_check path = get_partition_path(target_slot_number, partition) @@ -184,7 +184,7 @@ def extract_casync_image(target_slot_number: int, partition: dict, cloudlog): target = casync.parse_caibx(partition['casync_caibx']) - sources: List[Tuple[str, casync.ChunkReader, casync.ChunkDict]] = [] + sources: list[tuple[str, casync.ChunkReader, casync.ChunkDict]] = [] # First source is the current partition. try: diff --git a/system/hardware/tici/amplifier.py b/system/hardware/tici/amplifier.py index e003f131cc..af82067467 100755 --- a/system/hardware/tici/amplifier.py +++ b/system/hardware/tici/amplifier.py @@ -2,7 +2,6 @@ import time from smbus2 import SMBus from collections import namedtuple -from typing import List # https://datasheets.maximintegrated.com/en/ds/MAX98089.pdf @@ -110,7 +109,7 @@ class Amplifier: def _get_shutdown_config(self, amp_disabled: bool) -> AmpConfig: return AmpConfig("Global shutdown", 0b0 if amp_disabled else 0b1, 0x51, 7, 0b10000000) - def _set_configs(self, configs: List[AmpConfig]) -> None: + def _set_configs(self, configs: list[AmpConfig]) -> None: with SMBus(self.AMP_I2C_BUS) as bus: for config in configs: if self.debug: @@ -123,7 +122,7 @@ class Amplifier: if self.debug: print(f" Changed {hex(config.register)}: {hex(old_value)} -> {hex(new_value)}") - def set_configs(self, configs: List[AmpConfig]) -> bool: + def set_configs(self, configs: list[AmpConfig]) -> bool: # retry in case panda is using the amp tries = 15 for i in range(15): diff --git a/system/hardware/tici/casync.py b/system/hardware/tici/casync.py index 993336616d..68ca37d38d 100755 --- a/system/hardware/tici/casync.py +++ b/system/hardware/tici/casync.py @@ -7,7 +7,7 @@ import sys import time from abc import ABC, abstractmethod from collections import defaultdict, namedtuple -from typing import Callable, Dict, List, Optional, Tuple +from collections.abc import Callable import requests from Crypto.Hash import SHA512 @@ -28,7 +28,7 @@ CHUNK_DOWNLOAD_RETRIES = 3 CAIBX_DOWNLOAD_TIMEOUT = 120 Chunk = namedtuple('Chunk', ['sha', 'offset', 'length']) -ChunkDict = Dict[bytes, Chunk] +ChunkDict = dict[bytes, Chunk] class ChunkReader(ABC): @@ -83,7 +83,7 @@ class RemoteChunkReader(ChunkReader): return decompressor.decompress(contents) -def parse_caibx(caibx_path: str) -> List[Chunk]: +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""" caibx: io.BufferedIOBase @@ -132,7 +132,7 @@ def parse_caibx(caibx_path: str) -> List[Chunk]: return chunks -def build_chunk_dict(chunks: List[Chunk]) -> ChunkDict: +def build_chunk_dict(chunks: list[Chunk]) -> ChunkDict: """Turn a list of chunks into a dict for faster lookups based on hash. Keep first chunk since it's more likely to be already downloaded.""" r = {} @@ -142,11 +142,11 @@ def build_chunk_dict(chunks: List[Chunk]) -> ChunkDict: return r -def extract(target: List[Chunk], - sources: List[Tuple[str, ChunkReader, ChunkDict]], +def extract(target: list[Chunk], + sources: list[tuple[str, ChunkReader, ChunkDict]], out_path: str, - progress: Optional[Callable[[int], None]] = None): - stats: Dict[str, int] = defaultdict(int) + progress: Callable[[int], None] | None = None): + stats: dict[str, int] = defaultdict(int) mode = 'rb+' if os.path.exists(out_path) else 'wb' with open(out_path, mode) as out: @@ -181,7 +181,7 @@ def extract(target: List[Chunk], return stats -def print_stats(stats: Dict[str, int]): +def print_stats(stats: dict[str, int]): total_bytes = sum(stats.values()) print(f"Total size: {total_bytes / 1024 / 1024:.2f} MB") for name, total in stats.items(): diff --git a/system/hardware/tici/power_monitor.py b/system/hardware/tici/power_monitor.py index ef3055ac47..296290dae8 100755 --- a/system/hardware/tici/power_monitor.py +++ b/system/hardware/tici/power_monitor.py @@ -3,7 +3,6 @@ import sys import time import datetime import numpy as np -from typing import List from collections import deque from openpilot.common.realtime import Ratekeeper @@ -14,7 +13,7 @@ def read_power(): with open("/sys/bus/i2c/devices/0-0040/hwmon/hwmon1/power1_input") as f: return int(f.read()) / 1e6 -def sample_power(seconds=5) -> List[float]: +def sample_power(seconds=5) -> list[float]: rate = 123 rk = Ratekeeper(rate, print_delay_threshold=None) diff --git a/system/hardware/tici/precise_power_measure.py b/system/hardware/tici/precise_power_measure.py index e186ba4aea..52fe0850ab 100755 --- a/system/hardware/tici/precise_power_measure.py +++ b/system/hardware/tici/precise_power_measure.py @@ -6,4 +6,4 @@ if __name__ == '__main__': print("measuring for 5 seconds") for _ in range(3): pwrs = sample_power() - print("mean %.2f std %.2f" % (np.mean(pwrs), np.std(pwrs))) + print(f"mean {np.mean(pwrs):.2f} std {np.std(pwrs):.2f}") diff --git a/system/hardware/tici/tests/compare_casync_manifest.py b/system/hardware/tici/tests/compare_casync_manifest.py index 835985b0b5..7de66d91d0 100755 --- a/system/hardware/tici/tests/compare_casync_manifest.py +++ b/system/hardware/tici/tests/compare_casync_manifest.py @@ -3,7 +3,6 @@ import argparse import collections import multiprocessing import os -from typing import Dict, List import requests from tqdm import tqdm @@ -42,7 +41,7 @@ if __name__ == "__main__": szs = list(tqdm(pool.imap(get_chunk_download_size, to), total=len(to))) chunk_sizes = {t.sha: sz for (t, sz) in zip(to, szs, strict=True)} - sources: Dict[str, List[int]] = { + sources: dict[str, list[int]] = { 'seed': [], 'remote_uncompressed': [], 'remote_compressed': [], diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index f6c0cf21a4..352fcdf18a 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -7,7 +7,6 @@ import time import numpy as np from dataclasses import dataclass from tabulate import tabulate -from typing import List import cereal.messaging as messaging from cereal.services import SERVICE_LIST @@ -22,9 +21,9 @@ MAX_WARMUP_TIME = 30 # seconds to wait for SAMPLE_TIME consecutive valid sample @dataclass class Proc: - procs: List[str] + procs: list[str] power: float - msgs: List[str] + msgs: list[str] rtol: float = 0.05 atol: float = 0.12 @@ -66,7 +65,7 @@ class TestPowerDraw(unittest.TestCase): return np.core.numeric.isclose(used, proc.power, rtol=proc.rtol, atol=proc.atol) def tabulate_msg_counts(self, msgs_and_power): - msg_counts = defaultdict(lambda: 0) + msg_counts = defaultdict(int) for _, counts in msgs_and_power: for msg, count in counts.items(): msg_counts[msg] += count diff --git a/system/loggerd/deleter.py b/system/loggerd/deleter.py index 868340150a..2f0b96c90e 100755 --- a/system/loggerd/deleter.py +++ b/system/loggerd/deleter.py @@ -2,7 +2,6 @@ import os import shutil import threading -from typing import List from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog from openpilot.system.loggerd.config import get_available_bytes, get_available_percent @@ -23,7 +22,7 @@ def has_preserve_xattr(d: str) -> bool: return getxattr(os.path.join(Paths.log_root(), d), PRESERVE_ATTR_NAME) == PRESERVE_ATTR_VALUE -def get_preserved_segments(dirs_by_creation: List[str]) -> List[str]: +def get_preserved_segments(dirs_by_creation: list[str]) -> list[str]: preserved = [] for n, d in enumerate(filter(has_preserve_xattr, reversed(dirs_by_creation))): if n == PRESERVE_COUNT: diff --git a/system/loggerd/tests/loggerd_tests_common.py b/system/loggerd/tests/loggerd_tests_common.py index 3aa9e40531..0532fe1a89 100644 --- a/system/loggerd/tests/loggerd_tests_common.py +++ b/system/loggerd/tests/loggerd_tests_common.py @@ -2,7 +2,6 @@ import os import random import unittest from pathlib import Path -from typing import Optional import openpilot.system.loggerd.deleter as deleter @@ -12,7 +11,7 @@ from openpilot.system.hardware.hw import Paths from openpilot.system.loggerd.xattr_cache import setxattr -def create_random_file(file_path: Path, size_mb: float, lock: bool = False, upload_xattr: Optional[bytes] = None) -> None: +def create_random_file(file_path: Path, size_mb: float, lock: bool = False, upload_xattr: bytes | None = None) -> None: file_path.parent.mkdir(parents=True, exist_ok=True) if lock: @@ -82,7 +81,7 @@ class UploaderTestCase(unittest.TestCase): self.params.put("DongleId", "0000000000000000") def make_file_with_data(self, f_dir: str, fn: str, size_mb: float = .1, lock: bool = False, - upload_xattr: Optional[bytes] = None, preserve_xattr: Optional[bytes] = None) -> Path: + upload_xattr: bytes | None = None, preserve_xattr: bytes | None = None) -> Path: file_path = Path(Paths.log_root()) / f_dir / fn create_random_file(file_path, size_mb, lock, upload_xattr) diff --git a/system/loggerd/tests/test_deleter.py b/system/loggerd/tests/test_deleter.py index e4112b7b4e..37d25507e0 100755 --- a/system/loggerd/tests/test_deleter.py +++ b/system/loggerd/tests/test_deleter.py @@ -4,7 +4,7 @@ import threading import unittest from collections import namedtuple from pathlib import Path -from typing import Sequence +from collections.abc import Sequence import openpilot.system.loggerd.deleter as deleter from openpilot.common.timeout import Timeout, TimeoutException diff --git a/system/loggerd/tests/test_loggerd.py b/system/loggerd/tests/test_loggerd.py index 963978926d..c80dc19fce 100755 --- a/system/loggerd/tests/test_loggerd.py +++ b/system/loggerd/tests/test_loggerd.py @@ -8,7 +8,6 @@ import subprocess import time from collections import defaultdict from pathlib import Path -from typing import Dict, List from flaky import flaky import cereal.messaging as messaging @@ -76,7 +75,7 @@ class TestLoggerd: end_type = SentinelType.endOfRoute if route else SentinelType.endOfSegment assert msgs[-1].sentinel.type == end_type - def _publish_random_messages(self, services: List[str]) -> Dict[str, list]: + def _publish_random_messages(self, services: list[str]) -> dict[str, list]: pm = messaging.PubMaster(services) managed_processes["loggerd"].start() diff --git a/system/loggerd/tests/test_uploader.py b/system/loggerd/tests/test_uploader.py index b674de5438..b807bd6b98 100755 --- a/system/loggerd/tests/test_uploader.py +++ b/system/loggerd/tests/test_uploader.py @@ -6,7 +6,6 @@ import unittest import logging import json from pathlib import Path -from typing import List, Optional from openpilot.system.hardware.hw import Paths from openpilot.common.swaglog import cloudlog @@ -53,7 +52,7 @@ class TestUploader(UploaderTestCase): self.end_event.set() self.up_thread.join() - def gen_files(self, lock=False, xattr: Optional[bytes] = None, boot=True) -> List[Path]: + def gen_files(self, lock=False, xattr: bytes | None = None, boot=True) -> list[Path]: f_paths = [] for t in ["qlog", "rlog", "dcamera.hevc", "fcamera.hevc"]: f_paths.append(self.make_file_with_data(self.seg_dir, t, 1, lock=lock, upload_xattr=xattr)) @@ -62,7 +61,7 @@ class TestUploader(UploaderTestCase): f_paths.append(self.make_file_with_data("boot", f"{self.seg_dir}", 1, lock=lock, upload_xattr=xattr)) return f_paths - def gen_order(self, seg1: List[int], seg2: List[int], boot=True) -> List[str]: + def gen_order(self, seg1: list[int], seg2: list[int], boot=True) -> list[str]: keys = [] if boot: keys += [f"boot/{self.seg_format.format(i)}.bz2" for i in seg1] diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 5c8f25368c..5ccf0ff69a 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -9,7 +9,8 @@ import threading import time import traceback import datetime -from typing import BinaryIO, Iterator, List, Optional, Tuple +from typing import BinaryIO +from collections.abc import Iterator from cereal import log import cereal.messaging as messaging @@ -42,10 +43,10 @@ class FakeResponse: self.request = FakeRequest() -def get_directory_sort(d: str) -> List[str]: +def get_directory_sort(d: str) -> list[str]: return [s.rjust(10, '0') for s in d.rsplit('--', 1)] -def listdir_by_creation(d: str) -> List[str]: +def listdir_by_creation(d: str) -> list[str]: if not os.path.isdir(d): return [] @@ -82,7 +83,7 @@ class Uploader: self.immediate_folders = ["crash/", "boot/"] self.immediate_priority = {"qlog": 0, "qlog.bz2": 0, "qcamera.ts": 1} - def list_upload_files(self, metered: bool) -> Iterator[Tuple[str, str, str]]: + def list_upload_files(self, metered: bool) -> Iterator[tuple[str, str, str]]: r = self.params.get("AthenadRecentlyViewedRoutes", encoding="utf8") requested_routes = [] if r is None else r.split(",") @@ -121,7 +122,7 @@ class Uploader: yield name, key, fn - def next_file_to_upload(self, metered: bool) -> Optional[Tuple[str, str, str]]: + def next_file_to_upload(self, metered: bool) -> tuple[str, str, str] | None: upload_files = list(self.list_upload_files(metered)) for name, key, fn in upload_files: @@ -207,7 +208,7 @@ class Uploader: return success - def step(self, network_type: int, metered: bool) -> Optional[bool]: + def step(self, network_type: int, metered: bool) -> bool | None: d = self.next_file_to_upload(metered) if d is None: return None @@ -221,7 +222,7 @@ class Uploader: return self.upload(name, key, fn, network_type, metered) -def main(exit_event: Optional[threading.Event] = None) -> None: +def main(exit_event: threading.Event | None = None) -> None: if exit_event is None: exit_event = threading.Event() diff --git a/system/loggerd/xattr_cache.py b/system/loggerd/xattr_cache.py index 5feeff34d2..d3220118ac 100644 --- a/system/loggerd/xattr_cache.py +++ b/system/loggerd/xattr_cache.py @@ -1,10 +1,9 @@ import os import errno -from typing import Dict, Optional, Tuple -_cached_attributes: Dict[Tuple, Optional[bytes]] = {} +_cached_attributes: dict[tuple, bytes | None] = {} -def getxattr(path: str, attr_name: str) -> Optional[bytes]: +def getxattr(path: str, attr_name: str) -> bytes | None: key = (path, attr_name) if key not in _cached_attributes: try: diff --git a/system/qcomgpsd/nmeaport.py b/system/qcomgpsd/nmeaport.py index 231096fc5d..caff7af646 100644 --- a/system/qcomgpsd/nmeaport.py +++ b/system/qcomgpsd/nmeaport.py @@ -93,7 +93,7 @@ def nmea_checksum_ok(s): def process_nmea_port_messages(device:str="/dev/ttyUSB1") -> NoReturn: while True: try: - with open(device, "r") as nmeaport: + with open(device) as nmeaport: for line in nmeaport: line = line.strip() if DEBUG: diff --git a/system/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index e2a180df86..e8c407a627 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -10,7 +10,7 @@ import shutil import subprocess import datetime from multiprocessing import Process, Event -from typing import NoReturn, Optional +from typing import NoReturn from struct import unpack_from, calcsize, pack from cereal import log @@ -90,7 +90,7 @@ def try_setup_logs(diag, logs): return setup_logs(diag, logs) @retry(attempts=3, delay=1.0) -def at_cmd(cmd: str) -> Optional[str]: +def at_cmd(cmd: str) -> str | None: return subprocess.check_output(f"mmcli -m any --timeout 30 --command='{cmd}'", shell=True, encoding='utf8') def gps_enabled() -> bool: @@ -342,7 +342,7 @@ def main() -> NoReturn: gps.bearingDeg = report["q_FltHeadingRad"] * 180/math.pi # TODO needs update if there is another leap second, after june 2024? - dt_timestamp = (datetime.datetime(1980, 1, 6, 0, 0, 0, 0, datetime.timezone.utc) + + dt_timestamp = (datetime.datetime(1980, 1, 6, 0, 0, 0, 0, datetime.UTC) + datetime.timedelta(weeks=report['w_GpsWeekNumber']) + datetime.timedelta(seconds=(1e-3*report['q_GpsFixTimeMs'] - 18))) gps.unixTimestampMillis = dt_timestamp.timestamp()*1e3 diff --git a/system/sensord/pigeond.py b/system/sensord/pigeond.py index 78b3b07498..21b3a86f97 100755 --- a/system/sensord/pigeond.py +++ b/system/sensord/pigeond.py @@ -7,7 +7,6 @@ import struct import requests import urllib.parse from datetime import datetime -from typing import List, Optional, Tuple from cereal import messaging from openpilot.common.params import Params @@ -41,7 +40,7 @@ def add_ubx_checksum(msg: bytes) -> bytes: B = (B + A) % 256 return msg + bytes([A, B]) -def get_assistnow_messages(token: bytes) -> List[bytes]: +def get_assistnow_messages(token: bytes) -> list[bytes]: # make request # TODO: implement adding the last known location r = requests.get("https://online-live2.services.u-blox.com/GetOnlineData.ashx", params=urllib.parse.urlencode({ @@ -238,7 +237,7 @@ def initialize_pigeon(pigeon: TTYPigeon) -> bool: return False return True -def deinitialize_and_exit(pigeon: Optional[TTYPigeon]): +def deinitialize_and_exit(pigeon: TTYPigeon | None): cloudlog.warning("Storing almanac in ublox flash") if pigeon is not None: @@ -259,7 +258,7 @@ def deinitialize_and_exit(pigeon: Optional[TTYPigeon]): set_power(False) sys.exit(0) -def create_pigeon() -> Tuple[TTYPigeon, messaging.PubMaster]: +def create_pigeon() -> tuple[TTYPigeon, messaging.PubMaster]: pigeon = None # register exit handler diff --git a/system/ubloxd/tests/ubloxd.py b/system/ubloxd/tests/ubloxd.py index 4ee99dc28a..c17387114f 100755 --- a/system/ubloxd/tests/ubloxd.py +++ b/system/ubloxd/tests/ubloxd.py @@ -82,7 +82,7 @@ def configure_ublox(dev): if __name__ == "__main__": class Device: def write(self, s): - d = '"{}"s'.format(''.join('\\x{:02X}'.format(b) for b in s)) + d = '"{}"s'.format(''.join(f'\\x{b:02X}' for b in s)) print(f" if (!send_with_ack({d})) continue;") dev = ublox.UBlox(Device(), baudrate=baudrate) diff --git a/system/version.py b/system/version.py index e34458f16f..4319ef2140 100755 --- a/system/version.py +++ b/system/version.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 import os import subprocess -from typing import List, Callable, TypeVar +from typing import TypeVar +from collections.abc import Callable from functools import lru_cache from openpilot.common.basedir import BASEDIR @@ -18,11 +19,11 @@ def cache(user_function: Callable[..., _RT], /) -> Callable[..., _RT]: return lru_cache(maxsize=None)(user_function) -def run_cmd(cmd: List[str]) -> str: +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: +def run_cmd_default(cmd: list[str], default: str = "") -> str: try: return run_cmd(cmd) except subprocess.CalledProcessError: diff --git a/system/webrtc/device/audio.py b/system/webrtc/device/audio.py index 3c78be6752..b1859518a1 100644 --- a/system/webrtc/device/audio.py +++ b/system/webrtc/device/audio.py @@ -1,6 +1,5 @@ import asyncio import io -from typing import Optional, List, Tuple import aiortc import av @@ -17,7 +16,7 @@ class AudioInputStreamTrack(aiortc.mediastreams.AudioStreamTrack): pyaudio.paFloat32: 'flt', } - def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 16000, channels: int = 1, packet_time: float = 0.020, device_index: Optional[int] = None): + def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 16000, channels: int = 1, packet_time: float = 0.020, device_index: int | None = None): super().__init__() self.p = pyaudio.PyAudio() @@ -49,7 +48,7 @@ class AudioInputStreamTrack(aiortc.mediastreams.AudioStreamTrack): class AudioOutputSpeaker: - def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 48000, channels: int = 2, packet_time: float = 0.2, device_index: Optional[int] = None): + def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 48000, channels: int = 2, packet_time: float = 0.2, device_index: int | None = None): chunk_size = int(packet_time * rate) self.p = pyaudio.PyAudio() @@ -62,7 +61,7 @@ class AudioOutputSpeaker: output=True, output_device_index=device_index, stream_callback=self.__pyaudio_callback) - self.tracks_and_tasks: List[Tuple[aiortc.MediaStreamTrack, Optional[asyncio.Task]]] = [] + self.tracks_and_tasks: list[tuple[aiortc.MediaStreamTrack, asyncio.Task | None]] = [] def __pyaudio_callback(self, in_data, frame_count, time_info, status): if self.buffer.getbuffer().nbytes < frame_count * self.channels * 2: diff --git a/system/webrtc/device/video.py b/system/webrtc/device/video.py index 314f812834..1bca909294 100644 --- a/system/webrtc/device/video.py +++ b/system/webrtc/device/video.py @@ -1,5 +1,4 @@ import asyncio -from typing import Optional import av from teleoprtc.tracks import TiciVideoStreamTrack @@ -40,5 +39,5 @@ class LiveStreamVideoStreamTrack(TiciVideoStreamTrack): return packet - def codec_preference(self) -> Optional[str]: + def codec_preference(self) -> str | None: return "H264" diff --git a/system/webrtc/schema.py b/system/webrtc/schema.py index f659b34293..d80986ebf2 100644 --- a/system/webrtc/schema.py +++ b/system/webrtc/schema.py @@ -1,8 +1,8 @@ import capnp -from typing import Union, List, Dict, Any +from typing import Any -def generate_type(type_walker, schema_walker) -> Union[str, List[Any], Dict[str, Any]]: +def generate_type(type_walker, schema_walker) -> str | list[Any] | dict[str, Any]: data_type = next(type_walker) if data_type.which() == 'struct': return generate_struct(next(schema_walker)) @@ -15,11 +15,11 @@ def generate_type(type_walker, schema_walker) -> Union[str, List[Any], Dict[str, return str(data_type.which()) -def generate_struct(schema: capnp.lib.capnp._StructSchema) -> Dict[str, Any]: +def generate_struct(schema: capnp.lib.capnp._StructSchema) -> dict[str, Any]: return {field: generate_field(schema.fields[field]) for field in schema.fields if not field.endswith("DEPRECATED")} -def generate_field(field: capnp.lib.capnp._StructSchemaField) -> Union[str, List[Any], Dict[str, Any]]: +def generate_field(field: capnp.lib.capnp._StructSchemaField) -> str | list[Any] | dict[str, Any]: def schema_walker(field): yield field.schema diff --git a/system/webrtc/tests/test_webrtcd.py b/system/webrtc/tests/test_webrtcd.py index e92958cc92..c31b63d02b 100755 --- a/system/webrtc/tests/test_webrtcd.py +++ b/system/webrtc/tests/test_webrtcd.py @@ -18,7 +18,7 @@ class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): try: async with asyncio.timeout(timeout): await awaitable - except asyncio.TimeoutError: + except TimeoutError: self.fail("Timeout while waiting for awaitable to complete") async def test_webrtcd(self): diff --git a/system/webrtc/webrtcd.py b/system/webrtc/webrtcd.py index cc26d50daf..6c1370eae9 100755 --- a/system/webrtc/webrtcd.py +++ b/system/webrtc/webrtcd.py @@ -6,7 +6,7 @@ import json import uuid import logging from dataclasses import dataclass, field -from typing import Any, List, Optional, Union, TYPE_CHECKING +from typing import Any, TYPE_CHECKING # aiortc and its dependencies have lots of internal warnings :( import warnings @@ -24,7 +24,7 @@ from cereal import messaging, log class CerealOutgoingMessageProxy: def __init__(self, sm: messaging.SubMaster): self.sm = sm - self.channels: List['RTCDataChannel'] = [] + self.channels: list['RTCDataChannel'] = [] def add_channel(self, channel: 'RTCDataChannel'): self.channels.append(channel) @@ -103,7 +103,7 @@ class CerealProxyRunner: class StreamSession: - def __init__(self, sdp: str, cameras: List[str], incoming_services: List[str], outgoing_services: List[str], debug_mode: bool = False): + def __init__(self, sdp: str, cameras: list[str], incoming_services: list[str], outgoing_services: list[str], debug_mode: bool = False): from aiortc.mediastreams import VideoStreamTrack, AudioStreamTrack from aiortc.contrib.media import MediaBlackhole from openpilot.system.webrtc.device.video import LiveStreamVideoStreamTrack @@ -132,8 +132,8 @@ class StreamSession: self.incoming_bridge = CerealIncomingMessageProxy(messaging.PubMaster(incoming_services)) self.outgoing_bridge_runner = CerealProxyRunner(self.outgoing_bridge) - self.audio_output: Optional[Union[AudioOutputSpeaker, MediaBlackhole]] = None - self.run_task: Optional[asyncio.Task] = None + self.audio_output: AudioOutputSpeaker | MediaBlackhole | None = None + self.run_task: asyncio.Task | None = None self.logger = logging.getLogger("webrtcd") self.logger.info("New stream session (%s), cameras %s, audio in %s out %s, incoming services %s, outgoing services %s", self.identifier, cameras, config.incoming_audio_track, config.expected_audio_track, incoming_services, outgoing_services) @@ -189,9 +189,9 @@ class StreamSession: @dataclass class StreamRequestBody: sdp: str - cameras: List[str] - bridge_services_in: List[str] = field(default_factory=list) - bridge_services_out: List[str] = field(default_factory=list) + cameras: list[str] + bridge_services_in: list[str] = field(default_factory=list) + bridge_services_out: list[str] = field(default_factory=list) async def get_stream(request: 'web.Request'): diff --git a/tools/bodyteleop/web.py b/tools/bodyteleop/web.py index b1fb9525db..fd8f691d19 100644 --- a/tools/bodyteleop/web.py +++ b/tools/bodyteleop/web.py @@ -56,7 +56,7 @@ def create_ssl_cert(cert_path: str, key_path: str): try: proc = subprocess.run(f'openssl req -x509 -newkey rsa:4096 -nodes -out {cert_path} -keyout {key_path} \ -days 365 -subj "/C=US/ST=California/O=commaai/OU=comma body"', - stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + capture_output=True, shell=True) proc.check_returncode() except subprocess.CalledProcessError as ex: raise ValueError(f"Error creating SSL certificate:\n[stdout]\n{proc.stdout.decode()}\n[stderr]\n{proc.stderr.decode()}") from ex @@ -77,7 +77,7 @@ def create_ssl_context(): ## ENDPOINTS async def index(request: 'web.Request'): - with open(os.path.join(TELEOPDIR, "static", "index.html"), "r") as f: + with open(os.path.join(TELEOPDIR, "static", "index.html")) as f: content = f.read() return web.Response(content_type="text/html", text=content) diff --git a/tools/car_porting/auto_fingerprint.py b/tools/car_porting/auto_fingerprint.py index 7dae9ce048..f122c2774e 100755 --- a/tools/car_porting/auto_fingerprint.py +++ b/tools/car_porting/auto_fingerprint.py @@ -2,7 +2,6 @@ import argparse from collections import defaultdict -from typing import Optional from openpilot.selfdrive.debug.format_fingerprints import format_brand_fw_versions from openpilot.selfdrive.car.fw_versions import match_fw_to_car @@ -30,7 +29,7 @@ if __name__ == "__main__": carVin = None carPlatform = None - platform: Optional[str] = None + platform: str | None = None CP = lr.first("carParams") diff --git a/tools/car_porting/test_car_model.py b/tools/car_porting/test_car_model.py index 66fe2ea65f..86980b054b 100755 --- a/tools/car_porting/test_car_model.py +++ b/tools/car_porting/test_car_model.py @@ -1,7 +1,6 @@ #!/usr/bin/env python3 import argparse import sys -from typing import List import unittest from openpilot.selfdrive.car.tests.routes import CarTestRoute @@ -9,7 +8,7 @@ from openpilot.selfdrive.car.tests.test_models import TestCarModel from openpilot.tools.lib.route import SegmentName -def create_test_models_suite(routes: List[CarTestRoute], ci=False) -> unittest.TestSuite: +def create_test_models_suite(routes: list[CarTestRoute], ci=False) -> unittest.TestSuite: test_suite = unittest.TestSuite() for test_route in routes: # create new test case and discover tests diff --git a/tools/latencylogger/latency_logger.py b/tools/latencylogger/latency_logger.py index 19c0a86bf4..8c6af56b6e 100755 --- a/tools/latencylogger/latency_logger.py +++ b/tools/latencylogger/latency_logger.py @@ -90,7 +90,7 @@ def read_logs(lr): return (data, frame_mismatches) # This is not needed in 3.10 as a "key" parameter is added to bisect -class KeyifyList(object): +class KeyifyList: def __init__(self, inner, key): self.inner = inner self.key = key diff --git a/tools/lib/auth.py b/tools/lib/auth.py index 997d1f860d..5988397d0a 100755 --- a/tools/lib/auth.py +++ b/tools/lib/auth.py @@ -26,7 +26,7 @@ import sys import pprint import webbrowser from http.server import BaseHTTPRequestHandler, HTTPServer -from typing import Any, Dict +from typing import Any from urllib.parse import parse_qs, urlencode from openpilot.tools.lib.api import APIError, CommaApi, UnauthorizedError @@ -36,7 +36,7 @@ PORT = 3000 class ClientRedirectServer(HTTPServer): - query_params: Dict[str, Any] = {} + query_params: dict[str, Any] = {} class ClientRedirectHandler(BaseHTTPRequestHandler): diff --git a/tools/lib/azure_container.py b/tools/lib/azure_container.py index 7d9550266d..52b2f37dbf 100644 --- a/tools/lib/azure_container.py +++ b/tools/lib/azure_container.py @@ -2,7 +2,7 @@ import os from datetime import datetime, timedelta from functools import lru_cache from pathlib import Path -from typing import IO, Union +from typing import IO TOKEN_PATH = Path("/data/azure_token") @@ -57,7 +57,7 @@ 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: Union[bytes, IO], blob_name: str) -> str: + def upload_bytes(self, data: bytes | IO, blob_name: str) -> str: from azure.storage.blob import BlobClient blob = BlobClient( account_url=self.ACCOUNT_URL, @@ -69,6 +69,6 @@ class AzureContainer: blob.upload_blob(data) return self.BASE_URL + blob_name - def upload_file(self, path: Union[str, os.PathLike], blob_name: str) -> str: + def upload_file(self, path: str | os.PathLike, blob_name: str) -> str: with open(path, "rb") as f: return self.upload_bytes(f, blob_name) diff --git a/tools/lib/bootlog.py b/tools/lib/bootlog.py index 827ef1eefc..208ddc19c2 100644 --- a/tools/lib/bootlog.py +++ b/tools/lib/bootlog.py @@ -1,6 +1,5 @@ import functools import re -from typing import List, Optional from openpilot.tools.lib.auth_config import get_token from openpilot.tools.lib.api import CommaApi @@ -44,7 +43,7 @@ class Bootlog: return False return self.id < b.id -def get_bootlog_from_id(bootlog_id: str) -> Optional[Bootlog]: +def get_bootlog_from_id(bootlog_id: str) -> Bootlog | None: # TODO: implement an API endpoint for this bl = Bootlog(bootlog_id) for b in get_bootlogs(bl.dongle_id): @@ -52,7 +51,7 @@ def get_bootlog_from_id(bootlog_id: str) -> Optional[Bootlog]: return b return None -def get_bootlogs(dongle_id: str) -> List[Bootlog]: +def get_bootlogs(dongle_id: str) -> list[Bootlog]: api = CommaApi(get_token()) r = api.get(f'v1/devices/{dongle_id}/bootlogs') return [Bootlog(b) for b in r] diff --git a/tools/lib/helpers.py b/tools/lib/helpers.py index f0af3d03c5..653eb3d7e0 100644 --- a/tools/lib/helpers.py +++ b/tools/lib/helpers.py @@ -9,18 +9,18 @@ class RE: DONGLE_ID = r'(?P[a-f0-9]{16})' TIMESTAMP = r'(?P[0-9]{4}-[0-9]{2}-[0-9]{2}--[0-9]{2}-[0-9]{2}-[0-9]{2})' LOG_ID_V2 = r'(?P[a-f0-9]{8})--(?P[a-z0-9]{10})' - LOG_ID = r'(?P(?:{}|{}))'.format(TIMESTAMP, LOG_ID_V2) - ROUTE_NAME = r'(?P{}[|_/]{})'.format(DONGLE_ID, LOG_ID) - SEGMENT_NAME = r'{}(?:--|/)(?P[0-9]+)'.format(ROUTE_NAME) + LOG_ID = fr'(?P(?:{TIMESTAMP}|{LOG_ID_V2}))' + ROUTE_NAME = fr'(?P{DONGLE_ID}[|_/]{LOG_ID})' + SEGMENT_NAME = fr'{ROUTE_NAME}(?:--|/)(?P[0-9]+)' INDEX = r'-?[0-9]+' - SLICE = r'(?P{})?:?(?P{})?:?(?P{})?'.format(INDEX, INDEX, INDEX) - SEGMENT_RANGE = r'{}(?:(--|/)(?P({})))?(?:/(?P([qras])))?'.format(ROUTE_NAME, SLICE) + SLICE = fr'(?P{INDEX})?:?(?P{INDEX})?:?(?P{INDEX})?' + SEGMENT_RANGE = fr'{ROUTE_NAME}(?:(--|/)(?P({SLICE})))?(?:/(?P([qras])))?' BOOTLOG_NAME = ROUTE_NAME - EXPLORER_FILE = r'^(?P{})--(?P[a-z]+\.[a-z0-9]+)$'.format(SEGMENT_NAME) - OP_SEGMENT_DIR = r'^(?P{})$'.format(SEGMENT_NAME) + EXPLORER_FILE = fr'^(?P{SEGMENT_NAME})--(?P[a-z]+\.[a-z0-9]+)$' + OP_SEGMENT_DIR = fr'^(?P{SEGMENT_NAME})$' def timestamp_to_datetime(t: str) -> datetime.datetime: diff --git a/tools/lib/live_logreader.py b/tools/lib/live_logreader.py index 0678fd1d00..6a7ecee6fd 100644 --- a/tools/lib/live_logreader.py +++ b/tools/lib/live_logreader.py @@ -1,5 +1,4 @@ import os -from typing import List from cereal import log as capnp_log, messaging from cereal.services import SERVICE_LIST @@ -8,7 +7,7 @@ from openpilot.tools.lib.logreader import LogIterable, RawLogIterable ALL_SERVICES = list(SERVICE_LIST.keys()) -def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: +def raw_live_logreader(services: list[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> RawLogIterable: if addr != "127.0.0.1": os.environ["ZMQ"] = "1" messaging.context = messaging.Context() @@ -25,7 +24,7 @@ def raw_live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0. yield msg -def live_logreader(services: List[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: +def live_logreader(services: list[str] = ALL_SERVICES, addr: str = '127.0.0.1') -> LogIterable: for m in raw_live_logreader(services, addr): with capnp_log.Event.from_bytes(m) as evt: yield evt diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 7957712aff..6247bbc9db 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -11,7 +11,7 @@ import tqdm import urllib.parse import warnings -from typing import Callable, Dict, Iterable, Iterator, List, Optional, Type +from collections.abc import Callable, Iterable, Iterator from urllib.parse import parse_qs, urlparse from cereal import log as capnp_log @@ -21,7 +21,7 @@ from openpilot.tools.lib.openpilotci import get_url from openpilot.tools.lib.filereader import FileReader, file_exists, internal_source_available from openpilot.tools.lib.route import Route, SegmentRange -LogMessage = Type[capnp._DynamicStructReader] +LogMessage = type[capnp._DynamicStructReader] LogIterable = Iterable[LogMessage] RawLogIterable = Iterable[bytes] @@ -76,8 +76,8 @@ class ReadMode(enum.StrEnum): AUTO_INTERACTIVE = "i" # default to rlogs, fallback to qlogs with a prompt from the user -LogPath = Optional[str] -LogPaths = List[LogPath] +LogPath = str | None +LogPaths = list[LogPath] ValidFileCallable = Callable[[LogPath], bool] Source = Callable[[SegmentRange, ReadMode], LogPaths] @@ -170,7 +170,7 @@ def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: if mode == ReadMode.SANITIZED: return comma_car_segments_source(sr, mode) - SOURCES: List[Source] = [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source,] + SOURCES: list[Source] = [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source,] exceptions = [] # Automatically determine viable source for source in SOURCES: @@ -212,7 +212,7 @@ def parse_indirect(identifier: str): class LogReader: - def _parse_identifiers(self, identifier: str | List[str]): + def _parse_identifiers(self, identifier: str | list[str]): if isinstance(identifier, list): return [i for j in identifier for i in self._parse_identifiers(j)] @@ -234,7 +234,7 @@ class LogReader: are uploaded or auto fallback to qlogs with '/a' selector at the end of the route name." return identifiers - def __init__(self, identifier: str | List[str], default_mode: ReadMode = ReadMode.RLOG, + def __init__(self, identifier: str | list[str], default_mode: ReadMode = ReadMode.RLOG, default_source=auto_source, sort_by_time=False, only_union_types=False): self.default_mode = default_mode self.default_source = default_source @@ -243,7 +243,7 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout self.sort_by_time = sort_by_time self.only_union_types = only_union_types - self.__lrs: Dict[int, _LogFileReader] = {} + self.__lrs: dict[int, _LogFileReader] = {} self.reset() def _get_lr(self, i): diff --git a/tools/lib/route.py b/tools/lib/route.py index 47ebdc7a51..bd0ccc1fc3 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -4,7 +4,7 @@ from functools import cache from urllib.parse import urlparse from collections import defaultdict from itertools import chain -from typing import Optional, cast +from typing import cast from openpilot.tools.lib.auth_config import get_token from openpilot.tools.lib.api import CommaApi @@ -231,7 +231,7 @@ class SegmentName: def route_name(self) -> RouteName: return self._route_name @property - def data_dir(self) -> Optional[str]: return self._data_dir + def data_dir(self) -> str | None: return self._data_dir def __str__(self) -> str: return self._canonical_name diff --git a/tools/lib/tests/test_comma_car_segments.py b/tools/lib/tests/test_comma_car_segments.py index b355b0fe60..50d4200b4f 100644 --- a/tools/lib/tests/test_comma_car_segments.py +++ b/tools/lib/tests/test_comma_car_segments.py @@ -1,5 +1,3 @@ - - import unittest import requests diff --git a/tools/lib/vidindex.py b/tools/lib/vidindex.py index 8156faba6b..f2e4e9ca45 100755 --- a/tools/lib/vidindex.py +++ b/tools/lib/vidindex.py @@ -3,7 +3,6 @@ import argparse import os import struct from enum import IntEnum -from typing import Tuple from openpilot.tools.lib.filereader import FileReader @@ -120,7 +119,7 @@ HEVC_CODED_SLICE_SEGMENT_NAL_UNITS = ( class VideoFileInvalid(Exception): pass -def get_ue(dat: bytes, start_idx: int, skip_bits: int) -> Tuple[int, int]: +def get_ue(dat: bytes, start_idx: int, skip_bits: int) -> tuple[int, int]: prefix_val = 0 prefix_len = 0 suffix_val = 0 @@ -184,7 +183,7 @@ def get_hevc_nal_unit_type(dat: bytes, nal_unit_start: int) -> HevcNalUnitType: print(" nal_unit_type:", nal_unit_type.name, f"({nal_unit_type.value})") return nal_unit_type -def get_hevc_slice_type(dat: bytes, nal_unit_start: int, nal_unit_type: HevcNalUnitType) -> Tuple[int, bool]: +def get_hevc_slice_type(dat: bytes, nal_unit_start: int, nal_unit_type: HevcNalUnitType) -> tuple[int, bool]: # 7.3.2.9 Slice segment layer RBSP syntax # slice_segment_layer_rbsp( ) { # slice_segment_header( ) @@ -259,7 +258,7 @@ def get_hevc_slice_type(dat: bytes, nal_unit_start: int, nal_unit_type: HevcNalU raise VideoFileInvalid("slice_type must be 0, 1, or 2") return slice_type, is_first_slice -def hevc_index(hevc_file_name: str, allow_corrupt: bool=False) -> Tuple[list, int, bytes]: +def hevc_index(hevc_file_name: str, allow_corrupt: bool=False) -> tuple[list, int, bytes]: with FileReader(hevc_file_name) as f: dat = f.read() diff --git a/tools/replay/lib/ui_helpers.py b/tools/replay/lib/ui_helpers.py index e350b89bac..23f3563084 100644 --- a/tools/replay/lib/ui_helpers.py +++ b/tools/replay/lib/ui_helpers.py @@ -1,5 +1,5 @@ import itertools -from typing import Any, Dict, Tuple +from typing import Any import matplotlib.pyplot as plt import numpy as np @@ -84,7 +84,7 @@ class Calibration: return pts / self.zoom -_COLOR_CACHE : Dict[Tuple[int, int, int], Any] = {} +_COLOR_CACHE : dict[tuple[int, int, int], Any] = {} def find_color(lidar_surface, color): if color in _COLOR_CACHE: return _COLOR_CACHE[color] diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 91ab0b6f07..10e2a055a3 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -4,7 +4,6 @@ import functools from multiprocessing import Process, Queue, Value from abc import ABC, abstractmethod -from typing import Optional from openpilot.common.params import Params from openpilot.common.numpy_fast import clip @@ -44,7 +43,7 @@ class SimulatorBridge(ABC): self._exit = threading.Event() self.simulator_state = SimulatorState() - self.world: Optional[World] = None + self.world: World | None = None self.past_startup_engaged = False diff --git a/tools/sim/bridge/metadrive/metadrive_bridge.py b/tools/sim/bridge/metadrive/metadrive_bridge.py index 1b1e5ffea6..c94fca2b95 100644 --- a/tools/sim/bridge/metadrive/metadrive_bridge.py +++ b/tools/sim/bridge/metadrive/metadrive_bridge.py @@ -30,14 +30,14 @@ class CopyRamRGBCamera(RGBCamera): class RGBCameraWide(CopyRamRGBCamera): def __init__(self, *args, **kwargs): - super(RGBCameraWide, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) lens = self.get_lens() lens.setFov(120) lens.setNear(0.1) class RGBCameraRoad(CopyRamRGBCamera): def __init__(self, *args, **kwargs): - super(RGBCameraRoad, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) lens = self.get_lens() lens.setFov(40) lens.setNear(0.1) @@ -85,7 +85,7 @@ class MetaDriveBridge(SimulatorBridge): def __init__(self, dual_camera, high_quality): self.should_render = False - super(MetaDriveBridge, self).__init__(dual_camera, high_quality) + super().__init__(dual_camera, high_quality) def spawn_world(self): sensors = { diff --git a/tools/sim/lib/manual_ctrl.py b/tools/sim/lib/manual_ctrl.py index 5e826e7baa..8a72296538 100755 --- a/tools/sim/lib/manual_ctrl.py +++ b/tools/sim/lib/manual_ctrl.py @@ -4,7 +4,7 @@ import array import os import struct from fcntl import ioctl -from typing import NoReturn, Dict, List +from typing import NoReturn # Iterate over the joystick devices. print('Available devices:') @@ -13,8 +13,8 @@ for fn in os.listdir('/dev/input'): print(f' /dev/input/{fn}') # We'll store the states here. -axis_states: Dict[str, float] = {} -button_states: Dict[str, float] = {} +axis_states: dict[str, float] = {} +button_states: dict[str, float] = {} # These constants were borrowed from linux/input.h axis_names = { @@ -88,8 +88,8 @@ button_names = { 0x2c3 : 'dpad_down', } -axis_name_list: List[str] = [] -button_name_list: List[str] = [] +axis_name_list: list[str] = [] +button_name_list: list[str] = [] def wheel_poll_thread(q: 'Queue[str]') -> NoReturn: # Open the joystick device. From 0b0ddd8d9e3ab5202b90ea81902247f3cee1bcc6 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 24 Feb 2024 20:41:38 -0500 Subject: [PATCH 252/923] Update CHANGELOGS.md --- CHANGELOGS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 1339df9800..96f593957f 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -19,8 +19,8 @@ sunnypilot - 0.9.6.1 (2024-02-27) * Toyota RAV4 Hybrid 2023-24 support ************************ * UPDATED: Synced with commaai's openpilot - * master commit 9acc558 (February 14, 2024) - * v0.9.6 release (February 22, 2024) + * master commit db57a21 (February 22, 2024) + * v0.9.6 release (February 27, 2024) * UPDATED: Dynamic Experimental Control (DEC) * Synced with dragonpilot-community/dragonpilot:beta3 commit f4ee52f * NEW❗: Default Driving Model: Los Angeles v2 (January 24, 2024) From 96ce470b7356a5dc3ca2e02aa6fc8d08646faf78 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 24 Feb 2024 20:54:04 -0800 Subject: [PATCH 253/923] VSCode settings (#31582) * base config * add launch.json * little more * cleanup * fix --------- Co-authored-by: Justin Newberry --- .gitignore | 1 - .pre-commit-config.yaml | 2 +- .vscode/extensions.json | 7 ++++++ .vscode/launch.json | 47 +++++++++++++++++++++++++++++++++++++++++ .vscode/settings.json | 16 ++++++++++++++ 5 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json diff --git a/.gitignore b/.gitignore index 3e91531d08..3da75aaea4 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ venv/ .overlay_init .overlay_consistent .sconsign.dblite -.vscode* model2.png a.out .hypothesis diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 335ccae456..09fded7f77 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,7 +10,7 @@ repos: - id: check-ast exclude: '^(third_party)/' - id: check-json - exclude: '.devcontainer/devcontainer.json' # this supports JSON with comments + exclude: '.devcontainer/devcontainer.json|.vscode/' # these support JSON with comments - id: check-toml - id: check-xml - id: check-yaml diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..3799b93e79 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-vscode.cpptools", + "elagil.pre-commit-helper", + ] +} \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..3b3953c3f4 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,47 @@ +{ + "version": "0.2.0", + "inputs": [ + { + "id": "python_process", + "type": "pickString", + "description": "Select the process to debug", + "options": [ + "selfdrive/controls/controlsd.py", + "selfdrive/navd/navd.py", + "system/timed/timed.py", + "tools/sim/run_bridge.py" + ] + }, + { + "id": "cpp_process", + "type": "pickString", + "description": "Select the process to debug", + "options": [ + "selfdrive/ui/ui" + ] + }, + { + "id": "args", + "description": "Arguments to pass to the process", + "type": "promptString" + } + ], + "configurations": [ + { + "name": "Python: openpilot Process", + "type": "debugpy", + "request": "launch", + "program": "${input:python_process}", + "console": "integratedTerminal", + "justMyCode": true, + "args": "${input:args}" + }, + { + "name": "C++: openpilot Process", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/${input:cpp_process}", + "cwd": "${workspaceFolder}", + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..daf74ca777 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "editor.tabSize": 2, + "editor.insertSpaces": true, + "editor.renderWhitespace": "trailing", + "files.trimTrailingWhitespace": true, + "search.exclude": { + "**/.git": true, + "**/.venv": true, + "**/__pycache__": true + }, + "files.exclude": { + "**/.git": true, + "**/.venv": true, + "**/__pycache__": true + } +} \ No newline at end of file From e6009d80e9323f0cbb41f058164b63eef4a9c55c Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Sun, 25 Feb 2024 01:18:13 -0500 Subject: [PATCH 254/923] cars: introduce "Platform" union type for all car enums (#31558) * Hmm * release * hmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm * unrelated * forgot * cleaner * Platform * new syntax * Fix * clean * Fix --- release/files_common | 1 + selfdrive/car/car_helpers.py | 6 +++++- selfdrive/car/interfaces.py | 7 ++++--- selfdrive/car/subaru/interface.py | 3 ++- selfdrive/car/values.py | 18 ++++++++++++++++++ 5 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 selfdrive/car/values.py diff --git a/release/files_common b/release/files_common index 1158d2c552..00a6abe6e6 100644 --- a/release/files_common +++ b/release/files_common @@ -87,6 +87,7 @@ selfdrive/car/docs_definitions.py selfdrive/car/car_helpers.py selfdrive/car/fingerprints.py selfdrive/car/interfaces.py +selfdrive/car/values.py selfdrive/car/vin.py selfdrive/car/disable_ecu.py selfdrive/car/fw_versions.py diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index fe4c0e885c..339be1912c 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -5,6 +5,7 @@ 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 @@ -189,7 +190,10 @@ def fingerprint(logcan, sendcan, num_pandas): cloudlog.event("fingerprinted", car_fingerprint=car_fingerprint, source=source, fuzzy=not exact_match, cached=cached, 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) - return car_fingerprint, finger, vin, car_fw, source, exact_match + + car_platform = PLATFORMS.get(car_fingerprint, car_fingerprint) + + return car_platform, finger, vin, car_fw, source, exact_match def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 05610a6dd6..4516ff3a9a 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -14,6 +14,7 @@ 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 PlatformConfig, apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG +from openpilot.selfdrive.car.values import Platform 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 @@ -101,14 +102,14 @@ class CarInterfaceBase(ABC): return ACCEL_MIN, ACCEL_MAX @classmethod - def get_non_essential_params(cls, candidate: str): + def get_non_essential_params(cls, candidate: Platform): """ 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: str, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): + def get_params(cls, candidate: Platform, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): ret = CarInterfaceBase.get_std_params(candidate) if hasattr(candidate, "config"): @@ -132,7 +133,7 @@ class CarInterfaceBase(ABC): @staticmethod @abstractmethod - def _get_params(ret: car.CarParams, candidate: str, fingerprint: dict[int, dict[int, int]], + def _get_params(ret: car.CarParams, candidate: Platform, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): raise NotImplementedError diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index edf07ac2ef..1358adb69c 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -1,6 +1,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car.values import Platform from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, LKAS_ANGLE, GLOBAL_GEN2, PREGLOBAL_CARS, HYBRID_CARS, SubaruFlags @@ -9,7 +10,7 @@ from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, LKAS_ANGL class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret, candidate: Platform, fingerprint, car_fw, experimental_long, docs): ret.carName = "subaru" ret.radarUnavailable = True # for HYBRID CARS to be upstreamed, we need: diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py new file mode 100644 index 0000000000..7a824d25c3 --- /dev/null +++ b/selfdrive/car/values.py @@ -0,0 +1,18 @@ +from typing import List, cast, Dict +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 VOLKSWAGEN + +Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | NISSAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN +BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, NISSAN, SUBARU, TESLA, TOYOTA, VOLKSWAGEN] + +PLATFORMS: Dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in cast(List[Platform], brand)} From cdd4d418aaa1516d110e03199f070b3168cb55c6 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Sun, 25 Feb 2024 02:15:16 -0500 Subject: [PATCH 255/923] Subaru: fix forester weight (#31585) fix weight --- selfdrive/car/subaru/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index e496f43628..0fd7ab9c13 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -139,7 +139,7 @@ class CAR(Platforms): FORESTER = SubaruPlatformConfig( "SUBARU FORESTER 2019", SubaruCarInfo("Subaru Forester 2019-21", "All"), - specs=CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), + specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), ) FORESTER_HYBRID = SubaruPlatformConfig( "SUBARU FORESTER HYBRID 2020", From be8e503a7da7b686ffa944902d58bb62925e34a9 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 25 Feb 2024 16:24:33 +0000 Subject: [PATCH 256/923] cars: update platforms typing syntax (#31586) --- selfdrive/car/values.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py index 7a824d25c3..3e27870915 100644 --- a/selfdrive/car/values.py +++ b/selfdrive/car/values.py @@ -1,4 +1,4 @@ -from typing import List, cast, Dict +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 @@ -15,4 +15,4 @@ from openpilot.selfdrive.car.volkswagen.values import CAR as VOLKSWAGEN Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | NISSAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, NISSAN, SUBARU, TESLA, TOYOTA, VOLKSWAGEN] -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 cast(list[Platform], brand)} From 30afe2c231d18bbbf71c1e26d0458bf0acacdd2f Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 25 Feb 2024 17:26:11 +0000 Subject: [PATCH 257/923] scripts: install and run pyupgrade (#31587) --- scripts/pyupgrade.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100755 scripts/pyupgrade.sh diff --git a/scripts/pyupgrade.sh b/scripts/pyupgrade.sh new file mode 100755 index 0000000000..19aac4b5e2 --- /dev/null +++ b/scripts/pyupgrade.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -e + +pip install --upgrade pyupgrade + +git ls-files '*.py' | grep -v 'third_party/' | xargs pyupgrade --py311-plus From 854e78eaffbdf66daccb53aa326276fb51723ee1 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Sun, 25 Feb 2024 18:18:43 +0000 Subject: [PATCH 258/923] linux-aarch64 also works for plotjuggler --- tools/plotjuggler/juggle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/plotjuggler/juggle.py b/tools/plotjuggler/juggle.py index dc94062801..0caf5a18ff 100755 --- a/tools/plotjuggler/juggle.py +++ b/tools/plotjuggler/juggle.py @@ -26,7 +26,7 @@ MAX_STREAMING_BUFFER_SIZE = 1000 def install(): m = f"{platform.system()}-{platform.machine()}" - supported = ("Linux-x86_64", "Darwin-arm64", "Darwin-x86_64") + supported = ("Linux-x86_64", "Linux-aarch64", "Darwin-arm64", "Darwin-x86_64") if m not in supported: raise Exception(f"Unsupported platform: '{m}'. Supported platforms: {supported}") From 3520d479557dad78b85ce2fd1f51d656c7ea6bd2 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 25 Feb 2024 19:41:27 +0000 Subject: [PATCH 259/923] vscode: add ruff extension (#31589) --- .vscode/extensions.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 3799b93e79..458312fc88 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,5 +3,6 @@ "ms-python.python", "ms-vscode.cpptools", "elagil.pre-commit-helper", + "charliermarsh.ruff", ] -} \ No newline at end of file +} From 80da3aee147867e46f566b63a96f4fe199e0628d Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 25 Feb 2024 21:29:18 +0000 Subject: [PATCH 260/923] mypy: use implicit-optional (#31590) * mypy: set implicit-optional = true * find and replace '| None = None' -> '= None' in function args --- common/file_helpers.py | 2 +- common/prefix.py | 2 +- pyproject.toml | 3 +++ selfdrive/athena/athenad.py | 6 +++--- selfdrive/athena/tests/test_athenad.py | 2 +- selfdrive/car/docs_definitions.py | 2 +- selfdrive/car/ecu_addrs.py | 2 +- selfdrive/car/fw_versions.py | 2 +- selfdrive/car/isotp_parallel_query.py | 2 +- selfdrive/controls/lib/alertmanager.py | 2 +- selfdrive/locationd/calibrationd.py | 2 +- selfdrive/locationd/helpers.py | 2 +- selfdrive/manager/process.py | 2 +- selfdrive/navd/helpers.py | 2 +- selfdrive/test/fuzzy_generation.py | 2 +- selfdrive/test/process_replay/process_replay.py | 6 +++--- selfdrive/test/process_replay/regen.py | 2 +- selfdrive/test/update_ci_routes.py | 2 +- selfdrive/ui/translations/auto_translate.py | 2 +- selfdrive/updated.py | 2 +- system/hardware/tici/casync.py | 2 +- system/loggerd/tests/loggerd_tests_common.py | 4 ++-- system/loggerd/tests/test_uploader.py | 2 +- system/loggerd/uploader.py | 2 +- system/webrtc/device/audio.py | 4 ++-- 25 files changed, 33 insertions(+), 30 deletions(-) diff --git a/common/file_helpers.py b/common/file_helpers.py index 417776b87c..29ad219c07 100644 --- a/common/file_helpers.py +++ b/common/file_helpers.py @@ -23,7 +23,7 @@ class CallbackReader: @contextlib.contextmanager -def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: str | None = None, newline: str | None = None, +def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: str = None, newline: str = None, overwrite: bool = False): """Write to a file atomically using a temporary file in the same directory as the destination file.""" dir_name = os.path.dirname(path) diff --git a/common/prefix.py b/common/prefix.py index 40f2f34b74..4059ac09e2 100644 --- a/common/prefix.py +++ b/common/prefix.py @@ -8,7 +8,7 @@ from openpilot.system.hardware.hw import Paths from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT class OpenpilotPrefix: - def __init__(self, prefix: str | None = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): + def __init__(self, prefix: str = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False): self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15]) self.msgq_path = os.path.join('/dev/shm', self.prefix) self.clean_dirs_on_exit = clean_dirs_on_exit diff --git a/pyproject.toml b/pyproject.toml index 51396ca39b..ac5bb0922c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -63,6 +63,9 @@ warn_unused_ignores=true # restrict dynamic typing warn_return_any=true +# allow implicit optionals for default args +implicit_optional = true + [tool.poetry] name = "openpilot" diff --git a/selfdrive/athena/athenad.py b/selfdrive/athena/athenad.py index 9480d2b8ec..9f901498b7 100755 --- a/selfdrive/athena/athenad.py +++ b/selfdrive/athena/athenad.py @@ -279,7 +279,7 @@ def upload_handler(end_event: threading.Event) -> None: cloudlog.exception("athena.upload_handler.exception") -def _do_upload(upload_item: UploadItem, callback: Callable | None = None) -> requests.Response: +def _do_upload(upload_item: UploadItem, callback: Callable = None) -> requests.Response: path = upload_item.path compress = False @@ -328,7 +328,7 @@ def getVersion() -> dict[str, str]: @dispatcher.add_method -def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: str | None = None, place_details: str | None = None) -> dict[str, int]: +def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: str = None, place_details: str = None) -> dict[str, int]: destination = { "latitude": latitude, "longitude": longitude, @@ -767,7 +767,7 @@ def backoff(retries: int) -> int: return random.randrange(0, min(128, int(2 ** retries))) -def main(exit_event: threading.Event | None = None): +def main(exit_event: threading.Event = None): try: set_core_affinity([0, 1, 2, 3]) except Exception: diff --git a/selfdrive/athena/tests/test_athenad.py b/selfdrive/athena/tests/test_athenad.py index 8d09661f01..780bef345e 100755 --- a/selfdrive/athena/tests/test_athenad.py +++ b/selfdrive/athena/tests/test_athenad.py @@ -96,7 +96,7 @@ class TestAthenadMethods(unittest.TestCase): break @staticmethod - def _create_file(file: str, parent: str | None = None, data: bytes = b'') -> str: + def _create_file(file: str, parent: str = None, data: bytes = b'') -> str: fn = os.path.join(Paths.log_root() if parent is None else parent, file) os.makedirs(os.path.dirname(fn), exist_ok=True) with open(fn, 'wb') as f: diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 03ed1f32cb..841cc3af2f 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -159,7 +159,7 @@ class CarParts: return copy.deepcopy(self) @classmethod - def common(cls, add: list[EnumBase] | None = None, remove: list[EnumBase] | None = None): + def common(cls, add: list[EnumBase] = None, remove: list[EnumBase] = None): p = [part for part in (add or []) + DEFAULT_CAR_PARTS if part not in (remove or [])] return cls(p) diff --git a/selfdrive/car/ecu_addrs.py b/selfdrive/car/ecu_addrs.py index 6d6fa333a5..da5e7b4612 100755 --- a/selfdrive/car/ecu_addrs.py +++ b/selfdrive/car/ecu_addrs.py @@ -19,7 +19,7 @@ def make_tester_present_msg(addr, bus, subaddr=None): return make_can_msg(addr, bytes(dat), bus) -def is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subaddr: int | None = None) -> bool: +def is_tester_present_response(msg: capnp.lib.capnp._DynamicStructReader, subaddr: int = None) -> bool: # ISO-TP messages are always padded to 8 bytes # tester present response is always a single frame dat_offset = 1 if subaddr is not None else 0 diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 1cf4cecd3e..7673814195 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -39,7 +39,7 @@ def is_brand(brand: str, filter_brand: str | None) -> bool: def build_fw_dict(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], - filter_brand: str | None = None) -> dict[AddrType, set[bytes]]: + filter_brand: str = None) -> dict[AddrType, set[bytes]]: fw_versions_dict: defaultdict[AddrType, set[bytes]] = defaultdict(set) for fw in fw_versions: if is_brand(fw.brand, filter_brand) and not fw.logging: diff --git a/selfdrive/car/isotp_parallel_query.py b/selfdrive/car/isotp_parallel_query.py index 678fe9ea46..8fdc747e9e 100644 --- a/selfdrive/car/isotp_parallel_query.py +++ b/selfdrive/car/isotp_parallel_query.py @@ -12,7 +12,7 @@ from panda.python.uds import CanClient, IsoTpMessage, FUNCTIONAL_ADDRS, get_rx_a class IsoTpParallelQuery: def __init__(self, sendcan: messaging.PubSocket, logcan: messaging.SubSocket, bus: int, addrs: list[int] | list[AddrType], request: list[bytes], response: list[bytes], response_offset: int = 0x8, - functional_addrs: list[int] | None = None, debug: bool = False, response_pending_timeout: float = 10) -> None: + functional_addrs: list[int] = None, debug: bool = False, response_pending_timeout: float = 10) -> None: self.sendcan = sendcan self.logcan = logcan self.bus = bus diff --git a/selfdrive/controls/lib/alertmanager.py b/selfdrive/controls/lib/alertmanager.py index 8034c8ebbc..f67e269fa9 100644 --- a/selfdrive/controls/lib/alertmanager.py +++ b/selfdrive/controls/lib/alertmanager.py @@ -13,7 +13,7 @@ with open(os.path.join(BASEDIR, "selfdrive/controls/lib/alerts_offroad.json")) a OFFROAD_ALERTS = json.load(f) -def set_offroad_alert(alert: str, show_alert: bool, extra_text: str | None = None) -> None: +def set_offroad_alert(alert: str, show_alert: bool, extra_text: str = None) -> None: if show_alert: a = copy.copy(OFFROAD_ALERTS[alert]) a['extra'] = extra_text or '' diff --git a/selfdrive/locationd/calibrationd.py b/selfdrive/locationd/calibrationd.py index 1456bf16f5..6e154bf07c 100755 --- a/selfdrive/locationd/calibrationd.py +++ b/selfdrive/locationd/calibrationd.py @@ -89,7 +89,7 @@ class Calibrator: valid_blocks: int = 0, wide_from_device_euler_init: np.ndarray = WIDE_FROM_DEVICE_EULER_INIT, height_init: np.ndarray = HEIGHT_INIT, - smooth_from: np.ndarray | None = None) -> None: + smooth_from: np.ndarray = None) -> None: if not np.isfinite(rpy_init).all(): self.rpy = RPY_INIT.copy() else: diff --git a/selfdrive/locationd/helpers.py b/selfdrive/locationd/helpers.py index c273ba87b3..786bdbbfec 100644 --- a/selfdrive/locationd/helpers.py +++ b/selfdrive/locationd/helpers.py @@ -41,7 +41,7 @@ class PointBuckets: def add_point(self, x: float, y: float, bucket_val: float) -> None: raise NotImplementedError - def get_points(self, num_points: int | None = None) -> Any: + def get_points(self, num_points: int = None) -> Any: points = np.vstack([x.arr for x in self.buckets.values()]) if num_points is None: return points diff --git a/selfdrive/manager/process.py b/selfdrive/manager/process.py index 46fb68f89c..7964f5229d 100644 --- a/selfdrive/manager/process.py +++ b/selfdrive/manager/process.py @@ -109,7 +109,7 @@ class ManagerProcess(ABC): else: self.watchdog_seen = True - def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals | None = None) -> int | None: + def stop(self, retry: bool = True, block: bool = True, sig: signal.Signals = None) -> int | None: if self.proc is None: return None diff --git a/selfdrive/navd/helpers.py b/selfdrive/navd/helpers.py index 5b0f5b7e85..0f0410c2c7 100644 --- a/selfdrive/navd/helpers.py +++ b/selfdrive/navd/helpers.py @@ -106,7 +106,7 @@ def distance_along_geometry(geometry: list[Coordinate], pos: Coordinate) -> floa return total_distance_closest -def coordinate_from_param(param: str, params: Params | None = None) -> Coordinate | None: +def coordinate_from_param(param: str, params: Params = None) -> Coordinate | None: if params is None: params = Params() diff --git a/selfdrive/test/fuzzy_generation.py b/selfdrive/test/fuzzy_generation.py index 00e98fadc1..26c35c0c18 100644 --- a/selfdrive/test/fuzzy_generation.py +++ b/selfdrive/test/fuzzy_generation.py @@ -68,7 +68,7 @@ class FuzzyGenerator: else: return self.generate_struct(field.schema) - def generate_struct(self, schema: capnp.lib.capnp._StructSchema, event: str | None = None) -> st.SearchStrategy[dict[str, Any]]: + def generate_struct(self, schema: capnp.lib.capnp._StructSchema, event: str = None) -> st.SearchStrategy[dict[str, Any]]: full_fill: list[str] = list(schema.non_union_fields) single_fill: list[str] = [event] if event else [self.draw(st.sampled_from(schema.union_fields))] if schema.union_fields else [] return st.fixed_dictionaries({field: self.generate_field(schema.fields[field]) for field in full_fill + single_fill}) diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index b760548fd7..4fb3e3c4de 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -627,9 +627,9 @@ def replay_process_with_name(name: str | Iterable[str], lr: LogIterable, *args, def replay_process( - cfg: ProcessConfig | Iterable[ProcessConfig], lr: LogIterable, frs: dict[str, BaseFrameReader] | None = None, - fingerprint: str | None = None, return_all_logs: bool = False, custom_params: dict[str, Any] | None = None, - captured_output_store: dict[str, dict[str, str]] | None = None, disable_progress: bool = False + cfg: ProcessConfig | Iterable[ProcessConfig], lr: LogIterable, frs: dict[str, BaseFrameReader] = None, + fingerprint: str = None, return_all_logs: bool = False, custom_params: dict[str, Any] = None, + captured_output_store: dict[str, dict[str, str]] = None, disable_progress: bool = False ) -> list[capnp._DynamicStructReader]: if isinstance(cfg, Iterable): cfgs = list(cfg) diff --git a/selfdrive/test/process_replay/regen.py b/selfdrive/test/process_replay/regen.py index 3bb51d0b65..8e882207b5 100755 --- a/selfdrive/test/process_replay/regen.py +++ b/selfdrive/test/process_replay/regen.py @@ -41,7 +41,7 @@ class DummyFrameReader(BaseFrameReader): def regen_segment( - lr: LogIterable, frs: dict[str, Any] | None = None, + lr: LogIterable, frs: dict[str, Any] = None, processes: Iterable[ProcessConfig] = CONFIGS, disable_tqdm: bool = False ) -> list[capnp._DynamicStructReader]: all_msgs = sorted(lr, key=lambda m: m.logMonoTime) diff --git a/selfdrive/test/update_ci_routes.py b/selfdrive/test/update_ci_routes.py index bdfefb78d1..a9f4494ffd 100755 --- a/selfdrive/test/update_ci_routes.py +++ b/selfdrive/test/update_ci_routes.py @@ -19,7 +19,7 @@ SOURCES: list[AzureContainer] = [ DEST = OpenpilotCIContainer -def upload_route(path: str, exclude_patterns: Iterable[str] | None = None) -> None: +def upload_route(path: str, exclude_patterns: Iterable[str] = None) -> None: if exclude_patterns is None: exclude_patterns = [r'dcamera\.hevc'] diff --git a/selfdrive/ui/translations/auto_translate.py b/selfdrive/ui/translations/auto_translate.py index 8613feb245..c2e4bbc552 100755 --- a/selfdrive/ui/translations/auto_translate.py +++ b/selfdrive/ui/translations/auto_translate.py @@ -18,7 +18,7 @@ OPENAI_PROMPT = "You are a professional translator from English to {language} (I "The following sentence or word is in the GUI of a software called openpilot, translate it accordingly." -def get_language_files(languages: list[str] | None = None) -> dict[str, pathlib.Path]: +def get_language_files(languages: list[str] = None) -> dict[str, pathlib.Path]: files = {} with open(TRANSLATIONS_LANGUAGES) as fp: diff --git a/selfdrive/updated.py b/selfdrive/updated.py index ba4260ae3d..b6b395f254 100755 --- a/selfdrive/updated.py +++ b/selfdrive/updated.py @@ -71,7 +71,7 @@ def read_time_from_param(params, param) -> datetime.datetime | None: pass return None -def run(cmd: list[str], cwd: str | None = None) -> str: +def run(cmd: list[str], cwd: str = None) -> str: return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT, encoding='utf8') diff --git a/system/hardware/tici/casync.py b/system/hardware/tici/casync.py index 68ca37d38d..986228c1cd 100755 --- a/system/hardware/tici/casync.py +++ b/system/hardware/tici/casync.py @@ -145,7 +145,7 @@ def build_chunk_dict(chunks: list[Chunk]) -> ChunkDict: def extract(target: list[Chunk], sources: list[tuple[str, ChunkReader, ChunkDict]], out_path: str, - progress: Callable[[int], None] | None = None): + progress: Callable[[int], None] = None): stats: dict[str, int] = defaultdict(int) mode = 'rb+' if os.path.exists(out_path) else 'wb' diff --git a/system/loggerd/tests/loggerd_tests_common.py b/system/loggerd/tests/loggerd_tests_common.py index 0532fe1a89..42eec2a0f4 100644 --- a/system/loggerd/tests/loggerd_tests_common.py +++ b/system/loggerd/tests/loggerd_tests_common.py @@ -11,7 +11,7 @@ from openpilot.system.hardware.hw import Paths from openpilot.system.loggerd.xattr_cache import setxattr -def create_random_file(file_path: Path, size_mb: float, lock: bool = False, upload_xattr: bytes | None = None) -> None: +def create_random_file(file_path: Path, size_mb: float, lock: bool = False, upload_xattr: bytes = None) -> None: file_path.parent.mkdir(parents=True, exist_ok=True) if lock: @@ -81,7 +81,7 @@ class UploaderTestCase(unittest.TestCase): self.params.put("DongleId", "0000000000000000") def make_file_with_data(self, f_dir: str, fn: str, size_mb: float = .1, lock: bool = False, - upload_xattr: bytes | None = None, preserve_xattr: bytes | None = None) -> Path: + upload_xattr: bytes = None, preserve_xattr: bytes = None) -> Path: file_path = Path(Paths.log_root()) / f_dir / fn create_random_file(file_path, size_mb, lock, upload_xattr) diff --git a/system/loggerd/tests/test_uploader.py b/system/loggerd/tests/test_uploader.py index b807bd6b98..73917a30cf 100755 --- a/system/loggerd/tests/test_uploader.py +++ b/system/loggerd/tests/test_uploader.py @@ -52,7 +52,7 @@ class TestUploader(UploaderTestCase): self.end_event.set() self.up_thread.join() - def gen_files(self, lock=False, xattr: bytes | None = None, boot=True) -> list[Path]: + def gen_files(self, lock=False, xattr: bytes = None, boot=True) -> list[Path]: f_paths = [] for t in ["qlog", "rlog", "dcamera.hevc", "fcamera.hevc"]: f_paths.append(self.make_file_with_data(self.seg_dir, t, 1, lock=lock, upload_xattr=xattr)) diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 5ccf0ff69a..33ee8c1850 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -222,7 +222,7 @@ class Uploader: return self.upload(name, key, fn, network_type, metered) -def main(exit_event: threading.Event | None = None) -> None: +def main(exit_event: threading.Event = None) -> None: if exit_event is None: exit_event = threading.Event() diff --git a/system/webrtc/device/audio.py b/system/webrtc/device/audio.py index b1859518a1..4b22033e03 100644 --- a/system/webrtc/device/audio.py +++ b/system/webrtc/device/audio.py @@ -16,7 +16,7 @@ class AudioInputStreamTrack(aiortc.mediastreams.AudioStreamTrack): pyaudio.paFloat32: 'flt', } - def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 16000, channels: int = 1, packet_time: float = 0.020, device_index: int | None = None): + def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 16000, channels: int = 1, packet_time: float = 0.020, device_index: int = None): super().__init__() self.p = pyaudio.PyAudio() @@ -48,7 +48,7 @@ class AudioInputStreamTrack(aiortc.mediastreams.AudioStreamTrack): class AudioOutputSpeaker: - def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 48000, channels: int = 2, packet_time: float = 0.2, device_index: int | None = None): + def __init__(self, audio_format: int = pyaudio.paInt16, rate: int = 48000, channels: int = 2, packet_time: float = 0.2, device_index: int = None): chunk_size = int(packet_time * rate) self.p = pyaudio.PyAudio() From da540eac1346d0d28bf7cbb2499d6193af541798 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Sun, 25 Feb 2024 19:38:17 -0600 Subject: [PATCH 261/923] VW: Move car specs to PlatformConfig (#31567) * subaru platform config * forester wrong dbc * spacing * subaru car specs * someday! * more red diff * all brands can be done like this * but this should be done first and thats subaru specific * that seems very low but we shouldn't change it here * as long as it subclasses str its fine * well that sucked * cleanup and follow refactor * diff reduction * oops * fix * force fingerprint * Revert "force fingerprint" This reverts commit 600fbcd7d559703601a06c8876a640de417e5b6c. * space * Fix specs * this one too --------- Co-authored-by: Justin Newberry --- selfdrive/car/__init__.py | 6 +- selfdrive/car/interfaces.py | 2 + selfdrive/car/volkswagen/interface.py | 120 +-------- selfdrive/car/volkswagen/values.py | 336 ++++++++++++++++---------- 4 files changed, 217 insertions(+), 247 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 7544796b93..ca77dce1cf 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,6 +1,6 @@ # functions common among cars from collections import namedtuple -from dataclasses import dataclass +from dataclasses import dataclass, field from enum import ReprEnum import capnp @@ -246,11 +246,13 @@ class CanSignalRateCalculator: CarInfos = CarInfo | list[CarInfo] -@dataclass +@dataclass(kw_only=True) class CarSpecs: mass: float wheelbase: float steerRatio: float + minSteerSpeed: float = field(default=0.) + minEnableSpeed: float = field(default=-1.) @dataclass(order=True) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 4516ff3a9a..e0db1b56d8 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -118,6 +118,8 @@ class CarInterfaceBase(ABC): ret.mass = platform_config.specs.mass ret.wheelbase = platform_config.specs.wheelbase ret.steerRatio = platform_config.specs.steerRatio + ret.minEnableSpeed = platform_config.specs.minEnableSpeed + ret.minSteerSpeed = platform_config.specs.minSteerSpeed ret = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 544d104d33..fa68e81d0d 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -1,9 +1,8 @@ from cereal import car from panda import Panda -from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase -from openpilot.selfdrive.car.volkswagen.values import CAR, PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags +from openpilot.selfdrive.car.volkswagen.values import PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName @@ -72,7 +71,6 @@ class CarInterface(CarInterfaceBase): # Global lateral tuning defaults, can be overridden per-vehicle - ret.steerRatio = 15.6 # Let the params learner figure this out ret.steerLimitTimer = 0.4 if candidate in PQ_CARS: ret.steerActuatorDelay = 0.2 @@ -105,122 +103,6 @@ class CarInterface(CarInterfaceBase): # Per-chassis tuning values, override tuning defaults here if desired - if candidate == CAR.ARTEON_MK1: - ret.mass = 1733 - ret.wheelbase = 2.84 - - elif candidate == CAR.ATLAS_MK1: - ret.mass = 2011 - ret.wheelbase = 2.98 - - elif candidate == CAR.CRAFTER_MK2: - ret.mass = 2100 - ret.wheelbase = 3.64 # SWB, LWB is 4.49, TBD how to detect difference - ret.minSteerSpeed = 50 * CV.KPH_TO_MS - - elif candidate == CAR.GOLF_MK7: - ret.mass = 1397 - ret.wheelbase = 2.62 - - elif candidate == CAR.JETTA_MK7: - ret.mass = 1328 - ret.wheelbase = 2.71 - - elif candidate == CAR.PASSAT_MK8: - ret.mass = 1551 - ret.wheelbase = 2.79 - - elif candidate == CAR.PASSAT_NMS: - ret.mass = 1503 - ret.wheelbase = 2.80 - ret.minEnableSpeed = 20 * CV.KPH_TO_MS # ACC "basic", no FtS - ret.minSteerSpeed = 50 * CV.KPH_TO_MS - - elif candidate == CAR.POLO_MK6: - ret.mass = 1230 - ret.wheelbase = 2.55 - - elif candidate == CAR.SHARAN_MK2: - ret.mass = 1639 - ret.wheelbase = 2.92 - ret.minSteerSpeed = 50 * CV.KPH_TO_MS - - elif candidate == CAR.TAOS_MK1: - ret.mass = 1498 - ret.wheelbase = 2.69 - - elif candidate == CAR.TCROSS_MK1: - ret.mass = 1150 - ret.wheelbase = 2.60 - - elif candidate == CAR.TIGUAN_MK2: - ret.mass = 1715 - ret.wheelbase = 2.74 - - elif candidate == CAR.TOURAN_MK2: - ret.mass = 1516 - ret.wheelbase = 2.79 - - elif candidate == CAR.TRANSPORTER_T61: - ret.mass = 1926 - ret.wheelbase = 3.00 # SWB, LWB is 3.40, TBD how to detect difference - ret.minSteerSpeed = 14.0 - - elif candidate == CAR.TROC_MK1: - ret.mass = 1413 - ret.wheelbase = 2.63 - - elif candidate == CAR.AUDI_A3_MK3: - ret.mass = 1335 - ret.wheelbase = 2.61 - - elif candidate == CAR.AUDI_Q2_MK1: - ret.mass = 1205 - ret.wheelbase = 2.61 - - elif candidate == CAR.AUDI_Q3_MK2: - ret.mass = 1623 - ret.wheelbase = 2.68 - - elif candidate == CAR.SEAT_ATECA_MK1: - ret.mass = 1900 - ret.wheelbase = 2.64 - - elif candidate == CAR.SEAT_LEON_MK3: - ret.mass = 1227 - ret.wheelbase = 2.64 - - elif candidate == CAR.SKODA_FABIA_MK4: - ret.mass = 1266 - ret.wheelbase = 2.56 - - elif candidate == CAR.SKODA_KAMIQ_MK1: - ret.mass = 1265 - ret.wheelbase = 2.66 - - elif candidate == CAR.SKODA_KAROQ_MK1: - ret.mass = 1278 - ret.wheelbase = 2.66 - - elif candidate == CAR.SKODA_KODIAQ_MK1: - ret.mass = 1569 - ret.wheelbase = 2.79 - - elif candidate == CAR.SKODA_OCTAVIA_MK3: - ret.mass = 1388 - ret.wheelbase = 2.68 - - elif candidate == CAR.SKODA_SCALA_MK1: - ret.mass = 1192 - ret.wheelbase = 2.65 - - elif candidate == CAR.SKODA_SUPERB_MK3: - ret.mass = 1505 - ret.wheelbase = 2.84 - - else: - raise ValueError(f"unsupported car {candidate}") - ret.autoResumeSng = ret.minEnableSpeed == -1 ret.centerToFront = ret.wheelbase * 0.45 return ret diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index e49b9850be..f029740284 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,11 +1,12 @@ -from collections import defaultdict, namedtuple +from collections import namedtuple from dataclasses import dataclass, field -from enum import Enum, IntFlag, StrEnum +from enum import Enum, IntFlag from cereal import car from panda.python import uds from opendbc.can.can_define import CANDefine -from openpilot.selfdrive.car import dbc_dict +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, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -111,49 +112,17 @@ class CANBUS: class VolkswagenFlags(IntFlag): STOCK_HCA_PRESENT = 1 +@dataclass +class VolkswagenMQBPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None)) -# 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(StrEnum): - ARTEON_MK1 = "VOLKSWAGEN ARTEON 1ST GEN" # Chassis AN, Mk1 VW Arteon and variants - ATLAS_MK1 = "VOLKSWAGEN ATLAS 1ST GEN" # Chassis CA, Mk1 VW Atlas and Atlas Cross Sport - CRAFTER_MK2 = "VOLKSWAGEN CRAFTER 2ND GEN" # Chassis SY/SZ, Mk2 VW Crafter, VW Grand California, MAN TGE - GOLF_MK7 = "VOLKSWAGEN GOLF 7TH GEN" # Chassis 5G/AU/BA/BE, Mk7 VW Golf and variants - JETTA_MK7 = "VOLKSWAGEN JETTA 7TH GEN" # Chassis BU, Mk7 VW Jetta - PASSAT_MK8 = "VOLKSWAGEN PASSAT 8TH GEN" # Chassis 3G, Mk8 VW Passat and variants - PASSAT_NMS = "VOLKSWAGEN PASSAT NMS" # Chassis A3, North America/China/Mideast NMS Passat, incl. facelift - POLO_MK6 = "VOLKSWAGEN POLO 6TH GEN" # Chassis AW, Mk6 VW Polo - SHARAN_MK2 = "VOLKSWAGEN SHARAN 2ND GEN" # Chassis 7N, Mk2 Volkswagen Sharan and SEAT Alhambra - TAOS_MK1 = "VOLKSWAGEN TAOS 1ST GEN" # Chassis B2, Mk1 VW Taos and Tharu - TCROSS_MK1 = "VOLKSWAGEN T-CROSS 1ST GEN" # Chassis C1, Mk1 VW T-Cross SWB and LWB variants - TIGUAN_MK2 = "VOLKSWAGEN TIGUAN 2ND GEN" # Chassis AD/BW, Mk2 VW Tiguan and variants - TOURAN_MK2 = "VOLKSWAGEN TOURAN 2ND GEN" # Chassis 1T, Mk2 VW Touran and variants - TRANSPORTER_T61 = "VOLKSWAGEN TRANSPORTER T6.1" # Chassis 7H/7L, T6-facelift Transporter/Multivan/Caravelle/California - TROC_MK1 = "VOLKSWAGEN T-ROC 1ST GEN" # Chassis A1, Mk1 VW T-Roc and variants - AUDI_A3_MK3 = "AUDI A3 3RD GEN" # Chassis 8V/FF, Mk3 Audi A3 and variants - AUDI_Q2_MK1 = "AUDI Q2 1ST GEN" # Chassis GA, Mk1 Audi Q2 (RoW) and Q2L (China only) - AUDI_Q3_MK2 = "AUDI Q3 2ND GEN" # Chassis 8U/F3/FS, Mk2 Audi Q3 and variants - SEAT_ATECA_MK1 = "SEAT ATECA 1ST GEN" # Chassis 5F, Mk1 SEAT Ateca and CUPRA Ateca - SEAT_LEON_MK3 = "SEAT LEON 3RD GEN" # Chassis 5F, Mk3 SEAT Leon and variants - SKODA_FABIA_MK4 = "SKODA FABIA 4TH GEN" # Chassis PJ, Mk4 Skoda Fabia - SKODA_KAMIQ_MK1 = "SKODA KAMIQ 1ST GEN" # Chassis NW, Mk1 Skoda Kamiq - SKODA_KAROQ_MK1 = "SKODA KAROQ 1ST GEN" # Chassis NU, Mk1 Skoda Karoq - SKODA_KODIAQ_MK1 = "SKODA KODIAQ 1ST GEN" # Chassis NS, Mk1 Skoda Kodiaq - SKODA_SCALA_MK1 = "SKODA SCALA 1ST GEN" # Chassis NW, Mk1 Skoda Scala and Skoda Kamiq - SKODA_SUPERB_MK3 = "SKODA SUPERB 3RD GEN" # Chassis 3V/NP, Mk3 Skoda Superb and variants - SKODA_OCTAVIA_MK3 = "SKODA OCTAVIA 3RD GEN" # Chassis NE, Mk3 Skoda Octavia and variants - - -PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} - - -DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict("vw_mqb_2010", None)) -for car_type in PQ_CARS: - DBC[car_type] = dbc_dict("vw_golf_mk4", None) +@dataclass +class VolkswagenPQPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) +@dataclass(kw_only=True) +class VolkswagenCarSpecs(CarSpecs): + steerRatio: float = field(default=15.6) class Footnote(Enum): KAMIQ = CarFootnote( @@ -189,90 +158,202 @@ class VWCarInfo(CarInfo): if CP.carFingerprint in (CAR.CRAFTER_MK2, CAR.TRANSPORTER_T61): self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) +# 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 -CAR_INFO: dict[str, VWCarInfo | list[VWCarInfo]] = { - CAR.ARTEON_MK1: [ - 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"), - ], - CAR.ATLAS_MK1: [ - 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"), - ], - CAR.CRAFTER_MK2: [ - 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"), - ], - CAR.GOLF_MK7: [ - 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"), - ], - CAR.JETTA_MK7: [ - VWCarInfo("Volkswagen Jetta 2018-24"), - VWCarInfo("Volkswagen Jetta GLI 2021-24"), - ], - CAR.PASSAT_MK8: [ - VWCarInfo("Volkswagen Passat 2015-22", footnotes=[Footnote.PASSAT]), - VWCarInfo("Volkswagen Passat Alltrack 2015-22"), - VWCarInfo("Volkswagen Passat GTE 2015-22"), - ], - CAR.PASSAT_NMS: VWCarInfo("Volkswagen Passat NMS 2017-22"), - CAR.POLO_MK6: [ - VWCarInfo("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), - VWCarInfo("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), - ], - CAR.SHARAN_MK2: [ - VWCarInfo("Volkswagen Sharan 2018-22"), - VWCarInfo("SEAT Alhambra 2018-20"), - ], - CAR.TAOS_MK1: VWCarInfo("Volkswagen Taos 2022-23"), - CAR.TCROSS_MK1: VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0]), - CAR.TIGUAN_MK2: [ - VWCarInfo("Volkswagen Tiguan 2018-24"), - VWCarInfo("Volkswagen Tiguan eHybrid 2021-23"), - ], - CAR.TOURAN_MK2: VWCarInfo("Volkswagen Touran 2016-23"), - CAR.TRANSPORTER_T61: [ - VWCarInfo("Volkswagen Caravelle 2020"), - VWCarInfo("Volkswagen California 2021-23"), - ], - CAR.TROC_MK1: VWCarInfo("Volkswagen T-Roc 2018-22", footnotes=[Footnote.VW_MQB_A0]), - CAR.AUDI_A3_MK3: [ - VWCarInfo("Audi A3 2014-19"), - VWCarInfo("Audi A3 Sportback e-tron 2017-18"), - VWCarInfo("Audi RS3 2018"), - VWCarInfo("Audi S3 2015-17"), - ], - CAR.AUDI_Q2_MK1: VWCarInfo("Audi Q2 2018"), - CAR.AUDI_Q3_MK2: VWCarInfo("Audi Q3 2019-23"), - CAR.SEAT_ATECA_MK1: VWCarInfo("SEAT Ateca 2018"), - CAR.SEAT_LEON_MK3: VWCarInfo("SEAT Leon 2014-20"), - CAR.SKODA_FABIA_MK4: VWCarInfo("Škoda Fabia 2022-23", footnotes=[Footnote.VW_MQB_A0]), - CAR.SKODA_KAMIQ_MK1: VWCarInfo("Škoda Kamiq 2021-23", footnotes=[Footnote.VW_MQB_A0, Footnote.KAMIQ]), - CAR.SKODA_KAROQ_MK1: VWCarInfo("Škoda Karoq 2019-23"), - CAR.SKODA_KODIAQ_MK1: VWCarInfo("Škoda Kodiaq 2017-23"), - CAR.SKODA_SCALA_MK1: VWCarInfo("Škoda Scala 2020-23", footnotes=[Footnote.VW_MQB_A0]), - CAR.SKODA_SUPERB_MK3: VWCarInfo("Škoda Superb 2015-22"), - CAR.SKODA_OCTAVIA_MK3: [ - VWCarInfo("Škoda Octavia 2015-19"), - VWCarInfo("Škoda Octavia RS 2016"), - ], -} +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"), + ], + specs=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"), + ], + specs=VolkswagenCarSpecs(mass=2011, wheelbase=2.98), + ) + 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"), + ], + specs=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"), + ], + specs=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"), + ], + specs=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"), + ], + specs=VolkswagenCarSpecs(mass=1551, wheelbase=2.79), + ) + PASSAT_NMS = VolkswagenPQPlatformConfig( + "VOLKSWAGEN PASSAT NMS", # Chassis A3 + VWCarInfo("Volkswagen Passat NMS 2017-22"), + specs=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]), + ], + specs=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"), + ], + specs=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"), + specs=VolkswagenCarSpecs(mass=1498, wheelbase=2.69), + ) + TCROSS_MK1 = VolkswagenMQBPlatformConfig( + "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 + car_info=VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0]), + specs=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"), + ], + specs=VolkswagenCarSpecs(mass=1715, wheelbase=2.74), + ) + TOURAN_MK2 = VolkswagenMQBPlatformConfig( + "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T + VWCarInfo("Volkswagen Touran 2016-23"), + specs=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"), + ], + specs=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]), + specs=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"), + ], + specs=VolkswagenCarSpecs(mass=1335, wheelbase=2.61), + ) + AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( + "AUDI Q2 1ST GEN", # Chassis GA + VWCarInfo("Audi Q2 2018"), + specs=VolkswagenCarSpecs(mass=1205, wheelbase=2.61), + ) + AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( + "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS + VWCarInfo("Audi Q3 2019-23"), + specs=VolkswagenCarSpecs(mass=1623, wheelbase=2.68), + ) + SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( + "SEAT ATECA 1ST GEN", # Chassis 5F + VWCarInfo("SEAT Ateca 2018"), + specs=VolkswagenCarSpecs(mass=1900, wheelbase=2.64), + ) + SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( + "SEAT LEON 3RD GEN", # Chassis 5F + VWCarInfo("SEAT Leon 2014-20"), + specs=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]), + specs=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]), + specs=VolkswagenCarSpecs(mass=1265, wheelbase=2.66), + ) + SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( + "SKODA KAROQ 1ST GEN", # Chassis NU + VWCarInfo("Škoda Karoq 2019-23"), + specs=VolkswagenCarSpecs(mass=1278, wheelbase=2.66), + ) + SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( + "SKODA KODIAQ 1ST GEN", # Chassis NS + VWCarInfo("Škoda Kodiaq 2017-23"), + specs=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"), + ], + specs=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]), + specs=VolkswagenCarSpecs(mass=1192, wheelbase=2.65), + ) + SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( + "SKODA SUPERB 3RD GEN", # Chassis 3V/NP + VWCarInfo("Škoda Superb 2015-22"), + specs=VolkswagenCarSpecs(mass=1505, wheelbase=2.84), + ) +PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} # 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. @@ -313,3 +394,6 @@ FW_QUERY_CONFIG = FwQueryConfig( ), ]], ) + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From 5012e15aa65f4ee82ce19c856a52909b3a879016 Mon Sep 17 00:00:00 2001 From: Eric Brown Date: Sun, 25 Feb 2024 18:53:26 -0700 Subject: [PATCH 262/923] GM: move to platform config (#31553) * subaru platform config * forester wrong dbc * spacing * subaru car specs * someday! * more red diff * Move GM to platform config * Implement CarSpecs * Simplify centerToFront * Accidentally had subaru DBC * Fix typo in DBC name * done above * two spaces * that is moved up * fix hardcoded fingerprints * whitespace * values * better? * fix * bump * fix * fix --------- Co-authored-by: Justin Newberry --- selfdrive/car/__init__.py | 1 + selfdrive/car/gm/interface.py | 61 -------------- selfdrive/car/gm/values.py | 133 ++++++++++++++++++++---------- selfdrive/car/interfaces.py | 1 + selfdrive/car/subaru/interface.py | 3 - 5 files changed, 90 insertions(+), 109 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index ca77dce1cf..75b85cab2f 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -251,6 +251,7 @@ class CarSpecs: mass: float wheelbase: float steerRatio: float + centerToFrontRatio: float = field(default=0.5) minSteerSpeed: float = field(default=0.) minEnableSpeed: float = field(default=-1.) diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 05caa28510..e0dde4d0e9 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -152,11 +152,7 @@ class CarInterface(CarInterfaceBase): ret.longitudinalActuatorDelayUpperBound = 0.5 # large delay to initially start braking if candidate == CAR.VOLT: - ret.mass = 1607. - ret.wheelbase = 2.69 - ret.steerRatio = 17.7 # Stock 15.7, LiveParameters ret.tireStiffnessFactor = 0.469 # Stock Michelin Energy Saver A/S, LiveParameters - ret.centerToFront = ret.wheelbase * 0.45 # Volt Gen 1, TODO corner weigh ret.lateralTuning.pid.kpBP = [0., 40.] ret.lateralTuning.pid.kpV = [0., 0.17] @@ -165,61 +161,20 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 1. # get_steer_feedforward_volt() ret.steerActuatorDelay = 0.2 - elif candidate == CAR.MALIBU: - ret.mass = 1496. - ret.wheelbase = 2.83 - ret.steerRatio = 15.8 - ret.centerToFront = ret.wheelbase * 0.4 # wild guess - - elif candidate == CAR.HOLDEN_ASTRA: - ret.mass = 1363. - ret.wheelbase = 2.662 - # Remaining parameters copied from Volt for now - ret.centerToFront = ret.wheelbase * 0.4 - ret.steerRatio = 15.7 - elif candidate == CAR.ACADIA: ret.minEnableSpeed = -1. # engage speed is decided by pcm - ret.mass = 4353. * CV.LB_TO_KG - ret.wheelbase = 2.86 - ret.steerRatio = 14.4 # end to end is 13.46 - ret.centerToFront = ret.wheelbase * 0.4 ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.BUICK_LACROSSE: - ret.mass = 1712. - ret.wheelbase = 2.91 - ret.steerRatio = 15.8 - ret.centerToFront = ret.wheelbase * 0.4 # wild guess CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - elif candidate == CAR.BUICK_REGAL: - ret.mass = 3779. * CV.LB_TO_KG # (3849+3708)/2 - ret.wheelbase = 2.83 # 111.4 inches in meters - ret.steerRatio = 14.4 # guess for tourx - ret.centerToFront = ret.wheelbase * 0.4 # guess for tourx - - elif candidate == CAR.CADILLAC_ATS: - ret.mass = 1601. - ret.wheelbase = 2.78 - ret.steerRatio = 15.3 - ret.centerToFront = ret.wheelbase * 0.5 - elif candidate == CAR.ESCALADE: ret.minEnableSpeed = -1. # engage speed is decided by pcm - ret.mass = 5653. * CV.LB_TO_KG # (5552+5815)/2 - ret.wheelbase = 2.95 # 116 inches in meters - ret.steerRatio = 17.3 - ret.centerToFront = ret.wheelbase * 0.5 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate in (CAR.ESCALADE_ESV, CAR.ESCALADE_ESV_2019): ret.minEnableSpeed = -1. # engage speed is decided by pcm - ret.mass = 2739. - ret.wheelbase = 3.302 - ret.steerRatio = 17.3 - ret.centerToFront = ret.wheelbase * 0.5 ret.tireStiffnessFactor = 1.0 if candidate == CAR.ESCALADE_ESV: @@ -231,19 +186,11 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.BOLT_EUV: - ret.mass = 1669. - ret.wheelbase = 2.63779 - ret.steerRatio = 16.8 - ret.centerToFront = ret.wheelbase * 0.4 ret.tireStiffnessFactor = 1.0 ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.SILVERADO: - ret.mass = 2450. - ret.wheelbase = 3.75 - ret.steerRatio = 16.3 - ret.centerToFront = ret.wheelbase * 0.5 ret.tireStiffnessFactor = 1.0 # 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. @@ -253,17 +200,9 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.EQUINOX: - ret.mass = 3500. * CV.LB_TO_KG - ret.wheelbase = 2.72 - ret.steerRatio = 14.4 - ret.centerToFront = ret.wheelbase * 0.4 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.TRAILBLAZER: - ret.mass = 1345. - ret.wheelbase = 2.64 - ret.steerRatio = 16.8 - ret.centerToFront = ret.wheelbase * 0.4 ret.tireStiffnessFactor = 1.0 ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 5c4d572fdb..53dbde87f4 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -1,9 +1,8 @@ -from collections import defaultdict -from dataclasses import dataclass -from enum import Enum, StrEnum +from dataclasses import dataclass, field +from enum import Enum from cereal import car -from openpilot.selfdrive.car import dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -61,23 +60,6 @@ class CarControllerParams: self.BRAKE_LOOKUP_V = [self.MAX_BRAKE, 0.] -class CAR(StrEnum): - HOLDEN_ASTRA = "HOLDEN ASTRA RS-V BK 2017" - VOLT = "CHEVROLET VOLT PREMIER 2017" - CADILLAC_ATS = "CADILLAC ATS Premium Performance 2018" - MALIBU = "CHEVROLET MALIBU PREMIER 2017" - ACADIA = "GMC ACADIA DENALI 2018" - BUICK_LACROSSE = "BUICK LACROSSE 2017" - BUICK_REGAL = "BUICK REGAL ESSENCE 2018" - ESCALADE = "CADILLAC ESCALADE 2017" - ESCALADE_ESV = "CADILLAC ESCALADE ESV 2016" - ESCALADE_ESV_2019 = "CADILLAC ESCALADE ESV 2019" - BOLT_EUV = "CHEVROLET BOLT EUV 2022" - SILVERADO = "CHEVROLET SILVERADO 1500 2020" - EQUINOX = "CHEVROLET EQUINOX 2019" - TRAILBLAZER = "CHEVROLET TRAILBLAZER 2021" - - class Footnote(Enum): OBD_II = CarFootnote( 'Requires a community built ASCM harness. ' + @@ -97,28 +79,88 @@ class GMCarInfo(CarInfo): self.footnotes.append(Footnote.OBD_II) -CAR_INFO: dict[str, GMCarInfo | list[GMCarInfo]] = { - CAR.HOLDEN_ASTRA: GMCarInfo("Holden Astra 2017"), - CAR.VOLT: GMCarInfo("Chevrolet Volt 2017-18", min_enable_speed=0, video_link="https://youtu.be/QeMCN_4TFfQ"), - CAR.CADILLAC_ATS: GMCarInfo("Cadillac ATS Premium Performance 2018"), - CAR.MALIBU: GMCarInfo("Chevrolet Malibu Premier 2017"), - CAR.ACADIA: GMCarInfo("GMC Acadia 2018", video_link="https://www.youtube.com/watch?v=0ZN6DdsBUZo"), - CAR.BUICK_LACROSSE: GMCarInfo("Buick LaCrosse 2017-19", "Driver Confidence Package 2"), - CAR.BUICK_REGAL: GMCarInfo("Buick Regal Essence 2018"), - CAR.ESCALADE: GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"), - CAR.ESCALADE_ESV: GMCarInfo("Cadillac Escalade ESV 2016", "Adaptive Cruise Control (ACC) & LKAS"), - CAR.ESCALADE_ESV_2019: GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS"), - CAR.BOLT_EUV: [ - 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"), - ], - CAR.SILVERADO: [ - 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"), - ], - CAR.EQUINOX: GMCarInfo("Chevrolet Equinox 2019-22"), - CAR.TRAILBLAZER: GMCarInfo("Chevrolet Trailblazer 2021-22"), -} +@dataclass +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')) + + +class CAR(Platforms): + HOLDEN_ASTRA = GMPlatformConfig( + "HOLDEN ASTRA RS-V BK 2017", + GMCarInfo("Holden Astra 2017"), + specs=CarSpecs(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"), + specs=CarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45), + ) + CADILLAC_ATS = GMPlatformConfig( + "CADILLAC ATS Premium Performance 2018", + GMCarInfo("Cadillac ATS Premium Performance 2018"), + specs=CarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), + ) + MALIBU = GMPlatformConfig( + "CHEVROLET MALIBU PREMIER 2017", + GMCarInfo("Chevrolet Malibu Premier 2017"), + specs=CarSpecs(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"), + specs=CarSpecs(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"), + specs=CarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), + ) + BUICK_REGAL = GMPlatformConfig( + "BUICK REGAL ESSENCE 2018", + GMCarInfo("Buick Regal Essence 2018"), + specs=CarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), + ) + ESCALADE = GMPlatformConfig( + "CADILLAC ESCALADE 2017", + GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"), + specs=CarSpecs(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"), + specs=CarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3), + ) + ESCALADE_ESV_2019 = GMPlatformConfig( + "CADILLAC ESCALADE ESV 2019", + GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS"), + specs=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"), + ], + specs=CarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4), + ) + 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"), + ], + specs=CarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3), + ) + EQUINOX = GMPlatformConfig( + "CHEVROLET EQUINOX 2019", + GMCarInfo("Chevrolet Equinox 2019-22"), + specs=CarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), + ) + TRAILBLAZER = GMPlatformConfig( + "CHEVROLET TRAILBLAZER 2021", + GMCarInfo("Chevrolet Trailblazer 2021-22"), + specs=CarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4), + ) class CruiseButtons: @@ -180,11 +222,12 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x24b, None)], ) -DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict('gm_global_a_powertrain_generated', 'gm_global_a_object', chassis_dbc='gm_global_a_chassis')) - EV_CAR = {CAR.VOLT, CAR.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} STEER_THRESHOLD = 1.0 + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index e0db1b56d8..0a2d978004 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -118,6 +118,7 @@ class CarInterfaceBase(ABC): 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 diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 1358adb69c..2dfb4f9565 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -41,9 +41,6 @@ class CarInterface(CarInterfaceBase): else: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - - ret.centerToFront = ret.wheelbase * 0.5 - if candidate in (CAR.ASCENT, CAR.ASCENT_2023): ret.steerActuatorDelay = 0.3 # end-to-end angle controller ret.lateralTuning.init('pid') From 8e03cdfc2ae72ea09208ce41ddc8f7a118c3b973 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Mon, 26 Feb 2024 01:55:42 +0000 Subject: [PATCH 263/923] Ford: move to PlatformConfig (#31554) * Ford: move to PlatformConfig * Align Aviator model years with Explorer * Add CarSpecs to PlatformConfig --------- Co-authored-by: justin --- selfdrive/car/ford/interface.py | 47 +---------- selfdrive/car/ford/values.py | 141 +++++++++++++++++++------------- 2 files changed, 83 insertions(+), 105 deletions(-) diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index 685a2a27ad..fd4c381f88 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -3,7 +3,7 @@ from panda import Panda from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.ford.fordcan import CanBus -from openpilot.selfdrive.car.ford.values import CANFD_CAR, CAR, Ecu +from openpilot.selfdrive.car.ford.values import CANFD_CAR, Ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase TransmissionType = car.CarParams.TransmissionType @@ -39,51 +39,6 @@ class CarInterface(CarInterfaceBase): if candidate in CANFD_CAR: ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_CANFD - if candidate == CAR.BRONCO_SPORT_MK1: - ret.wheelbase = 2.67 - ret.steerRatio = 17.7 - ret.mass = 1625 - - elif candidate == CAR.ESCAPE_MK4: - ret.wheelbase = 2.71 - ret.steerRatio = 16.7 - ret.mass = 1750 - - elif candidate == CAR.EXPLORER_MK6: - ret.wheelbase = 3.025 - ret.steerRatio = 16.8 - ret.mass = 2050 - - elif candidate == CAR.F_150_MK14: - # required trim only on SuperCrew - ret.wheelbase = 3.69 - ret.steerRatio = 17.0 - ret.mass = 2000 - - elif candidate == CAR.F_150_LIGHTNING_MK1: - # required trim only on SuperCrew - ret.wheelbase = 3.70 - ret.steerRatio = 16.9 - ret.mass = 2948 - - elif candidate == CAR.MUSTANG_MACH_E_MK1: - ret.wheelbase = 2.984 - ret.steerRatio = 17.0 # guess - ret.mass = 2200 - - elif candidate == CAR.FOCUS_MK4: - ret.wheelbase = 2.7 - ret.steerRatio = 15.0 - ret.mass = 1350 - - elif candidate == CAR.MAVERICK_MK1: - ret.wheelbase = 3.076 - ret.steerRatio = 17.0 - ret.mass = 1650 - - else: - raise ValueError(f"Unsupported car: {candidate}") - # Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1 found_ecus = [fw.ecu for fw in car_fw] if Ecu.shiftByWire in found_ecus or 0x5A in fingerprint[CAN.main] or docs: diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 3ad39d715f..ef99cf5f34 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,9 +1,8 @@ -from collections import defaultdict -from dataclasses import dataclass -from enum import Enum, StrEnum +from dataclasses import dataclass, field +from enum import Enum from cereal import car -from openpilot.selfdrive.car import AngleRateLimit, dbc_dict +from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, dbc_dict, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -39,33 +38,11 @@ class CarControllerParams: pass -class CAR(StrEnum): - BRONCO_SPORT_MK1 = "FORD BRONCO SPORT 1ST GEN" - ESCAPE_MK4 = "FORD ESCAPE 4TH GEN" - EXPLORER_MK6 = "FORD EXPLORER 6TH GEN" - F_150_MK14 = "FORD F-150 14TH GEN" - FOCUS_MK4 = "FORD FOCUS 4TH GEN" - MAVERICK_MK1 = "FORD MAVERICK 1ST GEN" - F_150_LIGHTNING_MK1 = "FORD F-150 LIGHTNING 1ST GEN" - MUSTANG_MACH_E_MK1 = "FORD MUSTANG MACH-E 1ST GEN" - - -CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1} - - class RADAR: DELPHI_ESR = 'ford_fusion_2018_adas' DELPHI_MRR = 'FORD_CADS' -DBC: dict[str, dict[str, str]] = defaultdict(lambda: dbc_dict("ford_lincoln_base_pt", RADAR.DELPHI_MRR)) - -# F-150 radar is not yet supported -DBC[CAR.F_150_MK14] = dbc_dict("ford_lincoln_base_pt", None) -DBC[CAR.F_150_LIGHTNING_MK1] = dbc_dict("ford_lincoln_base_pt", None) -DBC[CAR.MUSTANG_MACH_E_MK1] = dbc_dict("ford_lincoln_base_pt", None) - - class Footnote(Enum): FOCUS = CarFootnote( "Refers only to the Focus Mk4 (C519) available in Europe/China/Taiwan/Australasia, not the Focus Mk3 (C346) in " + @@ -86,39 +63,82 @@ class FordCarInfo(CarInfo): self.car_parts = CarParts([Device.threex, harness]) -CAR_INFO: dict[str, CarInfo | list[CarInfo]] = { - CAR.BRONCO_SPORT_MK1: FordCarInfo("Ford Bronco Sport 2021-22"), - CAR.ESCAPE_MK4: [ - 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"), - ], - CAR.EXPLORER_MK6: [ - 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 - ], - CAR.F_150_MK14: [ - FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), - FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"), - ], - CAR.F_150_LIGHTNING_MK1: FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), - CAR.MUSTANG_MACH_E_MK1: FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), - CAR.FOCUS_MK4: [ - 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 - ], - CAR.MAVERICK_MK1: [ - 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"), - ], -} +@dataclass +class FordPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) + + +class CAR(Platforms): + BRONCO_SPORT_MK1 = FordPlatformConfig( + "FORD BRONCO SPORT 1ST GEN", + FordCarInfo("Ford Bronco Sport 2021-22"), + specs=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"), + ], + specs=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 + ], + specs=CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), + ) + F_150_MK14 = FordPlatformConfig( + "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"), + ], + dbc_dict=dbc_dict('ford_lincoln_base_pt', None), + specs=CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), + ) + F_150_LIGHTNING_MK1 = FordPlatformConfig( + "FORD F-150 LIGHTNING 1ST GEN", + FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), + dbc_dict=dbc_dict('ford_lincoln_base_pt', None), + specs=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 + ], + specs=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", "Co-Pilot360 Assist"), + FordCarInfo("Ford Maverick Hybrid 2023", "Co-Pilot360 Assist"), + ], + specs=CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), + ) + MUSTANG_MACH_E_MK1 = FordPlatformConfig( + "FORD MUSTANG MACH-E 1ST GEN", + FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), + dbc_dict=dbc_dict('ford_lincoln_base_pt', None), + specs=CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio + ) + + +CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1} + FW_QUERY_CONFIG = FwQueryConfig( requests=[ @@ -142,3 +162,6 @@ FW_QUERY_CONFIG = FwQueryConfig( (Ecu.shiftByWire, 0x732, None), ], ) + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From a1fefabbca852923dee83b5ee58c748ce861cdad Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 26 Feb 2024 09:08:24 -0800 Subject: [PATCH 264/923] [bot] Update Python packages and pre-commit hooks (#31595) Update Python packages and pre-commit hooks Co-authored-by: jnewb1 --- .pre-commit-config.yaml | 2 +- poetry.lock | 351 ++++++++++++++++++++-------------------- 2 files changed, 177 insertions(+), 176 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 09fded7f77..6db68e55bc 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -91,7 +91,7 @@ repos: pass_filenames: false files: 'selfdrive/ui/translations/*' - repo: https://github.com/python-poetry/poetry - rev: '1.7.0' + rev: '1.8.0' hooks: - id: poetry-check name: validate poetry lock diff --git a/poetry.lock b/poetry.lock index 9972cd7732..588186d138 100644 --- a/poetry.lock +++ b/poetry.lock @@ -751,63 +751,63 @@ test = ["pytest", "pytest-timeout"] [[package]] name = "coverage" -version = "7.4.1" +version = "7.4.3" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, - {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, - {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, - {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, - {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, - {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, - {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, - {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, - {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, - {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, - {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, - {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, - {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, - {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, - {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, - {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8bdb0285a0202888d19ec6b6d23d5990410decb932b709f2b0dfe216d031d218"}, - {file = "coverage-7.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:918440dea04521f499721c039863ef95433314b1db00ff826a02580c1f503e45"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:379d4c7abad5afbe9d88cc31ea8ca262296480a86af945b08214eb1a556a3e4d"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b094116f0b6155e36a304ff912f89bbb5067157aff5f94060ff20bbabdc8da06"}, - {file = "coverage-7.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2f5968608b1fe2a1d00d01ad1017ee27efd99b3437e08b83ded9b7af3f6f766"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:10e88e7f41e6197ea0429ae18f21ff521d4f4490aa33048f6c6f94c6045a6a75"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a4a3907011d39dbc3e37bdc5df0a8c93853c369039b59efa33a7b6669de04c60"}, - {file = "coverage-7.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6d224f0c4c9c98290a6990259073f496fcec1b5cc613eecbd22786d398ded3ad"}, - {file = "coverage-7.4.1-cp38-cp38-win32.whl", hash = "sha256:23f5881362dcb0e1a92b84b3c2809bdc90db892332daab81ad8f642d8ed55042"}, - {file = "coverage-7.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:a07f61fc452c43cd5328b392e52555f7d1952400a1ad09086c4a8addccbd138d"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, - {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, - {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, - {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, - {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, - {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, - {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, - {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, + {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"}, ] [package.extras] @@ -825,43 +825,43 @@ files = [ [[package]] name = "cryptography" -version = "42.0.3" +version = "42.0.5" 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.3-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:de5086cd475d67113ccb6f9fae6d8fe3ac54a4f9238fd08bfdb07b03d791ff0a"}, - {file = "cryptography-42.0.3-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:935cca25d35dda9e7bd46a24831dfd255307c55a07ff38fd1a92119cffc34857"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20100c22b298c9eaebe4f0b9032ea97186ac2555f426c3e70670f2517989543b"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eb6368d5327d6455f20327fb6159b97538820355ec00f8cc9464d617caecead"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:39d5c93e95bcbc4c06313fc6a500cee414ee39b616b55320c1904760ad686938"}, - {file = "cryptography-42.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3d96ea47ce6d0055d5b97e761d37b4e84195485cb5a38401be341fabf23bc32a"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d1998e545081da0ab276bcb4b33cce85f775adb86a516e8f55b3dac87f469548"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:93fbee08c48e63d5d1b39ab56fd3fdd02e6c2431c3da0f4edaf54954744c718f"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:90147dad8c22d64b2ff7331f8d4cddfdc3ee93e4879796f837bdbb2a0b141e0c"}, - {file = "cryptography-42.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4dcab7c25e48fc09a73c3e463d09ac902a932a0f8d0c568238b3696d06bf377b"}, - {file = "cryptography-42.0.3-cp37-abi3-win32.whl", hash = "sha256:1e935c2900fb53d31f491c0de04f41110351377be19d83d908c1fd502ae8daa5"}, - {file = "cryptography-42.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:762f3771ae40e111d78d77cbe9c1035e886ac04a234d3ee0856bf4ecb3749d54"}, - {file = "cryptography-42.0.3-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0d3ec384058b642f7fb7e7bff9664030011ed1af8f852540c76a1317a9dd0d20"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35772a6cffd1f59b85cb670f12faba05513446f80352fe811689b4e439b5d89e"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:04859aa7f12c2b5f7e22d25198ddd537391f1695df7057c8700f71f26f47a129"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:c3d1f5a1d403a8e640fa0887e9f7087331abb3f33b0f2207d2cc7f213e4a864c"}, - {file = "cryptography-42.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df34312149b495d9d03492ce97471234fd9037aa5ba217c2a6ea890e9166f151"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:de4ae486041878dc46e571a4c70ba337ed5233a1344c14a0790c4c4be4bbb8b4"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:0fab2a5c479b360e5e0ea9f654bcebb535e3aa1e493a715b13244f4e07ea8eec"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25b09b73db78facdfd7dd0fa77a3f19e94896197c86e9f6dc16bce7b37a96504"}, - {file = "cryptography-42.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d5cf11bc7f0b71fb71af26af396c83dfd3f6eed56d4b6ef95d57867bf1e4ba65"}, - {file = "cryptography-42.0.3-cp39-abi3-win32.whl", hash = "sha256:0fea01527d4fb22ffe38cd98951c9044400f6eff4788cf52ae116e27d30a1ba3"}, - {file = "cryptography-42.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:2619487f37da18d6826e27854a7f9d4d013c51eafb066c80d09c63cf24505306"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ead69ba488f806fe1b1b4050febafdbf206b81fa476126f3e16110c818bac396"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:20180da1b508f4aefc101cebc14c57043a02b355d1a652b6e8e537967f1e1b46"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fbf0f3f0fac7c089308bd771d2c6c7b7d53ae909dce1db52d8e921f6c19bb3a"}, - {file = "cryptography-42.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c23f03cfd7d9826cdcbad7850de67e18b4654179e01fe9bc623d37c2638eb4ef"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db0480ffbfb1193ac4e1e88239f31314fe4c6cdcf9c0b8712b55414afbf80db4"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:6c25e1e9c2ce682d01fc5e2dde6598f7313027343bd14f4049b82ad0402e52cd"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9541c69c62d7446539f2c1c06d7046aef822940d248fa4b8962ff0302862cc1f"}, - {file = "cryptography-42.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1b797099d221df7cce5ff2a1d272761d1554ddf9a987d3e11f6459b38cd300fd"}, - {file = "cryptography-42.0.3.tar.gz", hash = "sha256:069d2ce9be5526a44093a0991c450fe9906cdf069e0e7cd67d9dee49a62b9ebe"}, + {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"}, ] [package.dependencies] @@ -2281,22 +2281,22 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.26.0" +version = "1.27.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" files = [ - {file = "msal-1.26.0-py2.py3-none-any.whl", hash = "sha256:be77ba6a8f49c9ff598bbcdc5dfcf1c9842f3044300109af738e8c3e371065b5"}, - {file = "msal-1.26.0.tar.gz", hash = "sha256:224756079fe338be838737682b49f8ebc20a87c1c5eeaf590daae4532b83de15"}, + {file = "msal-1.27.0-py2.py3-none-any.whl", hash = "sha256:572d07149b83e7343a85a3bcef8e581167b4ac76befcbbb6eef0c0e19643cdc0"}, + {file = "msal-1.27.0.tar.gz", hash = "sha256:3109503c038ba6b307152b0e8d34f98113f2e7a78986e28d0baf5b5303afda52"}, ] [package.dependencies] -cryptography = ">=0.6,<44" +cryptography = ">=0.6,<45" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.14)"] +broker = ["pymsalruntime (>=0.13.2,<0.15)"] [[package]] name = "msal-extensions" @@ -2608,36 +2608,36 @@ reference = ["Pillow", "google-re2"] [[package]] name = "onnxruntime" -version = "1.17.0" +version = "1.17.1" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime-1.17.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d2b22a25a94109cc983443116da8d9805ced0256eb215c5e6bc6dcbabefeab96"}, - {file = "onnxruntime-1.17.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4c87d83c6f58d1af2675fc99e3dc810f2dbdb844bcefd0c1b7573632661f6fc"}, - {file = "onnxruntime-1.17.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dba55723bf9b835e358f48c98a814b41692c393eb11f51e02ece0625c756b797"}, - {file = "onnxruntime-1.17.0-cp310-cp310-win32.whl", hash = "sha256:ee48422349cc500273beea7607e33c2237909f58468ae1d6cccfc4aecd158565"}, - {file = "onnxruntime-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f34cc46553359293854e38bdae2ab1be59543aad78a6317e7746d30e311110c3"}, - {file = "onnxruntime-1.17.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:16d26badd092c8c257fa57c458bb600d96dc15282c647ccad0ed7b2732e6c03b"}, - {file = "onnxruntime-1.17.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6f1273bebcdb47ed932d076c85eb9488bc4768fcea16d5f2747ca692fad4f9d3"}, - {file = "onnxruntime-1.17.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cb60fd3c2c1acd684752eb9680e89ae223e9801a9b0e0dc7b28adabe45a2e380"}, - {file = "onnxruntime-1.17.0-cp311-cp311-win32.whl", hash = "sha256:4b038324586bc905299e435f7c00007e6242389c856b82fe9357fdc3b1ef2bdc"}, - {file = "onnxruntime-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:93d39b3fa1ee01f034f098e1c7769a811a21365b4883f05f96c14a2b60c6028b"}, - {file = "onnxruntime-1.17.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:90c0890e36f880281c6c698d9bc3de2afbeee2f76512725ec043665c25c67d21"}, - {file = "onnxruntime-1.17.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7466724e809a40e986b1637cba156ad9fc0d1952468bc00f79ef340bc0199552"}, - {file = "onnxruntime-1.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d47bee7557a8b99c8681b6882657a515a4199778d6d5e24e924d2aafcef55b0a"}, - {file = "onnxruntime-1.17.0-cp312-cp312-win32.whl", hash = "sha256:bb1bf1ee575c665b8bbc3813ab906e091a645a24ccc210be7932154b8260eca1"}, - {file = "onnxruntime-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac2f286da3494b29b4186ca193c7d4e6a2c1f770c4184c7192c5da142c3dec28"}, - {file = "onnxruntime-1.17.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:1ec485643b93e0a3896c655eb2426decd63e18a278bb7ccebc133b340723624f"}, - {file = "onnxruntime-1.17.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83c35809cda898c5a11911c69ceac8a2ac3925911854c526f73bad884582f911"}, - {file = "onnxruntime-1.17.0-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fa464aa4d81df818375239e481887b656e261377d5b6b9a4692466f5f3261edc"}, - {file = "onnxruntime-1.17.0-cp38-cp38-win32.whl", hash = "sha256:b7b337cd0586f7836601623cbd30a443df9528ef23965860d11c753ceeb009f2"}, - {file = "onnxruntime-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:fbb9faaf51d01aa2c147ef52524d9326744c852116d8005b9041809a71838878"}, - {file = "onnxruntime-1.17.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:5a06ab84eaa350bf64b1d747b33ccf10da64221ed1f38f7287f15eccbec81603"}, - {file = "onnxruntime-1.17.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d3d11db2c8242766212a68d0b139745157da7ce53bd96ba349a5c65e5a02357"}, - {file = "onnxruntime-1.17.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5632077c3ab8b0cd4f74b0af9c4e924be012b1a7bcd7daa845763c6c6bf14b7d"}, - {file = "onnxruntime-1.17.0-cp39-cp39-win32.whl", hash = "sha256:61a12732cba869b3ad2d4e29ab6cb62c7a96f61b8c213f7fcb961ba412b70b37"}, - {file = "onnxruntime-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:461fa0fc7d9c392c352b6cccdedf44d818430f3d6eacd924bb804fdea2dcfd02"}, + {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"}, ] [package.dependencies] @@ -2650,21 +2650,21 @@ sympy = "*" [[package]] name = "onnxruntime-gpu" -version = "1.17.0" +version = "1.17.1" description = "ONNX Runtime is a runtime accelerator for Machine Learning models" optional = false python-versions = "*" files = [ - {file = "onnxruntime_gpu-1.17.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1f2a4e0468ac0bd8246996c3d5dbba92cbbaca874bcd7f9cee4e99ce6eb27f5b"}, - {file = "onnxruntime_gpu-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:0721b7930d7abed3730b2335e639e60d94ec411bb4d35a0347cc9c8b52c34540"}, - {file = "onnxruntime_gpu-1.17.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:be0314afe399943904de7c1ca797cbcc63e6fad60eb85d3df6422f81dd94e79e"}, - {file = "onnxruntime_gpu-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:52125c24b21406d1431e43de1c98cea29c21e0cceba80db530b7e4c9216d86ea"}, - {file = "onnxruntime_gpu-1.17.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:bb802d8033885c412269f8bc8877d8779b0dc874df6fb9df8b796cba7276ad66"}, - {file = "onnxruntime_gpu-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:8c43533e3e5335eaa78059fb86b849a4faded513a00c1feaaa205ca5af51c40f"}, - {file = "onnxruntime_gpu-1.17.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:1d461455bba160836d6c11c648c8fd4e4500d5c17096a13e6c2c9d22a4abd436"}, - {file = "onnxruntime_gpu-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4398f2175a92f4b35d95279a6294a89c462f24de058a2736ee1d498bab5a16"}, - {file = "onnxruntime_gpu-1.17.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1d0e3805cd1c024aba7f4ae576fd08545fc27530a2aaad2b3c8ac0ee889fbd05"}, - {file = "onnxruntime_gpu-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc1da5b93363ee600b5b220b04eeec51ad2c2b3e96f0b7615b16b8a173c88001"}, + {file = "onnxruntime_gpu-1.17.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a55fe84ee11a59ea069c6a790ee960f1c7da0d7d6c74822b2a8b357027c93646"}, + {file = "onnxruntime_gpu-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:a9abefceb32879cbee9f57977d6bb8d58cbac501f8a64bf96bca2f4fdff157fe"}, + {file = "onnxruntime_gpu-1.17.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:b2cd54f2b0a05e6bc9ab30182b859364d30115a19c31be24aa2edef40be00277"}, + {file = "onnxruntime_gpu-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdffcced8a5f6275c0df202220e9232138b336f868cd671c9d2c571e834d2a80"}, + {file = "onnxruntime_gpu-1.17.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:a1c871e8d0ae4121ea6528fc9410a5a7cbc5e43714b30521d5514fd10b987c83"}, + {file = "onnxruntime_gpu-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:9a0a94eda080e9f4a8e5035fdf0b3c24f5533e7861d88833a94493e63fca0812"}, + {file = "onnxruntime_gpu-1.17.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:624fdb65a632833f13de36854855818680be4f77942d8114524491d58f60d3ab"}, + {file = "onnxruntime_gpu-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:29fa78d232bbb5a5be3a3e0a022148a7b3df2ca66b4c21a11eef56e6f22859e9"}, + {file = "onnxruntime_gpu-1.17.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b0f8c70f2f9aeae825f3a397cc0c5f45124f9ae7c173263cf13c495982b0b99a"}, + {file = "onnxruntime_gpu-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:b1a27a104334461b690e4fc62775e1e71c68936399874932225d7fea21a0c261"}, ] [package.dependencies] @@ -2844,40 +2844,40 @@ test = ["pylint (>=3.0.0,<3.1.0)", "pytest", "pytest-pylint"] [[package]] name = "pandas" -version = "2.2.0" +version = "2.2.1" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" files = [ - {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, - {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, - {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, - {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, - {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, - {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, - {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, - {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, - {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, - {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, - {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, - {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, - {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, - {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, - {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, - {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, - {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, - {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, + {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] @@ -2905,6 +2905,7 @@ parquet = ["pyarrow (>=10.0.1)"] performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] plot = ["matplotlib (>=3.6.3)"] postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +pyarrow = ["pyarrow (>=10.0.1)"] spss = ["pyreadstat (>=1.2.0)"] sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] @@ -6468,13 +6469,13 @@ cp2110 = ["hidapi"] [[package]] name = "pytest" -version = "8.0.1" +version = "8.0.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.0.1-py3-none-any.whl", hash = "sha256:3e4f16fe1c0a9dc9d9389161c127c3edc5d810c38d6793042fb81d9f48a59fca"}, - {file = "pytest-8.0.1.tar.gz", hash = "sha256:267f6563751877d772019b13aacbe4e860d73fe8f651f28112e9ac37de7513ae"}, + {file = "pytest-8.0.2-py3-none-any.whl", hash = "sha256:edfaaef32ce5172d5466b5127b42e0d6d35ebbe4453f0e3505d96afd93f6b096"}, + {file = "pytest-8.0.2.tar.gz", hash = "sha256:d4051d623a2e0b7e51960ba963193b09ce6daeb9759a451844a21e4ddedfc1bd"}, ] [package.dependencies] @@ -6639,12 +6640,12 @@ numpy = ["numpy (>=1.6.0)"] [[package]] name = "pytweening" -version = "1.1.0" -description = "A collection of tweening / easing functions." +version = "1.2.0" +description = "A collection of tweening (aka easing) functions." optional = false python-versions = "*" files = [ - {file = "pytweening-1.1.0.tar.gz", hash = "sha256:0d8e14af529dd816ad4aa4a86757dfb5fe2fc2897e06f5db60183706a9370828"}, + {file = "pytweening-1.2.0.tar.gz", hash = "sha256:243318b7736698066c5f362ec5c2b6434ecf4297c3c8e7caa8abfe6af4cac71b"}, ] [[package]] @@ -7172,19 +7173,19 @@ test = ["pytest"] [[package]] name = "setuptools" -version = "69.1.0" +version = "69.1.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, - {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, + {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"}, + {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"}, ] [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)", "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-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +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-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" @@ -7619,13 +7620,13 @@ files = [ [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] @@ -7658,13 +7659,13 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] From 5c0bbc7dda74f4e354b5e670185abf29d2d49488 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 26 Feb 2024 11:20:42 -0800 Subject: [PATCH 265/923] [bot] Bump submodules (#31594) * bump submodules * bump opendbc --------- Co-authored-by: jnewb1 Co-authored-by: Justin Newberry --- cereal | 2 +- opendbc | 2 +- panda | 2 +- rednose_repo | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cereal b/cereal index 2fba1381f4..a4255106b7 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 2fba1381f40df2654f42a2e4bed869f2b7d01a52 +Subproject commit a4255106b7255e00ae04162f7aa14aa3cae339c3 diff --git a/opendbc b/opendbc index 951ab07fdc..0ac21652f2 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 951ab07fdcbce023a5c927f56bbf94e0f2322366 +Subproject commit 0ac21652f2e643e29aa471ad6b238bf74b22e356 diff --git a/panda b/panda index 6aa4b55033..0c7d5f11d7 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 6aa4b550336136bc20a6abb307cf310e876eba28 +Subproject commit 0c7d5f11d7187904022ea49b6a76b54d7b280345 diff --git a/rednose_repo b/rednose_repo index 18b91458fd..c5762e8bc6 160000 --- a/rednose_repo +++ b/rednose_repo @@ -1 +1 @@ -Subproject commit 18b91458fd396530d43e1a2fe9a3ac9055fa9109 +Subproject commit c5762e8bc6f7338c7a30d2cd1cba8cc64e81ba19 From 86090a1e150f6d6df5283725ff1fb03605ecfef5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 26 Feb 2024 14:20:51 -0500 Subject: [PATCH 266/923] add common/mock to release (#31596) * add mock * fix * fix2 --- release/files_common | 1 + 1 file changed, 1 insertion(+) diff --git a/release/files_common b/release/files_common index 00a6abe6e6..d62ef8d1bb 100644 --- a/release/files_common +++ b/release/files_common @@ -23,6 +23,7 @@ common/.gitignore common/__init__.py common/*.py common/*.pyx +common/mock/* common/transformations/__init__.py common/transformations/camera.py From 9d1cafd0fccc0406a91309a2f9aa1053b498601d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 26 Feb 2024 15:53:17 -0500 Subject: [PATCH 267/923] move with_http_server to selfdrive/test/helpers (#31597) * move * fix --- selfdrive/athena/tests/helpers.py | 24 ------------------------ selfdrive/athena/tests/test_athenad.py | 4 ++-- selfdrive/test/helpers.py | 24 ++++++++++++++++++++++++ tools/lib/tests/test_caching.py | 2 +- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/selfdrive/athena/tests/helpers.py b/selfdrive/athena/tests/helpers.py index 87202665aa..3dd98f02c9 100644 --- a/selfdrive/athena/tests/helpers.py +++ b/selfdrive/athena/tests/helpers.py @@ -1,7 +1,5 @@ import http.server -import threading import socket -from functools import wraps class MockResponse: @@ -65,25 +63,3 @@ class HTTPRequestHandler(http.server.SimpleHTTPRequestHandler): self.rfile.read(length) self.send_response(201, "Created") self.end_headers() - - -def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): - @wraps(func) - def inner(*args, **kwargs): - host = '127.0.0.1' - server = http.server.HTTPServer((host, 0), handler) - port = server.server_port - t = threading.Thread(target=server.serve_forever) - t.start() - - if setup is not None: - setup(host, port) - - try: - return func(*args, f'http://{host}:{port}', **kwargs) - finally: - server.shutdown() - server.server_close() - t.join() - - return inner diff --git a/selfdrive/athena/tests/test_athenad.py b/selfdrive/athena/tests/test_athenad.py index 780bef345e..4850ab9a3f 100755 --- a/selfdrive/athena/tests/test_athenad.py +++ b/selfdrive/athena/tests/test_athenad.py @@ -23,9 +23,9 @@ from openpilot.common.params import Params from openpilot.common.timeout import Timeout from openpilot.selfdrive.athena import athenad from openpilot.selfdrive.athena.athenad import MAX_RETRY_COUNT, dispatcher -from openpilot.selfdrive.athena.tests.helpers import MockWebsocket, MockApi, EchoSocket, with_http_server +from openpilot.selfdrive.athena.tests.helpers import HTTPRequestHandler, MockWebsocket, MockApi, EchoSocket +from openpilot.selfdrive.test.helpers import with_http_server from openpilot.system.hardware.hw import Paths -from openpilot.selfdrive.athena.tests.helpers import HTTPRequestHandler def seed_athena_server(host, port): diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index a62f7ede85..210a283699 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -1,4 +1,6 @@ +import http.server import os +import threading import time from functools import wraps @@ -76,3 +78,25 @@ def read_segment_list(segment_list_path): seg_list = f.read().splitlines() return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] + + +def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): + @wraps(func) + def inner(*args, **kwargs): + host = '127.0.0.1' + server = http.server.HTTPServer((host, 0), handler) + port = server.server_port + t = threading.Thread(target=server.serve_forever) + t.start() + + if setup is not None: + setup(host, port) + + try: + return func(*args, f'http://{host}:{port}', **kwargs) + finally: + server.shutdown() + server.server_close() + t.join() + + return inner diff --git a/tools/lib/tests/test_caching.py b/tools/lib/tests/test_caching.py index bc92b01357..5d3dfeba42 100755 --- a/tools/lib/tests/test_caching.py +++ b/tools/lib/tests/test_caching.py @@ -7,7 +7,7 @@ import socket import unittest from parameterized import parameterized -from openpilot.selfdrive.athena.tests.helpers import with_http_server +from openpilot.selfdrive.test.helpers import with_http_server from openpilot.system.hardware.hw import Paths from openpilot.tools.lib.url_file import URLFile From edd26acdc324ad8d4b3ccd7406be545545f4cb6f Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 26 Feb 2024 19:26:01 -0500 Subject: [PATCH 268/923] can_replay: add type hint (#31601) type hint --- tools/replay/can_replay.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index c597df1f66..bf6b1e9ae2 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -21,41 +21,41 @@ ENABLE_IGN = IGN_ON > 0 and IGN_OFF > 0 ENABLE_PWR = PWR_ON > 0 and PWR_OFF > 0 -def send_thread(s, flock): +def send_thread(j: PandaJungle, flock): if "FLASH" in os.environ: with flock: - s.flash() + j.flash() for i in [0, 1, 2, 3, 0xFFFF]: - s.can_clear(i) - s.set_can_speed_kbps(i, 500) - s.set_can_data_speed_kbps(i, 500) - s.set_ignition(False) + j.can_clear(i) + j.set_can_speed_kbps(i, 500) + j.set_can_data_speed_kbps(i, 500) + j.set_ignition(False) time.sleep(5) - s.set_ignition(True) - s.set_panda_power(True) - s.set_can_loopback(False) + j.set_ignition(True) + j.set_panda_power(True) + j.set_can_loopback(False) rk = Ratekeeper(1 / DT_CTRL, print_delay_threshold=None) while True: # handle cycling if ENABLE_PWR: i = (rk.frame*DT_CTRL) % (PWR_ON + PWR_OFF) < PWR_ON - s.set_panda_power(i) + j.set_panda_power(i) if ENABLE_IGN: i = (rk.frame*DT_CTRL) % (IGN_ON + IGN_OFF) < IGN_ON - s.set_ignition(i) + j.set_ignition(i) snd = CAN_MSGS[rk.frame % len(CAN_MSGS)] snd = list(filter(lambda x: x[-1] <= 2, snd)) try: - s.can_send_many(snd) + j.can_send_many(snd) except usb1.USBErrorTimeout: # timeout is fine, just means the CAN TX buffer is full pass # Drain panda message buffer - s.can_recv() + j.can_recv() rk.keep_time() From 3c4e82f14a3569cec615fe602886271fee1566c7 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 26 Feb 2024 20:21:44 -0800 Subject: [PATCH 269/923] get name from kernel (#31602) * get name from kernel * revert that --------- Co-authored-by: Comma Device --- system/hardware/tici/hardware.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/hardware/tici/hardware.h b/system/hardware/tici/hardware.h index e553a665a8..f1d1f1e717 100644 --- a/system/hardware/tici/hardware.h +++ b/system/hardware/tici/hardware.h @@ -20,12 +20,12 @@ public: } static std::string get_name() { - std::string devicetree_model = util::read_file("/sys/firmware/devicetree/base/model"); - return (devicetree_model.find("tizi") != std::string::npos) ? "tizi" : "tici"; + std::string model = util::read_file("/sys/firmware/devicetree/base/model"); + return model.substr(std::string("comma ").size()); } static cereal::InitData::DeviceType get_device_type() { - return (get_name() == "tizi") ? cereal::InitData::DeviceType::TIZI : cereal::InitData::DeviceType::TICI; + return (get_name() == "tizi") ? cereal::InitData::DeviceType::TIZI : (get_name() == "mici" ? cereal::InitData::DeviceType::MICI : cereal::InitData::DeviceType::TICI); } static int get_voltage() { return std::atoi(util::read_file("/sys/class/hwmon/hwmon1/in1_input").c_str()); } From 14ea615ae4acc644026b66342edc76edd9178afc Mon Sep 17 00:00:00 2001 From: Comma Device Date: Mon, 26 Feb 2024 20:39:41 -0800 Subject: [PATCH 270/923] no amp config --- system/hardware/tici/amplifier.py | 1 + 1 file changed, 1 insertion(+) diff --git a/system/hardware/tici/amplifier.py b/system/hardware/tici/amplifier.py index af82067467..5725cb8170 100755 --- a/system/hardware/tici/amplifier.py +++ b/system/hardware/tici/amplifier.py @@ -97,6 +97,7 @@ CONFIGS = { AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), ], + "mici": [], } class Amplifier: From 6d0027342ab00486e9cfbed1ffbd098642f2abd7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 00:01:41 -0500 Subject: [PATCH 271/923] remove cast for platformconfig (#31604) * this isnt required * Cleaner --- selfdrive/car/interfaces.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 0a2d978004..0a5ec94aa0 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -4,7 +4,7 @@ import numpy as np import tomllib from abc import abstractmethod, ABC from enum import StrEnum -from typing import Any, NamedTuple, cast +from typing import Any, NamedTuple from collections.abc import Callable from cereal import car @@ -13,7 +13,7 @@ from openpilot.common.conversions import Conversions as CV 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 PlatformConfig, apply_hysteresis, gen_empty_fingerprint, scale_rot_inertia, scale_tire_stiffness, STD_CARGO_KG +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.controls.lib.drive_helpers import V_CRUISE_MAX, get_friction from openpilot.selfdrive.controls.lib.events import Events @@ -113,14 +113,13 @@ class CarInterfaceBase(ABC): ret = CarInterfaceBase.get_std_params(candidate) if hasattr(candidate, "config"): - platform_config = cast(PlatformConfig, candidate.config) - if platform_config.specs is not None: - 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 + if candidate.config.specs is not None: + 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 = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) From 9ecff49118a053917b462aac9dd20cadcf56dd1a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 00:16:05 -0500 Subject: [PATCH 272/923] platformconfig: freeze all dataclasses (#31605) * frozen * frozen --- selfdrive/car/__init__.py | 4 ++-- selfdrive/car/ford/values.py | 2 +- selfdrive/car/gm/values.py | 2 +- selfdrive/car/subaru/values.py | 2 +- selfdrive/car/volkswagen/values.py | 6 +++--- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 75b85cab2f..3b749101c9 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -246,7 +246,7 @@ class CanSignalRateCalculator: CarInfos = CarInfo | list[CarInfo] -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class CarSpecs: mass: float wheelbase: float @@ -256,7 +256,7 @@ class CarSpecs: minEnableSpeed: float = field(default=-1.) -@dataclass(order=True) +@dataclass(frozen=True, order=True) class PlatformConfig: platform_str: str car_info: CarInfos diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index ef99cf5f34..caa3eb0d37 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -63,7 +63,7 @@ class FordCarInfo(CarInfo): self.car_parts = CarParts([Device.threex, harness]) -@dataclass +@dataclass(frozen=True) class FordPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 53dbde87f4..35fdf3fb92 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -79,7 +79,7 @@ class GMCarInfo(CarInfo): self.footnotes.append(Footnote.OBD_II) -@dataclass +@dataclass(frozen=True) 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')) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 0fd7ab9c13..a296550b12 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -89,7 +89,7 @@ class SubaruCarInfo(CarInfo): self.footnotes.append(Footnote.EXP_LONG) -@dataclass +@dataclass(frozen=True) class SubaruPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('subaru_global_2017_generated', None)) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index f029740284..4dff9205d6 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -112,15 +112,15 @@ class CANBUS: class VolkswagenFlags(IntFlag): STOCK_HCA_PRESENT = 1 -@dataclass +@dataclass(frozen=True) class VolkswagenMQBPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None)) -@dataclass +@dataclass(frozen=True) class VolkswagenPQPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) -@dataclass(kw_only=True) +@dataclass(frozen=True, kw_only=True) class VolkswagenCarSpecs(CarSpecs): steerRatio: float = field(default=15.6) From c724d1c86ce4044bfc03f1e7941871466f51a708 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Tue, 27 Feb 2024 12:22:10 +0000 Subject: [PATCH 273/923] Ford: log interesting module configuration data (#31569) * Ford: log interesting module configuration data Ford ECUs have what is called "As-Built Data" which is configured at the factory/workshop to set what packages/features are enabled on the car. But they also contain vehicle specific information (VIN, make, model, weight, wheel base...), DTC information and driver preferences. I dumped the CAN traffic for the FORScan diagnostic tool to see how it requests this information from the ECUs.
FORScan communication with IPMA (camera)
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': '0200'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'TESTER_PRESENT', 'hex': '00'}
{'addr': 1806, 'type': 'positive_response', 'service': 'TESTER_PRESENT', 'hex': '00'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f190'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00020799dbaa10296516a440000000000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f113'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x13JX7T-19H406-CH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1134a5837542d3139483430362d434800000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f188'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x88JX7T-14F397-AH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1884a5837542d3134463339372d414800000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f120'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1 JX7T-14F397-BF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1204a5837542d3134463339372d424600000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f121'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f124'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1$JX7T-14F398-AG\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1244a5837542d3134463339382d414700000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f125'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1%JX7T-14F398-BF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1254a5837542d3134463339382d424600000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f126'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f10a'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f111'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x11JX7T-14F403-CA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1114a5837542d3134463430332d434100000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f18c'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x8c182762191\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f18c31383237363231393100000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f162'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f110'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x10DS-JX7T-19H406-AD\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f11044532d4a5837542d3139483430362d414400000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': '0202'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd100'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd10001'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd700'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd70001010101'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd701'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'd70101020000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'dd01'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'dd010102f8'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'f113'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'data': b'\xf1\x13JX7T-19H406-CH\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 'hex': 'f1134a5837542d3139483430362d434800000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'fd08'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'fd0800000500500100300000000000000000000000300000000000000000200100400300100200001200f00300500000000000000300c00b00400200000000000000000000000000000000200f01201e01501400a00200200400700d02501d01700700e06405005e05503401100a000000002002002001000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'fd09'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'fd09ffec0001fef60002'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00020799dbaa10296516a440000000000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DTC_INFORMATION', 'hex': '028f'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DTC_INFORMATION', 'hex': '02ff50019768c253002cc401862cc418862c'}
... skip DTC requests ...
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de00020799dbaa10296516a440000000000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de01'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de01fd5616db5fffff557fe1f842080000000800000008000000080000000819bfe00f7c00000000000000000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de02'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de02800000008000000080000000800000008337fc00800000008000000080000000800000008337fc0000000000000000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de03'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de03fffc26c3800000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de04'}
{'addr': 1806, 'type': 'positive_response', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de04546a8c0000000000'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de05'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de06'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de07'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de08'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de09'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de0a'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de0b'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de0c'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de0d'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
{'addr': 1798, 'type': 'request', 'service': 'READ_DATA_BY_IDENTIFIER', 'hex': 'de0e'}
{'addr': 1806, 'type': 'negative_response', 'hex': '2231'}
Using UDS service `READ_DATA_BY_IDENTIFIER`, we can read the As-Built blocks from `0xDExx` with no diagnostic session/security access necessary. I used [Online As-Built databases](https://cyanlabs.net/asbuilt-db/) and various coding spreadsheets shared online to find values we might be interested in using for fingerprinting (both vehicle parameters and identifying the platform). ABS: - Payload tier (Base, Mid Payload Upgrade, Heavy Duty Payload Upgrade...) - Wheelbase - Steering ratio - Cruise Control Mode (Normal, Adaptive) - Enable Stop and Go PSCM: - Enable Lane Keeping Aid - Enable Traffic Jam Assist - Enable Lane Centering Assist IPMA (Q4): - Steering ratio - Wheelbase APIM (Sync 3 and Sync 4): - Steering ratio - Vehicle weight - Wheelbase There are more potentially useful signals which I haven't included although they might not be necessary: - Vehicle (Ford platform code, like "C344" or "C519" - although the source of the mapping from index to code is FORScan and not Ford themselves unless we can find a better source). - Fuel type - Vehicle length/height/front track/rear track - Tire circumference (could be useful for converting wheel speed rad/s to m/s) - Steering angle source (Pinion, Wheel) - Country code (letters, e.g. US, CA or UK) - Transmission type - CAN network architecture - More feature flags (the APIM also stores settings for ACC, LCA, BLIS) The full list of settings I have found is [here](https://github.com/incognitojam/op-notebooks/blob/main/ford/settings.py). * FwQueryConfig: add data_requests * add car_data to CarInterface get_params * Revert "add car_data to CarInterface get_params" This reverts commit aa161a6b82082705db97bea2c4317e1888a74845. * test_ford: add APIM ecu address * Revert "FwQueryConfig: add data_requests" This reverts commit dc5484a9b80be5bc61a7fdf55560b8813bc43ef7. * fix block numbers and add extra queries * bump test_fw_query_timing * add missing query whitelists * simplify asbuilt requests * use forscan block ids * formatting --------- Co-authored-by: Shane Smiskol --- selfdrive/car/ford/tests/test_ford.py | 1 + selfdrive/car/ford/values.py | 46 ++++++++++++++++++++-- selfdrive/car/tests/test_fw_fingerprint.py | 6 +-- 3 files changed, 46 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/ford/tests/test_ford.py b/selfdrive/car/ford/tests/test_ford.py index fb5d07f4bf..2ad3f5db1b 100755 --- a/selfdrive/car/ford/tests/test_ford.py +++ b/selfdrive/car/ford/tests/test_ford.py @@ -19,6 +19,7 @@ ECU_ADDRESSES = { Ecu.fwdCamera: 0x706, # Image Processing Module A (IPMA) Ecu.engine: 0x7E0, # Powertrain Control Module (PCM) Ecu.shiftByWire: 0x732, # Gear Shift Module (GSM) + Ecu.debug: 0x7D0, # Accessory Protocol Interface Module (APIM) } diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index caa3eb0d37..df3201c853 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,11 +1,12 @@ from dataclasses import dataclass, field from enum import Enum +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, \ Device -from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries +from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 Ecu = car.CarParams.Ecu @@ -140,6 +141,33 @@ class CAR(Platforms): CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1} +DATA_IDENTIFIER_FORD_ASBUILT = 0xDE + +ASBUILT_BLOCKS: list[tuple[int, list]] = [ + (1, [Ecu.debug, Ecu.fwdCamera, Ecu.eps]), + (2, [Ecu.abs, Ecu.debug, Ecu.eps]), + (3, [Ecu.abs, Ecu.debug, Ecu.eps]), + (4, [Ecu.debug, Ecu.fwdCamera]), + (5, [Ecu.debug]), + (6, [Ecu.debug]), + (7, [Ecu.debug]), + (8, [Ecu.debug]), + (9, [Ecu.debug]), + (16, [Ecu.debug, Ecu.fwdCamera]), + (18, [Ecu.fwdCamera]), + (20, [Ecu.fwdCamera]), + (21, [Ecu.fwdCamera]), +] + + +def ford_asbuilt_block_request(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + + +def ford_asbuilt_block_response(block_id: int): + return bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + p16(DATA_IDENTIFIER_FORD_ASBUILT + block_id - 1) + + FW_QUERY_CONFIG = FwQueryConfig( requests=[ # CAN and CAN FD queries are combined. @@ -147,19 +175,29 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire], logging=True, ), Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_SOFTWARE_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.abs, Ecu.debug, Ecu.engine, Ecu.eps, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.shiftByWire], bus=0, auxiliary=True, ), + *[Request( + [StdQueries.TESTER_PRESENT_REQUEST, ford_asbuilt_block_request(block_id)], + [StdQueries.TESTER_PRESENT_RESPONSE, ford_asbuilt_block_response(block_id)], + whitelist_ecus=ecus, + bus=0, + logging=True, + ) for block_id, ecus in ASBUILT_BLOCKS], ], extra_ecus=[ - # We are unlikely to get a response from the PCM from behind the gateway - (Ecu.engine, 0x7e0, None), - (Ecu.shiftByWire, 0x732, None), + (Ecu.engine, 0x7e0, None), # Powertrain Control Module + # Note: We are unlikely to get a response from behind the gateway + (Ecu.shiftByWire, 0x732, None), # Gear Shift Module + (Ecu.debug, 0x7d0, None), # Accessory Protocol Interface Module ], ) diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 1a745b4447..88c7225f22 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -263,13 +263,13 @@ 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: 6.5, 2: 7.4} + total_ref_time = {1: 7.8, 2: 8.7} brand_ref_times = { 1: { 'gm': 0.5, 'body': 0.1, 'chrysler': 0.3, - 'ford': 0.2, + 'ford': 1.5, 'honda': 0.55, 'hyundai': 1.05, 'mazda': 0.1, @@ -280,7 +280,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'volkswagen': 0.65, }, 2: { - 'ford': 0.3, + 'ford': 1.6, 'hyundai': 1.85, } } From 3978e7e98caef295ea60277bc7994e77b38823f3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 27 Feb 2024 06:40:46 -0600 Subject: [PATCH 274/923] [bot] Fingerprints: add missing FW versions from new users (#31572) * Export fingerprints * get these FP in --- 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 12a1d46aaf..6b48408a10 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -573,6 +573,7 @@ FW_VERSIONS = { b'\x018821F6201400\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x750, 0x6d): [ + b'\x028646F12010C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', b'\x028646F12010D0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', b'\x028646F1201100\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', b'\x028646F1201200\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', @@ -843,6 +844,7 @@ FW_VERSIONS = { b'8965B47023\x00\x00\x00\x00\x00\x00', b'8965B47050\x00\x00\x00\x00\x00\x00', b'8965B47060\x00\x00\x00\x00\x00\x00', + b'8965B47070\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x7b0, None): [ b'F152647290\x00\x00\x00\x00\x00\x00', @@ -1024,6 +1026,7 @@ FW_VERSIONS = { b'\x02896634A13000\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', 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\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 cdd93855f2ee63ba20cdfc88cd5f06f0a38c3b85 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 27 Feb 2024 10:30:59 -0500 Subject: [PATCH 275/923] Update CHANGELOGS.md --- CHANGELOGS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 96f593957f..24858624df 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -23,7 +23,7 @@ sunnypilot - 0.9.6.1 (2024-02-27) * v0.9.6 release (February 27, 2024) * UPDATED: Dynamic Experimental Control (DEC) * Synced with dragonpilot-community/dragonpilot:beta3 commit f4ee52f -* NEW❗: Default Driving Model: Los Angeles v2 (January 24, 2024) +* NEW❗: Default Driving Model: Certified Herbalist v2 (February 13, 2024) * UPDATED: Driving Model Selector v3 * NEW❗: Driving Model additions * Certified Herbalist v2 (February 13, 2024) - CHv2 From d3f0f76a7e33832bb7312597f85b802b50f2d757 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 13:16:06 -0500 Subject: [PATCH 276/923] Nissan: move to platform config (#31599) * do nissan * cleanup + fix --- selfdrive/car/__init__.py | 5 ++- selfdrive/car/nissan/interface.py | 14 +------ selfdrive/car/nissan/values.py | 68 +++++++++++++++++++------------ 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 3b749101c9..297dc582f7 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,6 +1,6 @@ # functions common among cars from collections import namedtuple -from dataclasses import dataclass, field +from dataclasses import dataclass, field, replace from enum import ReprEnum import capnp @@ -267,6 +267,9 @@ class PlatformConfig: def __hash__(self) -> int: return hash(self.platform_str) + def override(self, **kwargs): + return replace(self, **kwargs) + class Platforms(str, ReprEnum): config: PlatformConfig diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index aedcaa1887..a94b97de20 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -16,25 +16,13 @@ class CarInterface(CarInterfaceBase): ret.steerLimitTimer = 1.0 ret.steerActuatorDelay = 0.1 - ret.steerRatio = 17 ret.steerControlType = car.CarParams.SteerControlType.angle ret.radarUnavailable = True - if candidate in (CAR.ROGUE, CAR.XTRAIL): - ret.mass = 1610 - ret.wheelbase = 2.705 - ret.centerToFront = ret.wheelbase * 0.44 - elif candidate in (CAR.LEAF, CAR.LEAF_IC): - ret.mass = 1610 - ret.wheelbase = 2.705 - ret.centerToFront = ret.wheelbase * 0.44 - elif candidate == CAR.ALTIMA: + if candidate == CAR.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 - ret.mass = 1492 - ret.wheelbase = 2.824 - ret.centerToFront = ret.wheelbase * 0.44 return ret diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index c0308f9e0d..58e4eb051a 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -1,9 +1,8 @@ from dataclasses import dataclass, field -from enum import StrEnum from cereal import car from panda.python import uds -from openpilot.selfdrive.car import AngleRateLimit, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -20,29 +19,52 @@ class CarControllerParams: pass -class CAR(StrEnum): - XTRAIL = "NISSAN X-TRAIL 2017" - LEAF = "NISSAN LEAF 2018" - # 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 = "NISSAN LEAF 2018 Instrument Cluster" - ROGUE = "NISSAN ROGUE 2019" - ALTIMA = "NISSAN ALTIMA 2020" - - @dataclass class NissanCarInfo(CarInfo): package: str = "ProPILOT Assist" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.nissan_a])) -CAR_INFO: dict[str, NissanCarInfo | list[NissanCarInfo] | None] = { - CAR.XTRAIL: NissanCarInfo("Nissan X-Trail 2017"), - CAR.LEAF: NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY"), - CAR.LEAF_IC: None, # same platforms - CAR.ROGUE: NissanCarInfo("Nissan Rogue 2018-20"), - CAR.ALTIMA: NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b])), -} +@dataclass(frozen=True) +class NissanCarSpecs(CarSpecs): + centerToFrontRatio: float = 0.44 + steerRatio: float = 17. + + +@dataclass(frozen=True) +class NissanPlaformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('nissan_x_trail_2017_generated', None)) + + +class CAR(Platforms): + XTRAIL = NissanPlaformConfig( + "NISSAN X-TRAIL 2017", + NissanCarInfo("Nissan X-Trail 2017"), + specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + ) + LEAF = NissanPlaformConfig( + "NISSAN LEAF 2018", + NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY"), + dbc_dict=dbc_dict('nissan_leaf_2018_generated', None), + specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + ) + # 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) + ROGUE = NissanPlaformConfig( + "NISSAN ROGUE 2019", + NissanCarInfo("Nissan Rogue 2018-20"), + specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + ) + ALTIMA = NissanPlaformConfig( + "NISSAN ALTIMA 2020", + NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b])), + specs=NissanCarSpecs(mass=1492, wheelbase=2.824) + ) + + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() # Default diagnostic session NISSAN_DIAGNOSTIC_REQUEST_KWP = bytes([uds.SERVICE_TYPE.DIAGNOSTIC_SESSION_CONTROL, 0x81]) @@ -88,11 +110,3 @@ FW_QUERY_CONFIG = FwQueryConfig( ), ]], ) - -DBC = { - CAR.XTRAIL: dbc_dict('nissan_x_trail_2017_generated', None), - CAR.LEAF: dbc_dict('nissan_leaf_2018_generated', None), - CAR.LEAF_IC: dbc_dict('nissan_leaf_2018_generated', None), - CAR.ROGUE: dbc_dict('nissan_x_trail_2017_generated', None), - CAR.ALTIMA: dbc_dict('nissan_x_trail_2017_generated', None), -} From 666c41d96923b1826f34a971b568f7d7754b4070 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 13:16:22 -0500 Subject: [PATCH 277/923] Chrylser: move to platform config (#31600) * do chrysler * chrysler specs * cleanup Co-authored-by: Shane Smiskol --------- Co-authored-by: Shane Smiskol --- selfdrive/car/chrysler/interface.py | 12 --- selfdrive/car/chrysler/values.py | 131 +++++++++++++++++----------- 2 files changed, 79 insertions(+), 64 deletions(-) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 32a4f5dfcf..34df32762d 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -24,7 +24,6 @@ class CarInterface(CarInterfaceBase): elif candidate in RAM_DT: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_CHRYSLER_RAM_DT - ret.minSteerSpeed = 3.8 # m/s 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. @@ -35,10 +34,6 @@ class CarInterface(CarInterfaceBase): # 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): - ret.mass = 2242. - ret.wheelbase = 3.089 - ret.steerRatio = 16.2 # Pacifica Hybrid 2017 - 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]] @@ -46,9 +41,6 @@ class CarInterface(CarInterfaceBase): # Jeep elif candidate in (CAR.JEEP_GRAND_CHEROKEE, CAR.JEEP_GRAND_CHEROKEE_2019): - ret.mass = 1778 - ret.wheelbase = 2.71 - ret.steerRatio = 16.7 ret.steerActuatorDelay = 0.2 ret.lateralTuning.init('pid') @@ -60,9 +52,6 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.RAM_1500: ret.steerActuatorDelay = 0.2 ret.wheelbase = 3.88 - ret.steerRatio = 16.3 - ret.mass = 2493. - ret.minSteerSpeed = 14.5 # 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. @@ -72,7 +61,6 @@ class CarInterface(CarInterfaceBase): ret.wheelbase = 3.785 ret.steerRatio = 15.61 ret.mass = 3405. - ret.minSteerSpeed = 16 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, 1.0, False) else: diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index a7eec8fe5a..a94512608a 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -1,9 +1,9 @@ -from enum import IntFlag, StrEnum +from enum import IntFlag from dataclasses import dataclass, field from cereal import car from panda.python import uds -from openpilot.selfdrive.car import dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, p16 @@ -13,25 +13,89 @@ Ecu = car.CarParams.Ecu class ChryslerFlags(IntFlag): HIGHER_MIN_STEERING_SPEED = 1 +@dataclass +class ChryslerCarInfo(CarInfo): + package: str = "Adaptive Cruise Control (ACC)" + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) -class CAR(StrEnum): + +@dataclass +class ChryslerPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('chrysler_pacifica_2017_hybrid_generated', None)) + + +@dataclass +class ChryslerCarSpecs(CarSpecs): + minSteerSpeed: float = 3.8 # m/s + + +class CAR(Platforms): # Chrysler - PACIFICA_2017_HYBRID = "CHRYSLER PACIFICA HYBRID 2017" - PACIFICA_2018_HYBRID = "CHRYSLER PACIFICA HYBRID 2018" - PACIFICA_2019_HYBRID = "CHRYSLER PACIFICA HYBRID 2019" - PACIFICA_2018 = "CHRYSLER PACIFICA 2018" - PACIFICA_2020 = "CHRYSLER PACIFICA 2020" + PACIFICA_2017_HYBRID = ChryslerPlatformConfig( + "CHRYSLER PACIFICA HYBRID 2017", + ChryslerCarInfo("Chrysler Pacifica Hybrid 2017"), + specs=ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), + ) + PACIFICA_2018_HYBRID = ChryslerPlatformConfig( + "CHRYSLER PACIFICA HYBRID 2018", + ChryslerCarInfo("Chrysler Pacifica Hybrid 2018"), + specs=PACIFICA_2017_HYBRID.specs, + ) + PACIFICA_2019_HYBRID = ChryslerPlatformConfig( + "CHRYSLER PACIFICA HYBRID 2019", + ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23"), + specs=PACIFICA_2017_HYBRID.specs, + ) + PACIFICA_2018 = ChryslerPlatformConfig( + "CHRYSLER PACIFICA 2018", + ChryslerCarInfo("Chrysler Pacifica 2017-18"), + specs=PACIFICA_2017_HYBRID.specs, + ) + PACIFICA_2020 = ChryslerPlatformConfig( + "CHRYSLER PACIFICA 2020", + [ + ChryslerCarInfo("Chrysler Pacifica 2019-20"), + ChryslerCarInfo("Chrysler Pacifica 2021-23", package="All"), + ], + specs=PACIFICA_2017_HYBRID.specs, + ) # Dodge - DODGE_DURANGO = "DODGE DURANGO 2021" + DODGE_DURANGO = ChryslerPlatformConfig( + "DODGE DURANGO 2021", + ChryslerCarInfo("Dodge Durango 2020-21"), + specs=PACIFICA_2017_HYBRID.specs, + ) # Jeep - JEEP_GRAND_CHEROKEE = "JEEP GRAND CHEROKEE V6 2018" # includes 2017 Trailhawk - JEEP_GRAND_CHEROKEE_2019 = "JEEP GRAND CHEROKEE 2019" # includes 2020 Trailhawk + 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"), + specs=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"), + specs=JEEP_GRAND_CHEROKEE.specs, + ) # Ram - RAM_1500 = "RAM 1500 5TH GEN" - RAM_HD = "RAM HD 5TH GEN" + RAM_1500 = ChryslerPlatformConfig( + "RAM 1500 5TH GEN", + ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram])), + dbc_dict('chrysler_ram_dt_generated', None), + specs=ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), + ) + 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])), + ], + dbc_dict('chrysler_ram_hd_generated', None), + specs=ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), + ) class CarControllerParams: @@ -59,32 +123,6 @@ RAM_HD = {CAR.RAM_HD, } RAM_CARS = RAM_DT | RAM_HD -@dataclass -class ChryslerCarInfo(CarInfo): - package: str = "Adaptive Cruise Control (ACC)" - car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) - - -CAR_INFO: dict[str, ChryslerCarInfo | list[ChryslerCarInfo] | None] = { - CAR.PACIFICA_2017_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2017"), - CAR.PACIFICA_2018_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2018"), - CAR.PACIFICA_2019_HYBRID: ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23"), - CAR.PACIFICA_2018: ChryslerCarInfo("Chrysler Pacifica 2017-18"), - CAR.PACIFICA_2020: [ - ChryslerCarInfo("Chrysler Pacifica 2019-20"), - ChryslerCarInfo("Chrysler Pacifica 2021-23", package="All"), - ], - CAR.JEEP_GRAND_CHEROKEE: ChryslerCarInfo("Jeep Grand Cherokee 2016-18", video_link="https://www.youtube.com/watch?v=eLR9o2JkuRk"), - CAR.JEEP_GRAND_CHEROKEE_2019: ChryslerCarInfo("Jeep Grand Cherokee 2019-21", video_link="https://www.youtube.com/watch?v=jBe4lWnRSu4"), - CAR.DODGE_DURANGO: ChryslerCarInfo("Dodge Durango 2020-21"), - CAR.RAM_1500: ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram])), - CAR.RAM_HD: [ - ChryslerCarInfo("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), - ChryslerCarInfo("Ram 3500 2019-22", car_parts=CarParts.common([CarHarness.ram])), - ], -} - - CHRYSLER_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(0xf132) CHRYSLER_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ @@ -124,16 +162,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - -DBC = { - CAR.PACIFICA_2017_HYBRID: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.PACIFICA_2018: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.PACIFICA_2020: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.PACIFICA_2018_HYBRID: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.PACIFICA_2019_HYBRID: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.DODGE_DURANGO: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.JEEP_GRAND_CHEROKEE: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.JEEP_GRAND_CHEROKEE_2019: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion'), - CAR.RAM_1500: dbc_dict('chrysler_ram_dt_generated', None), - CAR.RAM_HD: dbc_dict('chrysler_ram_hd_generated', None), -} +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From d457ed9d50801905b762c870c4799e734dea05b1 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 13:23:13 -0500 Subject: [PATCH 278/923] chrysler: freeze dataclass + remove more from interface (#31613) * fix * fix --- selfdrive/car/chrysler/interface.py | 3 --- selfdrive/car/chrysler/values.py | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 34df32762d..eb40bc6f6e 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -58,9 +58,6 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.RAM_HD: ret.steerActuatorDelay = 0.2 - ret.wheelbase = 3.785 - ret.steerRatio = 15.61 - ret.mass = 3405. CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, 1.0, False) else: diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index a94512608a..1cc51753d4 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -19,12 +19,12 @@ class ChryslerCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) -@dataclass +@dataclass(frozen=True) class ChryslerPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('chrysler_pacifica_2017_hybrid_generated', None)) -@dataclass +@dataclass(frozen=True) class ChryslerCarSpecs(CarSpecs): minSteerSpeed: float = 3.8 # m/s From 0e41bf34746854869ad0d319fbb6bb765288ce50 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Tue, 27 Feb 2024 18:59:27 +0000 Subject: [PATCH 279/923] Ford: fix As-Built request identifier (#31609) Should be 0xDE00 not 0xDE --- selfdrive/car/ford/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index df3201c853..1008d68b98 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -141,7 +141,7 @@ class CAR(Platforms): CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1} -DATA_IDENTIFIER_FORD_ASBUILT = 0xDE +DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 ASBUILT_BLOCKS: list[tuple[int, list]] = [ (1, [Ecu.debug, Ecu.fwdCamera, Ecu.eps]), From 402ac424d90f7b66dfe100b4073a43bf13570081 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 27 Feb 2024 11:09:48 -0800 Subject: [PATCH 280/923] auto PR comments (#30675) * auto PR comments * little more * test * update action * cleanup --- .github/workflows/auto_pr_review.yaml | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index abb6c38d6b..de07ed118f 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -34,6 +34,23 @@ jobs: already-exists-action: close_this already-exists-comment: "Your PR should be made against the `master` branch" + comment: + runs-on: ubuntu-latest + steps: + - name: comment + uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 + with: + message: | + Thanks for contributing to openpilot! In order for us to review your PR as quickly as possible, check the following: + * Convert your PR to a draft unless it's ready to review + * Read the [contributing docs](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md) + * Before marking as "ready for review", ensure: + * the goal is clearly stated in the description + * all the tests are passing + * the change is [something we merge](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md#what-gets-merged) + * include a route or your device' dongle ID if relevant + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + check-pr-template: runs-on: ubuntu-latest permissions: @@ -41,7 +58,7 @@ jobs: issues: write pull-requests: write actions: read - if: github.event.pull_request.head.repo.full_name != 'commaai/openpilot' + if: false && github.event.pull_request.head.repo.full_name != 'commaai/openpilot' steps: - uses: actions/github-script@v7 with: From dc3728134055bd422abac4f005e1ecbae46e6167 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 14:55:19 -0500 Subject: [PATCH 281/923] typo (#31618) dataset --- docs/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 30f4e0dfd3..755ca82220 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -62,4 +62,4 @@ A good pull request has all of the following: * Consider opting into driver camera uploads to improve the driver monitoring model. * Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models. * Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release. -* Annotate images in the [comma10k dateset](https://github.com/commaai/comma10k). +* Annotate images in the [comma10k dataset](https://github.com/commaai/comma10k). From 47013fd0a4a322da39cbbdf6bd8129d49abb295d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 27 Feb 2024 12:06:53 -0800 Subject: [PATCH 282/923] Revert "auto PR comments (#30675)" This reverts commit 402ac424d90f7b66dfe100b4073a43bf13570081. --- .github/workflows/auto_pr_review.yaml | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index de07ed118f..abb6c38d6b 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -34,23 +34,6 @@ jobs: already-exists-action: close_this already-exists-comment: "Your PR should be made against the `master` branch" - comment: - runs-on: ubuntu-latest - steps: - - name: comment - uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 - with: - message: | - Thanks for contributing to openpilot! In order for us to review your PR as quickly as possible, check the following: - * Convert your PR to a draft unless it's ready to review - * Read the [contributing docs](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md) - * Before marking as "ready for review", ensure: - * the goal is clearly stated in the description - * all the tests are passing - * the change is [something we merge](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md#what-gets-merged) - * include a route or your device' dongle ID if relevant - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - check-pr-template: runs-on: ubuntu-latest permissions: @@ -58,7 +41,7 @@ jobs: issues: write pull-requests: write actions: read - if: false && github.event.pull_request.head.repo.full_name != 'commaai/openpilot' + if: github.event.pull_request.head.repo.full_name != 'commaai/openpilot' steps: - uses: actions/github-script@v7 with: From f293f7bad4d6675b70a97d303f1321fb6cfc9182 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 16:17:56 -0500 Subject: [PATCH 283/923] scons: move cereal library exports to cereal submodule (#31617) * cleanup-cereal * bump --- SConstruct | 9 --------- cereal | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/SConstruct b/SConstruct index b04e3903ed..4d4f9ad4fe 100644 --- a/SConstruct +++ b/SConstruct @@ -96,8 +96,6 @@ lenv = { rpath = lenv["LD_LIBRARY_PATH"].copy() if arch == "larch64": - lenv["LD_LIBRARY_PATH"] += ['/data/data/com.termux/files/usr/lib'] - cpppath = [ "#third_party/opencl/include", ] @@ -360,13 +358,6 @@ Export('common', 'gpucommon') # Build cereal and messaging SConscript(['cereal/SConscript']) -cereal = [File('#cereal/libcereal.a')] -messaging = [File('#cereal/libmessaging.a')] -visionipc = [File('#cereal/libvisionipc.a')] -messaging_python = [File('#cereal/messaging/messaging_pyx.so')] - -Export('cereal', 'messaging', 'messaging_python', 'visionipc') - # Build other submodules SConscript([ 'body/board/SConscript', diff --git a/cereal b/cereal index a4255106b7..2012d9fd16 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit a4255106b7255e00ae04162f7aa14aa3cae339c3 +Subproject commit 2012d9fd16f62c737951ce2d1eb19d39f0c7615f From c05b37979d49c0a586b56db9294aa061c2c079e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Tue, 27 Feb 2024 13:23:04 -0800 Subject: [PATCH 284/923] Wheeled body (#31614) * Wheeled body * 100hz only for balance * No carparams in locationd no more * Update ref --- common/params.cc | 1 - selfdrive/car/body/carcontroller.py | 20 ++----------------- selfdrive/locationd/locationd.cc | 8 +++----- .../test/process_replay/process_replay.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- 5 files changed, 7 insertions(+), 26 deletions(-) diff --git a/common/params.cc b/common/params.cc index eb75705ca3..aef2cbdecd 100644 --- a/common/params.cc +++ b/common/params.cc @@ -207,7 +207,6 @@ std::unordered_map keys = { {"UpdaterLastFetchTime", PERSISTENT}, {"Version", PERSISTENT}, {"VisionRadarToggle", PERSISTENT}, - {"WheeledBody", PERSISTENT}, }; } // namespace diff --git a/selfdrive/car/body/carcontroller.py b/selfdrive/car/body/carcontroller.py index 1dad8e796a..d15f11d3a4 100644 --- a/selfdrive/car/body/carcontroller.py +++ b/selfdrive/car/body/carcontroller.py @@ -1,6 +1,5 @@ import numpy as np -from openpilot.common.params import Params from openpilot.common.realtime import DT_CTRL from opendbc.can.packer import CANPacker from openpilot.selfdrive.car.body import bodycan @@ -20,18 +19,13 @@ class CarController: self.frame = 0 self.packer = CANPacker(dbc_name) - # Speed, balance and turn PIDs - self.speed_pid = PIDController(0.115, k_i=0.23, rate=1/DT_CTRL) - self.balance_pid = PIDController(1300, k_i=0, k_d=280, rate=1/DT_CTRL) + # PIDs self.turn_pid = PIDController(110, k_i=11.5, rate=1/DT_CTRL) self.wheeled_speed_pid = PIDController(110, k_i=11.5, rate=1/DT_CTRL) self.torque_r_filtered = 0. self.torque_l_filtered = 0. - params = Params() - self.wheeled_body = params.get("WheeledBody") - @staticmethod def deadband_filter(torque, deadband): if torque > 0: @@ -55,17 +49,7 @@ class CarController: speed_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl + CS.out.wheelSpeeds.fr) / 2. speed_error = speed_desired - speed_measured - if self.wheeled_body is None: - freeze_integrator = ((speed_error < 0 and self.speed_pid.error_integral <= -MAX_POS_INTEGRATOR) or - (speed_error > 0 and self.speed_pid.error_integral >= MAX_POS_INTEGRATOR)) - angle_setpoint = self.speed_pid.update(speed_error, freeze_integrator=freeze_integrator) - - # Clip angle error, this is enough to get up from stands - angle_error = np.clip((-CC.orientationNED[1]) - angle_setpoint, -MAX_ANGLE_ERROR, MAX_ANGLE_ERROR) - angle_error_rate = np.clip(-CC.angularVelocity[1], -1., 1.) - torque = self.balance_pid.update(angle_error, error_rate=angle_error_rate) - else: - torque = self.wheeled_speed_pid.update(speed_error, freeze_integrator=False) + torque = self.wheeled_speed_pid.update(speed_error, freeze_integrator=False) speed_diff_measured = SPEED_FROM_RPM * (CS.out.wheelSpeeds.fl - CS.out.wheelSpeeds.fr) turn_error = speed_diff_measured - speed_diff_desired diff --git a/selfdrive/locationd/locationd.cc b/selfdrive/locationd/locationd.cc index e32ed78a3e..1050d68b9b 100644 --- a/selfdrive/locationd/locationd.cc +++ b/selfdrive/locationd/locationd.cc @@ -691,10 +691,9 @@ int Localizer::locationd_thread() { this->configure_gnss_source(source); const std::initializer_list service_list = {gps_location_socket, "cameraOdometry", "liveCalibration", - "carState", "carParams", "accelerometer", "gyroscope"}; + "carState", "accelerometer", "gyroscope"}; - // TODO: remove carParams once we're always sending at 100Hz - SubMaster sm(service_list, {}, nullptr, {gps_location_socket, "carParams"}); + SubMaster sm(service_list, {}, nullptr, {gps_location_socket}); PubMaster pm({"liveLocationKalman"}); uint64_t cnt = 0; @@ -718,8 +717,7 @@ int Localizer::locationd_thread() { filterInitialized = sm.allAliveAndValid(); } - // 100Hz publish for notcars, 20Hz for cars - const char* trigger_msg = sm["carParams"].getCarParams().getNotCar() ? "accelerometer" : "cameraOdometry"; + const char* trigger_msg = "cameraOdometry"; if (sm.updated(trigger_msg)) { bool inputsOK = sm.allValid() && this->are_inputs_ok(); bool gpsOK = this->is_gps_ok(); diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 4fb3e3c4de..5119be0a8c 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -512,7 +512,7 @@ CONFIGS = [ proc_name="locationd", pubs=[ "cameraOdometry", "accelerometer", "gyroscope", "gpsLocationExternal", - "liveCalibration", "carState", "carParams", "gpsLocation" + "liveCalibration", "carState", "gpsLocation" ], subs=["liveLocationKalman"], ignore=["logMonoTime"], diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index fc38f87310..9c627fb7c9 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -d0cdea7eb15f3cac8a921f7ace3eaa6baebb4fd5 +47609e372bf616932c4dca74d2616c3d97fa2443 From 19db56b1f6a86a6a250e6b69f1533ae02d1fb367 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 17:06:18 -0500 Subject: [PATCH 285/923] tici tests: remove pytest.main (#31622) pytest.main is bad! --- selfdrive/test/test_onroad.py | 2 +- system/hardware/tici/tests/test_hardware.py | 2 +- system/hardware/tici/tests/test_power_draw.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index de8a4420b3..8f8c93ecff 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -424,4 +424,4 @@ class TestOnroad(unittest.TestCase): if __name__ == "__main__": - pytest.main() + unittest.main() diff --git a/system/hardware/tici/tests/test_hardware.py b/system/hardware/tici/tests/test_hardware.py index 0c436595ee..6c41c383a0 100755 --- a/system/hardware/tici/tests/test_hardware.py +++ b/system/hardware/tici/tests/test_hardware.py @@ -25,4 +25,4 @@ class TestHardware(unittest.TestCase): if __name__ == "__main__": - pytest.main() + unittest.main() diff --git a/system/hardware/tici/tests/test_power_draw.py b/system/hardware/tici/tests/test_power_draw.py index 352fcdf18a..180ec155e4 100755 --- a/system/hardware/tici/tests/test_power_draw.py +++ b/system/hardware/tici/tests/test_power_draw.py @@ -1,6 +1,5 @@ #!/usr/bin/env python3 from collections import defaultdict, deque -import sys import pytest import unittest import time @@ -132,4 +131,4 @@ class TestPowerDraw(unittest.TestCase): if __name__ == "__main__": - pytest.main(sys.argv) + unittest.main() From 262b328ad706194425479b1a56af9321d1a0c97a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 27 Feb 2024 17:17:01 -0500 Subject: [PATCH 286/923] ban pytest.main (#31623) ban it! --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index ac5bb0922c..99a8602460 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -190,6 +190,7 @@ lint.flake8-implicit-str-concat.allow-multiline=false "system".msg = "Use openpilot.system" "third_party".msg = "Use openpilot.third_party" "tools".msg = "Use openpilot.tools" +"pytest.main".msg = "pytest.main requires special handling that is easy to mess up!" [tool.coverage.run] concurrency = ["multiprocessing", "thread"] From 56e343b3f1e0117d379ad4582170d51609599530 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 27 Feb 2024 19:41:52 -0600 Subject: [PATCH 287/923] Honda Accord: label non-essential ECUs (#31624) * note non-essential ecus * do accordh --- selfdrive/car/honda/values.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index a2ef757d15..f573296609 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -207,6 +207,8 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.combinationMeter: [CAR.CIVIC_BOSCH, CAR.CRV_5G], Ecu.gateway: [CAR.CIVIC_BOSCH, CAR.CRV_5G], Ecu.electricBrakeBooster: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.shiftByWire: [CAR.ACCORD], # existence correlates with transmission type for ICE + Ecu.hud: [CAR.ACCORD, CAR.ACCORDH], # existence correlates with trim level }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic From 4397a687bc4f1f78135ea1067f53d53bd6415bfb Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 27 Feb 2024 21:09:47 -0500 Subject: [PATCH 288/923] Bump submodules --- cereal | 2 +- opendbc | 2 +- panda | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index 6aff39be25..d4c43a0865 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 6aff39be259914e1596cc6a582f434132ce0e810 +Subproject commit d4c43a0865fe2d9c7c765f62e31233c9a7d33ebc diff --git a/opendbc b/opendbc index 3f6e8d1859..ecffe0cc98 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 3f6e8d1859c5128ef11de79b1a82b4999723d47c +Subproject commit ecffe0cc9881d7db1dc87a1569a3534816bd7db5 diff --git a/panda b/panda index aae8ea8ff2..6683e77bcc 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit aae8ea8ff274c03ccff0c703eb2a2f721cb91f15 +Subproject commit 6683e77bcccda0c55aa53859ffcd9eeb782db164 From dbaba022a26f095a2b00f9f1918abda10be03eec Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 27 Feb 2024 21:28:12 -0500 Subject: [PATCH 289/923] Fix upstream merge conflicts --- common/realtime.py | 2 +- selfdrive/car/interfaces.py | 4 ++-- selfdrive/car/subaru/carcontroller.py | 3 +-- selfdrive/sentry.py | 3 +-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/common/realtime.py b/common/realtime.py index 49a38a8ff5..ed0d46532d 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -46,7 +46,7 @@ def config_realtime_process(cores: int | list[int], priority: int) -> None: set_core_affinity(c) -def set_thread_affinity(thread: threading.Thread, cores: List[int]) -> None: +def set_thread_affinity(thread: threading.Thread, cores: list[int]) -> None: try: process = psutil.Process(thread.ident) process.cpu_affinity(cores) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 9433bcf5eb..0ef758cafe 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -155,7 +155,7 @@ class FluxModel: self.friction_override = (y < 0.1) -def get_nn_model_path(_car, eps_firmware) -> Tuple[Optional[str], float]: +def get_nn_model_path(_car, eps_firmware) -> tuple[str | None, float]: def check_nn_path(_check_model): _model_path = None _max_similarity = -1.0 @@ -182,7 +182,7 @@ def get_nn_model_path(_car, eps_firmware) -> Tuple[Optional[str], float]: return model_path, max_similarity -def get_nn_model(_car, eps_firmware) -> Tuple[Optional[FluxModel], float]: +def get_nn_model(_car, eps_firmware) -> tuple[FluxModel | None, float]: model, similarity_score = get_nn_model_path(_car, eps_firmware) if model is not None: model = FluxModel(model) diff --git a/selfdrive/car/subaru/carcontroller.py b/selfdrive/car/subaru/carcontroller.py index df7447269c..8dc4e1e702 100644 --- a/selfdrive/car/subaru/carcontroller.py +++ b/selfdrive/car/subaru/carcontroller.py @@ -1,5 +1,4 @@ from cereal import car -from typing import Tuple from openpilot.common.numpy_fast import clip, interp from openpilot.common.params import Params from opendbc.can.packer import CANPacker @@ -179,7 +178,7 @@ class CarController: return new_actuators, can_sends # Stop and Go auto-resume thanks to martinl from subaru-community - def stop_and_go(self, CC: car.CarControl, CS: car.CarState, throttle_cmd: bool = False, speed_cmd: bool = False) -> Tuple[bool, bool]: + def stop_and_go(self, CC: car.CarControl, CS: car.CarState, throttle_cmd: bool = False, speed_cmd: bool = False) -> tuple[bool, bool]: if not self.subaru_sng: return throttle_cmd, speed_cmd if self.CP.carFingerprint in PREGLOBAL_CARS: diff --git a/selfdrive/sentry.py b/selfdrive/sentry.py index 6a789e12f0..b94ab0fb8b 100644 --- a/selfdrive/sentry.py +++ b/selfdrive/sentry.py @@ -2,7 +2,6 @@ import sentry_sdk import subprocess from enum import Enum -from typing import Tuple from sentry_sdk.integrations.threading import ThreadingIntegration from openpilot.common.basedir import BASEDIR @@ -93,7 +92,7 @@ def set_tag(key: str, value: str) -> None: sentry_sdk.set_tag(key, value) -def get_properties() -> Tuple[str, str]: +def get_properties() -> tuple[str, str]: params = Params() dongle_id = params.get("DongleId", encoding='utf-8') if dongle_id in (None, UNREGISTERED_DONGLE_ID): From ce4055ced6bc05238ad2c40c139934c9eb5f8f1f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 27 Feb 2024 21:57:14 -0500 Subject: [PATCH 290/923] FCR: Implement during the fingerprint stage --- selfdrive/car/car_helpers.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index fabdb3f4ed..50b484e8ab 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -191,6 +191,17 @@ def fingerprint(logcan, sendcan, num_pandas): car_fingerprint = fixed_fingerprint source = car.CarParams.FingerprintSource.fixed + if params.get("CarModel") is not None: + car_fingerprint = params.get("CarModel").decode("utf-8") + with open(os.path.join(BASEDIR, "selfdrive/car/sunnypilot_carname.json")) as f: + car_models = json.load(f) + if car_fingerprint not in car_models.values(): + car_fingerprint = None + params.put("CarModel", "") + params.put("CarModelText", "") + else: + source = car.CarParams.FingerprintSource.fixed + cloudlog.event("fingerprinted", car_fingerprint=car_fingerprint, source=source, fuzzy=not exact_match, cached=cached, 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) @@ -240,16 +251,6 @@ def crash_log2(fingerprints, fw): def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas) - params = Params() - if params.get("CarModel") is not None: - candidate = params.get("CarModel").decode("utf-8") - with open(os.path.join(BASEDIR, "selfdrive/car/sunnypilot_carname.json")) as f: - car_models = json.load(f) - if candidate not in car_models.values(): - candidate = None - params.put("CarModel", "") - params.put("CarModelText", "") - if candidate is None: cloudlog.event("car doesn't match any fingerprints", fingerprints=repr(fingerprints), error=True) candidate = "mock" From ce6637cd8ffdd9eef39a57fe67c3528c55b11c68 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 27 Feb 2024 22:09:02 -0600 Subject: [PATCH 291/923] Honda Accord: allow fingerprinting without comma power (#31477) * Do Accord * add comment * good test * this catches the accord/accordh issue! * as expected, only if both radar&camera have in common FW does the test fail * cmt * clean up * better * Use HondaFlags * detect alt brake * for test * hypothesis isn't installed * test failure * works * Revert " works" This reverts commit bfc0d808abe548630e6507431f13b01e8a1316cb. * Revert "test failure" This reverts commit 10ab6eb63ccd411740751b742f31fd610397fe8e. * Revert "hypothesis isn't installed" This reverts commit d474cc3f0ed7e84fe8bd24f452b3315fd2b8d47c. * Revert "for test" This reverts commit 98e039f4fc0189ccb57c1dae6b344209ef15eb1c. * this is important too * clean up * merge accord fingerprints, test * remove duplicates * accordh doesn't have these * rm * no unknown * start over, merge platforms * add cmt * note non-essential ecus * add non essential obd ecus * combine FW * format fingerprints (remove dups) * migrate test models segs * cmt * Update ref_commit * clean up --- selfdrive/car/honda/carstate.py | 4 +- selfdrive/car/honda/fingerprints.py | 85 ++++++++---------------- selfdrive/car/honda/interface.py | 4 +- selfdrive/car/honda/values.py | 22 +++--- selfdrive/car/tests/routes.py | 4 +- selfdrive/car/tests/test_models_segs.txt | 4 +- selfdrive/car/torque_data/params.toml | 3 +- selfdrive/test/process_replay/ref_commit | 2 +- 8 files changed, 49 insertions(+), 79 deletions(-) diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 9025f72397..4f5337813b 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -64,7 +64,7 @@ def get_can_messages(CP, gearbox_msg): messages.append(("CRUISE_PARAMS", 50)) # TODO: clean this up - if CP.carFingerprint in (CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, + 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): pass elif CP.carFingerprint in (CAR.ODYSSEY_CHN, CAR.FREED, CAR.HRV): @@ -129,7 +129,7 @@ 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.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_HYBRID, CAR.INSIGHT, + 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): ret.doorOpen = bool(cp.vl["SCM_FEEDBACK"]["DRIVERS_DOOR_OPEN"]) elif self.CP.carFingerprint in (CAR.ODYSSEY_CHN, CAR.FREED, CAR.HRV): diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 359ae83b15..0ae39751f9 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -48,6 +48,7 @@ FW_VERSIONS = { ], (Ecu.shiftByWire, 0x18da0bf1, None): [ b'54008-TVC-A910\x00\x00', + b'54008-TWA-A910\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-6A7-A220\x00\x00', @@ -89,6 +90,12 @@ FW_VERSIONS = { b'57114-TVA-C530\x00\x00', b'57114-TVA-E520\x00\x00', b'57114-TVE-H250\x00\x00', + b'57114-TWA-A040\x00\x00', + b'57114-TWA-A050\x00\x00', + b'57114-TWA-A530\x00\x00', + b'57114-TWA-B520\x00\x00', + b'57114-TWA-C510\x00\x00', + b'57114-TWB-H030\x00\x00', ], (Ecu.eps, 0x18da30f1, None): [ b'39990-TBX-H120\x00\x00', @@ -100,6 +107,7 @@ FW_VERSIONS = { b'39990-TVA-X030\x00\x00', b'39990-TVA-X040\x00\x00', b'39990-TVE-H130\x00\x00', + b'39990-TWB-H120\x00\x00', ], (Ecu.srs, 0x18da53f1, None): [ b'77959-TBX-H230\x00\x00', @@ -108,6 +116,9 @@ FW_VERSIONS = { b'77959-TVA-H230\x00\x00', b'77959-TVA-L420\x00\x00', b'77959-TVA-X330\x00\x00', + b'77959-TWA-A440\x00\x00', + b'77959-TWA-L420\x00\x00', + b'77959-TWB-H220\x00\x00', ], (Ecu.combinationMeter, 0x18da60f1, None): [ b'78109-TBX-H310\x00\x00', @@ -141,7 +152,19 @@ FW_VERSIONS = { 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', @@ -158,6 +181,9 @@ FW_VERSIONS = { b'36802-TVE-H070\x00\x00', b'36802-TWA-A070\x00\x00', b'36802-TWA-A080\x00\x00', + b'36802-TWA-A210\x00\x00', + b'36802-TWA-A330\x00\x00', + b'36802-TWB-H060\x00\x00', ], (Ecu.fwdCamera, 0x18dab5f1, None): [ b'36161-TBX-H130\x00\x00', @@ -166,72 +192,17 @@ FW_VERSIONS = { b'36161-TVC-A330\x00\x00', b'36161-TVE-H050\x00\x00', b'36161-TWA-A070\x00\x00', + b'36161-TWA-A330\x00\x00', + b'36161-TWB-H040\x00\x00', ], (Ecu.gateway, 0x18daeff1, None): [ b'38897-TVA-A010\x00\x00', b'38897-TVA-A020\x00\x00', b'38897-TVA-A230\x00\x00', b'38897-TVA-A240\x00\x00', - ], - }, - CAR.ACCORDH: { - (Ecu.gateway, 0x18daeff1, None): [ b'38897-TWA-A120\x00\x00', b'38897-TWD-J020\x00\x00', ], - (Ecu.vsa, 0x18da28f1, None): [ - b'57114-TWA-A040\x00\x00', - b'57114-TWA-A050\x00\x00', - b'57114-TWA-A530\x00\x00', - b'57114-TWA-B520\x00\x00', - b'57114-TWA-C510\x00\x00', - b'57114-TWB-H030\x00\x00', - ], - (Ecu.srs, 0x18da53f1, None): [ - b'77959-TWA-A440\x00\x00', - b'77959-TWA-L420\x00\x00', - b'77959-TWB-H220\x00\x00', - ], - (Ecu.combinationMeter, 0x18da60f1, None): [ - 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.shiftByWire, 0x18da0bf1, None): [ - b'54008-TWA-A910\x00\x00', - ], - (Ecu.hud, 0x18da61f1, None): [ - b'78209-TVA-A010\x00\x00', - b'78209-TVA-A110\x00\x00', - ], - (Ecu.fwdCamera, 0x18dab5f1, None): [ - b'36161-TWA-A070\x00\x00', - b'36161-TWA-A330\x00\x00', - b'36161-TWB-H040\x00\x00', - ], - (Ecu.fwdRadar, 0x18dab0f1, None): [ - b'36802-TWA-A070\x00\x00', - b'36802-TWA-A080\x00\x00', - b'36802-TWA-A210\x00\x00', - b'36802-TWA-A330\x00\x00', - b'36802-TWB-H060\x00\x00', - ], - (Ecu.eps, 0x18da30f1, None): [ - b'39990-TVA-A150\x00\x00', - b'39990-TVA-A160\x00\x00', - b'39990-TVA-A340\x00\x00', - b'39990-TWB-H120\x00\x00', - ], }, CAR.CIVIC: { (Ecu.programmedFuelInjection, 0x18da10f1, None): [ diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 153fa1e635..041ab67a97 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -59,7 +59,7 @@ class CarInterface(CarInterfaceBase): if any(0x33DA in f for f in fingerprint.values()): ret.flags |= HondaFlags.BOSCH_EXT_HUD.value - # Accord 1.5T CVT has different gearbox message + # Accord ICE 1.5T CVT has different gearbox message if candidate == CAR.ACCORD and 0x191 in fingerprint[1]: ret.transmissionType = TransmissionType.cvt @@ -115,7 +115,7 @@ class CarInterface(CarInterfaceBase): 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 in (CAR.ACCORD, CAR.ACCORDH): + elif candidate == CAR.ACCORD: ret.mass = 3279. * CV.LB_TO_KG ret.wheelbase = 2.83 ret.centerToFront = ret.wheelbase * 0.39 diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index f573296609..434316943b 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -74,7 +74,6 @@ VISUAL_HUD = { class CAR(StrEnum): ACCORD = "HONDA ACCORD 2018" - ACCORDH = "HONDA ACCORD HYBRID 2018" CIVIC = "HONDA CIVIC 2016" CIVIC_BOSCH = "HONDA CIVIC (BOSCH) 2019" CIVIC_BOSCH_DIESEL = "HONDA CIVIC SEDAN 1.6 DIESEL 2019" @@ -119,8 +118,8 @@ CAR_INFO: dict[str, HondaCarInfo | list[HondaCarInfo] | None] = { CAR.ACCORD: [ 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), ], - CAR.ACCORDH: HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), CAR.CIVIC: HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"), CAR.CIVIC_BOSCH: [ HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", @@ -201,14 +200,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.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.transmission: [CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.vsa: [CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.combinationMeter: [CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.gateway: [CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.electricBrakeBooster: [CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.programmedFuelInjection: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.transmission: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.srs: [CAR.ACCORD], + Ecu.eps: [CAR.ACCORD], + Ecu.vsa: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.combinationMeter: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + Ecu.gateway: [CAR.ACCORD, 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, CAR.ACCORDH], # existence correlates with trim level + Ecu.hud: [CAR.ACCORD], # existence correlates with trim level }, extra_ecus=[ # The only other ECU on PT bus accessible by camera on radarless Civic @@ -219,7 +220,6 @@ FW_QUERY_CONFIG = FwQueryConfig( DBC = { CAR.ACCORD: dbc_dict('honda_accord_2018_can_generated', None), - CAR.ACCORDH: dbc_dict('honda_accord_2018_can_generated', None), CAR.ACURA_ILX: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), CAR.ACURA_RDX: dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), CAR.ACURA_RDX_3G: dbc_dict('acura_rdx_2020_can_generated', None), @@ -252,6 +252,6 @@ STEER_THRESHOLD = { HONDA_NIDEC_ALT_PCM_ACCEL = {CAR.ODYSSEY} HONDA_NIDEC_ALT_SCM_MESSAGES = {CAR.ACURA_ILX, CAR.ACURA_RDX, CAR.CRV, CAR.CRV_EU, CAR.FIT, CAR.FREED, CAR.HRV, CAR.ODYSSEY_CHN, CAR.PILOT, CAR.RIDGELINE} -HONDA_BOSCH = {CAR.ACCORD, CAR.ACCORDH, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, +HONDA_BOSCH = {CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G} HONDA_BOSCH_RADARLESS = {CAR.CIVIC_2022, CAR.HRV_3G} diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 9c14c0d252..811416ccef 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -82,8 +82,8 @@ routes = [ 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.ACCORDH), - CarTestRoute("f29e2b57a55e7ad5|2021-03-24--20-52-38", HONDA.ACCORDH), # 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), diff --git a/selfdrive/car/tests/test_models_segs.txt b/selfdrive/car/tests/test_models_segs.txt index ca089bbdde..c983fb08e7 100644 --- a/selfdrive/car/tests/test_models_segs.txt +++ b/selfdrive/car/tests/test_models_segs.txt @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cadad21e1230729c70cffb4c46dd0a5dda4eec1a262b1bcd9f1b6b98265c20b5 -size 125104 +oid sha256:0810a361ec5b5f5f9a2ee73b89ffb2df62ef40e8feff7e97ecb62f80fa53f6f5 +size 124950 diff --git a/selfdrive/car/torque_data/params.toml b/selfdrive/car/torque_data/params.toml index 568646c84c..142332b220 100644 --- a/selfdrive/car/torque_data/params.toml +++ b/selfdrive/car/torque_data/params.toml @@ -11,8 +11,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "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.7135052593468778, 0.3461280068322071, 0.21579936052863807] -"HONDA ACCORD HYBRID 2018" = [1.6651615004829625, 0.30322180951193245, 0.2083000440586149] +"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] diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 9c627fb7c9..0fa4652e4c 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -47609e372bf616932c4dca74d2616c3d97fa2443 +dab93e072903e80f91029a03600430c43c722cb7 From a5fa419fbd32afe176dc4380e84c785bf84ba8aa Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 27 Feb 2024 21:48:40 -0800 Subject: [PATCH 292/923] Volkswagen: log camera ECU FW --- selfdrive/car/volkswagen/values.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 4dff9205d6..3344d58ea9 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -393,6 +393,7 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=obd_multiplexing, ), ]], + extra_ecus=[(Ecu.fwdCamera, 0x74f, None)], ) CAR_INFO = CAR.create_carinfo_map() From 2c247ea2c6f6c22aa6ce55a6220e75ab17b58e06 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 28 Feb 2024 00:12:00 -0600 Subject: [PATCH 293/923] Honda Civic (Nidec): allow fingerprinting without comma power (#31501) * civic: FP with no OBD port * non essential ecus --- selfdrive/car/honda/values.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 434316943b..ce4a531d01 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -187,7 +187,6 @@ FW_QUERY_CONFIG = FwQueryConfig( [StdQueries.UDS_VERSION_REQUEST], [StdQueries.UDS_VERSION_RESPONSE], bus=0, - logging=True, ), # Bosch PT bus Request( @@ -200,13 +199,13 @@ 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_BOSCH, CAR.CRV_5G], - Ecu.transmission: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + 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_BOSCH, CAR.CRV_5G], - Ecu.combinationMeter: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], - Ecu.gateway: [CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CRV_5G], + 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 From 8750b25a0fc45234e9570da3f40385eb8dbb7a39 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 28 Feb 2024 11:34:29 -0500 Subject: [PATCH 294/923] Bump to 0.9.7.0 --- CHANGELOGS.md | 9 +++++++++ common/version.h | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 24858624df..fd7c841de1 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,3 +1,11 @@ +sunnypilot - 0.9.7.0 (2024-xx-xx) +======================== +* New driving model +* Support for many hybrid Ford models +************************ +* UPDATED: Synced with commaai's openpilot + * master commit 56e343b (February 27, 2024) + sunnypilot - 0.9.6.1 (2024-02-27) ======================== * New driving model @@ -55,6 +63,7 @@ sunnypilot - 0.9.6.1 (2024-02-27) * Display the statuses of certain features on the driving screen * NEW❗: Visuals: Enable Onroad Settings toggle * Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu + * REMOVED: "Device ambient" temperature option on the sidebar * FIXED: New comma 3X support * FIXED: New comma eSIM support * Bug fixes and performance improvements diff --git a/common/version.h b/common/version.h index dce92e0801..f89e14a780 100644 --- a/common/version.h +++ b/common/version.h @@ -1 +1 @@ -#define COMMA_VERSION "0.9.6.1" +#define COMMA_VERSION "0.9.7.0" From 540431a06b8ecb8da1ff4dcd2252c424102e3689 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 28 Feb 2024 11:36:56 -0500 Subject: [PATCH 295/923] Models: Update default name --- common/model.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/model.h b/common/model.h index 828a198694..140baa43bd 100644 --- a/common/model.h +++ b/common/model.h @@ -1 +1 @@ -#define CURRENT_MODEL "Los Angeles v2 (January 24, 2024)" +#define CURRENT_MODEL "Certified Herbalist v2 (February 13, 2024)" From 71ac15bf4e5e61382fd7de41a3b0643967b1d0c3 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 28 Feb 2024 12:41:10 -0500 Subject: [PATCH 296/923] Update README.md --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ca6221995b..c78052ad6b 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ Please refer to [Recommended Branches](#-recommended-branches) to find your pref * sunnypilot not installed or you installed a version before 0.8.17? 1. [Factory reset/uninstall](https://github.com/commaai/openpilot/wiki/FAQ#how-can-i-reset-the-device) the previous software if you have another software/fork installed. 2. After factory reset/uninstall and upon reboot, select `Custom Software` when given the option. - 3. Input the installation URL per [Recommended Branches](#-recommended-branches). Example: ```bit.ly/sp-release-c3``` [^4] (note: `https://` is not requirement on the comma three) + 3. Input the installation URL per [Recommended Branches](#-recommended-branches). Example: ```release-c3.sunnypilot.ai``` [^4] (note: `https://` is not requirement on the comma three) 4. Complete the rest of the installation following the onscreen instructions. * sunnypilot already installed and you installed a version after 0.8.17? @@ -107,6 +107,12 @@ Please refer to [Recommended Branches](#-recommended-branches) to find your pref 3. At the `Target Branch` option, press `SELECT` to open the Target Branch selector. 4. Scroll to select the desired branch per [Recommended Branches](#-recommended-branches). Example: `release-c3` +| Branch | Installation URL | +|:------------:|:--------------------------------:| +| `release-c3` | https://release-c3.sunnypilot.ai | +| `staging-c3` | https://staging-c3.sunnypilot.ai | +| `dev-c3` | https://dev-c3.sunnypilot.ai | + Requires further assistance with software installation? Join the [sunnypilot Discord server](https://discord.sunnypilot.com) and message us in the `#installation-help` channel. comma two From 7cf2b28b7883fdc3e68ad9e0974879103fa3a6ba Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 14:41:42 -0500 Subject: [PATCH 297/923] scons: fix race condition with opendbc (#31621) * fix race condition * add to release * fix for now * bump --- SConstruct | 8 +------- opendbc | 2 +- release/files_common | 2 ++ selfdrive/SConscript | 7 +++++++ selfdrive/controls/lib/lateral_mpc_lib/SConscript | 3 ++- selfdrive/controls/lib/longitudinal_mpc_lib/SConscript | 4 ++-- 6 files changed, 15 insertions(+), 11 deletions(-) create mode 100644 selfdrive/SConscript diff --git a/SConstruct b/SConstruct index 4d4f9ad4fe..dac3529892 100644 --- a/SConstruct +++ b/SConstruct @@ -384,13 +384,7 @@ if arch != "Darwin": # Build openpilot SConscript(['third_party/SConscript']) -SConscript(['selfdrive/boardd/SConscript']) -SConscript(['selfdrive/controls/lib/lateral_mpc_lib/SConscript']) -SConscript(['selfdrive/controls/lib/longitudinal_mpc_lib/SConscript']) -SConscript(['selfdrive/locationd/SConscript']) -SConscript(['selfdrive/navd/SConscript']) -SConscript(['selfdrive/modeld/SConscript']) -SConscript(['selfdrive/ui/SConscript']) +SConscript(['selfdrive/SConscript']) if arch in ['x86_64', 'aarch64', 'Darwin'] and Dir('#tools/cabana/').exists() and GetOption('extras'): SConscript(['tools/replay/SConscript']) diff --git a/opendbc b/opendbc index 0ac21652f2..5f096db742 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 0ac21652f2e643e29aa471ad6b238bf74b22e356 +Subproject commit 5f096db742b0c5dcd19976afdb07d5dd098f4b07 diff --git a/release/files_common b/release/files_common index d62ef8d1bb..1fb05b43a7 100644 --- a/release/files_common +++ b/release/files_common @@ -60,6 +60,8 @@ system/logmessaged.py system/micd.py system/version.py +selfdrive/SConscript + selfdrive/athena/__init__.py selfdrive/athena/athenad.py selfdrive/athena/manage_athenad.py diff --git a/selfdrive/SConscript b/selfdrive/SConscript new file mode 100644 index 0000000000..6b72177d8e --- /dev/null +++ b/selfdrive/SConscript @@ -0,0 +1,7 @@ +SConscript(['boardd/SConscript']) +SConscript(['controls/lib/lateral_mpc_lib/SConscript']) +SConscript(['controls/lib/longitudinal_mpc_lib/SConscript']) +SConscript(['locationd/SConscript']) +SConscript(['navd/SConscript']) +SConscript(['modeld/SConscript']) +SConscript(['ui/SConscript']) \ No newline at end of file diff --git a/selfdrive/controls/lib/lateral_mpc_lib/SConscript b/selfdrive/controls/lib/lateral_mpc_lib/SConscript index 49666abe69..b6603e69fc 100644 --- a/selfdrive/controls/lib/lateral_mpc_lib/SConscript +++ b/selfdrive/controls/lib/lateral_mpc_lib/SConscript @@ -1,4 +1,4 @@ -Import('env', 'envCython', 'arch') +Import('env', 'envCython', 'arch', 'messaging_python', 'common_python', 'opendbc_python') gen = "c_generated_code" @@ -60,6 +60,7 @@ lenv.Clean(generated_files, Dir(gen)) generated_lat = lenv.Command(generated_files, source_list, f"cd {Dir('.').abspath} && python3 lat_mpc.py") +lenv.Depends(generated_lat, [messaging_python, common_python, opendbc_python]) lenv["CFLAGS"].append("-DACADOS_WITH_QPOASES") lenv["CXXFLAGS"].append("-DACADOS_WITH_QPOASES") diff --git a/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript b/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript index 79afa1d918..c00d5cb5a7 100644 --- a/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript +++ b/selfdrive/controls/lib/longitudinal_mpc_lib/SConscript @@ -1,4 +1,4 @@ -Import('env', 'envCython', 'arch', 'messaging_python', 'common_python') +Import('env', 'envCython', 'arch', 'messaging_python', 'common_python', 'opendbc_python') gen = "c_generated_code" @@ -66,7 +66,7 @@ lenv.Clean(generated_files, Dir(gen)) generated_long = lenv.Command(generated_files, source_list, f"cd {Dir('.').abspath} && python3 long_mpc.py") -lenv.Depends(generated_long, [messaging_python, common_python]) +lenv.Depends(generated_long, [messaging_python, common_python, opendbc_python]) lenv["CFLAGS"].append("-DACADOS_WITH_QPOASES") lenv["CXXFLAGS"].append("-DACADOS_WITH_QPOASES") From e9a10ca712c79c51037f5c96b8f8e749c98ce060 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 15:05:43 -0500 Subject: [PATCH 298/923] auto pr review (#31626) * auto PR comments * little more * test * update action * cleanup * ensure it only runs once * comment that part out --------- Co-authored-by: Adeeb Shihadeh --- .github/workflows/auto_pr_review.yaml | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index abb6c38d6b..0720c1e676 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -34,6 +34,25 @@ jobs: already-exists-action: close_this already-exists-comment: "Your PR should be made against the `master` branch" + comment: + runs-on: ubuntu-latest + steps: + - name: comment + uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 + with: + message: | + + Thanks for contributing to openpilot! In order for us to review your PR as quickly as possible, check the following: + * Convert your PR to a draft unless it's ready to review + * Read the [contributing docs](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md) + * Before marking as "ready for review", ensure: + * the goal is clearly stated in the description + * all the tests are passing + * the change is [something we merge](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md#what-gets-merged) + * include a route or your device' dongle ID if relevant + comment_tag: run_id + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + check-pr-template: runs-on: ubuntu-latest permissions: @@ -41,7 +60,7 @@ jobs: issues: write pull-requests: write actions: read - if: github.event.pull_request.head.repo.full_name != 'commaai/openpilot' + if: false && github.event.pull_request.head.repo.full_name != 'commaai/openpilot' steps: - uses: actions/github-script@v7 with: @@ -91,7 +110,7 @@ jobs: // Utility function to check if a list of checkboxes is a subset of another list of checkboxes isCheckboxSubset = (templateCheckBoxTexts, prTextCheckBoxTexts) => { - // Check if each template checkbox text is a substring of at least one PR checkbox text + // Check if each template checkbox text is a substring of at least one PR checkbox text // (user should be allowed to add additional text) return templateCheckBoxTexts.every((item) => prTextCheckBoxTexts.some((element) => element.includes(item))) } From 2d6dbc12757b0a696347c6bb637bd6100b304aef Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 28 Feb 2024 17:12:01 -0500 Subject: [PATCH 299/923] Event: Add additional GitHub path for startup event check --- system/version.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/version.py b/system/version.py index 6df4b0fb7e..7051c09663 100755 --- a/system/version.py +++ b/system/version.py @@ -89,7 +89,8 @@ def is_prebuilt() -> bool: 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/sunnypilot/sunnypilot" + return get_normalized_origin() in ("github.com/sunnypilot/sunnypilot", "github.com/sunnyhaibin/sunnypilot", + "github.com/sunnypilot/openpilot", "github.com/sunnyhaibin/openpilot") @cache def is_tested_branch() -> bool: From 6cf7599bcd1a0218bb359f72c3d17e15c53bae93 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 28 Feb 2024 15:54:21 -0800 Subject: [PATCH 300/923] setup: add openpilot button (#31628) * setup: add openpilot button * rename --- selfdrive/ui/qt/setup/setup.cc | 122 +++++++++++++++++++---- selfdrive/ui/qt/setup/setup.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 +++ 12 files changed, 226 insertions(+), 17 deletions(-) diff --git a/selfdrive/ui/qt/setup/setup.cc b/selfdrive/ui/qt/setup/setup.cc index 4f2e4f48cb..08f4a0f9c0 100644 --- a/selfdrive/ui/qt/setup/setup.cc +++ b/selfdrive/ui/qt/setup/setup.cc @@ -20,7 +20,7 @@ #include "selfdrive/ui/qt/widgets/input.h" const std::string USER_AGENT = "AGNOSSetup-"; -const QString TEST_URL = "https://openpilot.comma.ai"; +const QString OPENPILOT_URL = "https://openpilot.comma.ai"; bool is_elf(char *fname) { FILE *fp = fopen(fname, "rb"); @@ -201,20 +201,7 @@ QWidget * Setup::network_setup() { QPushButton *cont = new QPushButton(); cont->setObjectName("navBtn"); cont->setProperty("primary", true); - QObject::connect(cont, &QPushButton::clicked, [=]() { - auto w = currentWidget(); - QTimer::singleShot(0, [=]() { - setCurrentWidget(downloading_widget); - }); - QString url = InputDialog::getText(tr("Enter URL"), this, tr("for Custom Software")); - if (!url.isEmpty()) { - QTimer::singleShot(1000, this, [=]() { - download(url); - }); - } else { - setCurrentWidget(w); - } - }); + QObject::connect(cont, &QPushButton::clicked, this, &Setup::nextPage); blayout->addWidget(cont); // setup timer for testing internet connection @@ -229,11 +216,11 @@ QWidget * Setup::network_setup() { } repaint(); }); - request->sendRequest(TEST_URL); + request->sendRequest(OPENPILOT_URL); QTimer *timer = new QTimer(this); QObject::connect(timer, &QTimer::timeout, [=]() { if (!request->active() && cont->isVisible()) { - request->sendRequest(TEST_URL); + request->sendRequest(OPENPILOT_URL); } }); timer->start(1000); @@ -241,6 +228,106 @@ QWidget * Setup::network_setup() { return widget; } +QWidget * radio_button(QString title, QButtonGroup *group) { + QPushButton *btn = new QPushButton(title); + btn->setCheckable(true); + group->addButton(btn); + btn->setStyleSheet(R"( + QPushButton { + height: 230; + padding-left: 100px; + padding-right: 100px; + text-align: left; + font-size: 80px; + font-weight: 400; + border-radius: 10px; + background-color: #4F4F4F; + } + QPushButton:checked { + background-color: #465BEA; + } + )"); + + // checkmark icon + QPixmap pix(":/img_circled_check.svg"); + btn->setIcon(pix); + btn->setIconSize(QSize(0, 0)); + btn->setLayoutDirection(Qt::RightToLeft); + QObject::connect(btn, &QPushButton::toggled, [=](bool checked) { + btn->setIconSize(checked ? QSize(104, 104) : QSize(0, 0)); + }); + return btn; +} + +QWidget * Setup::software_selection() { + QWidget *widget = new QWidget(); + QVBoxLayout *main_layout = new QVBoxLayout(widget); + main_layout->setContentsMargins(55, 50, 55, 50); + main_layout->setSpacing(0); + + // title + QLabel *title = new QLabel(tr("Choose Software to Install")); + title->setStyleSheet("font-size: 90px; font-weight: 500;"); + main_layout->addWidget(title, 0, Qt::AlignLeft | Qt::AlignTop); + + main_layout->addSpacing(50); + + // openpilot + custom radio buttons + QButtonGroup *group = new QButtonGroup(widget); + group->setExclusive(true); + + QWidget *openpilot = radio_button(tr("openpilot"), group); + main_layout->addWidget(openpilot); + + main_layout->addSpacing(30); + + QWidget *custom = radio_button(tr("Custom Software"), group); + main_layout->addWidget(custom); + + main_layout->addStretch(); + + // back + continue buttons + QHBoxLayout *blayout = new QHBoxLayout; + main_layout->addLayout(blayout); + blayout->setSpacing(50); + + QPushButton *back = new QPushButton(tr("Back")); + back->setObjectName("navBtn"); + QObject::connect(back, &QPushButton::clicked, this, &Setup::prevPage); + blayout->addWidget(back); + + QPushButton *cont = new QPushButton(tr("Continue")); + cont->setObjectName("navBtn"); + cont->setEnabled(false); + cont->setProperty("primary", true); + blayout->addWidget(cont); + + QObject::connect(cont, &QPushButton::clicked, [=]() { + auto w = currentWidget(); + QTimer::singleShot(0, [=]() { + setCurrentWidget(downloading_widget); + }); + QString url = OPENPILOT_URL; + if (group->checkedButton() != openpilot) { + url = InputDialog::getText(tr("Enter URL"), this, tr("for Custom Software")); + } + if (!url.isEmpty()) { + QTimer::singleShot(1000, this, [=]() { + download(url); + }); + } else { + setCurrentWidget(w); + } + }); + + connect(group, QOverload::of(&QButtonGroup::buttonClicked), [=](QAbstractButton *btn) { + btn->setChecked(true); + cont->setEnabled(true); + }); + + return widget; +} + QWidget * Setup::downloading() { QWidget *widget = new QWidget(); QVBoxLayout *main_layout = new QVBoxLayout(widget); @@ -326,6 +413,7 @@ Setup::Setup(QWidget *parent) : QStackedWidget(parent) { addWidget(getting_started()); addWidget(network_setup()); + addWidget(software_selection()); downloading_widget = downloading(); addWidget(downloading_widget); diff --git a/selfdrive/ui/qt/setup/setup.h b/selfdrive/ui/qt/setup/setup.h index 8c33acc380..ee5cc85483 100644 --- a/selfdrive/ui/qt/setup/setup.h +++ b/selfdrive/ui/qt/setup/setup.h @@ -17,6 +17,7 @@ private: QWidget *low_voltage(); QWidget *getting_started(); QWidget *network_setup(); + QWidget *software_selection(); QWidget *downloading(); QWidget *download_failed(QLabel *url, QLabel *body); diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index eb6a580c01..7a431b8bf8 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -762,6 +762,18 @@ This may take up to a minute. Select a language اختر لغة + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 6d814b9625..ae2bdf33cb 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -744,6 +744,18 @@ This may take up to a minute. Select a language Sprache wählen + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index cd96c466e9..ba496c1b89 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -746,6 +746,18 @@ Cela peut prendre jusqu'à une minute.
Select a language Choisir une langue + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index d07c7d525a..54ff0fa4ae 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -740,6 +740,18 @@ This may take up to a minute. Select a language 言語を選択 + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index a903978329..3f98db2f9c 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -742,6 +742,18 @@ This may take up to a minute. Select a language 언어를 선택하세요 + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index fce5a8a8ff..e31001a1e0 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -746,6 +746,18 @@ Isso pode levar até um minuto. Select a language Selecione o Idioma + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index f4d097b2a2..c1f0039a3c 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -742,6 +742,18 @@ This may take up to a minute. Select a language เลือกภาษา + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index ec6f71f5b0..d19c9ff036 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -740,6 +740,18 @@ This may take up to a minute. Select a language Dil seçin + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 91f55c6e94..a27dc18bd2 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -742,6 +742,18 @@ This may take up to a minute. Select a language 选择语言 + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index e8c8854d0e..1e7f1a614b 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -742,6 +742,18 @@ This may take up to a minute. Select a language 選擇語言 + + Choose Software to Install + + + + openpilot + openpilot + + + Custom Software + + SetupWidget From 7208e37f8c02c2d5260ed06faf4c531f753811a3 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 19:44:10 -0500 Subject: [PATCH 301/923] disable notebooks (#31631) --- .github/workflows/tools_tests.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index d15ab8cd60..a051cb1241 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -86,7 +86,7 @@ jobs: notebooks: name: notebooks runs-on: ubuntu-20.04 - if: github.repository == 'commaai/openpilot' + if: false && github.repository == 'commaai/openpilot' timeout-minutes: 45 steps: - uses: actions/checkout@v4 From f4a7e8eae6e4102a35c0ba787d61861bd40ed8f4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 19:47:08 -0500 Subject: [PATCH 302/923] disable commaCarSegments tests (#31632) disable this test too --- tools/lib/tests/test_comma_car_segments.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/lib/tests/test_comma_car_segments.py b/tools/lib/tests/test_comma_car_segments.py index 50d4200b4f..b293251583 100644 --- a/tools/lib/tests/test_comma_car_segments.py +++ b/tools/lib/tests/test_comma_car_segments.py @@ -1,3 +1,4 @@ +import pytest import unittest import requests @@ -6,6 +7,7 @@ from openpilot.tools.lib.logreader import LogReader from openpilot.tools.lib.route import SegmentRange +@pytest.mark.skip(reason="huggingface is flaky, run this test manually to check for issues") class TestCommaCarSegments(unittest.TestCase): def test_database(self): database = get_comma_car_segments_database() From 4cec88c02902ff15eafbb497e779c5ca2dc13d8b Mon Sep 17 00:00:00 2001 From: Shea_D Date: Wed, 28 Feb 2024 19:07:06 -0600 Subject: [PATCH 303/923] Ford - Add OBDC Cable Length to CarPartList (#31608) * Update comma cable requirement for Ford CANFD * Adding Long_Cable to part list * Moving cable info into doc_definitions under CarHarness * Updating parts for ford_q4 * Updating Q3 info * Updated MachE with USBC coupler * fix typo * updating docs/cars.md * Add 3X angled no cable * Adding in nocable device package * Add missing ) Co-authored-by: Cameron Clough * Generating new Docs.MD * Added threex_nocable for MachE * Swap MachE to regular mount no cable * confirmed with Comma Operations all boxes include 1.5ft cable regardless of 9.5ft selection * Updating CarInfo * Update USB_Coupler for Q4 Harness * Remove cable from import * removed ] * Disagree with the inconsistency but OK Co-authored-by: Shane Smiskol * Update selfdrive/car/ford/values.py --------- Co-authored-by: sheaduncan Co-authored-by: Cameron Clough Co-authored-by: Shane Smiskol --- selfdrive/car/docs_definitions.py | 3 ++- selfdrive/car/ford/values.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 841cc3af2f..1adf78b1c8 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -118,7 +118,8 @@ class CarHarness(EnumBase): nissan_b = BaseCarHarness("Nissan B connector", parts=[Accessory.harness_box, Cable.rj45_cable_7ft, Cable.long_obdc_cable, Cable.usbc_coupler]) mazda = BaseCarHarness("Mazda connector") ford_q3 = BaseCarHarness("Ford Q3 connector") - ford_q4 = BaseCarHarness("Ford Q4 connector") + ford_q4 = BaseCarHarness("Ford Q4 connector", parts=[Accessory.harness_box, Accessory.comma_power_v2, Cable.rj45_cable_7ft, Cable.long_obdc_cable, + Cable.usbc_coupler]) class Device(EnumBase): diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 1008d68b98..f969d395d2 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -58,7 +58,7 @@ class FordCarInfo(CarInfo): def init_make(self, CP: car.CarParams): harness = CarHarness.ford_q4 if CP.carFingerprint in CANFD_CAR else CarHarness.ford_q3 - if CP.carFingerprint in (CAR.BRONCO_SPORT_MK1, CAR.MAVERICK_MK1, CAR.F_150_MK14): + if CP.carFingerprint in (CAR.BRONCO_SPORT_MK1, CAR.MAVERICK_MK1, CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1): self.car_parts = CarParts([Device.threex_angled_mount, harness]) else: self.car_parts = CarParts([Device.threex, harness]) From d4c497d82674126103118a4d5bb7a39db2823609 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 20:13:44 -0500 Subject: [PATCH 304/923] add CarControllerBase base class to all CarControllers (#31630) just base class for now --- selfdrive/car/body/carcontroller.py | 3 ++- selfdrive/car/chrysler/carcontroller.py | 3 ++- selfdrive/car/ford/carcontroller.py | 3 ++- selfdrive/car/gm/carcontroller.py | 3 ++- selfdrive/car/honda/carcontroller.py | 3 ++- selfdrive/car/hyundai/carcontroller.py | 3 ++- selfdrive/car/interfaces.py | 9 +++++++++ selfdrive/car/mazda/carcontroller.py | 3 ++- selfdrive/car/nissan/carcontroller.py | 3 ++- selfdrive/car/subaru/carcontroller.py | 3 ++- selfdrive/car/tesla/carcontroller.py | 3 ++- selfdrive/car/toyota/carcontroller.py | 3 ++- selfdrive/car/volkswagen/carcontroller.py | 3 ++- 13 files changed, 33 insertions(+), 12 deletions(-) diff --git a/selfdrive/car/body/carcontroller.py b/selfdrive/car/body/carcontroller.py index d15f11d3a4..db34320caa 100644 --- a/selfdrive/car/body/carcontroller.py +++ b/selfdrive/car/body/carcontroller.py @@ -4,6 +4,7 @@ from openpilot.common.realtime import DT_CTRL from opendbc.can.packer import CANPacker from openpilot.selfdrive.car.body import bodycan from openpilot.selfdrive.car.body.values import SPEED_FROM_RPM +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.controls.lib.pid import PIDController @@ -14,7 +15,7 @@ MAX_POS_INTEGRATOR = 0.2 # meters MAX_TURN_INTEGRATOR = 0.1 # meters -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.frame = 0 self.packer = CANPacker(dbc_name) diff --git a/selfdrive/car/chrysler/carcontroller.py b/selfdrive/car/chrysler/carcontroller.py index 050eb41b1a..39248f3f75 100644 --- a/selfdrive/car/chrysler/carcontroller.py +++ b/selfdrive/car/chrysler/carcontroller.py @@ -3,9 +3,10 @@ from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_meas_steer_torque_limits from openpilot.selfdrive.car.chrysler import chryslercan from openpilot.selfdrive.car.chrysler.values import RAM_CARS, CarControllerParams, ChryslerFlags +from openpilot.selfdrive.car.interfaces import CarControllerBase -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.apply_steer_last = 0 diff --git a/selfdrive/car/ford/carcontroller.py b/selfdrive/car/ford/carcontroller.py index 45516d6035..61c46674db 100644 --- a/selfdrive/car/ford/carcontroller.py +++ b/selfdrive/car/ford/carcontroller.py @@ -4,6 +4,7 @@ from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_std_steer_angle_limits from openpilot.selfdrive.car.ford import fordcan from openpilot.selfdrive.car.ford.values import CANFD_CAR, CarControllerParams +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX LongCtrlState = car.CarControl.Actuators.LongControlState @@ -22,7 +23,7 @@ def apply_ford_curvature_limits(apply_curvature, apply_curvature_last, current_c return clip(apply_curvature, -CarControllerParams.CURVATURE_MAX, CarControllerParams.CURVATURE_MAX) -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.VM = VM diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index 6c7e8007f2..e010c56536 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -6,6 +6,7 @@ from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_driver_steer_torque_limits from openpilot.selfdrive.car.gm import gmcan from openpilot.selfdrive.car.gm.values import DBC, CanBus, CarControllerParams, CruiseButtons +from openpilot.selfdrive.car.interfaces import CarControllerBase VisualAlert = car.CarControl.HUDControl.VisualAlert NetworkLocation = car.CarParams.NetworkLocation @@ -17,7 +18,7 @@ CAMERA_CANCEL_DELAY_FRAMES = 10 MIN_STEER_MSG_INTERVAL_MS = 15 -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.start_time = 0. diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 056b47c4b3..8170e1e9ef 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -7,6 +7,7 @@ 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 from openpilot.selfdrive.controls.lib.drive_helpers import rate_limit VisualAlert = car.CarControl.HUDControl.VisualAlert @@ -104,7 +105,7 @@ def rate_limit_steer(new_steer, last_steer): return clip(new_steer, last_steer - MAX_DELTA, last_steer + MAX_DELTA) -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.packer = CANPacker(dbc_name) diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index 0b5f724ab9..b0851abf55 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -7,6 +7,7 @@ from openpilot.selfdrive.car import apply_driver_steer_torque_limits, common_fau from openpilot.selfdrive.car.hyundai import hyundaicanfd, hyundaican from openpilot.selfdrive.car.hyundai.hyundaicanfd import CanBus from openpilot.selfdrive.car.hyundai.values import HyundaiFlags, Buttons, CarControllerParams, CANFD_CAR, CAR +from openpilot.selfdrive.car.interfaces import CarControllerBase VisualAlert = car.CarControl.HUDControl.VisualAlert LongCtrlState = car.CarControl.Actuators.LongControlState @@ -42,7 +43,7 @@ def process_hud_alert(enabled, fingerprint, hud_control): return sys_warning, sys_state, left_lane_warning, right_lane_warning -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.CAN = CanBus(CP) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 0a5ec94aa0..63005e6351 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -518,3 +518,12 @@ class NanoFFModel: pred = x[0] pred = pred * (self.weights['output_norm_mat'][1] - self.weights['output_norm_mat'][0]) + self.weights['output_norm_mat'][0] return pred + + +SendCan = tuple[int, int, bytes, int] + + +class CarControllerBase(ABC): + @abstractmethod + def update(self, CC, CS, now_nanos) -> tuple[car.CarControl.Actuators, list[SendCan]]: + pass diff --git a/selfdrive/car/mazda/carcontroller.py b/selfdrive/car/mazda/carcontroller.py index 320ad19bb4..3f3b7a9494 100644 --- a/selfdrive/car/mazda/carcontroller.py +++ b/selfdrive/car/mazda/carcontroller.py @@ -1,13 +1,14 @@ from cereal import car from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_driver_steer_torque_limits +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.mazda import mazdacan from openpilot.selfdrive.car.mazda.values import CarControllerParams, Buttons VisualAlert = car.CarControl.HUDControl.VisualAlert -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.apply_steer_last = 0 diff --git a/selfdrive/car/nissan/carcontroller.py b/selfdrive/car/nissan/carcontroller.py index 2da518bbf1..6aa4bb9438 100644 --- a/selfdrive/car/nissan/carcontroller.py +++ b/selfdrive/car/nissan/carcontroller.py @@ -1,13 +1,14 @@ from cereal import car from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_std_steer_angle_limits +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.nissan import nissancan from openpilot.selfdrive.car.nissan.values import CAR, CarControllerParams VisualAlert = car.CarControl.HUDControl.VisualAlert -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.car_fingerprint = CP.carFingerprint diff --git a/selfdrive/car/subaru/carcontroller.py b/selfdrive/car/subaru/carcontroller.py index cc8ce4f722..4a65c2c02c 100644 --- a/selfdrive/car/subaru/carcontroller.py +++ b/selfdrive/car/subaru/carcontroller.py @@ -1,6 +1,7 @@ from openpilot.common.numpy_fast import clip, interp from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_driver_steer_torque_limits, common_fault_avoidance +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.subaru import subarucan from openpilot.selfdrive.car.subaru.values import DBC, GLOBAL_ES_ADDR, GLOBAL_GEN2, PREGLOBAL_CARS, HYBRID_CARS, STEER_RATE_LIMITED, \ CanBus, CarControllerParams, SubaruFlags @@ -11,7 +12,7 @@ MAX_STEER_RATE = 25 # deg/s MAX_STEER_RATE_FRAMES = 7 # tx control frames needed before torque can be cut -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.apply_steer_last = 0 diff --git a/selfdrive/car/tesla/carcontroller.py b/selfdrive/car/tesla/carcontroller.py index 95a248a614..f217c4692d 100644 --- a/selfdrive/car/tesla/carcontroller.py +++ b/selfdrive/car/tesla/carcontroller.py @@ -1,11 +1,12 @@ from openpilot.common.numpy_fast import clip from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_std_steer_angle_limits +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.tesla.teslacan import TeslaCAN from openpilot.selfdrive.car.tesla.values import DBC, CANBUS, CarControllerParams -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.frame = 0 diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 343b1d3031..d960114f1b 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -2,6 +2,7 @@ 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.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, \ @@ -25,7 +26,7 @@ MAX_LTA_ANGLE = 94.9461 # deg MAX_LTA_DRIVER_TORQUE_ALLOWANCE = 150 # slightly above steering pressed allows some resistance when changing lanes -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.params = CarControllerParams(self.CP) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 0cee2c7fce..f99e87d5d3 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -4,6 +4,7 @@ from openpilot.common.numpy_fast import clip from openpilot.common.conversions import Conversions as CV from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_driver_steer_torque_limits +from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.volkswagen import mqbcan, pqcan from openpilot.selfdrive.car.volkswagen.values import CANBUS, PQ_CARS, CarControllerParams, VolkswagenFlags @@ -11,7 +12,7 @@ VisualAlert = car.CarControl.HUDControl.VisualAlert LongCtrlState = car.CarControl.Actuators.LongControlState -class CarController: +class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.CCP = CarControllerParams(CP) From ec9856b784e6cda8f02e012076666aebe7476650 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 28 Feb 2024 20:01:58 -0600 Subject: [PATCH 305/923] GM: add more FW logging (#31633) * add more DIDs * one more * update refs * rm * btr * Update selfdrive/car/gm/values.py --- selfdrive/car/gm/values.py | 13 +++++++++++++ selfdrive/car/tests/test_fw_fingerprint.py | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 35fdf3fb92..ca35b53f72 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -189,22 +189,35 @@ class CanBus: # In a Data Module, an identifier is a string used to recognize an object, # either by itself or together with the identifiers of parent objects. # Each returns a 4 byte hex representation of the decimal part number. `b"\x02\x8c\xf0'"` -> 42790951 +GM_BOOT_SOFTWARE_PART_NUMER_REQUEST = b'\x1a\xc0' # likely does not contain anything useful GM_SOFTWARE_MODULE_1_REQUEST = b'\x1a\xc1' GM_SOFTWARE_MODULE_2_REQUEST = b'\x1a\xc2' GM_SOFTWARE_MODULE_3_REQUEST = b'\x1a\xc3' + +# Part number of XML data file that is used to configure ECU +GM_XML_DATA_FILE_PART_NUMBER = b'\x1a\x9c' +GM_XML_CONFIG_COMPAT_ID = b'\x1a\x9b' # used to know if XML file is compatible with the ECU software/hardware + # This DID is for identifying the part number that reflects the mix of hardware, # software, and calibrations in the ECU when it first arrives at the vehicle assembly plant. # If there's an Alpha Code, it's associated with this part number and stored in the DID $DB. GM_END_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcb' +GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdb' GM_BASE_MODEL_PART_NUMBER_REQUEST = b'\x1a\xcc' +GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST = b'\x1a\xdc' GM_FW_RESPONSE = b'\x5a' GM_FW_REQUESTS = [ + GM_BOOT_SOFTWARE_PART_NUMER_REQUEST, GM_SOFTWARE_MODULE_1_REQUEST, GM_SOFTWARE_MODULE_2_REQUEST, GM_SOFTWARE_MODULE_3_REQUEST, + GM_XML_DATA_FILE_PART_NUMBER, + GM_XML_CONFIG_COMPAT_ID, GM_END_MODEL_PART_NUMBER_REQUEST, + GM_END_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST, GM_BASE_MODEL_PART_NUMBER_REQUEST, + GM_BASE_MODEL_PART_NUMBER_ALPHA_CODE_REQUEST, ] GM_RX_OFFSET = 0x400 diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index 88c7225f22..a8bae29391 100755 --- a/selfdrive/car/tests/test_fw_fingerprint.py +++ b/selfdrive/car/tests/test_fw_fingerprint.py @@ -263,10 +263,10 @@ 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: 7.8, 2: 8.7} + total_ref_time = {1: 8.3, 2: 9.2} brand_ref_times = { 1: { - 'gm': 0.5, + 'gm': 1.0, 'body': 0.1, 'chrysler': 0.3, 'ford': 1.5, From 95b224c1557d419cf14aa8c74b5c921f535a7b19 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 29 Feb 2024 02:32:55 +0000 Subject: [PATCH 306/923] NNLC: Add HONDA CLARITY 2018 --- selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json b/selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json new file mode 100644 index 0000000000..6a5716e62e --- /dev/null +++ b/selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json @@ -0,0 +1 @@ +{"input_std":[[6.17857],[0.44787604],[0.5243947],[0.032028187],[0.44404522],[0.4443511],[0.44520274],[0.45595846],[0.4604483],[0.47209886],[0.4884655],[0.03209721],[0.03205],[0.03203256],[0.03195497],[0.031864975],[0.03177169],[0.03154828]],"model_test_loss":0.0009851785143837333,"input_size":18,"current_date_and_time":"2024-01-04_15-35-20","input_mean":[[21.90655],[-0.29117808],[-0.08760989],[-0.009034546],[-0.2664771],[-0.27346689],[-0.2819304],[-0.3144748],[-0.33650345],[-0.36093968],[-0.38976616],[-0.009162463],[-0.009145338],[-0.009107736],[-0.008843513],[-0.008647824],[-0.0083346395],[-0.007997973]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.06760431],[-0.2907365],[-0.4082806],[-0.20224898],[0.29265383],[0.26244283],[0.15451357]],"dense_1_W":[[0.014618384,0.37313232,0.035592113,-0.3403019,0.033235013,0.24829742,-0.49047577,0.28937504,-0.2026583,-0.2760167,0.21064562,0.08079155,0.11982211,0.042024616,-0.052886724,-0.06286289,-0.13398048,0.13160145],[-0.0048215007,0.30684328,0.020128243,-0.41616872,-0.20515934,-0.2511921,-0.13518195,0.37878683,0.26875132,0.113668166,-0.27679917,0.66174066,-0.052989658,-0.1855979,-0.02353523,-0.30120054,0.091657996,0.09602743],[-0.0042930744,-0.15373556,0.08812353,-0.31896785,0.019456651,-0.20545581,0.05433538,-0.23081444,0.43445846,0.11084425,-0.0024109932,-0.6938004,-1.024248,-0.4391781,-0.0550922,0.07583203,0.79354477,-1.8509296],[0.04390958,-0.18022121,-0.08688032,0.19231437,-0.14530687,-0.27636525,0.4690427,0.4344902,0.16017663,-0.25027603,-0.2452524,0.5537437,0.13898967,0.038036723,0.6355534,0.5031342,1.3155322,-0.14124991],[-0.006398488,-0.7886078,0.03451426,-0.054085355,0.25506452,0.4975867,1.0672406,-0.27192074,-0.91774124,0.2306121,-0.3410087,-0.16050793,0.15241678,-0.17949696,-0.31961542,0.22702731,0.419533,0.00035671022],[-0.0077034663,-0.78213346,-0.016133381,0.10805307,0.14032482,0.36524558,0.12367749,0.24540052,-0.059624504,-0.3247948,0.021967877,-0.039682694,-0.2721095,-0.10098841,0.21639878,-0.22641253,0.14136238,0.19991797],[-0.048534065,-0.20369655,0.07626118,-0.31831193,0.2750742,-0.2912584,0.088218614,0.09158782,0.06355577,-0.23128918,0.2086949,-0.44672933,0.2343581,-0.052767944,-0.26756912,-0.29403126,-0.0006949583,-0.3037349]],"activation":"σ"},{"dense_2_W":[[-0.19747548,0.3752813,0.005352072,0.22516197,-0.279574,-0.29499897,0.514051],[-0.23818707,-0.442092,0.21234472,-0.5240696,-0.666385,0.13287802,-0.70440364],[-0.12623425,-0.12563375,0.17045951,-0.4611073,0.13094379,-0.2603494,-0.578133],[-0.3201878,-0.472269,-0.45254824,-0.17459284,-0.13989829,-0.07893383,-0.15434109],[0.6313669,0.59430647,0.029979968,0.40872103,-0.6338095,-0.48483965,-0.16215326],[0.12921973,-0.35855725,-0.6317136,-0.24155544,0.018117908,0.6665686,-0.09261251],[-0.5263865,-0.500698,0.26361403,0.1989874,0.16189028,0.4017576,-0.50330746],[0.19345485,0.0116930995,-0.1151553,0.38370124,-0.51925737,-0.66009927,0.54345274],[-0.10049859,-0.07803794,-0.05125394,-0.5760374,0.22012971,-0.4562151,-0.24986024],[-0.035831526,0.17925176,0.08670547,-0.6276373,-0.24000542,0.09890566,0.005909479],[0.026487896,0.10827987,-0.5441871,0.10627476,-0.12671272,0.25334272,0.090102024],[0.11269248,-0.5982834,-0.20034944,-0.4165159,0.48223287,0.06892533,0.32945293],[0.14122471,-0.84526354,-0.102686554,-0.42417887,-0.056950103,-0.013891049,-0.043740742]],"activation":"σ","dense_2_b":[[0.021066276],[-0.18323943],[-0.08896128],[-0.059529945],[0.01516111],[-0.03864309],[-0.01915316],[0.0072613885],[-0.13141903],[-0.1963338],[-0.20056123],[-0.0918762],[-0.09109566]]},{"dense_3_W":[[-0.5145814,-0.15164766,0.41466355,0.5054458,-0.56660354,0.37653998,0.2958398,0.1300162,0.15582272,-0.14694406,0.089647524,0.0200251,-0.6487758],[0.18533824,-0.14857687,0.36485723,-0.25733942,-0.5232801,0.39276004,0.36414713,-0.54408604,-0.4820063,0.19759995,-0.12671192,0.39148358,0.189427],[0.5235357,-0.23839255,0.41131777,-0.43199104,-0.042662866,-0.042696618,-0.30467755,-0.119463064,-0.49081296,0.2406254,-0.07923712,-0.0021057576,-0.42410713]],"activation":"identity","dense_3_b":[[-0.036107603],[-0.036152013],[0.03689696]]},{"dense_4_W":[[-0.48288086,-0.87119794,0.8186898]],"dense_4_b":[[0.0358588]],"activation":"identity"}]} From 3ae151635d829ce432c13d72b0b075ced892f704 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Thu, 29 Feb 2024 00:33:37 -0300 Subject: [PATCH 307/923] Multilang: update pt-BR translations (#31634) update pt-BR translations --- selfdrive/ui/translations/main_pt-BR.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index e31001a1e0..c4789ed42e 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -638,7 +638,7 @@ Isso pode levar até um minuto. System reset triggered. Press confirm to erase all content and settings. Press cancel to resume boot. - Reinicialização do sistema acionada. Pressione confirmar para apagar todo o conteúdo e configurações. Pressione cancel para retomar a inicialização. + Reinicialização do sistema acionada. Pressione confirmar para apagar todo o conteúdo e configurações. Pressione cancel para retomar a inicialização. @@ -748,15 +748,15 @@ Isso pode levar até um minuto. Choose Software to Install - + Escolha o Software a ser Instalado openpilot - openpilot + openpilot Custom Software - + Software Customizado From 85eb221e4c9344a5c135789691e8e0500aa51482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Wed, 28 Feb 2024 19:55:57 -0800 Subject: [PATCH 308/923] GpsLocation: Rename accuracy to horizontal accuracy (#31629) * Rename accuracy to horizontal accuracy * typo in cereal --- cereal | 2 +- selfdrive/locationd/locationd.cc | 4 ++-- system/ubloxd/tests/print_gps_stats.py | 2 +- system/ubloxd/ublox_msg.cc | 2 +- tools/plotjuggler/layouts/gps_vs_llk.xml | 2 +- tools/plotjuggler/layouts/ublox-debug.xml | 2 +- tools/sim/lib/simulated_sensors.py | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cereal b/cereal index 2012d9fd16..2ad942be5b 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 2012d9fd16f62c737951ce2d1eb19d39f0c7615f +Subproject commit 2ad942be5b42532d7919c2127cb531e7178cbd2b diff --git a/selfdrive/locationd/locationd.cc b/selfdrive/locationd/locationd.cc index 1050d68b9b..26999cd684 100644 --- a/selfdrive/locationd/locationd.cc +++ b/selfdrive/locationd/locationd.cc @@ -310,7 +310,7 @@ void Localizer::input_fake_gps_observations(double current_time) { void Localizer::handle_gps(double current_time, const cereal::GpsLocationData::Reader& log, const double sensor_time_offset) { // ignore the message if the fix is invalid bool gps_invalid_flag = (log.getFlags() % 2 == 0); - bool gps_unreasonable = (Vector2d(log.getAccuracy(), log.getVerticalAccuracy()).norm() >= SANE_GPS_UNCERTAINTY); + bool gps_unreasonable = (Vector2d(log.getHorizontalAccuracy(), log.getVerticalAccuracy()).norm() >= SANE_GPS_UNCERTAINTY); bool gps_accuracy_insane = ((log.getVerticalAccuracy() <= 0) || (log.getSpeedAccuracy() <= 0) || (log.getBearingAccuracyDeg() <= 0)); bool gps_lat_lng_alt_insane = ((std::abs(log.getLatitude()) > 90) || (std::abs(log.getLongitude()) > 180) || (std::abs(log.getAltitude()) > ALTITUDE_SANITY_CHECK)); bool gps_vel_insane = (floatlist2vector(log.getVNED()).norm() > TRANS_SANITY_CHECK); @@ -331,7 +331,7 @@ void Localizer::handle_gps(double current_time, const cereal::GpsLocationData::R VectorXd ecef_pos = this->converter->ned2ecef({ 0.0, 0.0, 0.0 }).to_vector(); VectorXd ecef_vel = this->converter->ned2ecef({ log.getVNED()[0], log.getVNED()[1], log.getVNED()[2] }).to_vector() - ecef_pos; - float ecef_pos_std = std::sqrt(this->gps_variance_factor * std::pow(log.getAccuracy(), 2) + this->gps_vertical_variance_factor * std::pow(log.getVerticalAccuracy(), 2)); + float ecef_pos_std = std::sqrt(this->gps_variance_factor * std::pow(log.getHorizontalAccuracy(), 2) + this->gps_vertical_variance_factor * std::pow(log.getVerticalAccuracy(), 2)); MatrixXdr ecef_pos_R = Vector3d::Constant(std::pow(this->gps_std_factor * ecef_pos_std, 2)).asDiagonal(); MatrixXdr ecef_vel_R = Vector3d::Constant(std::pow(this->gps_std_factor * log.getSpeedAccuracy(), 2)).asDiagonal(); diff --git a/system/ubloxd/tests/print_gps_stats.py b/system/ubloxd/tests/print_gps_stats.py index cfddb7f8b8..edf94c060a 100755 --- a/system/ubloxd/tests/print_gps_stats.py +++ b/system/ubloxd/tests/print_gps_stats.py @@ -13,7 +13,7 @@ if __name__ == "__main__": cnos = [] for m in ug.measurementReport.measurements: cnos.append(m.cno) - print("Sats: %d Accuracy: %.2f m cnos" % (ug.measurementReport.numMeas, gle.accuracy), sorted(cnos)) + print("Sats: %d Accuracy: %.2f m cnos" % (ug.measurementReport.numMeas, gle.horizontalAccuracy), sorted(cnos)) except Exception: pass sm.update() diff --git a/system/ubloxd/ublox_msg.cc b/system/ubloxd/ublox_msg.cc index 7b4505dc81..eb1a1e4b19 100644 --- a/system/ubloxd/ublox_msg.cc +++ b/system/ubloxd/ublox_msg.cc @@ -132,7 +132,7 @@ kj::Array UbloxMsgParser::gen_nav_pvt(ubx_t::nav_pvt_t *msg) { gpsLoc.setAltitude(msg->height() * 1e-03); gpsLoc.setSpeed(msg->g_speed() * 1e-03); gpsLoc.setBearingDeg(msg->head_mot() * 1e-5); - gpsLoc.setAccuracy(msg->h_acc() * 1e-03); + gpsLoc.setHorizontalAccuracy(msg->h_acc() * 1e-03); std::tm timeinfo = std::tm(); timeinfo.tm_year = msg->year() - 1900; timeinfo.tm_mon = msg->month() - 1; diff --git a/tools/plotjuggler/layouts/gps_vs_llk.xml b/tools/plotjuggler/layouts/gps_vs_llk.xml index 44980712ed..69b8f20058 100644 --- a/tools/plotjuggler/layouts/gps_vs_llk.xml +++ b/tools/plotjuggler/layouts/gps_vs_llk.xml @@ -32,7 +32,7 @@ - + diff --git a/tools/plotjuggler/layouts/ublox-debug.xml b/tools/plotjuggler/layouts/ublox-debug.xml index d595a9ecc7..ea4dd35535 100644 --- a/tools/plotjuggler/layouts/ublox-debug.xml +++ b/tools/plotjuggler/layouts/ublox-debug.xml @@ -8,7 +8,7 @@ - +
diff --git a/tools/sim/lib/simulated_sensors.py b/tools/sim/lib/simulated_sensors.py index df6a0aeeff..e78f984736 100644 --- a/tools/sim/lib/simulated_sensors.py +++ b/tools/sim/lib/simulated_sensors.py @@ -55,7 +55,7 @@ class SimulatedSensors: dat.gpsLocationExternal = { "unixTimestampMillis": int(time.time() * 1000), "flags": 1, # valid fix - "accuracy": 1.0, + "horizontalAccuracy": 1.0, "verticalAccuracy": 1.0, "speedAccuracy": 0.1, "bearingAccuracyDeg": 0.1, From 3a6c3315ab181bf7390ae1faa6e87c93b1a97338 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 23:12:14 -0500 Subject: [PATCH 309/923] Subaru: move to flags within PlatformConfig (#31584) * flags * update ref * use the flags directly * use post_init (don't freeze) * we can maintain frozen with custom class * not preglobal * move to common * cleanup --- common/utils.py | 11 +++++ selfdrive/car/__init__.py | 22 ++++++++-- selfdrive/car/chrysler/values.py | 2 +- selfdrive/car/ford/values.py | 2 +- selfdrive/car/gm/values.py | 2 +- selfdrive/car/interfaces.py | 3 +- selfdrive/car/nissan/values.py | 2 +- selfdrive/car/subaru/carcontroller.py | 13 +++--- selfdrive/car/subaru/carstate.py | 54 ++++++++++++------------ selfdrive/car/subaru/interface.py | 23 +++++----- selfdrive/car/subaru/values.py | 42 ++++++++++++------ selfdrive/car/volkswagen/values.py | 4 +- selfdrive/test/process_replay/ref_commit | 2 +- 13 files changed, 112 insertions(+), 70 deletions(-) create mode 100644 common/utils.py diff --git a/common/utils.py b/common/utils.py new file mode 100644 index 0000000000..b9de020ee6 --- /dev/null +++ b/common/utils.py @@ -0,0 +1,11 @@ +class Freezable: + _frozen: bool = False + + def freeze(self): + if not self._frozen: + self._frozen = True + + def __setattr__(self, *args, **kwargs): + if self._frozen: + raise Exception("cannot modify frozen object") + super().__setattr__(*args, **kwargs) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 297dc582f7..7f47abbf98 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,12 +1,14 @@ # functions common among cars from collections import namedtuple -from dataclasses import dataclass, field, replace -from enum import ReprEnum +from dataclasses import dataclass, field +from enum import IntFlag, ReprEnum +from dataclasses import replace 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 @@ -256,11 +258,12 @@ class CarSpecs: minEnableSpeed: float = field(default=-1.) -@dataclass(frozen=True, order=True) -class PlatformConfig: +@dataclass(order=True) +class PlatformConfig(Freezable): platform_str: str car_info: CarInfos dbc_dict: DbcDict + flags: int = 0 specs: CarSpecs | None = None @@ -270,6 +273,13 @@ class PlatformConfig: def override(self, **kwargs): return replace(self, **kwargs) + def init(self): + pass + + def __post_init__(self): + self.init() + self.freeze() + class Platforms(str, ReprEnum): config: PlatformConfig @@ -287,3 +297,7 @@ class Platforms(str, ReprEnum): @classmethod def create_carinfo_map(cls) -> dict[str, CarInfos]: return {p: p.config.car_info for p in cls} + + @classmethod + def with_flags(cls, flags: IntFlag) -> set['Platforms']: + return {p for p in cls if p.config.flags & flags} diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 1cc51753d4..8fa7664b66 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -19,7 +19,7 @@ class ChryslerCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.fca])) -@dataclass(frozen=True) +@dataclass class ChryslerPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('chrysler_pacifica_2017_hybrid_generated', None)) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index f969d395d2..e60b7f0612 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -64,7 +64,7 @@ class FordCarInfo(CarInfo): self.car_parts = CarParts([Device.threex, harness]) -@dataclass(frozen=True) +@dataclass class FordPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index ca35b53f72..59b4b6ea30 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -79,7 +79,7 @@ class GMCarInfo(CarInfo): self.footnotes.append(Footnote.OBD_II) -@dataclass(frozen=True) +@dataclass 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')) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 63005e6351..77912e478b 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -120,6 +120,7 @@ class CarInterfaceBase(ABC): ret.centerToFront = ret.wheelbase * candidate.config.specs.centerToFrontRatio ret.minEnableSpeed = candidate.config.specs.minEnableSpeed ret.minSteerSpeed = candidate.config.specs.minSteerSpeed + ret.flags |= int(candidate.config.flags) ret = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) @@ -135,7 +136,7 @@ class CarInterfaceBase(ABC): @staticmethod @abstractmethod - def _get_params(ret: car.CarParams, candidate: Platform, fingerprint: dict[int, dict[int, int]], + def _get_params(ret: car.CarParams, candidate, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): raise NotImplementedError diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index 58e4eb051a..7af1700e0b 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -31,7 +31,7 @@ class NissanCarSpecs(CarSpecs): steerRatio: float = 17. -@dataclass(frozen=True) +@dataclass class NissanPlaformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('nissan_x_trail_2017_generated', None)) diff --git a/selfdrive/car/subaru/carcontroller.py b/selfdrive/car/subaru/carcontroller.py index 4a65c2c02c..22a1475b5b 100644 --- a/selfdrive/car/subaru/carcontroller.py +++ b/selfdrive/car/subaru/carcontroller.py @@ -3,8 +3,7 @@ from opendbc.can.packer import CANPacker from openpilot.selfdrive.car import apply_driver_steer_torque_limits, common_fault_avoidance from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.subaru import subarucan -from openpilot.selfdrive.car.subaru.values import DBC, GLOBAL_ES_ADDR, GLOBAL_GEN2, PREGLOBAL_CARS, HYBRID_CARS, STEER_RATE_LIMITED, \ - CanBus, CarControllerParams, SubaruFlags +from openpilot.selfdrive.car.subaru.values import DBC, GLOBAL_ES_ADDR, CanBus, CarControllerParams, SubaruFlags # FIXME: These limits aren't exact. The real limit is more than likely over a larger time period and # involves the total steering angle change rather than rate, but these limits work well for now @@ -43,12 +42,12 @@ class CarController(CarControllerBase): if not CC.latActive: apply_steer = 0 - if self.CP.carFingerprint in PREGLOBAL_CARS: + if self.CP.flags & SubaruFlags.PREGLOBAL: can_sends.append(subarucan.create_preglobal_steering_control(self.packer, self.frame // self.p.STEER_STEP, apply_steer, CC.latActive)) else: apply_steer_req = CC.latActive - if self.CP.carFingerprint in STEER_RATE_LIMITED: + if self.CP.flags & SubaruFlags.STEER_RATE_LIMITED: # Steering rate fault prevention self.steer_rate_counter, apply_steer_req = \ common_fault_avoidance(abs(CS.out.steeringRateDeg) > MAX_STEER_RATE, apply_steer_req, @@ -75,7 +74,7 @@ class CarController(CarControllerBase): cruise_brake = CarControllerParams.BRAKE_MIN # *** alerts and pcm cancel *** - if self.CP.carFingerprint in PREGLOBAL_CARS: + if self.CP.flags & SubaruFlags.PREGLOBAL: if self.frame % 5 == 0: # 1 = main, 2 = set shallow, 3 = set deep, 4 = resume shallow, 5 = resume deep # disengage ACC when OP is disengaged @@ -118,8 +117,8 @@ class CarController(CarControllerBase): self.CP.openpilotLongitudinalControl, cruise_brake > 0, cruise_throttle)) else: if pcm_cancel_cmd: - if self.CP.carFingerprint not in HYBRID_CARS: - bus = CanBus.alt if self.CP.carFingerprint in GLOBAL_GEN2 else CanBus.main + if not (self.CP.flags & SubaruFlags.HYBRID): + bus = CanBus.alt if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else CanBus.main can_sends.append(subarucan.create_es_distance(self.packer, CS.es_distance_msg["COUNTER"] + 1, CS.es_distance_msg, bus, pcm_cancel_cmd)) if self.CP.flags & SubaruFlags.DISABLE_EYESIGHT: diff --git a/selfdrive/car/subaru/carstate.py b/selfdrive/car/subaru/carstate.py index c8a6dfe1e6..ebf0ca9062 100644 --- a/selfdrive/car/subaru/carstate.py +++ b/selfdrive/car/subaru/carstate.py @@ -4,7 +4,7 @@ from opendbc.can.can_define import CANDefine from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser -from openpilot.selfdrive.car.subaru.values import DBC, GLOBAL_GEN2, PREGLOBAL_CARS, HYBRID_CARS, CanBus, SubaruFlags +from openpilot.selfdrive.car.subaru.values import DBC, CanBus, SubaruFlags from openpilot.selfdrive.car import CanSignalRateCalculator @@ -19,17 +19,17 @@ class CarState(CarStateBase): def update(self, cp, cp_cam, cp_body): ret = car.CarState.new_message() - throttle_msg = cp.vl["Throttle"] if self.car_fingerprint not in HYBRID_CARS else cp_body.vl["Throttle_Hybrid"] + throttle_msg = cp.vl["Throttle"] if not (self.CP.flags & SubaruFlags.HYBRID) else cp_body.vl["Throttle_Hybrid"] ret.gas = throttle_msg["Throttle_Pedal"] / 255. ret.gasPressed = ret.gas > 1e-5 - if self.car_fingerprint in PREGLOBAL_CARS: + if self.CP.flags & SubaruFlags.PREGLOBAL: ret.brakePressed = cp.vl["Brake_Pedal"]["Brake_Pedal"] > 0 else: - cp_brakes = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp + cp_brakes = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp ret.brakePressed = cp_brakes.vl["Brake_Status"]["Brake"] == 1 - cp_wheels = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp + cp_wheels = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp ret.wheelSpeeds = self.get_wheel_speeds( cp_wheels.vl["Wheel_Speeds"]["FL"], cp_wheels.vl["Wheel_Speeds"]["FR"], @@ -48,24 +48,24 @@ class CarState(CarStateBase): ret.leftBlindspot = (cp.vl["BSD_RCTA"]["L_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["L_APPROACHING"] == 1) ret.rightBlindspot = (cp.vl["BSD_RCTA"]["R_ADJACENT"] == 1) or (cp.vl["BSD_RCTA"]["R_APPROACHING"] == 1) - cp_transmission = cp_body if self.car_fingerprint in HYBRID_CARS else cp + cp_transmission = cp_body if self.CP.flags & SubaruFlags.HYBRID else cp can_gear = int(cp_transmission.vl["Transmission"]["Gear"]) ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(can_gear, None)) ret.steeringAngleDeg = cp.vl["Steering_Torque"]["Steering_Angle"] - if self.car_fingerprint not in PREGLOBAL_CARS: + if not (self.CP.flags & SubaruFlags.PREGLOBAL): # ideally we get this from the car, but unclear if it exists. diagnostic software doesn't even have it ret.steeringRateDeg = self.angle_rate_calulator.update(ret.steeringAngleDeg, cp.vl["Steering_Torque"]["COUNTER"]) ret.steeringTorque = cp.vl["Steering_Torque"]["Steer_Torque_Sensor"] ret.steeringTorqueEps = cp.vl["Steering_Torque"]["Steer_Torque_Output"] - steer_threshold = 75 if self.CP.carFingerprint in PREGLOBAL_CARS else 80 + steer_threshold = 75 if self.CP.flags & SubaruFlags.PREGLOBAL else 80 ret.steeringPressed = abs(ret.steeringTorque) > steer_threshold - cp_cruise = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp - if self.car_fingerprint in HYBRID_CARS: + cp_cruise = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp + if self.CP.flags & SubaruFlags.HYBRID: ret.cruiseState.enabled = cp_cam.vl["ES_DashStatus"]['Cruise_Activated'] != 0 ret.cruiseState.available = cp_cam.vl["ES_DashStatus"]['Cruise_On'] != 0 else: @@ -73,8 +73,8 @@ class CarState(CarStateBase): ret.cruiseState.available = cp_cruise.vl["CruiseControl"]["Cruise_On"] != 0 ret.cruiseState.speed = cp_cam.vl["ES_DashStatus"]["Cruise_Set_Speed"] * CV.KPH_TO_MS - if (self.car_fingerprint in PREGLOBAL_CARS and cp.vl["Dash_State2"]["UNITS"] == 1) or \ - (self.car_fingerprint not in PREGLOBAL_CARS and cp.vl["Dashlights"]["UNITS"] == 1): + if (self.CP.flags & SubaruFlags.PREGLOBAL and cp.vl["Dash_State2"]["UNITS"] == 1) or \ + (not (self.CP.flags & SubaruFlags.PREGLOBAL) and cp.vl["Dashlights"]["UNITS"] == 1): ret.cruiseState.speed *= CV.MPH_TO_KPH ret.seatbeltUnlatched = cp.vl["Dashlights"]["SEATBELT_FL"] == 1 @@ -84,8 +84,8 @@ class CarState(CarStateBase): cp.vl["BodyInfo"]["DOOR_OPEN_FL"]]) ret.steerFaultPermanent = cp.vl["Steering_Torque"]["Steer_Error_1"] == 1 - cp_es_distance = cp_body if self.car_fingerprint in (GLOBAL_GEN2 | HYBRID_CARS) else cp_cam - if self.car_fingerprint in PREGLOBAL_CARS: + cp_es_distance = cp_body if self.CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID) else cp_cam + if self.CP.flags & SubaruFlags.PREGLOBAL: self.cruise_button = cp_cam.vl["ES_Distance"]["Cruise_Button"] self.ready = not cp_cam.vl["ES_DashStatus"]["Not_Ready_Startup"] else: @@ -96,12 +96,12 @@ class CarState(CarStateBase): (cp_cam.vl["ES_LKAS_State"]["LKAS_Alert"] == 2) self.es_lkas_state_msg = copy.copy(cp_cam.vl["ES_LKAS_State"]) - cp_es_brake = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp_cam + cp_es_brake = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp_cam self.es_brake_msg = copy.copy(cp_es_brake.vl["ES_Brake"]) - cp_es_status = cp_body if self.car_fingerprint in GLOBAL_GEN2 else cp_cam + cp_es_status = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp_cam # TODO: Hybrid cars don't have ES_Distance, need a replacement - if self.car_fingerprint not in HYBRID_CARS: + if not (self.CP.flags & SubaruFlags.HYBRID): # 8 is known AEB, there are a few other values related to AEB we ignore ret.stockAeb = (cp_es_distance.vl["ES_Brake"]["AEB_Status"] == 8) and \ (cp_es_distance.vl["ES_Brake"]["Brake_Pressure"] != 0) @@ -109,7 +109,7 @@ class CarState(CarStateBase): self.es_status_msg = copy.copy(cp_es_status.vl["ES_Status"]) self.cruise_control_msg = copy.copy(cp_cruise.vl["CruiseControl"]) - if self.car_fingerprint not in HYBRID_CARS: + if not (self.CP.flags & SubaruFlags.HYBRID): self.es_distance_msg = copy.copy(cp_es_distance.vl["ES_Distance"]) self.es_dashstatus_msg = copy.copy(cp_cam.vl["ES_DashStatus"]) @@ -125,7 +125,7 @@ class CarState(CarStateBase): ("Brake_Status", 50), ] - if CP.carFingerprint not in HYBRID_CARS: + if not (CP.flags & SubaruFlags.HYBRID): messages.append(("CruiseControl", 20)) return messages @@ -136,7 +136,7 @@ class CarState(CarStateBase): ("ES_Brake", 20), ] - if CP.carFingerprint not in HYBRID_CARS: + if not (CP.flags & SubaruFlags.HYBRID): messages += [ ("ES_Distance", 20), ("ES_Status", 20) @@ -164,7 +164,7 @@ class CarState(CarStateBase): ("Brake_Pedal", 50), ] - if CP.carFingerprint not in HYBRID_CARS: + if not (CP.flags & SubaruFlags.HYBRID): messages += [ ("Throttle", 100), ("Transmission", 100) @@ -173,8 +173,8 @@ class CarState(CarStateBase): if CP.enableBsm: messages.append(("BSD_RCTA", 17)) - if CP.carFingerprint not in PREGLOBAL_CARS: - if CP.carFingerprint not in GLOBAL_GEN2: + if not (CP.flags & SubaruFlags.PREGLOBAL): + if not (CP.flags & SubaruFlags.GLOBAL_GEN2): messages += CarState.get_common_global_body_messages(CP) else: messages += CarState.get_common_preglobal_body_messages() @@ -183,7 +183,7 @@ class CarState(CarStateBase): @staticmethod def get_cam_can_parser(CP): - if CP.carFingerprint in PREGLOBAL_CARS: + if CP.flags & SubaruFlags.PREGLOBAL: messages = [ ("ES_DashStatus", 20), ("ES_Distance", 20), @@ -194,7 +194,7 @@ class CarState(CarStateBase): ("ES_LKAS_State", 10), ] - if CP.carFingerprint not in GLOBAL_GEN2: + if not (CP.flags & SubaruFlags.GLOBAL_GEN2): messages += CarState.get_common_global_es_messages(CP) if CP.flags & SubaruFlags.SEND_INFOTAINMENT: @@ -206,11 +206,11 @@ class CarState(CarStateBase): def get_body_can_parser(CP): messages = [] - if CP.carFingerprint in GLOBAL_GEN2: + if CP.flags & SubaruFlags.GLOBAL_GEN2: messages += CarState.get_common_global_body_messages(CP) messages += CarState.get_common_global_es_messages(CP) - if CP.carFingerprint in HYBRID_CARS: + if CP.flags & SubaruFlags.HYBRID: messages += [ ("Throttle_Hybrid", 40), ("Transmission", 100) diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 2dfb4f9565..ecf718bb3a 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -1,42 +1,43 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config -from openpilot.selfdrive.car.values import Platform from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase -from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, LKAS_ANGLE, GLOBAL_GEN2, PREGLOBAL_CARS, HYBRID_CARS, SubaruFlags +from openpilot.selfdrive.car.subaru.values import CAR, GLOBAL_ES_ADDR, SubaruFlags class CarInterface(CarInterfaceBase): @staticmethod - def _get_params(ret, candidate: Platform, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): + platform_flags = candidate.config.flags + ret.carName = "subaru" ret.radarUnavailable = True # for HYBRID CARS to be upstreamed, we need: # - replacement for ES_Distance so we can cancel the cruise control # - to find the Cruise_Activated bit from the car # - proper panda safety setup (use the correct cruise_activated bit, throttle from Throttle_Hybrid, etc) - ret.dashcamOnly = candidate in (PREGLOBAL_CARS | LKAS_ANGLE | HYBRID_CARS) + ret.dashcamOnly = bool(platform_flags & (SubaruFlags.PREGLOBAL | SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) ret.autoResumeSng = False # Detect infotainment message sent from the camera - if candidate not in PREGLOBAL_CARS and 0x323 in fingerprint[2]: + if not (platform_flags & SubaruFlags.PREGLOBAL) and 0x323 in fingerprint[2]: ret.flags |= SubaruFlags.SEND_INFOTAINMENT.value - if candidate in PREGLOBAL_CARS: + if platform_flags & SubaruFlags.PREGLOBAL: ret.enableBsm = 0x25c in fingerprint[0] ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaruPreglobal)] else: ret.enableBsm = 0x228 in fingerprint[0] ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaru)] - if candidate in GLOBAL_GEN2: + if platform_flags & SubaruFlags.GLOBAL_GEN2: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_SUBARU_GEN2 ret.steerLimitTimer = 0.4 ret.steerActuatorDelay = 0.1 - if candidate in LKAS_ANGLE: + if platform_flags & SubaruFlags.LKAS_ANGLE: ret.steerControlType = car.CarParams.SteerControlType.angle else: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) @@ -84,10 +85,12 @@ class CarInterface(CarInterfaceBase): else: raise ValueError(f"unknown car: {candidate}") - ret.experimentalLongitudinalAvailable = candidate not in (GLOBAL_GEN2 | PREGLOBAL_CARS | LKAS_ANGLE | HYBRID_CARS) + LONG_UNAVAILABLE = SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL| SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID + + ret.experimentalLongitudinalAvailable = not (platform_flags & LONG_UNAVAILABLE) ret.openpilotLongitudinalControl = experimental_long and ret.experimentalLongitudinalAvailable - if candidate in GLOBAL_GEN2 and ret.openpilotLongitudinalControl: + if platform_flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl: ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value if ret.openpilotLongitudinalControl: diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index a296550b12..a7c9a22e2c 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -19,7 +19,7 @@ class CarControllerParams: self.STEER_DRIVER_MULTIPLIER = 50 # weight driver torque heavily self.STEER_DRIVER_FACTOR = 1 # from dbc - if CP.carFingerprint in GLOBAL_GEN2: + if CP.flags & SubaruFlags.GLOBAL_GEN2: self.STEER_MAX = 1000 self.STEER_DELTA_UP = 40 self.STEER_DELTA_DOWN = 40 @@ -55,6 +55,14 @@ class CarControllerParams: class SubaruFlags(IntFlag): SEND_INFOTAINMENT = 1 DISABLE_EYESIGHT = 2 + GLOBAL_GEN2 = 4 + + # Cars that temporarily fault when steering angle rate is greater than some threshold. + # Appears to be all torque-based cars produced around 2019 - present + STEER_RATE_LIMITED = 8 + PREGLOBAL = 16 + HYBRID = 32 + LKAS_ANGLE = 64 GLOBAL_ES_ADDR = 0x787 @@ -89,10 +97,14 @@ class SubaruCarInfo(CarInfo): self.footnotes.append(Footnote.EXP_LONG) -@dataclass(frozen=True) +@dataclass class SubaruPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('subaru_global_2017_generated', None)) + def init(self): + if self.flags & SubaruFlags.HYBRID: + self.dbc_dict = dbc_dict('subaru_global_2020_hybrid_generated', None) + class CAR(Platforms): # Global platform @@ -105,11 +117,13 @@ class CAR(Platforms): "SUBARU OUTBACK 6TH GEN", SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.STEER_RATE_LIMITED, ) LEGACY = SubaruPlatformConfig( "SUBARU LEGACY 7TH GEN", SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), specs=OUTBACK.specs, + flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.STEER_RATE_LIMITED, ) IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", @@ -128,24 +142,26 @@ class CAR(Platforms): SubaruCarInfo("Subaru XV 2020-21"), ], specs=CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.STEER_RATE_LIMITED, ) # 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])), - dbc_dict('subaru_global_2020_hybrid_generated', None), specs=CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), + flags=SubaruFlags.HYBRID, ) FORESTER = SubaruPlatformConfig( "SUBARU FORESTER 2019", SubaruCarInfo("Subaru Forester 2019-21", "All"), specs=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"), - dbc_dict('subaru_global_2020_hybrid_generated', None), specs=FORESTER.specs, + flags=SubaruFlags.HYBRID, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( @@ -153,52 +169,50 @@ class CAR(Platforms): SubaruCarInfo("Subaru Forester 2017-18"), dbc_dict('subaru_forester_2017_generated', None), specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), + flags=SubaruFlags.PREGLOBAL, ) LEGACY_PREGLOBAL = SubaruPlatformConfig( "SUBARU LEGACY 2015 - 2018", SubaruCarInfo("Subaru Legacy 2015-18"), dbc_dict('subaru_outback_2015_generated', None), specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), + flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( "SUBARU OUTBACK 2015 - 2017", SubaruCarInfo("Subaru Outback 2015-17"), dbc_dict('subaru_outback_2015_generated', None), specs=FORESTER_PREGLOBAL.specs, + flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( "SUBARU OUTBACK 2018 - 2019", SubaruCarInfo("Subaru Outback 2018-19"), dbc_dict('subaru_outback_2019_generated', None), specs=FORESTER_PREGLOBAL.specs, + flags=SubaruFlags.PREGLOBAL, ) # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), specs=FORESTER.specs, + flags=SubaruFlags.LKAS_ANGLE, ) OUTBACK_2023 = SubaruPlatformConfig( "SUBARU OUTBACK 7TH GEN", SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), specs=OUTBACK.specs, + flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.LKAS_ANGLE, ) ASCENT_2023 = SubaruPlatformConfig( "SUBARU ASCENT 2023", SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), specs=ASCENT.specs, + flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.LKAS_ANGLE, ) -LKAS_ANGLE = {CAR.FORESTER_2022, CAR.OUTBACK_2023, CAR.ASCENT_2023} -GLOBAL_GEN2 = {CAR.OUTBACK, CAR.LEGACY, CAR.OUTBACK_2023, CAR.ASCENT_2023} -PREGLOBAL_CARS = {CAR.FORESTER_PREGLOBAL, CAR.LEGACY_PREGLOBAL, CAR.OUTBACK_PREGLOBAL, CAR.OUTBACK_PREGLOBAL_2018} -HYBRID_CARS = {CAR.CROSSTREK_HYBRID, CAR.FORESTER_HYBRID} - -# Cars that temporarily fault when steering angle rate is greater than some threshold. -# Appears to be all torque-based cars produced around 2019 - present -STEER_RATE_LIMITED = GLOBAL_GEN2 | {CAR.IMPREZA_2020, CAR.FORESTER} - SUBARU_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION) SUBARU_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ @@ -235,7 +249,7 @@ FW_QUERY_CONFIG = FwQueryConfig( ], # We don't get the EPS from non-OBD queries on GEN2 cars. Note that we still attempt to match when it exists non_essential_ecus={ - Ecu.eps: list(GLOBAL_GEN2), + Ecu.eps: list(CAR.with_flags(SubaruFlags.GLOBAL_GEN2)), } ) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 3344d58ea9..3e4a742224 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -112,11 +112,11 @@ class CANBUS: class VolkswagenFlags(IntFlag): STOCK_HCA_PRESENT = 1 -@dataclass(frozen=True) +@dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None)) -@dataclass(frozen=True) +@dataclass class VolkswagenPQPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 0fa4652e4c..13f776fbad 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -dab93e072903e80f91029a03600430c43c722cb7 +b9d29ac9402cfc04bf3e48867415efa70c144029 From 851df7458fc13e15244a7d83196d70c71e56d712 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 28 Feb 2024 23:22:54 -0500 Subject: [PATCH 310/923] pr comments: only on external prs (#31635) only on external prs --- .github/workflows/auto_pr_review.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index 0720c1e676..42ef4dbc1c 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -39,6 +39,7 @@ jobs: steps: - name: comment uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 + if: github.event.pull_request.head.repo.full_name != 'commaai/openpilot' with: message: | From f20bfacb9434d5f9d2a6692352c1f686dec9327f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 28 Feb 2024 20:22:59 -0800 Subject: [PATCH 311/923] move CarControllerBase up with other car classes --- selfdrive/car/interfaces.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 77912e478b..491138f788 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -456,6 +456,15 @@ class CarStateBase(ABC): return None +SendCan = tuple[int, int, bytes, int] + + +class CarControllerBase(ABC): + @abstractmethod + def update(self, CC, CS, now_nanos) -> tuple[car.CarControl.Actuators, list[SendCan]]: + pass + + INTERFACE_ATTR_FILE = { "FINGERPRINTS": "fingerprints", "FW_VERSIONS": "fingerprints", @@ -519,12 +528,3 @@ class NanoFFModel: pred = x[0] pred = pred * (self.weights['output_norm_mat'][1] - self.weights['output_norm_mat'][0]) + self.weights['output_norm_mat'][0] return pred - - -SendCan = tuple[int, int, bytes, int] - - -class CarControllerBase(ABC): - @abstractmethod - def update(self, CC, CS, now_nanos) -> tuple[car.CarControl.Actuators, list[SendCan]]: - pass From e4e9243f8d25711627bb4490ebb5255770e5f92c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 28 Feb 2024 20:23:05 -0800 Subject: [PATCH 312/923] bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 2ad942be5b..bfbb0cab83 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 2ad942be5b42532d7919c2127cb531e7178cbd2b +Subproject commit bfbb0cab83e3ad49d85ad1a34ee1241bf1ff782f From 7e7a6b1526ef8e3628a8125ca8f95919993fa6f6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 28 Feb 2024 20:34:44 -0800 Subject: [PATCH 313/923] bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 0c7d5f11d7..ea156f7c62 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 0c7d5f11d7187904022ea49b6a76b54d7b280345 +Subproject commit ea156f7c628a371bea9a15a29f9068d5392534ba From e0a80d34d993fb4e7f2247ed3fc853d6e925f08e Mon Sep 17 00:00:00 2001 From: vanillagorillaa <31773928+vanillagorillaa@users.noreply.github.com> Date: Wed, 28 Feb 2024 20:45:48 -0800 Subject: [PATCH 314/923] Honda: add CanBus class (#31528) * init canbus class * zero * put back after rebase * cmt * ordering * fix bsm bus --------- Co-authored-by: Shane Smiskol --- selfdrive/car/honda/carcontroller.py | 15 +++---- selfdrive/car/honda/carstate.py | 8 ++-- selfdrive/car/honda/hondacan.py | 63 ++++++++++++++++++---------- selfdrive/car/honda/interface.py | 12 +++--- 4 files changed, 59 insertions(+), 39 deletions(-) diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 8170e1e9ef..547abcd9b9 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -110,6 +110,7 @@ class CarController(CarControllerBase): self.CP = CP self.packer = CANPacker(dbc_name) self.params = CarControllerParams(CP) + self.CAN = hondacan.CanBus(CP) self.frame = 0 self.braking = False @@ -168,7 +169,7 @@ class CarController(CarControllerBase): can_sends.append((0x18DAB0F1, 0, b"\x02\x3E\x80\x00\x00\x00\x00\x00", 1)) # Send steering command. - can_sends.append(hondacan.create_steering_control(self.packer, apply_steer, CC.latActive, self.CP.carFingerprint, + can_sends.append(hondacan.create_steering_control(self.packer, self.CAN, apply_steer, CC.latActive, self.CP.carFingerprint, CS.CP.openpilotLongitudinalControl)) # wind brake from air resistance decel at high speed @@ -202,12 +203,12 @@ class CarController(CarControllerBase): if not self.CP.openpilotLongitudinalControl: if self.frame % 2 == 0 and self.CP.carFingerprint not in HONDA_BOSCH_RADARLESS: # radarless cars don't have supplemental message - can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, self.CP.carFingerprint)) + can_sends.append(hondacan.create_bosch_supplemental_1(self.packer, self.CAN, self.CP.carFingerprint)) # If using stock ACC, spam cancel command to kill gas when OP disengages. if pcm_cancel_cmd: - can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.CANCEL, self.CP.carFingerprint)) + can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.CANCEL, self.CP.carFingerprint)) elif CC.cruiseControl.resume: - can_sends.append(hondacan.spam_buttons_command(self.packer, CruiseButtons.RES_ACCEL, self.CP.carFingerprint)) + can_sends.append(hondacan.spam_buttons_command(self.packer, self.CAN, CruiseButtons.RES_ACCEL, self.CP.carFingerprint)) else: # Send gas and brake commands. @@ -220,7 +221,7 @@ class CarController(CarControllerBase): stopping = actuators.longControlState == LongCtrlState.stopping self.stopping_counter = self.stopping_counter + 1 if stopping else 0 - can_sends.extend(hondacan.create_acc_commands(self.packer, CC.enabled, CC.longActive, self.accel, self.gas, + can_sends.extend(hondacan.create_acc_commands(self.packer, self.CAN, CC.enabled, CC.longActive, self.accel, self.gas, self.stopping_counter, self.CP.carFingerprint)) else: apply_brake = clip(self.brake_last - wind_brake, 0.0, 1.0) @@ -228,7 +229,7 @@ class CarController(CarControllerBase): pump_on, self.last_pump_ts = brake_pump_hysteresis(apply_brake, self.apply_brake_last, self.last_pump_ts, ts) pcm_override = True - can_sends.append(hondacan.create_brake_command(self.packer, apply_brake, pump_on, + can_sends.append(hondacan.create_brake_command(self.packer, self.CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw_display, self.CP.carFingerprint, CS.stock_brake)) self.apply_brake_last = apply_brake @@ -251,7 +252,7 @@ class CarController(CarControllerBase): 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) - can_sends.extend(hondacan.create_ui_commands(self.packer, self.CP, CC.enabled, pcm_speed, hud, CS.is_metric, CS.acc_hud, CS.lkas_hud)) + 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: self.speed = pcm_speed diff --git a/selfdrive/car/honda/carstate.py b/selfdrive/car/honda/carstate.py index 4f5337813b..7784581e1c 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -5,7 +5,7 @@ from openpilot.common.conversions import Conversions as CV from openpilot.common.numpy_fast import interp from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser -from openpilot.selfdrive.car.honda.hondacan import get_cruise_speed_conversion, get_pt_bus +from openpilot.selfdrive.car.honda.hondacan import CanBus, get_cruise_speed_conversion from openpilot.selfdrive.car.honda.values import CAR, DBC, STEER_THRESHOLD, HONDA_BOSCH, \ HONDA_NIDEC_ALT_SCM_MESSAGES, HONDA_BOSCH_RADARLESS, \ HondaFlags @@ -267,7 +267,7 @@ class CarState(CarStateBase): def get_can_parser(self, CP): messages = get_can_messages(CP, self.gearbox_msg) - return CANParser(DBC[CP.carFingerprint]["pt"], messages, get_pt_bus(CP.carFingerprint)) + return CANParser(DBC[CP.carFingerprint]["pt"], messages, CanBus(CP).pt) @staticmethod def get_cam_can_parser(CP): @@ -287,7 +287,7 @@ class CarState(CarStateBase): ("BRAKE_COMMAND", 50), ] - return CANParser(DBC[CP.carFingerprint]["pt"], messages, 2) + return CANParser(DBC[CP.carFingerprint]["pt"], messages, CanBus(CP).camera) @staticmethod def get_body_can_parser(CP): @@ -296,6 +296,6 @@ class CarState(CarStateBase): ("BSM_STATUS_LEFT", 3), ("BSM_STATUS_RIGHT", 3), ] - bus_body = 0 # B-CAN is forwarded to ACC-CAN radar side (CAN 0 on fake ethernet port) + bus_body = CanBus(CP).radar # B-CAN is forwarded to ACC-CAN radar side (CAN 0 on fake ethernet port) return CANParser(DBC[CP.carFingerprint]["body"], messages, bus_body) return None diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index a8cbad78ce..d10d5576d9 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -1,4 +1,5 @@ from openpilot.common.conversions import Conversions as CV +from openpilot.selfdrive.car import CanBusBase from openpilot.selfdrive.car.honda.values import HondaFlags, HONDA_BOSCH, HONDA_BOSCH_RADARLESS, CAR, CarControllerParams # CAN bus layout with relay @@ -8,15 +9,34 @@ from openpilot.selfdrive.car.honda.values import HondaFlags, HONDA_BOSCH, HONDA_ # 3 = F-CAN A - OBDII port -def get_pt_bus(car_fingerprint): - return 1 if car_fingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) else 0 +class CanBus(CanBusBase): + def __init__(self, CP=None, fingerprint=None) -> None: + # use fingerprint if specified + super().__init__(CP if fingerprint is None else None, fingerprint) + + if CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS): + self._pt, self._radar = self.offset + 1, self.offset + else: + self._pt, self._radar = self.offset, self.offset + 1 + + @property + def pt(self) -> int: + return self._pt + + @property + def radar(self) -> int: + return self._radar + + @property + def camera(self) -> int: + return self.offset + 2 -def get_lkas_cmd_bus(car_fingerprint, radar_disabled=False): +def get_lkas_cmd_bus(CAN, car_fingerprint, radar_disabled=False): no_radar = car_fingerprint in HONDA_BOSCH_RADARLESS if radar_disabled or no_radar: # when radar is disabled, steering commands are sent directly to powertrain bus - return get_pt_bus(car_fingerprint) + return CAN.pt # normally steering commands are sent to radar, which forwards them to powertrain bus return 0 @@ -26,7 +46,7 @@ def get_cruise_speed_conversion(car_fingerprint: str, is_metric: bool) -> float: return CV.MPH_TO_MS if car_fingerprint in HONDA_BOSCH_RADARLESS and not is_metric else CV.KPH_TO_MS -def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake): +def create_brake_command(packer, CAN, apply_brake, pump_on, pcm_override, pcm_cancel_cmd, fcw, car_fingerprint, stock_brake): # TODO: do we loose pressure if we keep pump off for long? brakelights = apply_brake > 0 brake_rq = apply_brake > 0 @@ -47,13 +67,11 @@ def create_brake_command(packer, apply_brake, pump_on, pcm_override, pcm_cancel_ "AEB_REQ_2": 0, "AEB_STATUS": 0, } - bus = get_pt_bus(car_fingerprint) - return packer.make_can_msg("BRAKE_COMMAND", bus, values) + return packer.make_can_msg("BRAKE_COMMAND", CAN.pt, values) -def create_acc_commands(packer, enabled, active, accel, gas, stopping_counter, car_fingerprint): +def create_acc_commands(packer, CAN, enabled, active, accel, gas, stopping_counter, car_fingerprint): commands = [] - bus = get_pt_bus(car_fingerprint) min_gas_accel = CarControllerParams.BOSCH_GAS_LOOKUP_BP[0] control_on = 5 if enabled else 0 @@ -90,37 +108,36 @@ def create_acc_commands(packer, enabled, active, accel, gas, stopping_counter, c "SET_TO_75": 0x75, "SET_TO_30": 0x30, } - commands.append(packer.make_can_msg("ACC_CONTROL_ON", bus, acc_control_on_values)) + commands.append(packer.make_can_msg("ACC_CONTROL_ON", CAN.pt, acc_control_on_values)) - commands.append(packer.make_can_msg("ACC_CONTROL", bus, acc_control_values)) + commands.append(packer.make_can_msg("ACC_CONTROL", CAN.pt, acc_control_values)) return commands -def create_steering_control(packer, apply_steer, lkas_active, car_fingerprint, radar_disabled): +def create_steering_control(packer, CAN, apply_steer, lkas_active, car_fingerprint, radar_disabled): values = { "STEER_TORQUE": apply_steer if lkas_active else 0, "STEER_TORQUE_REQUEST": lkas_active, } - bus = get_lkas_cmd_bus(car_fingerprint, radar_disabled) + bus = get_lkas_cmd_bus(CAN, car_fingerprint, radar_disabled) return packer.make_can_msg("STEERING_CONTROL", bus, values) -def create_bosch_supplemental_1(packer, car_fingerprint): +def create_bosch_supplemental_1(packer, CAN, car_fingerprint): # non-active params values = { "SET_ME_X04": 0x04, "SET_ME_X80": 0x80, "SET_ME_X10": 0x10, } - bus = get_lkas_cmd_bus(car_fingerprint) + bus = get_lkas_cmd_bus(CAN, car_fingerprint) return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", bus, values) -def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud): +def create_ui_commands(packer, CAN, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud): commands = [] - bus_pt = get_pt_bus(CP.carFingerprint) radar_disabled = CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and CP.openpilotLongitudinalControl - bus_lkas = get_lkas_cmd_bus(CP.carFingerprint, radar_disabled) + bus_lkas = get_lkas_cmd_bus(CAN, CP.carFingerprint, radar_disabled) if CP.openpilotLongitudinalControl: acc_hud_values = { @@ -144,7 +161,7 @@ def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, acc_hud_values['FCM_OFF_2'] = acc_hud['FCM_OFF_2'] acc_hud_values['FCM_PROBLEM'] = acc_hud['FCM_PROBLEM'] acc_hud_values['ICONS'] = acc_hud['ICONS'] - commands.append(packer.make_can_msg("ACC_HUD", bus_pt, acc_hud_values)) + commands.append(packer.make_can_msg("ACC_HUD", CAN.pt, acc_hud_values)) lkas_hud_values = { 'SET_ME_X41': 0x41, @@ -173,19 +190,19 @@ def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, 'CMBS_OFF': 0x01, 'SET_TO_1': 0x01, } - commands.append(packer.make_can_msg('RADAR_HUD', bus_pt, radar_hud_values)) + commands.append(packer.make_can_msg('RADAR_HUD', CAN.pt, radar_hud_values)) if CP.carFingerprint == CAR.CIVIC_BOSCH: - commands.append(packer.make_can_msg("LEGACY_BRAKE_COMMAND", bus_pt, {})) + commands.append(packer.make_can_msg("LEGACY_BRAKE_COMMAND", CAN.pt, {})) return commands -def spam_buttons_command(packer, button_val, car_fingerprint): +def spam_buttons_command(packer, CAN, button_val, car_fingerprint): values = { 'CRUISE_BUTTONS': button_val, 'CRUISE_SETTING': 0, } # send buttons to camera on radarless cars - bus = 2 if car_fingerprint in HONDA_BOSCH_RADARLESS else get_pt_bus(car_fingerprint) + bus = CAN.camera if car_fingerprint in HONDA_BOSCH_RADARLESS else CAN.pt return packer.make_can_msg("SCM_BUTTONS", bus, values) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 041ab67a97..a4cf647c0f 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -3,7 +3,7 @@ from cereal import car 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 get_pt_bus +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 import create_button_events, get_safety_config @@ -36,6 +36,8 @@ class CarInterface(CarInterfaceBase): def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "honda" + CAN = CanBus(ret, fingerprint) + if candidate in HONDA_BOSCH: ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaBosch)] ret.radarUnavailable = True @@ -47,20 +49,20 @@ class CarInterface(CarInterfaceBase): ret.pcmCruise = not ret.openpilotLongitudinalControl else: ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaNidec)] - ret.enableGasInterceptor = 0x201 in fingerprint[0] + ret.enableGasInterceptor = 0x201 in fingerprint[CAN.pt] ret.openpilotLongitudinalControl = True ret.pcmCruise = not ret.enableGasInterceptor if candidate == CAR.CRV_5G: - ret.enableBsm = 0x12f8bfa7 in fingerprint[0] + ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar] # Detect Bosch cars with new HUD msgs if any(0x33DA in f for f in fingerprint.values()): ret.flags |= HondaFlags.BOSCH_EXT_HUD.value # Accord ICE 1.5T CVT has different gearbox message - if candidate == CAR.ACCORD and 0x191 in fingerprint[1]: + if candidate == CAR.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, @@ -276,7 +278,7 @@ class CarInterface(CarInterfaceBase): raise ValueError(f"unsupported car {candidate}") # These cars use alternate user brake msg (0x1BE) - if 0x1BE in fingerprint[get_pt_bus(candidate)] and candidate in HONDA_BOSCH: + if 0x1BE in fingerprint[CAN.pt] and candidate in HONDA_BOSCH: ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_ALT_BRAKE From 7687cafe8cc805a8be139c4d8a797bffd0df3fc8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 28 Feb 2024 20:47:49 -0800 Subject: [PATCH 315/923] Ford: remove unnecessary __init__ --- selfdrive/car/ford/fordcan.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/selfdrive/car/ford/fordcan.py b/selfdrive/car/ford/fordcan.py index c5ef0900f3..e99ae084e6 100644 --- a/selfdrive/car/ford/fordcan.py +++ b/selfdrive/car/ford/fordcan.py @@ -5,9 +5,6 @@ HUDControl = car.CarControl.HUDControl class CanBus(CanBusBase): - def __init__(self, CP=None, fingerprint=None) -> None: - super().__init__(CP, fingerprint) - @property def main(self) -> int: return self.offset From b8c9d3bd09171a5b9a30cb91a262e9c089d28cfd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 28 Feb 2024 21:13:26 -0800 Subject: [PATCH 316/923] Revert "Ford: remove unnecessary __init__" This reverts commit 7687cafe8cc805a8be139c4d8a797bffd0df3fc8. --- selfdrive/car/ford/fordcan.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/ford/fordcan.py b/selfdrive/car/ford/fordcan.py index e99ae084e6..c5ef0900f3 100644 --- a/selfdrive/car/ford/fordcan.py +++ b/selfdrive/car/ford/fordcan.py @@ -5,6 +5,9 @@ HUDControl = car.CarControl.HUDControl class CanBus(CanBusBase): + def __init__(self, CP=None, fingerprint=None) -> None: + super().__init__(CP, fingerprint) + @property def main(self) -> int: return self.offset From 85150c0289605c86f6aaeceebfc2376cd6027cf7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 29 Feb 2024 01:54:41 -0600 Subject: [PATCH 317/923] Platform config small cleanup (#31638) no field, label mass, correct spacing --- selfdrive/car/__init__.py | 10 +++++----- selfdrive/car/volkswagen/values.py | 8 +++++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 7f47abbf98..fe4bacd62f 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,6 +1,6 @@ # functions common among cars from collections import namedtuple -from dataclasses import dataclass, field +from dataclasses import dataclass from enum import IntFlag, ReprEnum from dataclasses import replace @@ -250,12 +250,12 @@ CarInfos = CarInfo | list[CarInfo] @dataclass(frozen=True, kw_only=True) class CarSpecs: - mass: float + mass: float # kg, curb weight wheelbase: float steerRatio: float - centerToFrontRatio: float = field(default=0.5) - minSteerSpeed: float = field(default=0.) - minEnableSpeed: float = field(default=-1.) + centerToFrontRatio: float = 0.5 + minSteerSpeed: float = 0.0 + minEnableSpeed: float = -1.0 @dataclass(order=True) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 3e4a742224..065a340928 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -112,17 +112,21 @@ class CANBUS: class VolkswagenFlags(IntFlag): STOCK_HCA_PRESENT = 1 + @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_mqb_2010', None)) + @dataclass class VolkswagenPQPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) + @dataclass(frozen=True, kw_only=True) class VolkswagenCarSpecs(CarSpecs): - steerRatio: float = field(default=15.6) + steerRatio: float = 15.6 + class Footnote(Enum): KAMIQ = CarFootnote( @@ -158,6 +162,7 @@ class VWCarInfo(CarInfo): if CP.carFingerprint in (CAR.CRAFTER_MK2, CAR.TRANSPORTER_T61): self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) + # 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. @@ -353,6 +358,7 @@ class CAR(Platforms): specs=VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) + PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} # All supported cars should return FW from the engine, srs, eps, and fwdRadar. Cars From 8e82bce17ae10b5df8c87ee77135ac556c4c1aac Mon Sep 17 00:00:00 2001 From: eFini Date: Thu, 29 Feb 2024 18:47:32 +0800 Subject: [PATCH 318/923] CHS/CHT translation update (#31642) update ZH translations --- selfdrive/ui/translations/main_zh-CHS.ts | 18 +++++++++--------- selfdrive/ui/translations/main_zh-CHT.ts | 18 +++++++++--------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index a27dc18bd2..59d6874035 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -68,23 +68,23 @@ Hidden Network - + 隐藏的网络 CONNECT - CONNECT + 连线 Enter SSID - 输入SSID + 输入 SSID Enter password - 输入密码 + 输入密码 for "%1" - 网络名称:"%1" + 网络名称:"%1" @@ -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 - + 定制软件 diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 1e7f1a614b..0079b47f7f 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -68,23 +68,23 @@ Hidden Network - + 隱藏的網路 CONNECT - 雲端服務 + 連線 Enter SSID - 輸入 SSID + 輸入 SSID Enter password - 輸入密碼 + 輸入密碼 for "%1" - 給 "%1" + 給 "%1" @@ -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 - + 自訂軟體 From 251eee46644c7975d732cb557af419d211532895 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 29 Feb 2024 16:17:13 +0000 Subject: [PATCH 319/923] test_processes: fix unclosed file (#31644) --- selfdrive/test/process_replay/test_processes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/test/process_replay/test_processes.py b/selfdrive/test/process_replay/test_processes.py index 2b917b0f61..88e46abb06 100755 --- a/selfdrive/test/process_replay/test_processes.py +++ b/selfdrive/test/process_replay/test_processes.py @@ -156,7 +156,8 @@ if __name__ == "__main__": assert full_test, "Need to run full test when updating refs" try: - ref_commit = open(REF_COMMIT_FN).read().strip() + with open(REF_COMMIT_FN) as f: + ref_commit = f.read().strip() except FileNotFoundError: print("Couldn't find reference commit") sys.exit(1) From f775faf26d555a99f43b74f8949aeb463d1d868e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 13:42:11 -0500 Subject: [PATCH 320/923] carspecs: add more units (#31646) more units --- selfdrive/car/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index fe4bacd62f..c4b685f818 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -251,11 +251,11 @@ CarInfos = CarInfo | list[CarInfo] @dataclass(frozen=True, kw_only=True) class CarSpecs: mass: float # kg, curb weight - wheelbase: float + wheelbase: float # meters steerRatio: float centerToFrontRatio: float = 0.5 - minSteerSpeed: float = 0.0 - minEnableSpeed: float = -1.0 + minSteerSpeed: float = 0.0 # m/s + minEnableSpeed: float = -1.0 # m/s @dataclass(order=True) From 80807879de395ae87ae3bcd88cd83eaac24ca744 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 14:11:37 -0500 Subject: [PATCH 321/923] Tesla: move to platform config (#31648) tesla platform config --- selfdrive/car/tesla/interface.py | 10 +--------- selfdrive/car/tesla/values.py | 34 +++++++++++++++++++------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index e06139729c..537433a350 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 from cereal import car from panda import Panda -from openpilot.selfdrive.car.tesla.values import CANBUS, CAR +from openpilot.selfdrive.car.tesla.values import CANBUS from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase @@ -41,14 +41,6 @@ class CarInterface(CarInterfaceBase): ret.steerLimitTimer = 1.0 ret.steerActuatorDelay = 0.25 - if candidate in (CAR.AP2_MODELS, CAR.AP1_MODELS): - ret.mass = 2100. - ret.wheelbase = 2.959 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 15.0 - else: - raise ValueError(f"Unsupported car: {candidate}") - return ret def _update(self, c): diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 2a51d15da8..74d2debe1f 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -1,8 +1,8 @@ from collections import namedtuple -from enum import StrEnum +from dataclasses import dataclass, field from cereal import car -from openpilot.selfdrive.car import AngleRateLimit, dbc_dict +from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -11,22 +11,24 @@ Ecu = car.CarParams.Ecu Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) -class CAR(StrEnum): - AP1_MODELS = 'TESLA AP1 MODEL S' - AP2_MODELS = 'TESLA AP2 MODEL S' +@dataclass +class TeslaPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('tesla_powertrain', 'tesla_radar', chassis_dbc='tesla_can')) -CAR_INFO: dict[str, CarInfo | list[CarInfo]] = { - CAR.AP1_MODELS: CarInfo("Tesla AP1 Model S", "All"), - CAR.AP2_MODELS: CarInfo("Tesla AP2 Model S", "All"), -} +class CAR(Platforms): + AP1_MODELS = TeslaPlatformConfig( + 'TESLA AP1 MODEL S', + CarInfo("Tesla AP1 Model S", "All"), + specs=CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0) + ) + AP2_MODELS = TeslaPlatformConfig( + 'TESLA AP2 MODEL S', + CarInfo("Tesla AP2 Model S", "All"), + specs=AP1_MODELS.specs + ) -DBC = { - CAR.AP2_MODELS: dbc_dict('tesla_powertrain', 'tesla_radar', chassis_dbc='tesla_can'), - CAR.AP1_MODELS: dbc_dict('tesla_powertrain', 'tesla_radar', chassis_dbc='tesla_can'), -} - FW_QUERY_CONFIG = FwQueryConfig( requests=[ Request( @@ -88,3 +90,7 @@ class CarControllerParams: def __init__(self, CP): pass + + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() From e122f1d7498d5964066bcc6b3f63b7d215f6d591 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 14:14:00 -0500 Subject: [PATCH 322/923] Mazda: move to platform config (#31647) * mazda platform config * update ref --- selfdrive/car/mazda/carcontroller.py | 6 +- selfdrive/car/mazda/carstate.py | 6 +- selfdrive/car/mazda/interface.py | 17 ------ selfdrive/car/mazda/mazdacan.py | 10 +-- selfdrive/car/mazda/values.py | 77 +++++++++++++++--------- selfdrive/test/process_replay/ref_commit | 2 +- 6 files changed, 59 insertions(+), 59 deletions(-) diff --git a/selfdrive/car/mazda/carcontroller.py b/selfdrive/car/mazda/carcontroller.py index 3f3b7a9494..8d3a59b4ea 100644 --- a/selfdrive/car/mazda/carcontroller.py +++ b/selfdrive/car/mazda/carcontroller.py @@ -36,13 +36,13 @@ class CarController(CarControllerBase): if self.frame % 10 == 0 and not (CS.out.brakePressed and self.brake_counter < 7): # Cancel Stock ACC if it's enabled while OP is disengaged # Send at a rate of 10hz until we sync with stock ACC state - can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP.carFingerprint, CS.crz_btns_counter, Buttons.CANCEL)) + can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.CANCEL)) else: self.brake_counter = 0 if CC.cruiseControl.resume and self.frame % 5 == 0: # Mazda Stop and Go requires a RES button (or gas) press if the car stops more than 3 seconds # Send Resume button when planner wants car to move - can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP.carFingerprint, CS.crz_btns_counter, Buttons.RESUME)) + can_sends.append(mazdacan.create_button_cmd(self.packer, self.CP, CS.crz_btns_counter, Buttons.RESUME)) self.apply_steer_last = apply_steer @@ -55,7 +55,7 @@ class CarController(CarControllerBase): can_sends.append(mazdacan.create_alert_command(self.packer, CS.cam_laneinfo, ldw, steer_required)) # send steering command - can_sends.append(mazdacan.create_steering_control(self.packer, self.CP.carFingerprint, + can_sends.append(mazdacan.create_steering_control(self.packer, self.CP, self.frame, apply_steer, CS.cam_lkas)) new_actuators = CC.actuators.copy() diff --git a/selfdrive/car/mazda/carstate.py b/selfdrive/car/mazda/carstate.py index c0819592d4..37a67ecd93 100644 --- a/selfdrive/car/mazda/carstate.py +++ b/selfdrive/car/mazda/carstate.py @@ -3,7 +3,7 @@ from openpilot.common.conversions import Conversions as CV from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser from openpilot.selfdrive.car.interfaces import CarStateBase -from openpilot.selfdrive.car.mazda.values import DBC, LKAS_LIMITS, GEN1 +from openpilot.selfdrive.car.mazda.values import DBC, LKAS_LIMITS, MazdaFlags class CarState(CarStateBase): def __init__(self, CP): @@ -116,7 +116,7 @@ class CarState(CarStateBase): ("WHEEL_SPEEDS", 100), ] - if CP.carFingerprint in GEN1: + if CP.flags & MazdaFlags.GEN1: messages += [ ("ENGINE_DATA", 100), ("CRZ_CTRL", 50), @@ -136,7 +136,7 @@ class CarState(CarStateBase): def get_cam_can_parser(CP): messages = [] - if CP.carFingerprint in GEN1: + if CP.flags & MazdaFlags.GEN1: messages += [ # sig_address, frequency ("CAM_LANEINFO", 2), diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 7ac93d9dee..a138318b1a 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -24,23 +24,6 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - if candidate in (CAR.CX5, CAR.CX5_2022): - ret.mass = 3655 * CV.LB_TO_KG - ret.wheelbase = 2.7 - ret.steerRatio = 15.5 - elif candidate in (CAR.CX9, CAR.CX9_2021): - ret.mass = 4217 * CV.LB_TO_KG - ret.wheelbase = 3.1 - ret.steerRatio = 17.6 - elif candidate == CAR.MAZDA3: - ret.mass = 2875 * CV.LB_TO_KG - ret.wheelbase = 2.7 - ret.steerRatio = 14.0 - elif candidate == CAR.MAZDA6: - ret.mass = 3443 * CV.LB_TO_KG - ret.wheelbase = 2.83 - ret.steerRatio = 15.5 - if candidate not in (CAR.CX5_2022, ): ret.minSteerSpeed = LKAS_LIMITS.DISABLE_SPEED * CV.KPH_TO_MS diff --git a/selfdrive/car/mazda/mazdacan.py b/selfdrive/car/mazda/mazdacan.py index e350c5587f..74f6af04c5 100644 --- a/selfdrive/car/mazda/mazdacan.py +++ b/selfdrive/car/mazda/mazdacan.py @@ -1,7 +1,7 @@ -from openpilot.selfdrive.car.mazda.values import GEN1, Buttons +from openpilot.selfdrive.car.mazda.values import Buttons, MazdaFlags -def create_steering_control(packer, car_fingerprint, frame, apply_steer, lkas): +def create_steering_control(packer, CP, frame, apply_steer, lkas): tmp = apply_steer + 2048 @@ -45,7 +45,7 @@ def create_steering_control(packer, car_fingerprint, frame, apply_steer, lkas): csum = csum % 256 values = {} - if car_fingerprint in GEN1: + if CP.flags & MazdaFlags.GEN1: values = { "LKAS_REQUEST": apply_steer, "CTR": ctr, @@ -88,12 +88,12 @@ def create_alert_command(packer, cam_msg: dict, ldw: bool, steer_required: bool) return packer.make_can_msg("CAM_LANEINFO", 0, values) -def create_button_cmd(packer, car_fingerprint, counter, button): +def create_button_cmd(packer, CP, counter, button): can = int(button == Buttons.CANCEL) res = int(button == Buttons.RESUME) - if car_fingerprint in GEN1: + if CP.flags & MazdaFlags.GEN1: values = { "CAN_OFF": can, "CAN_OFF_INV": (can + 1) % 2, diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index eaf76d6a72..246038bba3 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -1,8 +1,9 @@ from dataclasses import dataclass, field -from enum import StrEnum +from enum import IntFlag from cereal import car -from openpilot.selfdrive.car import dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -25,29 +26,54 @@ class CarControllerParams: pass -class CAR(StrEnum): - CX5 = "MAZDA CX-5" - CX9 = "MAZDA CX-9" - MAZDA3 = "MAZDA 3" - MAZDA6 = "MAZDA 6" - CX9_2021 = "MAZDA CX-9 2021" - CX5_2022 = "MAZDA CX-5 2022" - - @dataclass class MazdaCarInfo(CarInfo): package: str = "All" car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) -CAR_INFO: dict[str, MazdaCarInfo | list[MazdaCarInfo]] = { - CAR.CX5: MazdaCarInfo("Mazda CX-5 2017-21"), - CAR.CX9: MazdaCarInfo("Mazda CX-9 2016-20"), - CAR.MAZDA3: MazdaCarInfo("Mazda 3 2017-18"), - CAR.MAZDA6: MazdaCarInfo("Mazda 6 2017-20"), - CAR.CX9_2021: MazdaCarInfo("Mazda CX-9 2021-23", video_link="https://youtu.be/dA3duO4a0O4"), - CAR.CX5_2022: MazdaCarInfo("Mazda CX-5 2022-24"), -} +class MazdaFlags(IntFlag): + # Gen 1 hardware: same CAN messages and same camera + GEN1 = 1 + + +@dataclass +class MazdaPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('mazda_2017', None)) + flags: int = field(default=MazdaFlags.GEN1) + + +class CAR(Platforms): + CX5 = MazdaPlatformConfig( + "MAZDA CX-5", + MazdaCarInfo("Mazda CX-5 2017-21"), + specs=CarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) + ) + CX9 = MazdaPlatformConfig( + "MAZDA CX-9", + MazdaCarInfo("Mazda CX-9 2016-20"), + specs=CarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) + ) + MAZDA3 = MazdaPlatformConfig( + "MAZDA 3", + MazdaCarInfo("Mazda 3 2017-18"), + specs=CarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) + ) + MAZDA6 = MazdaPlatformConfig( + "MAZDA 6", + MazdaCarInfo("Mazda 6 2017-20"), + specs=CarSpecs(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"), + specs=CX9.specs + ) + CX5_2022 = MazdaPlatformConfig( + "MAZDA CX-5 2022", + MazdaCarInfo("Mazda CX-5 2022-24"), + specs=CX5.specs, + ) class LKAS_LIMITS: @@ -76,14 +102,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ) -DBC = { - CAR.CX5: dbc_dict('mazda_2017', None), - CAR.CX9: dbc_dict('mazda_2017', None), - CAR.MAZDA3: dbc_dict('mazda_2017', None), - CAR.MAZDA6: dbc_dict('mazda_2017', None), - CAR.CX9_2021: dbc_dict('mazda_2017', None), - CAR.CX5_2022: dbc_dict('mazda_2017', None), -} - -# Gen 1 hardware: same CAN messages and same camera -GEN1 = {CAR.CX5, CAR.CX9, CAR.CX9_2021, CAR.MAZDA3, CAR.MAZDA6, CAR.CX5_2022} +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 13f776fbad..3c29e9238b 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -b9d29ac9402cfc04bf3e48867415efa70c144029 +658699a6ba183bd97f161baa29cd4764b6bd2c30 From 5734d7c2bf13c217e469d37c4900321cba469121 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 14:29:40 -0500 Subject: [PATCH 323/923] Honda: move to platformconfig (#31637) * first * Fixes * not * not * Fixes * fix * cleanup + use sets for now * update ref * update ref --- selfdrive/car/__init__.py | 2 +- selfdrive/car/honda/values.py | 288 +++++++++++++++-------- selfdrive/car/tests/test_models.py | 6 +- selfdrive/test/process_replay/ref_commit | 2 +- 4 files changed, 190 insertions(+), 108 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index c4b685f818..42cd135446 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -245,7 +245,7 @@ class CanSignalRateCalculator: return self.rate -CarInfos = CarInfo | list[CarInfo] +CarInfos = CarInfo | list[CarInfo] | None @dataclass(frozen=True, kw_only=True) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index ce4a531d01..2b11086405 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from enum import Enum, IntFlag, StrEnum +from enum import Enum, IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV from panda.python import uds -from openpilot.selfdrive.car import dbc_dict +from openpilot.selfdrive.car import PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -46,10 +46,21 @@ class CarControllerParams: class HondaFlags(IntFlag): + # Detected flags # Bosch models with alternate set of LKAS_HUD messages BOSCH_EXT_HUD = 1 BOSCH_ALT_BRAKE = 2 + # Static flags + BOSCH = 4 + BOSCH_RADARLESS = 8 + + NIDEC = 16 + NIDEC_ALT_PCM_ACCEL = 32 + NIDEC_ALT_SCM_MESSAGES = 64 + + AUTORESUME_SNG = 128 + ELECTRIC_PARKING_BRAKE = 256 # Car button codes class CruiseButtons: @@ -72,29 +83,15 @@ VISUAL_HUD = { } -class CAR(StrEnum): - ACCORD = "HONDA ACCORD 2018" - CIVIC = "HONDA CIVIC 2016" - CIVIC_BOSCH = "HONDA CIVIC (BOSCH) 2019" - CIVIC_BOSCH_DIESEL = "HONDA CIVIC SEDAN 1.6 DIESEL 2019" - CIVIC_2022 = "HONDA CIVIC 2022" - ACURA_ILX = "ACURA ILX 2016" - CRV = "HONDA CR-V 2016" - CRV_5G = "HONDA CR-V 2017" - CRV_EU = "HONDA CR-V EU 2016" - CRV_HYBRID = "HONDA CR-V HYBRID 2019" - FIT = "HONDA FIT 2018" - FREED = "HONDA FREED 2020" - HRV = "HONDA HRV 2019" - HRV_3G = "HONDA HR-V 2023" - ODYSSEY = "HONDA ODYSSEY 2018" - ODYSSEY_CHN = "HONDA ODYSSEY CHN 2019" - ACURA_RDX = "ACURA RDX 2018" - ACURA_RDX_3G = "ACURA RDX 2020" - PILOT = "HONDA PILOT 2017" - RIDGELINE = "HONDA RIDGELINE 2017" - INSIGHT = "HONDA INSIGHT 2019" - HONDA_E = "HONDA E 2020" +@dataclass +class HondaCarInfo(CarInfo): + package: str = "Honda Sensing" + + def init_make(self, CP: car.CarParams): + if CP.flags & HondaFlags.BOSCH: + self.car_parts = CarParts.common([CarHarness.bosch_b]) if CP.flags & HondaFlags.BOSCH_RADARLESS else CarParts.common([CarHarness.bosch_a]) + else: + self.car_parts = CarParts.common([CarHarness.nidec]) class Footnote(Enum): @@ -103,55 +100,164 @@ class Footnote(Enum): Column.FSR_STEERING) -@dataclass -class HondaCarInfo(CarInfo): - package: str = "Honda Sensing" - - def init_make(self, CP: car.CarParams): - if CP.carFingerprint in HONDA_BOSCH: - self.car_parts = CarParts.common([CarHarness.bosch_b]) if CP.carFingerprint in HONDA_BOSCH_RADARLESS else CarParts.common([CarHarness.bosch_a]) - else: - self.car_parts = CarParts.common([CarHarness.nidec]) +class HondaPlatformConfig(PlatformConfig): + def init(self): + if self.flags & HondaFlags.BOSCH: + self.flags |= HondaFlags.AUTORESUME_SNG + self.flags |= HondaFlags.ELECTRIC_PARKING_BRAKE -CAR_INFO: dict[str, HondaCarInfo | list[HondaCarInfo] | None] = { - CAR.ACCORD: [ - 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), - ], - CAR.CIVIC: HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"), - CAR.CIVIC_BOSCH: [ - HondaCarInfo("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), - ], - CAR.CIVIC_BOSCH_DIESEL: None, # same platform - CAR.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"), - ], - CAR.ACURA_ILX: HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS), - CAR.CRV: HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.CRV_5G: HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.CRV_EU: None, # HondaCarInfo("Honda CR-V EU", "Touring"), # Euro version of CRV Touring - CAR.CRV_HYBRID: HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.FIT: HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.FREED: HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.HRV: HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.HRV_3G: HondaCarInfo("Honda HR-V 2023", "All"), - CAR.ODYSSEY: HondaCarInfo("Honda Odyssey 2018-20"), - CAR.ODYSSEY_CHN: None, # Chinese version of Odyssey - CAR.ACURA_RDX: HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.ACURA_RDX_3G: HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), - CAR.PILOT: [ - 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), - ], - CAR.RIDGELINE: HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS), - CAR.INSIGHT: HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), - CAR.HONDA_E: HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), -} +class CAR(Platforms): + # Bosch Cars + ACCORD = HondaPlatformConfig( + "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), + ], + dbc_dict('honda_accord_2018_can_generated', None), + flags=HondaFlags.BOSCH, + ) + CIVIC_BOSCH = HondaPlatformConfig( + "HONDA CIVIC (BOSCH) 2019", + [ + HondaCarInfo("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), + ], + dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), + flags=HondaFlags.BOSCH + ) + CIVIC_BOSCH_DIESEL = HondaPlatformConfig( + "HONDA CIVIC SEDAN 1.6 DIESEL 2019", + None, # don't show in docs + dbc_dict('honda_accord_2018_can_generated', None), + flags=HondaFlags.BOSCH + ) + CIVIC_2022 = HondaPlatformConfig( + "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"), + ], + dbc_dict('honda_civic_ex_2022_can_generated', None), + flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS, + ) + CRV_5G = HondaPlatformConfig( + "HONDA CR-V 2017", + HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), + flags=HondaFlags.BOSCH, + ) + CRV_HYBRID = HondaPlatformConfig( + "HONDA CR-V HYBRID 2019", + HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_accord_2018_can_generated', None), + flags=HondaFlags.BOSCH + ) + HRV_3G = HondaPlatformConfig( + "HONDA HR-V 2023", + HondaCarInfo("Honda HR-V 2023", "All"), + dbc_dict('honda_civic_ex_2022_can_generated', None), + flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS + ) + ACURA_RDX_3G = HondaPlatformConfig( + "ACURA RDX 2020", + HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + dbc_dict('acura_rdx_2020_can_generated', None), + flags=HondaFlags.BOSCH + ) + INSIGHT = HondaPlatformConfig( + "HONDA INSIGHT 2019", + HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), + dbc_dict('honda_insight_ex_2019_can_generated', None), + flags=HondaFlags.BOSCH + ) + HONDA_E = HondaPlatformConfig( + "HONDA E 2020", + HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), + dbc_dict('acura_rdx_2020_can_generated', None), + flags=HondaFlags.BOSCH + ) + + # Nidec Cars + ACURA_ILX = HondaPlatformConfig( + "ACURA ILX 2016", + HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS), + dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + CRV = HondaPlatformConfig( + "HONDA CR-V 2016", + HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + CRV_EU = HondaPlatformConfig( + "HONDA CR-V EU 2016", + None, # Euro version of CRV Touring, don't show in docs + dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + FIT = HondaPlatformConfig( + "HONDA FIT 2018", + HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + FREED = HondaPlatformConfig( + "HONDA FREED 2020", + HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + HRV = HondaPlatformConfig( + "HONDA HRV 2019", + HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + ODYSSEY = HondaPlatformConfig( + "HONDA ODYSSEY 2018", + HondaCarInfo("Honda Odyssey 2018-20"), + dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_PCM_ACCEL + ) + ODYSSEY_CHN = HondaPlatformConfig( + "HONDA ODYSSEY CHN 2019", + None, # Chinese version of Odyssey, don't show in docs + dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES + ) + ACURA_RDX = HondaPlatformConfig( + "ACURA RDX 2018", + HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + PILOT = HondaPlatformConfig( + "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), + ], + dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + RIDGELINE = HondaPlatformConfig( + "HONDA RIDGELINE 2017", + HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS), + dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + ) + CIVIC = HondaPlatformConfig( + "HONDA CIVIC 2016", + HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"), + dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), + flags=HondaFlags.NIDEC | HondaFlags.AUTORESUME_SNG | HondaFlags.ELECTRIC_PARKING_BRAKE, + ) + HONDA_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(0xF112) @@ -217,40 +323,16 @@ FW_QUERY_CONFIG = FwQueryConfig( ) -DBC = { - CAR.ACCORD: dbc_dict('honda_accord_2018_can_generated', None), - CAR.ACURA_ILX: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.ACURA_RDX: dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), - CAR.ACURA_RDX_3G: dbc_dict('acura_rdx_2020_can_generated', None), - CAR.CIVIC: dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.CIVIC_BOSCH: dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), - CAR.CIVIC_BOSCH_DIESEL: dbc_dict('honda_accord_2018_can_generated', None), - CAR.CRV: dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.CRV_5G: dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), - CAR.CRV_EU: dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.CRV_HYBRID: dbc_dict('honda_accord_2018_can_generated', None), - CAR.FIT: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - CAR.FREED: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - CAR.HRV: dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - CAR.HRV_3G: dbc_dict('honda_civic_ex_2022_can_generated', None), - CAR.ODYSSEY: dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), - CAR.ODYSSEY_CHN: dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), - CAR.PILOT: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.RIDGELINE: dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - CAR.INSIGHT: dbc_dict('honda_insight_ex_2019_can_generated', None), - CAR.HONDA_E: dbc_dict('acura_rdx_2020_can_generated', None), - CAR.CIVIC_2022: dbc_dict('honda_civic_ex_2022_can_generated', None), -} - STEER_THRESHOLD = { # default is 1200, overrides go here CAR.ACURA_RDX: 400, CAR.CRV_EU: 400, } -HONDA_NIDEC_ALT_PCM_ACCEL = {CAR.ODYSSEY} -HONDA_NIDEC_ALT_SCM_MESSAGES = {CAR.ACURA_ILX, CAR.ACURA_RDX, CAR.CRV, CAR.CRV_EU, CAR.FIT, CAR.FREED, CAR.HRV, CAR.ODYSSEY_CHN, - CAR.PILOT, CAR.RIDGELINE} -HONDA_BOSCH = {CAR.ACCORD, CAR.CIVIC_BOSCH, CAR.CIVIC_BOSCH_DIESEL, CAR.CRV_5G, - CAR.CRV_HYBRID, CAR.INSIGHT, CAR.ACURA_RDX_3G, CAR.HONDA_E, CAR.CIVIC_2022, CAR.HRV_3G} -HONDA_BOSCH_RADARLESS = {CAR.CIVIC_2022, CAR.HRV_3G} +HONDA_NIDEC_ALT_PCM_ACCEL = CAR.with_flags(HondaFlags.NIDEC_ALT_PCM_ACCEL) +HONDA_NIDEC_ALT_SCM_MESSAGES = CAR.with_flags(HondaFlags.NIDEC_ALT_SCM_MESSAGES) +HONDA_BOSCH = CAR.with_flags(HondaFlags.BOSCH) +HONDA_BOSCH_RADARLESS = CAR.with_flags(HondaFlags.BOSCH_RADARLESS) + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 2b29c14f72..b7d20e5a83 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -17,7 +17,7 @@ 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.car_helpers import FRAME_FINGERPRINT, interfaces -from openpilot.selfdrive.car.honda.values import CAR as HONDA, HONDA_BOSCH +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.controls.controlsd import Controls from openpilot.selfdrive.test.helpers import read_segment_list @@ -381,7 +381,7 @@ class TestCarModelBase(unittest.TestCase): if self.safety.get_vehicle_moving() != prev_panda_vehicle_moving: self.assertEqual(not CS.standstill, self.safety.get_vehicle_moving()) - if not (self.CP.carName == "honda" and self.CP.carFingerprint not in HONDA_BOSCH): + if not (self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH)): if self.safety.get_cruise_engaged_prev() != prev_panda_cruise_engaged: self.assertEqual(CS.cruiseState.enabled, self.safety.get_cruise_engaged_prev()) @@ -442,7 +442,7 @@ class TestCarModelBase(unittest.TestCase): # On most pcmCruise cars, openpilot's state is always tied to the PCM's cruise state. # On Honda Nidec, we always engage on the rising edge of the PCM cruise state, but # openpilot brakes to zero even if the min ACC speed is non-zero (i.e. the PCM disengages). - if self.CP.carName == "honda" and self.CP.carFingerprint not in HONDA_BOSCH: + if self.CP.carName == "honda" and not (self.CP.flags & HondaFlags.BOSCH): # only the rising edges are expected to match if CS.cruiseState.enabled and not CS_prev.cruiseState.enabled: checks['controlsAllowed'] += not self.safety.get_controls_allowed() diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 3c29e9238b..94674f05de 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -658699a6ba183bd97f161baa29cd4764b6bd2c30 +5aa0f4c0ab2cebccc3596aa8ef529fdb94a43643 From 7ec83c42f8229b37fb243d43004bbea22f0247c2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 17:14:24 -0500 Subject: [PATCH 324/923] devcontainer improvements (#31650) --- .devcontainer/Dockerfile | 2 +- .devcontainer/devcontainer.json | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index a24c524047..36bb6aa840 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,6 +1,6 @@ FROM ghcr.io/commaai/openpilot-base:latest -RUN apt update && apt install -y vim net-tools usbutils htop ripgrep tmux wget mesa-utils xvfb libxtst6 libxv1 libglu1-mesa libegl1-mesa +RUN apt update && apt install -y vim net-tools usbutils htop ripgrep tmux wget mesa-utils xvfb libxtst6 libxv1 libglu1-mesa libegl1-mesa gdb RUN pip install ipython jupyter jupyterlab RUN cd /tmp && \ diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index a7a63658ed..f1cfc82159 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -18,7 +18,6 @@ "--volume=${localWorkspaceFolder}/.devcontainer/.host/.Xauthority:/home/batman/.Xauthority", "--volume=${localEnv:HOME}/.comma:/home/batman/.comma", "--volume=/tmp/comma_download_cache:/tmp/comma_download_cache", - "--volume=/tmp/devcontainer_scons_cache:/tmp/scons_cache", "--shm-size=1G", "--add-host=host.docker.internal:host-gateway", // required to use host.docker.internal on linux "--publish=0.0.0.0:8070-8079:8070-8079" // body ZMQ services @@ -43,5 +42,8 @@ "lharri73.dbc" ] } - } + }, + "mounts": [ + "type=volume,source=scons_cache,target=/tmp/scons_cache" + ] } \ No newline at end of file From 5d291cb64d2ff925a13cbf0f783517642929917f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 29 Feb 2024 16:45:31 -0600 Subject: [PATCH 325/923] Subaru: group steer rate limited with GEN2 (#31640) * remove sideways diff * make a subclass * fix * fix --- selfdrive/car/subaru/values.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index a7c9a22e2c..90502bfad7 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -106,6 +106,15 @@ class SubaruPlatformConfig(PlatformConfig): self.dbc_dict = dbc_dict('subaru_global_2020_hybrid_generated', None) +@dataclass +class SubaruGen2PlatformConfig(SubaruPlatformConfig): + def init(self): + super().init() + self.flags |= SubaruFlags.GLOBAL_GEN2 + if not (self.flags & SubaruFlags.LKAS_ANGLE): + self.flags |= SubaruFlags.STEER_RATE_LIMITED + + class CAR(Platforms): # Global platform ASCENT = SubaruPlatformConfig( @@ -113,17 +122,15 @@ class CAR(Platforms): SubaruCarInfo("Subaru Ascent 2019-21", "All"), specs=CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), ) - OUTBACK = SubaruPlatformConfig( + OUTBACK = SubaruGen2PlatformConfig( "SUBARU OUTBACK 6TH GEN", SubaruCarInfo("Subaru Outback 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), - flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.STEER_RATE_LIMITED, ) - LEGACY = SubaruPlatformConfig( + LEGACY = SubaruGen2PlatformConfig( "SUBARU LEGACY 7TH GEN", SubaruCarInfo("Subaru Legacy 2020-22", "All", car_parts=CarParts.common([CarHarness.subaru_b])), specs=OUTBACK.specs, - flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.STEER_RATE_LIMITED, ) IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", @@ -199,17 +206,17 @@ class CAR(Platforms): specs=FORESTER.specs, flags=SubaruFlags.LKAS_ANGLE, ) - OUTBACK_2023 = SubaruPlatformConfig( + OUTBACK_2023 = SubaruGen2PlatformConfig( "SUBARU OUTBACK 7TH GEN", SubaruCarInfo("Subaru Outback 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), specs=OUTBACK.specs, - flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.LKAS_ANGLE, + flags=SubaruFlags.LKAS_ANGLE, ) - ASCENT_2023 = SubaruPlatformConfig( + ASCENT_2023 = SubaruGen2PlatformConfig( "SUBARU ASCENT 2023", SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), specs=ASCENT.specs, - flags=SubaruFlags.GLOBAL_GEN2 | SubaruFlags.LKAS_ANGLE, + flags=SubaruFlags.LKAS_ANGLE, ) From ac16c5518a300df5fa31e088a6e2a03d1a0d1747 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 18:01:47 -0500 Subject: [PATCH 326/923] add CAR.print_debug (#31652) print debug --- selfdrive/car/__init__.py | 14 +++++++++++++- selfdrive/car/subaru/values.py | 4 ++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 42cd135446..e46ce120e8 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,5 +1,5 @@ # functions common among cars -from collections import namedtuple +from collections import defaultdict, namedtuple from dataclasses import dataclass from enum import IntFlag, ReprEnum from dataclasses import replace @@ -301,3 +301,15 @@ class Platforms(str, ReprEnum): @classmethod def with_flags(cls, flags: IntFlag) -> set['Platforms']: return {p for p in cls if p.config.flags & flags} + + @classmethod + def print_debug(cls, flags): + platforms_with_flag = defaultdict(list) + for flag in flags: + for platform in cls: + if platform.config.flags & flag: + assert flag.name is not None + platforms_with_flag[flag.name].append(platform) + + for flag, platforms in platforms_with_flag.items(): + print(f"{flag:20s}: {', '.join(p.name for p in platforms)}") diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 90502bfad7..7bf0f11bad 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -262,3 +262,7 @@ FW_QUERY_CONFIG = FwQueryConfig( CAR_INFO = CAR.create_carinfo_map() DBC = CAR.create_dbc_map() + + +if __name__ == "__main__": + CAR.print_debug(SubaruFlags) From 0fa3445ddb829122fc8d67cd6aab7b9842a6e089 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 29 Feb 2024 17:19:31 -0600 Subject: [PATCH 327/923] Subaru: use carParams flags in interface (#31653) * Subaru: don't use platform flags * clean up --- selfdrive/car/subaru/interface.py | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index ecf718bb3a..30e186bd09 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -10,47 +10,45 @@ class CarInterface(CarInterfaceBase): @staticmethod def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): - platform_flags = candidate.config.flags - ret.carName = "subaru" ret.radarUnavailable = True # for HYBRID CARS to be upstreamed, we need: # - replacement for ES_Distance so we can cancel the cruise control # - to find the Cruise_Activated bit from the car # - proper panda safety setup (use the correct cruise_activated bit, throttle from Throttle_Hybrid, etc) - ret.dashcamOnly = bool(platform_flags & (SubaruFlags.PREGLOBAL | SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) + ret.dashcamOnly = bool(ret.flags & (SubaruFlags.PREGLOBAL | SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) ret.autoResumeSng = False # Detect infotainment message sent from the camera - if not (platform_flags & SubaruFlags.PREGLOBAL) and 0x323 in fingerprint[2]: + if not (ret.flags & SubaruFlags.PREGLOBAL) and 0x323 in fingerprint[2]: ret.flags |= SubaruFlags.SEND_INFOTAINMENT.value - if platform_flags & SubaruFlags.PREGLOBAL: + if ret.flags & SubaruFlags.PREGLOBAL: ret.enableBsm = 0x25c in fingerprint[0] ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaruPreglobal)] else: ret.enableBsm = 0x228 in fingerprint[0] ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.subaru)] - if platform_flags & SubaruFlags.GLOBAL_GEN2: + if ret.flags & SubaruFlags.GLOBAL_GEN2: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_SUBARU_GEN2 ret.steerLimitTimer = 0.4 ret.steerActuatorDelay = 0.1 - if platform_flags & SubaruFlags.LKAS_ANGLE: + if ret.flags & SubaruFlags.LKAS_ANGLE: ret.steerControlType = car.CarParams.SteerControlType.angle else: CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) if candidate in (CAR.ASCENT, CAR.ASCENT_2023): - ret.steerActuatorDelay = 0.3 # end-to-end angle controller + 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: - ret.steerActuatorDelay = 0.4 # end-to-end angle controller + 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.]] @@ -85,12 +83,11 @@ class CarInterface(CarInterfaceBase): else: raise ValueError(f"unknown car: {candidate}") - LONG_UNAVAILABLE = SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL| SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID - - ret.experimentalLongitudinalAvailable = not (platform_flags & LONG_UNAVAILABLE) + ret.experimentalLongitudinalAvailable = not (ret.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL | + SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID)) ret.openpilotLongitudinalControl = experimental_long and ret.experimentalLongitudinalAvailable - if platform_flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl: + if ret.flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl: ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value if ret.openpilotLongitudinalControl: From 690dc55ea26dadb26ed768103baafba47428cda6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 29 Feb 2024 17:36:40 -0600 Subject: [PATCH 328/923] Car flags: label static flags (#31639) * comment, consistent source * no caps not global * no field * label rest --- selfdrive/car/chrysler/values.py | 1 + selfdrive/car/mazda/values.py | 3 ++- selfdrive/car/subaru/values.py | 3 +++ selfdrive/car/volkswagen/values.py | 1 + 4 files changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 8fa7664b66..bb60139507 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -11,6 +11,7 @@ Ecu = car.CarParams.Ecu class ChryslerFlags(IntFlag): + # Detected flags HIGHER_MIN_STEERING_SPEED = 1 @dataclass diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 246038bba3..5597e9f52f 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -33,6 +33,7 @@ class MazdaCarInfo(CarInfo): class MazdaFlags(IntFlag): + # Static flags # Gen 1 hardware: same CAN messages and same camera GEN1 = 1 @@ -40,7 +41,7 @@ class MazdaFlags(IntFlag): @dataclass class MazdaPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('mazda_2017', None)) - flags: int = field(default=MazdaFlags.GEN1) + flags: int = MazdaFlags.GEN1 class CAR(Platforms): diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 7bf0f11bad..c2b2d16d7f 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -53,8 +53,11 @@ class CarControllerParams: class SubaruFlags(IntFlag): + # Detected flags SEND_INFOTAINMENT = 1 DISABLE_EYESIGHT = 2 + + # Static flags GLOBAL_GEN2 = 4 # Cars that temporarily fault when steering angle rate is greater than some threshold. diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 065a340928..f00fd971aa 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -110,6 +110,7 @@ class CANBUS: class VolkswagenFlags(IntFlag): + # Detected flags STOCK_HCA_PRESENT = 1 From 7014b5259628bf44a7b4fcf0eb5809d2bcdcf3b2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 18:56:11 -0500 Subject: [PATCH 329/923] Chrysler: fix radar not being enabled (#31655) fix radar --- selfdrive/car/chrysler/values.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index bb60139507..d6bfd4e0cb 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -22,7 +22,7 @@ class ChryslerCarInfo(CarInfo): @dataclass class ChryslerPlatformConfig(PlatformConfig): - dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('chrysler_pacifica_2017_hybrid_generated', None)) + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('chrysler_pacifica_2017_hybrid_generated', 'chrysler_pacifica_2017_hybrid_private_fusion')) @dataclass(frozen=True) From e341707b0f1b26bc235fb0a3d4a1703723c0e48b Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 20:04:54 -0500 Subject: [PATCH 330/923] HKG: move to platform config (#31649) * fuck me! * that kinda makes things pretty nice * move it down * and move this comment * Wip * more flags :/ * add the debug shit * add * lets not break this yet * MORE flags git add .git add .git add .git add .! * B * add mando * update ref * possibly better? * we can use flags here * formatting * formatting * move up * canfd subclass * this is more clear * spacing * static! --------- Co-authored-by: Shane Smiskol --- selfdrive/car/__init__.py | 2 +- selfdrive/car/hyundai/carcontroller.py | 6 +- selfdrive/car/hyundai/hyundaican.py | 28 +- selfdrive/car/hyundai/values.py | 770 +++++++++++++---------- selfdrive/test/process_replay/ref_commit | 2 +- 5 files changed, 473 insertions(+), 335 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index e46ce120e8..85b8a2bbe8 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -312,4 +312,4 @@ class Platforms(str, ReprEnum): platforms_with_flag[flag.name].append(platform) for flag, platforms in platforms_with_flag.items(): - print(f"{flag:20s}: {', '.join(p.name for p in platforms)}") + print(f"{flag:32s}: {', '.join(p.name for p in platforms)}") diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index b0851abf55..ee7f441227 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -135,7 +135,7 @@ class CarController(CarControllerBase): # button presses can_sends.extend(self.create_button_messages(CC, CS, use_clu11=False)) else: - can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.car_fingerprint, apply_steer, apply_steer_req, + can_sends.append(hyundaican.create_lkas11(self.packer, self.frame, self.CP, apply_steer, apply_steer_req, torque_fault, CS.lkas11, sys_warning, sys_state, CC.enabled, hud_control.leftLaneVisible, hud_control.rightLaneVisible, left_lane_warning, right_lane_warning)) @@ -175,12 +175,12 @@ class CarController(CarControllerBase): can_sends = [] if use_clu11: if CC.cruiseControl.cancel: - can_sends.append(hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.CANCEL, self.CP.carFingerprint)) + can_sends.append(hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.CANCEL, self.CP)) elif CC.cruiseControl.resume: # send resume at a max freq of 10Hz if (self.frame - self.last_button_frame) * DT_CTRL > 0.1: # send 25 messages at a time to increases the likelihood of resume being accepted - can_sends.extend([hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.RES_ACCEL, self.CP.carFingerprint)] * 25) + can_sends.extend([hyundaican.create_clu11(self.packer, self.frame, CS.clu11, Buttons.RES_ACCEL, self.CP)] * 25) if (self.frame - self.last_button_frame) * DT_CTRL >= 0.15: self.last_button_frame = self.frame else: diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index bc29aeb985..0bf29664e8 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -1,9 +1,9 @@ import crcmod -from openpilot.selfdrive.car.hyundai.values import CAR, CHECKSUM, CAMERA_SCC_CAR +from openpilot.selfdrive.car.hyundai.values import CAR, HyundaiFlags hyundai_checksum = crcmod.mkCrcFun(0x11D, initCrc=0xFD, rev=False, xorOut=0xdf) -def create_lkas11(packer, frame, car_fingerprint, apply_steer, steer_req, +def create_lkas11(packer, frame, CP, apply_steer, steer_req, torque_fault, lkas11, sys_warning, sys_state, enabled, left_lane, right_lane, left_lane_depart, right_lane_depart): @@ -33,12 +33,12 @@ def create_lkas11(packer, frame, car_fingerprint, 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 car_fingerprint 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.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): values["CF_Lkas_LdwsActivemode"] = int(left_lane) + (int(right_lane) << 1) values["CF_Lkas_LdwsOpt_USM"] = 2 @@ -57,7 +57,7 @@ def create_lkas11(packer, frame, car_fingerprint, apply_steer, steer_req, values["CF_Lkas_SysWarning"] = 4 if sys_warning else 0 # Likely cars lacking the ability to show individual lane lines in the dash - elif car_fingerprint in (CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL): + elif CP.carFingerprint in (CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL): # SysWarning 4 = keep hands on wheel + beep values["CF_Lkas_SysWarning"] = 4 if sys_warning else 0 @@ -72,18 +72,18 @@ def create_lkas11(packer, frame, car_fingerprint, apply_steer, steer_req, values["CF_Lkas_LdwsActivemode"] = 0 values["CF_Lkas_FcwOpt_USM"] = 0 - elif car_fingerprint == CAR.HYUNDAI_GENESIS: + elif CP.carFingerprint == CAR.HYUNDAI_GENESIS: # This field is actually LdwsActivemode # Genesis and Optima fault when forwarding while engaged values["CF_Lkas_LdwsActivemode"] = 2 dat = packer.make_can_msg("LKAS11", 0, values)[2] - if car_fingerprint in CHECKSUM["crc8"]: + if CP.flags & HyundaiFlags.CHECKSUM_CRC8: # CRC Checksum as seen on 2019 Hyundai Santa Fe dat = dat[:6] + dat[7:8] checksum = hyundai_checksum(dat) - elif car_fingerprint in CHECKSUM["6B"]: + elif CP.flags & HyundaiFlags.CHECKSUM_6B: # Checksum of first 6 Bytes, as seen on 2018 Kia Sorento checksum = sum(dat[:6]) % 256 else: @@ -95,7 +95,7 @@ def create_lkas11(packer, frame, car_fingerprint, apply_steer, steer_req, return packer.make_can_msg("LKAS11", 0, values) -def create_clu11(packer, frame, clu11, button, car_fingerprint): +def create_clu11(packer, frame, clu11, button, CP): values = {s: clu11[s] for s in [ "CF_Clu_CruiseSwState", "CF_Clu_CruiseSwMain", @@ -113,7 +113,7 @@ def create_clu11(packer, frame, clu11, button, car_fingerprint): values["CF_Clu_CruiseSwState"] = button values["CF_Clu_AliveCnt1"] = frame % 0x10 # send buttons to camera on camera-scc based cars - bus = 2 if car_fingerprint in CAMERA_SCC_CAR else 0 + bus = 2 if CP.flags & HyundaiFlags.CAMERA_SCC else 0 return packer.make_can_msg("CLU11", bus, values) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 76ff0b39ce..d23d3a0a75 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -1,11 +1,11 @@ import re -from dataclasses import dataclass -from enum import Enum, IntFlag, StrEnum +from dataclasses import dataclass, field +from enum import Enum, IntFlag from cereal import car from panda.python import uds from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car import dbc_dict +from openpilot.selfdrive.car import DbcDict, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -52,92 +52,46 @@ class CarControllerParams: class HyundaiFlags(IntFlag): + # Dynamic Flags CANFD_HDA2 = 1 CANFD_ALT_BUTTONS = 2 - CANFD_ALT_GEARS = 4 - CANFD_CAMERA_SCC = 8 + CANFD_ALT_GEARS = 2 ** 2 + CANFD_CAMERA_SCC = 2 ** 3 - ALT_LIMITS = 16 - ENABLE_BLINKERS = 32 - CANFD_ALT_GEARS_2 = 64 - SEND_LFA = 128 - USE_FCA = 256 - CANFD_HDA2_ALT_STEERING = 512 - HYBRID = 1024 - EV = 2048 + ALT_LIMITS = 2 ** 4 + ENABLE_BLINKERS = 2 ** 5 + CANFD_ALT_GEARS_2 = 2 ** 6 + SEND_LFA = 2 ** 7 + USE_FCA = 2 ** 8 + CANFD_HDA2_ALT_STEERING = 2 ** 9 + # these cars use a different gas signal + HYBRID = 2 ** 10 + EV = 2 ** 11 -class CAR(StrEnum): - # Hyundai - AZERA_6TH_GEN = "HYUNDAI AZERA 6TH GEN" - AZERA_HEV_6TH_GEN = "HYUNDAI AZERA HYBRID 6TH GEN" - ELANTRA = "HYUNDAI ELANTRA 2017" - ELANTRA_GT_I30 = "HYUNDAI I30 N LINE 2019 & GT 2018 DCT" - ELANTRA_2021 = "HYUNDAI ELANTRA 2021" - ELANTRA_HEV_2021 = "HYUNDAI ELANTRA HYBRID 2021" - HYUNDAI_GENESIS = "HYUNDAI GENESIS 2015-2016" - IONIQ = "HYUNDAI IONIQ HYBRID 2017-2019" - IONIQ_HEV_2022 = "HYUNDAI IONIQ HYBRID 2020-2022" - IONIQ_EV_LTD = "HYUNDAI IONIQ ELECTRIC LIMITED 2019" - IONIQ_EV_2020 = "HYUNDAI IONIQ ELECTRIC 2020" - IONIQ_PHEV_2019 = "HYUNDAI IONIQ PLUG-IN HYBRID 2019" - IONIQ_PHEV = "HYUNDAI IONIQ PHEV 2020" - KONA = "HYUNDAI KONA 2020" - KONA_EV = "HYUNDAI KONA ELECTRIC 2019" - KONA_EV_2022 = "HYUNDAI KONA ELECTRIC 2022" - KONA_EV_2ND_GEN = "HYUNDAI KONA ELECTRIC 2ND GEN" - KONA_HEV = "HYUNDAI KONA HYBRID 2020" - SANTA_FE = "HYUNDAI SANTA FE 2019" - SANTA_FE_2022 = "HYUNDAI SANTA FE 2022" - SANTA_FE_HEV_2022 = "HYUNDAI SANTA FE HYBRID 2022" - SANTA_FE_PHEV_2022 = "HYUNDAI SANTA FE PlUG-IN HYBRID 2022" - SONATA = "HYUNDAI SONATA 2020" - SONATA_LF = "HYUNDAI SONATA 2019" - STARIA_4TH_GEN = "HYUNDAI STARIA 4TH GEN" - TUCSON = "HYUNDAI TUCSON 2019" - PALISADE = "HYUNDAI PALISADE 2020" - VELOSTER = "HYUNDAI VELOSTER 2019" - SONATA_HYBRID = "HYUNDAI SONATA HYBRID 2021" - IONIQ_5 = "HYUNDAI IONIQ 5 2022" - IONIQ_6 = "HYUNDAI IONIQ 6 2023" - TUCSON_4TH_GEN = "HYUNDAI TUCSON 4TH GEN" - SANTA_CRUZ_1ST_GEN = "HYUNDAI SANTA CRUZ 1ST GEN" - CUSTIN_1ST_GEN = "HYUNDAI CUSTIN 1ST GEN" + # Static Flags - # Kia - KIA_FORTE = "KIA FORTE E 2018 & GT 2021" - KIA_K5_2021 = "KIA K5 2021" - KIA_K5_HEV_2020 = "KIA K5 HYBRID 2020" - KIA_K8_HEV_1ST_GEN = "KIA K8 HYBRID 1ST GEN" - KIA_NIRO_EV = "KIA NIRO EV 2020" - KIA_NIRO_EV_2ND_GEN = "KIA NIRO EV 2ND GEN" - KIA_NIRO_PHEV = "KIA NIRO HYBRID 2019" - KIA_NIRO_PHEV_2022 = "KIA NIRO PLUG-IN HYBRID 2022" - KIA_NIRO_HEV_2021 = "KIA NIRO HYBRID 2021" - KIA_NIRO_HEV_2ND_GEN = "KIA NIRO HYBRID 2ND GEN" - KIA_OPTIMA_G4 = "KIA OPTIMA 4TH GEN" - KIA_OPTIMA_G4_FL = "KIA OPTIMA 4TH GEN FACELIFT" - KIA_OPTIMA_H = "KIA OPTIMA HYBRID 2017 & SPORTS 2019" - KIA_OPTIMA_H_G4_FL = "KIA OPTIMA HYBRID 4TH GEN FACELIFT" - KIA_SELTOS = "KIA SELTOS 2021" - KIA_SPORTAGE_5TH_GEN = "KIA SPORTAGE 5TH GEN" - KIA_SORENTO = "KIA SORENTO GT LINE 2018" - KIA_SORENTO_4TH_GEN = "KIA SORENTO 4TH GEN" - KIA_SORENTO_HEV_4TH_GEN = "KIA SORENTO HYBRID 4TH GEN" - KIA_STINGER = "KIA STINGER GT2 2018" - KIA_STINGER_2022 = "KIA STINGER 2022" - KIA_CEED = "KIA CEED INTRO ED 2019" - KIA_EV6 = "KIA EV6 2022" - KIA_CARNIVAL_4TH_GEN = "KIA CARNIVAL 4TH GEN" + # If 0x500 is present on bus 1 it probably has a Mando radar outputting radar points. + # If no points are outputted by default it might be possible to turn it on using selfdrive/debug/hyundai_enable_radar_points.py + MANDO_RADAR = 2 ** 12 + CANFD = 2 ** 13 - # Genesis - GENESIS_GV60_EV_1ST_GEN = "GENESIS GV60 ELECTRIC 1ST GEN" - GENESIS_G70 = "GENESIS G70 2018" - GENESIS_G70_2020 = "GENESIS G70 2020" - GENESIS_GV70_1ST_GEN = "GENESIS GV70 1ST GEN" - GENESIS_G80 = "GENESIS G80 2017" - GENESIS_G90 = "GENESIS G90 2017" - GENESIS_GV80 = "GENESIS GV80 2023" + # The radar does SCC on these cars when HDA I, rather than the camera + RADAR_SCC = 2 ** 14 + CAMERA_SCC = 2 ** 15 + CHECKSUM_CRC8 = 2 ** 16 + CHECKSUM_6B = 2 ** 17 + + # these cars require a special panda safety mode due to missing counters and checksums in the messages + LEGACY = 2 ** 18 + + # these cars have not been verified to work with longitudinal yet - radar disable, sending correct messages, etc. + UNSUPPORTED_LONGITUDINAL = 2 ** 19 + + CANFD_NO_RADAR_DISABLE = 2 ** 20 + + CLUSTER_GEARS = 2 ** 21 + TCU_GEARS = 2 ** 22 class Footnote(Enum): @@ -152,160 +106,425 @@ class HyundaiCarInfo(CarInfo): package: str = "Smart Cruise Control (SCC)" def init_make(self, CP: car.CarParams): - if CP.carFingerprint in CANFD_CAR: + if CP.flags & HyundaiFlags.CANFD: self.footnotes.insert(0, Footnote.CANFD) -CAR_INFO: dict[str, HyundaiCarInfo | list[HyundaiCarInfo] | None] = { - CAR.AZERA_6TH_GEN: HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), - CAR.AZERA_HEV_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])), - ], - CAR.ELANTRA: [ - # 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])), - ], - CAR.ELANTRA_GT_I30: [ - 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])), - ], - CAR.ELANTRA_2021: HyundaiCarInfo("Hyundai Elantra 2021-23", video_link="https://youtu.be/_EdYQtV52-c", car_parts=CarParts.common([CarHarness.hyundai_k])), - CAR.ELANTRA_HEV_2021: HyundaiCarInfo("Hyundai Elantra Hybrid 2021-23", video_link="https://youtu.be/_EdYQtV52-c", +@dataclass +class HyundaiPlatformConfig(PlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict("hyundai_kia_generic", None)) + + def init(self): + if self.flags & HyundaiFlags.MANDO_RADAR: + self.dbc_dict = dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated') + + +@dataclass +class HyundaiCanFDPlatformConfig(HyundaiPlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict("hyundai_canfd", None)) + + def init(self): + super().init() + self.flags |= HyundaiFlags.CANFD + + +class CAR(Platforms): + # Hyundai + AZERA_6TH_GEN = HyundaiPlatformConfig( + "HYUNDAI AZERA 6TH GEN", + HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + ) + 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])), + ], + flags=HyundaiFlags.HYBRID + ) + ELANTRA = HyundaiPlatformConfig( + "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])), + ], + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS + ) + 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])), + ], + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS + ) + 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])), + 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])), - CAR.HYUNDAI_GENESIS: [ - # 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])), - ], - CAR.IONIQ: HyundaiCarInfo("Hyundai Ioniq Hybrid 2017-19", car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.IONIQ_HEV_2022: HyundaiCarInfo("Hyundai Ioniq Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_h])), # TODO: confirm 2020-21 harness - CAR.IONIQ_EV_LTD: HyundaiCarInfo("Hyundai Ioniq Electric 2019", car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.IONIQ_EV_2020: HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), - CAR.IONIQ_PHEV_2019: HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.IONIQ_PHEV: HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), - CAR.KONA: HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b])), - CAR.KONA_EV: HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g])), - CAR.KONA_EV_2022: HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o])), - CAR.KONA_HEV: HyundaiCarInfo("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i])), # TODO: check packages - # TODO: this is the 2024 US MY, not yet released - CAR.KONA_EV_2ND_GEN: HyundaiCarInfo("Hyundai Kona Electric (with HDA II, Korea only) 2023", video_link="https://www.youtube.com/watch?v=U2fOCmcQ8hw", + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID + ) + HYUNDAI_GENESIS = HyundaiPlatformConfig( + "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])), + ], + 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])), + flags=HyundaiFlags.HYBRID + ) + 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, + 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])), + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY + ) + IONIQ_EV_2020 = HyundaiPlatformConfig( + "HYUNDAI IONIQ ELECTRIC 2020", + HyundaiCarInfo("Hyundai Ioniq Electric 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + 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])), + flags=HyundaiFlags.HYBRID + ) + IONIQ_PHEV = HyundaiPlatformConfig( + "HYUNDAI IONIQ PHEV 2020", + HyundaiCarInfo("Hyundai Ioniq Plug-in Hybrid 2020-22", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + flags=HyundaiFlags.HYBRID + ) + KONA = HyundaiPlatformConfig( + "HYUNDAI KONA 2020", + HyundaiCarInfo("Hyundai Kona 2020", car_parts=CarParts.common([CarHarness.hyundai_b])), + flags=HyundaiFlags.CLUSTER_GEARS + ) + KONA_EV = HyundaiPlatformConfig( + "HYUNDAI KONA ELECTRIC 2019", + HyundaiCarInfo("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g])), + flags=HyundaiFlags.EV + ) + KONA_EV_2022 = HyundaiPlatformConfig( + "HYUNDAI KONA ELECTRIC 2022", + HyundaiCarInfo("Hyundai Kona Electric 2022-23", car_parts=CarParts.common([CarHarness.hyundai_o])), + 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])), - CAR.SANTA_FE: HyundaiCarInfo("Hyundai Santa Fe 2019-20", "All", video_link="https://youtu.be/bjDR0YjM__s", + 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, + 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])), - CAR.SANTA_FE_2022: HyundaiCarInfo("Hyundai Santa Fe 2021-23", "All", video_link="https://youtu.be/VnHzSTygTS4", + 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])), - CAR.SANTA_FE_HEV_2022: HyundaiCarInfo("Hyundai Santa Fe Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), - CAR.SANTA_FE_PHEV_2022: HyundaiCarInfo("Hyundai Santa Fe Plug-in Hybrid 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_l])), - CAR.SONATA: HyundaiCarInfo("Hyundai Sonata 2020-23", "All", video_link="https://www.youtube.com/watch?v=ix63r9kE3Fw", + 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])), + 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])), + 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])), - CAR.STARIA_4TH_GEN: HyundaiCarInfo("Hyundai Staria 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), - CAR.SONATA_LF: HyundaiCarInfo("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e])), - CAR.TUCSON: [ - 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])), - ], - CAR.PALISADE: [ - 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])), - ], - CAR.VELOSTER: HyundaiCarInfo("Hyundai Veloster 2019-20", min_enable_speed=5. * CV.MPH_TO_MS, car_parts=CarParts.common([CarHarness.hyundai_e])), - CAR.SONATA_HYBRID: HyundaiCarInfo("Hyundai Sonata Hybrid 2020-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.IONIQ_5: [ - 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])), - ], - CAR.IONIQ_6: [ + 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])), + 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])), + ) + 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])), + ], + flags=HyundaiFlags.TCU_GEARS + ) + 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])), + ], + 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])), + 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])), + 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])), + ], + 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])), - ], - CAR.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])), - ], - CAR.SANTA_CRUZ_1ST_GEN: HyundaiCarInfo("Hyundai Santa Cruz 2022-23", car_parts=CarParts.common([CarHarness.hyundai_n])), - CAR.CUSTIN_1ST_GEN: HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + 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])), + ], + ) + SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig( + "HYUNDAI SANTA CRUZ 1ST GEN", + HyundaiCarInfo("Hyundai Santa Cruz 2022-23", car_parts=CarParts.common([CarHarness.hyundai_n])), + ) + CUSTIN_1ST_GEN = HyundaiPlatformConfig( + "HYUNDAI CUSTIN 1ST GEN", + HyundaiCarInfo("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + flags=HyundaiFlags.CHECKSUM_CRC8 + ) # Kia - CAR.KIA_FORTE: [ + 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])), - ], - CAR.KIA_K5_2021: HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.KIA_K5_HEV_2020: HyundaiCarInfo("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.KIA_K8_HEV_1ST_GEN: HyundaiCarInfo("Kia K8 Hybrid (with HDA II) 2023", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), - CAR.KIA_NIRO_EV: [ - 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])), - ], - CAR.KIA_NIRO_EV_2ND_GEN: HyundaiCarInfo("Kia Niro EV 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.KIA_NIRO_PHEV: [ - 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])), - ], - CAR.KIA_NIRO_PHEV_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])), - ], - CAR.KIA_NIRO_HEV_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])), - ], - CAR.KIA_NIRO_HEV_2ND_GEN: HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.KIA_OPTIMA_G4: HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", + ] + ) + KIA_K5_2021 = HyundaiPlatformConfig( + "KIA K5 2021", + HyundaiCarInfo("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a])), + 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])), + 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])), + ) + 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])), + ], + 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])), + flags=HyundaiFlags.EV + ) + KIA_NIRO_PHEV = HyundaiPlatformConfig( + "KIA NIRO HYBRID 2019", + [ + 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])), + ], + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL + ) + 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])), + ], + flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR + ) + 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])), + ], + 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])), + ) + 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 - CAR.KIA_OPTIMA_G4_FL: HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g])), + flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS + ) + KIA_OPTIMA_G4_FL = HyundaiPlatformConfig( + "KIA OPTIMA 4TH GEN FACELIFT", + HyundaiCarInfo("Kia Optima 2019-20", car_parts=CarParts.common([CarHarness.hyundai_g])), + flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS + ) # TODO: may support adjacent years. may have a non-zero minimum steering speed - CAR.KIA_OPTIMA_H: HyundaiCarInfo("Kia Optima Hybrid 2017", "Advanced Smart Cruise Control", car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.KIA_OPTIMA_H_G4_FL: HyundaiCarInfo("Kia Optima Hybrid 2019", car_parts=CarParts.common([CarHarness.hyundai_h])), - CAR.KIA_SELTOS: HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a])), - CAR.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])), - ], - CAR.KIA_SORENTO: [ - HyundaiCarInfo("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", + 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])), + 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])), + flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL + ) + KIA_SELTOS = HyundaiPlatformConfig( + "KIA SELTOS 2021", + HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a])), + 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])), + ], + ) + 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", 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])), - ], - CAR.KIA_SORENTO_4TH_GEN: HyundaiCarInfo("Kia Sorento 2021-23", car_parts=CarParts.common([CarHarness.hyundai_k])), - CAR.KIA_SORENTO_HEV_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])), - ], - CAR.KIA_STINGER: HyundaiCarInfo("Kia Stinger 2018-20", video_link="https://www.youtube.com/watch?v=MJ94qoofYw0", - car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.KIA_STINGER_2022: HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), - CAR.KIA_CEED: HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e])), - CAR.KIA_EV6: [ - 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])) - ], - CAR.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])) - ], + HyundaiCarInfo("Kia Sorento 2019", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", car_parts=CarParts.common([CarHarness.hyundai_e])), + ], + 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])), + 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])), + ], + 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", + car_parts=CarParts.common([CarHarness.hyundai_c])) + ) + KIA_STINGER_2022 = HyundaiPlatformConfig( + "KIA STINGER 2022", + HyundaiCarInfo("Kia Stinger 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + ) + KIA_CEED = HyundaiPlatformConfig( + "KIA CEED INTRO ED 2019", + HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e])), + 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])) + ], + flags=HyundaiFlags.EV + ) + 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])) + ], + flags=HyundaiFlags.RADAR_SCC + ) # Genesis - CAR.GENESIS_GV60_EV_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])), - ], - CAR.GENESIS_G70: HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), - CAR.GENESIS_G70_2020: HyundaiCarInfo("Genesis G70 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), - CAR.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])), - ], - CAR.GENESIS_G80: HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), - CAR.GENESIS_G90: HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), - CAR.GENESIS_GV80: HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), -} + 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])), + ], + flags=HyundaiFlags.EV + ) + GENESIS_G70 = HyundaiPlatformConfig( + "GENESIS G70 2018", + HyundaiCarInfo("Genesis G70 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + flags=HyundaiFlags.LEGACY + ) + GENESIS_G70_2020 = HyundaiPlatformConfig( + "GENESIS G70 2020", + HyundaiCarInfo("Genesis G70 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + 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])), + ], + flags=HyundaiFlags.RADAR_SCC + ) + GENESIS_G80 = HyundaiPlatformConfig( + "GENESIS G80 2017", + HyundaiCarInfo("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h])), + flags=HyundaiFlags.LEGACY + ) + GENESIS_G90 = HyundaiPlatformConfig( + "GENESIS G90 2017", + HyundaiCarInfo("Genesis G90 2017-18", "All", car_parts=CarParts.common([CarHarness.hyundai_c])), + ) + GENESIS_GV80 = HyundaiCanFDPlatformConfig( + "GENESIS GV80 2023", + HyundaiCarInfo("Genesis GV80 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_m])), + flags=HyundaiFlags.RADAR_SCC + ) + class Buttons: NONE = 0 @@ -518,118 +737,37 @@ FW_QUERY_CONFIG = FwQueryConfig( match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, ) - CHECKSUM = { - "crc8": [CAR.SANTA_FE, CAR.SONATA, CAR.PALISADE, CAR.KIA_SELTOS, CAR.ELANTRA_2021, CAR.ELANTRA_HEV_2021, - CAR.SONATA_HYBRID, CAR.SANTA_FE_2022, CAR.KIA_K5_2021, CAR.SANTA_FE_HEV_2022, CAR.SANTA_FE_PHEV_2022, - CAR.KIA_K5_HEV_2020, CAR.CUSTIN_1ST_GEN], - "6B": [CAR.KIA_SORENTO, CAR.HYUNDAI_GENESIS], + "crc8": CAR.with_flags(HyundaiFlags.CHECKSUM_CRC8), + "6B": CAR.with_flags(HyundaiFlags.CHECKSUM_6B), } CAN_GEARS = { # which message has the gear. hybrid and EV use ELECT_GEAR - "use_cluster_gears": {CAR.ELANTRA, CAR.ELANTRA_GT_I30, CAR.KONA}, - "use_tcu_gears": {CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.SONATA_LF, CAR.VELOSTER, CAR.TUCSON}, + "use_cluster_gears": CAR.with_flags(HyundaiFlags.CLUSTER_GEARS), + "use_tcu_gears": CAR.with_flags(HyundaiFlags.TCU_GEARS), } -CANFD_CAR = {CAR.KIA_EV6, CAR.IONIQ_5, CAR.IONIQ_6, CAR.TUCSON_4TH_GEN, CAR.SANTA_CRUZ_1ST_GEN, CAR.KIA_SPORTAGE_5TH_GEN, CAR.GENESIS_GV70_1ST_GEN, - CAR.GENESIS_GV60_EV_1ST_GEN, CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_NIRO_HEV_2ND_GEN, CAR.KIA_NIRO_EV_2ND_GEN, - CAR.GENESIS_GV80, CAR.KIA_CARNIVAL_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.KONA_EV_2ND_GEN, CAR.KIA_K8_HEV_1ST_GEN, - CAR.STARIA_4TH_GEN} - -# The radar does SCC on these cars when HDA I, rather than the camera -CANFD_RADAR_SCC_CAR = {CAR.GENESIS_GV70_1ST_GEN, CAR.KIA_SORENTO_4TH_GEN, CAR.GENESIS_GV80, CAR.KIA_CARNIVAL_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN} +CANFD_CAR = CAR.with_flags(HyundaiFlags.CANFD) +CANFD_RADAR_SCC_CAR = CAR.with_flags(HyundaiFlags.RADAR_SCC) # These CAN FD cars do not accept communication control to disable the ADAS ECU, # responds with 0x7F2822 - 'conditions not correct' -CANFD_UNSUPPORTED_LONGITUDINAL_CAR = {CAR.IONIQ_6, CAR.KONA_EV_2ND_GEN} +CANFD_UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.CANFD_NO_RADAR_DISABLE) # The camera does SCC on these cars, rather than the radar -CAMERA_SCC_CAR = {CAR.KONA_EV_2022, } +CAMERA_SCC_CAR = CAR.with_flags(HyundaiFlags.CAMERA_SCC) -# these cars use a different gas signal -HYBRID_CAR = {CAR.IONIQ_PHEV, CAR.ELANTRA_HEV_2021, CAR.KIA_NIRO_PHEV, CAR.KIA_NIRO_HEV_2021, CAR.SONATA_HYBRID, CAR.KONA_HEV, CAR.IONIQ, - CAR.IONIQ_HEV_2022, CAR.SANTA_FE_HEV_2022, CAR.SANTA_FE_PHEV_2022, CAR.IONIQ_PHEV_2019, CAR.KIA_K5_HEV_2020, - CAR.KIA_OPTIMA_H, CAR.KIA_OPTIMA_H_G4_FL, CAR.AZERA_HEV_6TH_GEN, CAR.KIA_NIRO_PHEV_2022} +HYBRID_CAR = CAR.with_flags(HyundaiFlags.HYBRID) -EV_CAR = {CAR.IONIQ_EV_2020, CAR.IONIQ_EV_LTD, CAR.KONA_EV, CAR.KIA_NIRO_EV, CAR.KIA_NIRO_EV_2ND_GEN, CAR.KONA_EV_2022, - CAR.KIA_EV6, CAR.IONIQ_5, CAR.IONIQ_6, CAR.GENESIS_GV60_EV_1ST_GEN, CAR.KONA_EV_2ND_GEN} +EV_CAR = CAR.with_flags(HyundaiFlags.EV) -# these cars require a special panda safety mode due to missing counters and checksums in the messages -LEGACY_SAFETY_MODE_CAR = {CAR.HYUNDAI_GENESIS, CAR.IONIQ_EV_LTD, CAR.KIA_OPTIMA_G4, - CAR.VELOSTER, CAR.GENESIS_G70, CAR.GENESIS_G80, CAR.KIA_CEED, CAR.ELANTRA, CAR.IONIQ_HEV_2022, - CAR.KIA_OPTIMA_H, CAR.ELANTRA_GT_I30} +LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY) -# these cars have not been verified to work with longitudinal yet - radar disable, sending correct messages, etc. -UNSUPPORTED_LONGITUDINAL_CAR = LEGACY_SAFETY_MODE_CAR | {CAR.KIA_NIRO_PHEV, CAR.KIA_SORENTO, CAR.SONATA_LF, CAR.KIA_OPTIMA_G4_FL, - CAR.KIA_OPTIMA_H_G4_FL} +UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL) -# If 0x500 is present on bus 1 it probably has a Mando radar outputting radar points. -# If no points are outputted by default it might be possible to turn it on using selfdrive/debug/hyundai_enable_radar_points.py -DBC = { - CAR.AZERA_6TH_GEN: dbc_dict('hyundai_kia_generic', None), - CAR.AZERA_HEV_6TH_GEN: dbc_dict('hyundai_kia_generic', None), - CAR.ELANTRA: dbc_dict('hyundai_kia_generic', None), - CAR.ELANTRA_GT_I30: dbc_dict('hyundai_kia_generic', None), - CAR.ELANTRA_2021: dbc_dict('hyundai_kia_generic', None), - CAR.ELANTRA_HEV_2021: dbc_dict('hyundai_kia_generic', None), - CAR.GENESIS_G70: dbc_dict('hyundai_kia_generic', None), - CAR.GENESIS_G70_2020: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.GENESIS_G80: dbc_dict('hyundai_kia_generic', None), - CAR.GENESIS_G90: dbc_dict('hyundai_kia_generic', None), - CAR.HYUNDAI_GENESIS: dbc_dict('hyundai_kia_generic', None), - CAR.IONIQ_PHEV_2019: dbc_dict('hyundai_kia_generic', None), - CAR.IONIQ_PHEV: dbc_dict('hyundai_kia_generic', None), - CAR.IONIQ_EV_2020: dbc_dict('hyundai_kia_generic', None), - CAR.IONIQ_EV_LTD: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.IONIQ: dbc_dict('hyundai_kia_generic', None), - CAR.IONIQ_HEV_2022: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_FORTE: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_K5_2021: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_K5_HEV_2020: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.KIA_NIRO_EV: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.KIA_NIRO_PHEV: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.KIA_NIRO_HEV_2021: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_OPTIMA_G4: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_OPTIMA_G4_FL: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_OPTIMA_H: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_OPTIMA_H_G4_FL: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_SELTOS: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_SORENTO: dbc_dict('hyundai_kia_generic', None), # Has 0x5XX messages, but different format - CAR.KIA_STINGER: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_STINGER_2022: dbc_dict('hyundai_kia_generic', None), - CAR.KONA: dbc_dict('hyundai_kia_generic', None), - CAR.KONA_EV: dbc_dict('hyundai_kia_generic', None), - CAR.KONA_EV_2022: dbc_dict('hyundai_kia_generic', None), - CAR.KONA_HEV: dbc_dict('hyundai_kia_generic', None), - CAR.SANTA_FE: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.SANTA_FE_2022: dbc_dict('hyundai_kia_generic', None), - CAR.SANTA_FE_HEV_2022: dbc_dict('hyundai_kia_generic', None), - CAR.SANTA_FE_PHEV_2022: dbc_dict('hyundai_kia_generic', None), - CAR.SONATA: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.SONATA_LF: dbc_dict('hyundai_kia_generic', None), # Has 0x5XX messages, but different format - CAR.TUCSON: dbc_dict('hyundai_kia_generic', None), - CAR.PALISADE: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.VELOSTER: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_CEED: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_EV6: dbc_dict('hyundai_canfd', None), - CAR.SONATA_HYBRID: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.TUCSON_4TH_GEN: dbc_dict('hyundai_canfd', None), - CAR.IONIQ_5: dbc_dict('hyundai_canfd', None), - CAR.IONIQ_6: dbc_dict('hyundai_canfd', None), - CAR.SANTA_CRUZ_1ST_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_SPORTAGE_5TH_GEN: dbc_dict('hyundai_canfd', None), - CAR.GENESIS_GV70_1ST_GEN: dbc_dict('hyundai_canfd', None), - CAR.GENESIS_GV60_EV_1ST_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_SORENTO_4TH_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_NIRO_HEV_2ND_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_NIRO_EV_2ND_GEN: dbc_dict('hyundai_canfd', None), - CAR.GENESIS_GV80: dbc_dict('hyundai_canfd', None), - CAR.KIA_CARNIVAL_4TH_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_SORENTO_HEV_4TH_GEN: dbc_dict('hyundai_canfd', None), - CAR.KONA_EV_2ND_GEN: dbc_dict('hyundai_canfd', None), - CAR.KIA_K8_HEV_1ST_GEN: dbc_dict('hyundai_canfd', None), - CAR.CUSTIN_1ST_GEN: dbc_dict('hyundai_kia_generic', None), - CAR.KIA_NIRO_PHEV_2022: dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated'), - CAR.STARIA_4TH_GEN: dbc_dict('hyundai_canfd', None), -} +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() + +if __name__ == "__main__": + CAR.print_debug(HyundaiFlags) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 94674f05de..015f941261 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -5aa0f4c0ab2cebccc3596aa8ef529fdb94a43643 +de322b3898f8fedb57036b6cf4a0605968138929 From a6a6f7bb50ecbca61dfa44ca23f0cab201439342 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 22:14:31 -0500 Subject: [PATCH 331/923] Honda: move carspecs to platformconfig (#31657) * first pass * fix --- selfdrive/car/honda/interface.py | 69 -------------------------------- selfdrive/car/honda/values.py | 24 ++++++++++- 2 files changed, 23 insertions(+), 70 deletions(-) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index a4cf647c0f..71008e5001 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -92,10 +92,6 @@ class CarInterface(CarInterfaceBase): eps_modified = True if candidate == CAR.CIVIC: - ret.mass = 1326. - ret.wheelbase = 2.70 - ret.centerToFront = ret.wheelbase * 0.4 - ret.steerRatio = 15.38 # 10.93 is end-to-end spec 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 @@ -110,18 +106,10 @@ class CarInterface(CarInterfaceBase): 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): - ret.mass = 1326. - ret.wheelbase = 2.70 - ret.centerToFront = ret.wheelbase * 0.4 - ret.steerRatio = 15.38 # 10.93 is end-to-end spec 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: - ret.mass = 3279. * CV.LB_TO_KG - ret.wheelbase = 2.83 - ret.centerToFront = ret.wheelbase * 0.39 - ret.steerRatio = 16.33 # 11.82 is spec end-to-end ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.8467 @@ -131,29 +119,17 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] elif candidate == CAR.ACURA_ILX: - ret.mass = 3095. * CV.LB_TO_KG - ret.wheelbase = 2.67 - ret.centerToFront = ret.wheelbase * 0.37 - ret.steerRatio = 18.61 # 15.3 is spec end-to-end ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.72 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] elif candidate in (CAR.CRV, CAR.CRV_EU): - ret.mass = 3572. * CV.LB_TO_KG - ret.wheelbase = 2.62 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 16.89 # as spec ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 1000], [0, 1000]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] ret.wheelSpeedFactor = 1.025 elif candidate == CAR.CRV_5G: - ret.mass = 3410. * CV.LB_TO_KG - ret.wheelbase = 2.66 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 16.0 # 12.3 is spec end-to-end 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 @@ -167,39 +143,22 @@ class CarInterface(CarInterfaceBase): ret.wheelSpeedFactor = 1.025 elif candidate == CAR.CRV_HYBRID: - ret.mass = 1667. # mean of 4 models in kg - ret.wheelbase = 2.66 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 16.0 # 12.3 is spec end-to-end ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.677 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] ret.wheelSpeedFactor = 1.025 elif candidate == CAR.FIT: - ret.mass = 2644. * CV.LB_TO_KG - ret.wheelbase = 2.53 - ret.centerToFront = ret.wheelbase * 0.39 - ret.steerRatio = 13.06 ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.75 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] elif candidate == CAR.FREED: - ret.mass = 3086. * CV.LB_TO_KG - ret.wheelbase = 2.74 - # the remaining parameters were copied from FIT - ret.centerToFront = ret.wheelbase * 0.39 - ret.steerRatio = 13.06 ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] ret.tireStiffnessFactor = 0.75 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] elif candidate in (CAR.HRV, CAR.HRV_3G): - ret.mass = 3125 * CV.LB_TO_KG - ret.wheelbase = 2.61 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 15.2 ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] ret.tireStiffnessFactor = 0.5 if candidate == CAR.HRV: @@ -209,28 +168,16 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] # TODO: can probably use some tuning elif candidate == CAR.ACURA_RDX: - ret.mass = 3935. * CV.LB_TO_KG - ret.wheelbase = 2.68 - ret.centerToFront = ret.wheelbase * 0.38 - ret.steerRatio = 15.0 # as spec ret.tireStiffnessFactor = 0.444 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]] elif candidate == CAR.ACURA_RDX_3G: - ret.mass = 4068. * CV.LB_TO_KG - ret.wheelbase = 2.75 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 11.95 # as spec ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] ret.tireStiffnessFactor = 0.677 elif candidate in (CAR.ODYSSEY, CAR.ODYSSEY_CHN): - ret.mass = 1900. - ret.wheelbase = 3.00 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 14.35 # as spec ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] if candidate == CAR.ODYSSEY_CHN: @@ -239,37 +186,21 @@ class CarInterface(CarInterfaceBase): 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: - ret.mass = 4278. * CV.LB_TO_KG # average weight - ret.wheelbase = 2.86 - ret.centerToFront = ret.wheelbase * 0.428 - ret.steerRatio = 16.0 # as spec ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] elif candidate == CAR.RIDGELINE: - ret.mass = 4515. * CV.LB_TO_KG - ret.wheelbase = 3.18 - ret.centerToFront = ret.wheelbase * 0.41 - ret.steerRatio = 15.59 # as spec ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] elif candidate == CAR.INSIGHT: - ret.mass = 2987. * CV.LB_TO_KG - ret.wheelbase = 2.7 - ret.centerToFront = ret.wheelbase * 0.39 - ret.steerRatio = 15.0 # 12.58 is spec end-to-end ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] elif candidate == CAR.HONDA_E: - ret.mass = 3338.8 * CV.LB_TO_KG - ret.wheelbase = 2.5 - ret.centerToFront = ret.wheelbase * 0.5 - ret.steerRatio = 16.71 ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 2b11086405..abe710528c 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -4,7 +4,7 @@ from enum import Enum, IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV from panda.python import uds -from openpilot.selfdrive.car import PlatformConfig, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -117,6 +117,7 @@ class CAR(Platforms): HondaCarInfo("Honda Accord Hybrid 2018-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), ], dbc_dict('honda_accord_2018_can_generated', None), + specs=CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39), # steerRatio: 11.82 is spec end-to-end flags=HondaFlags.BOSCH, ) CIVIC_BOSCH = HondaPlatformConfig( @@ -127,12 +128,14 @@ class CAR(Platforms): HondaCarInfo("Honda Civic Hatchback 2017-21", min_steer_speed=12. * CV.MPH_TO_MS), ], dbc_dict('honda_civic_hatchback_ex_2017_can_generated', None), + specs=CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec flags=HondaFlags.BOSCH ) CIVIC_BOSCH_DIESEL = HondaPlatformConfig( "HONDA CIVIC SEDAN 1.6 DIESEL 2019", None, # don't show in docs dbc_dict('honda_accord_2018_can_generated', None), + specs=CIVIC_BOSCH.specs, flags=HondaFlags.BOSCH ) CIVIC_2022 = HondaPlatformConfig( @@ -142,42 +145,49 @@ class CAR(Platforms): HondaCarInfo("Honda Civic Hatchback 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), ], dbc_dict('honda_civic_ex_2022_can_generated', None), + specs=CIVIC_BOSCH.specs, flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS, ) CRV_5G = HondaPlatformConfig( "HONDA CR-V 2017", HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), + specs=CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end flags=HondaFlags.BOSCH, ) CRV_HYBRID = HondaPlatformConfig( "HONDA CR-V HYBRID 2019", HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_accord_2018_can_generated', None), + specs=CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41), # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end flags=HondaFlags.BOSCH ) HRV_3G = HondaPlatformConfig( "HONDA HR-V 2023", HondaCarInfo("Honda HR-V 2023", "All"), dbc_dict('honda_civic_ex_2022_can_generated', None), + specs=CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS ) ACURA_RDX_3G = HondaPlatformConfig( "ACURA RDX 2020", HondaCarInfo("Acura RDX 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), dbc_dict('acura_rdx_2020_can_generated', None), + specs=CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41), # as spec flags=HondaFlags.BOSCH ) INSIGHT = HondaPlatformConfig( "HONDA INSIGHT 2019", HondaCarInfo("Honda Insight 2019-22", "All", min_steer_speed=3. * CV.MPH_TO_MS), dbc_dict('honda_insight_ex_2019_can_generated', None), + specs=CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39), # as spec flags=HondaFlags.BOSCH ) HONDA_E = HondaPlatformConfig( "HONDA E 2020", HondaCarInfo("Honda e 2020", "All", min_steer_speed=3. * CV.MPH_TO_MS), dbc_dict('acura_rdx_2020_can_generated', None), + specs=CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71), flags=HondaFlags.BOSCH ) @@ -186,54 +196,63 @@ class CAR(Platforms): "ACURA ILX 2016", HondaCarInfo("Acura ILX 2016-19", "AcuraWatch Plus", min_steer_speed=25. * CV.MPH_TO_MS), dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37), # 15.3 is spec end-to-end flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV = HondaPlatformConfig( "HONDA CR-V 2016", HondaCarInfo("Honda CR-V 2015-16", "Touring Trim", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV_EU = HondaPlatformConfig( "HONDA CR-V EU 2016", None, # Euro version of CRV Touring, don't show in docs dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CRV.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FIT = HondaPlatformConfig( "HONDA FIT 2018", HondaCarInfo("Honda Fit 2018-20", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39), flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FREED = HondaPlatformConfig( "HONDA FREED 2020", HondaCarInfo("Honda Freed 2020", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39), # mostly copied from FIT flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) HRV = HondaPlatformConfig( "HONDA HRV 2019", HondaCarInfo("Honda HR-V 2019-22", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), + specs=HRV_3G.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ODYSSEY = HondaPlatformConfig( "HONDA ODYSSEY 2018", HondaCarInfo("Honda Odyssey 2018-20"), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41), flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_PCM_ACCEL ) ODYSSEY_CHN = HondaPlatformConfig( "HONDA ODYSSEY CHN 2019", None, # Chinese version of Odyssey, don't show in docs dbc_dict('honda_odyssey_extreme_edition_2018_china_can_generated', 'acura_ilx_2016_nidec'), + specs=ODYSSEY.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES ) ACURA_RDX = HondaPlatformConfig( "ACURA RDX 2018", HondaCarInfo("Acura RDX 2016-18", "AcuraWatch Plus", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) PILOT = HondaPlatformConfig( @@ -243,18 +262,21 @@ class CAR(Platforms): HondaCarInfo("Honda Passport 2019-23", "All", min_steer_speed=12. * CV.MPH_TO_MS), ], dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) RIDGELINE = HondaPlatformConfig( "HONDA RIDGELINE 2017", HondaCarInfo("Honda Ridgeline 2017-24", min_steer_speed=12. * CV.MPH_TO_MS), dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CIVIC = HondaPlatformConfig( "HONDA CIVIC 2016", HondaCarInfo("Honda Civic 2016-18", min_steer_speed=12. * CV.MPH_TO_MS, video_link="https://youtu.be/-IkImTe1NYE"), dbc_dict('honda_civic_touring_2016_can_generated', 'acura_ilx_2016_nidec'), + specs=CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec flags=HondaFlags.NIDEC | HondaFlags.AUTORESUME_SNG | HondaFlags.ELECTRIC_PARKING_BRAKE, ) From 2d2ba37b46e355c9784f0450f19470c125232bb6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 29 Feb 2024 19:39:28 -0800 Subject: [PATCH 332/923] build tools on-device (#31658) --- SConstruct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index dac3529892..c08fe48f66 100644 --- a/SConstruct +++ b/SConstruct @@ -386,7 +386,7 @@ SConscript(['third_party/SConscript']) SConscript(['selfdrive/SConscript']) -if arch in ['x86_64', 'aarch64', 'Darwin'] and Dir('#tools/cabana/').exists() and GetOption('extras'): +if Dir('#tools/cabana/').exists() and GetOption('extras'): SConscript(['tools/replay/SConscript']) SConscript(['tools/cabana/SConscript']) From e576da1457f2e978f1dbd594b857bff034a359d7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 29 Feb 2024 22:51:20 -0500 Subject: [PATCH 333/923] VW: use flags for PQ (#31659) pq use flags --- selfdrive/car/volkswagen/carcontroller.py | 4 ++-- selfdrive/car/volkswagen/carstate.py | 8 ++++---- selfdrive/car/volkswagen/interface.py | 8 ++++---- selfdrive/car/volkswagen/values.py | 10 +++++++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index f99e87d5d3..1b1858703d 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -6,7 +6,7 @@ from openpilot.common.realtime import DT_CTRL from openpilot.selfdrive.car import apply_driver_steer_torque_limits from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.car.volkswagen import mqbcan, pqcan -from openpilot.selfdrive.car.volkswagen.values import CANBUS, PQ_CARS, CarControllerParams, VolkswagenFlags +from openpilot.selfdrive.car.volkswagen.values import CANBUS, CarControllerParams, VolkswagenFlags VisualAlert = car.CarControl.HUDControl.VisualAlert LongCtrlState = car.CarControl.Actuators.LongControlState @@ -16,7 +16,7 @@ class CarController(CarControllerBase): def __init__(self, dbc_name, CP, VM): self.CP = CP self.CCP = CarControllerParams(CP) - self.CCS = pqcan if CP.carFingerprint in PQ_CARS else mqbcan + self.CCS = pqcan if CP.flags & VolkswagenFlags.PQ else mqbcan self.packer_pt = CANPacker(dbc_name) self.apply_steer_last = 0 diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 25c5bc04bc..48e9ed37d6 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -3,7 +3,7 @@ from cereal import car from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser -from openpilot.selfdrive.car.volkswagen.values import DBC, CANBUS, PQ_CARS, NetworkLocation, TransmissionType, GearShifter, \ +from openpilot.selfdrive.car.volkswagen.values import DBC, CANBUS, NetworkLocation, TransmissionType, GearShifter, \ CarControllerParams, VolkswagenFlags @@ -31,7 +31,7 @@ class CarState(CarStateBase): return button_events def update(self, pt_cp, cam_cp, ext_cp, trans_type): - if self.CP.carFingerprint in PQ_CARS: + if self.CP.flags & VolkswagenFlags.PQ: return self.update_pq(pt_cp, cam_cp, ext_cp, trans_type) ret = car.CarState.new_message() @@ -257,7 +257,7 @@ class CarState(CarStateBase): @staticmethod def get_can_parser(CP): - if CP.carFingerprint in PQ_CARS: + if CP.flags & VolkswagenFlags.PQ: return CarState.get_can_parser_pq(CP) messages = [ @@ -294,7 +294,7 @@ class CarState(CarStateBase): @staticmethod def get_cam_can_parser(CP): - if CP.carFingerprint in PQ_CARS: + if CP.flags & VolkswagenFlags.PQ: return CarState.get_cam_can_parser_pq(CP) messages = [] diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index fa68e81d0d..374b657512 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -2,7 +2,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase -from openpilot.selfdrive.car.volkswagen.values import PQ_CARS, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags +from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName @@ -22,11 +22,11 @@ class CarInterface(CarInterfaceBase): self.eps_timer_soft_disable_alert = False @staticmethod - def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): + def _get_params(ret, candidate: CAR, fingerprint, car_fw, experimental_long, docs): ret.carName = "volkswagen" ret.radarUnavailable = True - if candidate in PQ_CARS: + if ret.flags & VolkswagenFlags.PQ: # Set global PQ35/PQ46/NMS parameters ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.volkswagenPq)] ret.enableBsm = 0x3BA in fingerprint[0] # SWA_1 @@ -72,7 +72,7 @@ class CarInterface(CarInterfaceBase): # Global lateral tuning defaults, can be overridden per-vehicle ret.steerLimitTimer = 0.4 - if candidate in PQ_CARS: + if ret.flags & VolkswagenFlags.PQ: ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) else: diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index f00fd971aa..86788dcf64 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -40,7 +40,7 @@ class CarControllerParams: def __init__(self, CP): can_define = CANDefine(DBC[CP.carFingerprint]["pt"]) - if CP.carFingerprint in PQ_CARS: + if CP.flags & VolkswagenFlags.PQ: self.LDW_STEP = 5 # LDW_1 message frequency 20Hz self.ACC_HUD_STEP = 4 # ACC_GRA_Anzeige frequency 25Hz self.STEER_DRIVER_ALLOWANCE = 80 # Driver intervention threshold 0.8 Nm @@ -113,6 +113,9 @@ class VolkswagenFlags(IntFlag): # Detected flags STOCK_HCA_PRESENT = 1 + # Static Flags + PQ = 2 + @dataclass class VolkswagenMQBPlatformConfig(PlatformConfig): @@ -123,6 +126,9 @@ class VolkswagenMQBPlatformConfig(PlatformConfig): class VolkswagenPQPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('vw_golf_mk4', None)) + def init(self): + self.flags |= VolkswagenFlags.PQ + @dataclass(frozen=True, kw_only=True) class VolkswagenCarSpecs(CarSpecs): @@ -360,8 +366,6 @@ class CAR(Platforms): ) -PQ_CARS = {CAR.PASSAT_NMS, CAR.SHARAN_MK2} - # 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. # From 00f2703bbb70d5d79d3b64cb6b2974efb36cb4d4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 1 Mar 2024 04:01:59 +0000 Subject: [PATCH 334/923] basic platform config tests --- selfdrive/car/tests/test_platform_configs.py | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 selfdrive/car/tests/test_platform_configs.py diff --git a/selfdrive/car/tests/test_platform_configs.py b/selfdrive/car/tests/test_platform_configs.py new file mode 100755 index 0000000000..931780963f --- /dev/null +++ b/selfdrive/car/tests/test_platform_configs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +import unittest + +from openpilot.selfdrive.car.values import PLATFORMS + + +class TestPlatformConfigs(unittest.TestCase): + def test_configs(self): + + for platform in PLATFORMS.values(): + with self.subTest(platform=str(platform)): + if hasattr(platform, "config"): + + self.assertTrue(platform.config._frozen) + self.assertIn("pt", platform.config.dbc_dict) + self.assertTrue(len(platform.config.platform_str) > 0) + + # enable when all cars have specs + #self.assertIsNotNone(platform.config.specs) + + +if __name__ == "__main__": + unittest.main() From 9c3f0450bb277a02effdeccbe6e89986ed5678b9 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 29 Feb 2024 21:46:35 -0800 Subject: [PATCH 335/923] simple pyqt ui --- selfdrive/ui/ui.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 selfdrive/ui/ui.py diff --git a/selfdrive/ui/ui.py b/selfdrive/ui/ui.py new file mode 100755 index 0000000000..ea2ee51a45 --- /dev/null +++ b/selfdrive/ui/ui.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 +import os +import signal + +signal.signal(signal.SIGINT, signal.SIG_DFL) + +import cereal.messaging as messaging +from openpilot.system.hardware import HARDWARE + +from PyQt5.QtCore import Qt, QTimer +from PyQt5.QtWidgets import QLabel, QWidget, QVBoxLayout, QStackedLayout, QApplication +from openpilot.selfdrive.ui.qt.python_helpers import set_main_window + + +if __name__ == "__main__": + app = QApplication([]) + win = QWidget() + set_main_window(win) + + bg = QLabel("", alignment=Qt.AlignCenter) + + alert1 = QLabel() + alert2 = QLabel() + vlayout = QVBoxLayout() + vlayout.addWidget(alert1, alignment=Qt.AlignCenter) + vlayout.addWidget(alert2, alignment=Qt.AlignCenter) + + tmp = QWidget() + tmp.setLayout(vlayout) + + stack = QStackedLayout(win) + stack.addWidget(tmp) + stack.addWidget(bg) + stack.setStackingMode(QStackedLayout.StackAll) + + win.setObjectName("win") + win.setStyleSheet(""" + #win { + background-color: black; + } + QLabel { + color: white; + font-size: 40px; + } + """) + + sm = messaging.SubMaster(['deviceState', 'controlsState']) + + def update(): + sm.update(0) + + onroad = sm.all_checks(['deviceState']) and sm['deviceState'].started + if onroad: + cs = sm['controlsState'] + color = ("grey" if str(cs.status) in ("overriding", "preEnabled") else "green") if cs.enabled else "blue" + bg.setText("\U0001F44D" if cs.engageable else "\U0001F6D1") + bg.setStyleSheet(f"font-size: 100px; background-color: {color};") + bg.show() + + alert1.setText(cs.alertText1) + alert2.setText(cs.alertText2) + + if not sm.alive['controlsState']: + alert1.setText("waiting for controls...") + else: + bg.hide() + alert1.setText("") + alert2.setText("offroad") + + HARDWARE.set_screen_brightness(100 if onroad else 40) + os.system("echo 0 > /sys/class/backlight/panel0-backlight/bl_power") + + timer = QTimer() + timer.timeout.connect(update) + timer.start(50) + + app.exec_() From 52ee070fe0a6880b7e3a5db408a0453c8310be86 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 02:14:33 -0800 Subject: [PATCH 336/923] Toyota: use platform config (#31607) * part 1. Toyota platform config * more * everything works now * no more DBC * janky but that saves a lot of car lines * need to init inside values or else it won't be reliable * no return * fixes * minor update * common flags, no dbc grouping * some clean up * some clean up * rename * copied wrong :( * another * copied specs for easiest ones first * second easiest * fix erroneous commas * more clean up * do the rest * bug * the refactor is so error prone * huh?! * static * fix stiffness factor * detect unsupported DSU * Revert "detect unsupported DSU" This reverts commit 9b72de6c8ef282ce20f6472970874a960761884b. * fix DBC diff * test carparams * test sets * scratch * catches this * Revert "scratch" This reverts commit de08daa9fb8cc0368c5847b669e87b1b2e577616. * Revert "test sets" This reverts commit 62402f9b021cdf16a27fd9fb0883d81169711cbd. * Revert "test carparams" This reverts commit b02971659c2a8268d0ac8fdff02231dc36b5a197. * Update ref_commit --- selfdrive/car/__init__.py | 1 + selfdrive/car/interfaces.py | 1 + selfdrive/car/toyota/interface.py | 101 ----- selfdrive/car/toyota/values.py | 522 ++++++++++++++--------- selfdrive/test/process_replay/ref_commit | 2 +- 5 files changed, 319 insertions(+), 308 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 85b8a2bbe8..27d320bb41 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -256,6 +256,7 @@ class CarSpecs: centerToFrontRatio: float = 0.5 minSteerSpeed: float = 0.0 # m/s minEnableSpeed: float = -1.0 # m/s + tireStiffnessFactor: float = 1.0 @dataclass(order=True) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 491138f788..98b3c63ec7 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -120,6 +120,7 @@ class CarInterfaceBase(ABC): 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 = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 988b1b4547..7fd5c9435d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -1,5 +1,4 @@ from cereal import car -from openpilot.common.conversions import Conversions as CV from panda import Panda from panda.python import uds from openpilot.selfdrive.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerParams, TSS2_CAR, RADAR_ACC_CAR, NO_DSU_CAR, \ @@ -46,10 +45,6 @@ class CarInterface(CarInterfaceBase): if candidate == CAR.PRIUS: stop_and_go = True - ret.wheelbase = 2.70 - ret.steerRatio = 15.74 # unknown end-to-end spec - ret.tireStiffnessFactor = 0.6371 # hand-tune - ret.mass = 3045. * CV.LB_TO_KG # Only give steer angle deadzone to for bad angle sensor prius for fw in car_fw: if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00': @@ -58,68 +53,30 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.PRIUS_V: stop_and_go = True - ret.wheelbase = 2.78 - ret.steerRatio = 17.4 - ret.tireStiffnessFactor = 0.5533 - ret.mass = 3340. * CV.LB_TO_KG elif candidate in (CAR.RAV4, CAR.RAV4H): stop_and_go = True if (candidate in CAR.RAV4H) else False - ret.wheelbase = 2.65 - ret.steerRatio = 16.88 # 14.5 is spec end-to-end - ret.tireStiffnessFactor = 0.5533 - ret.mass = 3650. * CV.LB_TO_KG # mean between normal and hybrid - - elif candidate == CAR.COROLLA: - ret.wheelbase = 2.70 - ret.steerRatio = 18.27 - ret.tireStiffnessFactor = 0.444 # not optimized yet - ret.mass = 2860. * CV.LB_TO_KG # mean between normal and hybrid elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2): stop_and_go = True - ret.wheelbase = 2.79 - ret.steerRatio = 16. # 14.8 is spec end-to-end ret.wheelSpeedFactor = 1.035 - ret.tireStiffnessFactor = 0.5533 - ret.mass = 4481. * CV.LB_TO_KG # mean between min and max elif candidate in (CAR.CHR, CAR.CHR_TSS2): stop_and_go = True - ret.wheelbase = 2.63906 - ret.steerRatio = 13.6 - ret.tireStiffnessFactor = 0.7933 - ret.mass = 3300. * CV.LB_TO_KG elif candidate in (CAR.CAMRY, CAR.CAMRY_TSS2): stop_and_go = True - ret.wheelbase = 2.82448 - ret.steerRatio = 13.7 - ret.tireStiffnessFactor = 0.7933 - ret.mass = 3400. * CV.LB_TO_KG # mean between normal and hybrid elif candidate in (CAR.HIGHLANDER, CAR.HIGHLANDER_TSS2): # TODO: TSS-P models can do stop and go, but unclear if it requires sDSU or unplugging DSU stop_and_go = True - ret.wheelbase = 2.8194 # average of 109.8 and 112.2 in - ret.steerRatio = 16.0 - ret.tireStiffnessFactor = 0.8 - ret.mass = 4516. * CV.LB_TO_KG # mean between normal and hybrid elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.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 - ret.wheelbase = 2.82 - ret.steerRatio = 14.8 # Found at https://pressroom.toyota.com/releases/2016+avalon+product+specs.download - ret.tireStiffnessFactor = 0.7983 - ret.mass = 3505. * CV.LB_TO_KG # mean between normal and hybrid elif candidate in (CAR.RAV4_TSS2, CAR.RAV4_TSS2_2022, CAR.RAV4_TSS2_2023): - ret.wheelbase = 2.68986 - ret.steerRatio = 14.3 - ret.tireStiffnessFactor = 0.7933 - ret.mass = 3585. * CV.LB_TO_KG # Average between ICE and Hybrid ret.lateralTuning.init('pid') ret.lateralTuning.pid.kiBP = [0.0] ret.lateralTuning.pid.kpBP = [0.0] @@ -136,75 +93,17 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00004 break - elif candidate == CAR.COROLLA_TSS2: - ret.wheelbase = 2.67 # Average between 2.70 for sedan and 2.64 for hatchback - ret.steerRatio = 13.9 - ret.tireStiffnessFactor = 0.444 # not optimized yet - ret.mass = 3060. * CV.LB_TO_KG - - elif candidate in (CAR.LEXUS_ES, CAR.LEXUS_ES_TSS2): - ret.wheelbase = 2.8702 - ret.steerRatio = 16.0 # not optimized - ret.tireStiffnessFactor = 0.444 # not optimized yet - ret.mass = 3677. * CV.LB_TO_KG # mean between min and max - elif candidate == CAR.SIENNA: stop_and_go = True - ret.wheelbase = 3.03 - ret.steerRatio = 15.5 - ret.tireStiffnessFactor = 0.444 - ret.mass = 4590. * CV.LB_TO_KG - - elif candidate in (CAR.LEXUS_IS, CAR.LEXUS_IS_TSS2, CAR.LEXUS_RC): - ret.wheelbase = 2.79908 - ret.steerRatio = 13.3 - ret.tireStiffnessFactor = 0.444 - ret.mass = 3736.8 * CV.LB_TO_KG - - elif candidate == CAR.LEXUS_GS_F: - ret.wheelbase = 2.84988 - ret.steerRatio = 13.3 - ret.tireStiffnessFactor = 0.444 - ret.mass = 4034. * CV.LB_TO_KG elif candidate == CAR.LEXUS_CTH: stop_and_go = True - ret.wheelbase = 2.60 - ret.steerRatio = 18.6 - ret.tireStiffnessFactor = 0.517 - ret.mass = 3108 * CV.LB_TO_KG # mean between min and max elif candidate in (CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2): stop_and_go = True - ret.wheelbase = 2.66 - ret.steerRatio = 14.7 - ret.tireStiffnessFactor = 0.444 # not optimized yet - ret.mass = 4070 * CV.LB_TO_KG - - elif candidate == CAR.LEXUS_LC_TSS2: - ret.wheelbase = 2.87 - ret.steerRatio = 13.0 - ret.tireStiffnessFactor = 0.444 # not optimized yet - ret.mass = 4500 * CV.LB_TO_KG - - elif candidate == CAR.PRIUS_TSS2: - ret.wheelbase = 2.70002 # from toyota online sepc. - ret.steerRatio = 13.4 # True steerRatio from older prius - ret.tireStiffnessFactor = 0.6371 # hand-tune - ret.mass = 3115. * CV.LB_TO_KG elif candidate == CAR.MIRAI: stop_and_go = True - ret.wheelbase = 2.91 - ret.steerRatio = 14.8 - ret.tireStiffnessFactor = 0.8 - ret.mass = 4300. * CV.LB_TO_KG - - elif candidate == CAR.ALPHARD_TSS2: - ret.wheelbase = 3.00 - ret.steerRatio = 14.2 - ret.tireStiffnessFactor = 0.444 - ret.mass = 4305. * CV.LB_TO_KG ret.centerToFront = ret.wheelbase * 0.44 diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 011d153f70..09d6082f67 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -1,10 +1,11 @@ import re from collections import defaultdict from dataclasses import dataclass, field -from enum import Enum, IntFlag, StrEnum +from enum import Enum, IntFlag 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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -41,50 +42,19 @@ class CarControllerParams: class ToyotaFlags(IntFlag): + # Detected flags HYBRID = 1 SMART_DSU = 2 DISABLE_RADAR = 4 - -class CAR(StrEnum): - # Toyota - ALPHARD_TSS2 = "TOYOTA ALPHARD 2020" - AVALON = "TOYOTA AVALON 2016" - AVALON_2019 = "TOYOTA AVALON 2019" - AVALON_TSS2 = "TOYOTA AVALON 2022" # TSS 2.5 - CAMRY = "TOYOTA CAMRY 2018" - CAMRY_TSS2 = "TOYOTA CAMRY 2021" # TSS 2.5 - CHR = "TOYOTA C-HR 2018" - CHR_TSS2 = "TOYOTA C-HR 2021" - COROLLA = "TOYOTA COROLLA 2017" - # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid - COROLLA_TSS2 = "TOYOTA COROLLA TSS2 2019" - HIGHLANDER = "TOYOTA HIGHLANDER 2017" - HIGHLANDER_TSS2 = "TOYOTA HIGHLANDER 2020" - PRIUS = "TOYOTA PRIUS 2017" - PRIUS_V = "TOYOTA PRIUS v 2017" - PRIUS_TSS2 = "TOYOTA PRIUS TSS2 2021" - RAV4 = "TOYOTA RAV4 2017" - RAV4H = "TOYOTA RAV4 HYBRID 2017" - RAV4_TSS2 = "TOYOTA RAV4 2019" - RAV4_TSS2_2022 = "TOYOTA RAV4 2022" - RAV4_TSS2_2023 = "TOYOTA RAV4 2023" - MIRAI = "TOYOTA MIRAI 2021" # TSS 2.5 - SIENNA = "TOYOTA SIENNA 2018" - - # Lexus - LEXUS_CTH = "LEXUS CT HYBRID 2018" - LEXUS_ES = "LEXUS ES 2018" - LEXUS_ES_TSS2 = "LEXUS ES 2019" - LEXUS_IS = "LEXUS IS 2018" - LEXUS_IS_TSS2 = "LEXUS IS 2023" - LEXUS_NX = "LEXUS NX 2018" - LEXUS_NX_TSS2 = "LEXUS NX 2020" - LEXUS_LC_TSS2 = "LEXUS LC 2024" - LEXUS_RC = "LEXUS RC 2020" - LEXUS_RX = "LEXUS RX 2016" - LEXUS_RX_TSS2 = "LEXUS RX 2020" - LEXUS_GS_F = "LEXUS GS F 2016" + # Static flags + TSS2 = 8 + NO_DSU = 16 + UNSUPPORTED_DSU = 32 + RADAR_ACC = 64 + # these cars use the Lane Tracing Assist (LTA) message for lateral control + ANGLE_CONTROL = 128 + NO_STOP_TIMER = 256 class Footnote(Enum): @@ -99,127 +69,305 @@ class ToyotaCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.toyota_a])) -CAR_INFO: dict[str, ToyotaCarInfo | list[ToyotaCarInfo]] = { +@dataclass +class ToyotaTSS2PlatformConfig(PlatformConfig): + dbc_dict: dict = field(default_factory=lambda: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas')) + + def init(self): + self.flags |= ToyotaFlags.TSS2 | ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.NO_DSU + + if self.flags & ToyotaFlags.RADAR_ACC: + self.dbc_dict = dbc_dict('toyota_nodsu_pt_generated', None) + + +class CAR(Platforms): # Toyota - CAR.ALPHARD_TSS2: [ - ToyotaCarInfo("Toyota Alphard 2019-20"), - ToyotaCarInfo("Toyota Alphard Hybrid 2021"), - ], - CAR.AVALON: [ - ToyotaCarInfo("Toyota Avalon 2016", "Toyota Safety Sense P"), - ToyotaCarInfo("Toyota Avalon 2017-18"), - ], - CAR.AVALON_2019: [ - ToyotaCarInfo("Toyota Avalon 2019-21"), - ToyotaCarInfo("Toyota Avalon Hybrid 2019-21"), - ], - CAR.AVALON_TSS2: [ - ToyotaCarInfo("Toyota Avalon 2022"), - ToyotaCarInfo("Toyota Avalon Hybrid 2022"), - ], - CAR.CAMRY: [ - 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"), - ], - CAR.CAMRY_TSS2: [ - ToyotaCarInfo("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), - ToyotaCarInfo("Toyota Camry Hybrid 2021-24"), - ], - CAR.CHR: [ - ToyotaCarInfo("Toyota C-HR 2017-20"), - ToyotaCarInfo("Toyota C-HR Hybrid 2017-20"), - ], - CAR.CHR_TSS2: [ - ToyotaCarInfo("Toyota C-HR 2021"), - ToyotaCarInfo("Toyota C-HR Hybrid 2021-22"), - ], - CAR.COROLLA: ToyotaCarInfo("Toyota Corolla 2017-19"), - CAR.COROLLA_TSS2: [ - 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"), - # 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"), - ], - CAR.HIGHLANDER: [ - ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), - ToyotaCarInfo("Toyota Highlander Hybrid 2017-19"), - ], - CAR.HIGHLANDER_TSS2: [ - ToyotaCarInfo("Toyota Highlander 2020-23"), - ToyotaCarInfo("Toyota Highlander Hybrid 2020-23"), - ], - CAR.PRIUS: [ - 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"), - ], - CAR.PRIUS_V: ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED), - CAR.PRIUS_TSS2: [ - 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"), - ], - CAR.RAV4: [ - ToyotaCarInfo("Toyota RAV4 2016", "Toyota Safety Sense P"), - ToyotaCarInfo("Toyota RAV4 2017-18") - ], - CAR.RAV4H: [ - 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") - ], - CAR.RAV4_TSS2: [ - ToyotaCarInfo("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2019-21"), - ], - CAR.RAV4_TSS2_2022: [ - ToyotaCarInfo("Toyota RAV4 2022"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), - ], - CAR.RAV4_TSS2_2023: [ - ToyotaCarInfo("Toyota RAV4 2023-24"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), - ], - CAR.MIRAI: ToyotaCarInfo("Toyota Mirai 2021"), - CAR.SIENNA: ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED), + ALPHARD_TSS2 = ToyotaTSS2PlatformConfig( + "TOYOTA ALPHARD 2020", + [ + ToyotaCarInfo("Toyota Alphard 2019-20"), + ToyotaCarInfo("Toyota Alphard Hybrid 2021"), + ], + specs=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"), + ], + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), + ) + AVALON_2019 = PlatformConfig( + "TOYOTA AVALON 2019", + [ + ToyotaCarInfo("Toyota Avalon 2019-21"), + ToyotaCarInfo("Toyota Avalon Hybrid 2019-21"), + ], + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + specs=AVALON.specs, + ) + AVALON_TSS2 = ToyotaTSS2PlatformConfig( + "TOYOTA AVALON 2022", # TSS 2.5 + [ + ToyotaCarInfo("Toyota Avalon 2022"), + ToyotaCarInfo("Toyota Avalon Hybrid 2022"), + ], + specs=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"), + ], + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_DSU, + specs=CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), + ) + CAMRY_TSS2 = ToyotaTSS2PlatformConfig( + "TOYOTA CAMRY 2021", # TSS 2.5 + [ + ToyotaCarInfo("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), + ToyotaCarInfo("Toyota Camry Hybrid 2021-24"), + ], + specs=CAMRY.specs, + ) + CHR = PlatformConfig( + "TOYOTA C-HR 2018", + [ + ToyotaCarInfo("Toyota C-HR 2017-20"), + ToyotaCarInfo("Toyota C-HR Hybrid 2017-20"), + ], + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_DSU, + specs=CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933), + ) + CHR_TSS2 = ToyotaTSS2PlatformConfig( + "TOYOTA C-HR 2021", + [ + ToyotaCarInfo("Toyota C-HR 2021"), + ToyotaCarInfo("Toyota C-HR Hybrid 2021-22"), + ], + flags=ToyotaFlags.RADAR_ACC, + specs=CHR.specs, + ) + COROLLA = PlatformConfig( + "TOYOTA COROLLA 2017", + ToyotaCarInfo("Toyota Corolla 2017-19"), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), + ) + # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid + 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"), + # 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"), + ], + specs=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"), + ], + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + specs=CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8), + ) + HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( + "TOYOTA HIGHLANDER 2020", + [ + ToyotaCarInfo("Toyota Highlander 2020-23"), + ToyotaCarInfo("Toyota Highlander Hybrid 2020-23"), + ], + specs=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"), + ], + dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), + ) + PRIUS_V = PlatformConfig( + "TOYOTA PRIUS v 2017", + ToyotaCarInfo("Toyota Prius v 2017", "Toyota Safety Sense P", min_enable_speed=MIN_ACC_SPEED), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + specs=CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), + ) + 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"), + ], + specs=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") + ], + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), + ) + 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") + ], + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + specs=RAV4.specs, + ) + 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"), + ], + specs=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"), + ], + flags=ToyotaFlags.RADAR_ACC, + specs=RAV4_TSS2.specs, + ) + RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( + "TOYOTA RAV4 2023", + [ + ToyotaCarInfo("Toyota RAV4 2023-24"), + ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), + ], + flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, + specs=RAV4_TSS2.specs, + ) + MIRAI = ToyotaTSS2PlatformConfig( + "TOYOTA MIRAI 2021", # TSS 2.5 + ToyotaCarInfo("Toyota Mirai 2021"), + specs=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), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.NO_STOP_TIMER, + specs=CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), + ) # Lexus - CAR.LEXUS_CTH: ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+"), - CAR.LEXUS_ES: [ - ToyotaCarInfo("Lexus ES 2017-18"), - ToyotaCarInfo("Lexus ES Hybrid 2017-18"), - ], - CAR.LEXUS_ES_TSS2: [ - ToyotaCarInfo("Lexus ES 2019-24"), - ToyotaCarInfo("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), - ], - CAR.LEXUS_IS: ToyotaCarInfo("Lexus IS 2017-19"), - CAR.LEXUS_IS_TSS2: ToyotaCarInfo("Lexus IS 2022-23"), - CAR.LEXUS_GS_F: ToyotaCarInfo("Lexus GS F 2016"), - CAR.LEXUS_NX: [ - ToyotaCarInfo("Lexus NX 2018-19"), - ToyotaCarInfo("Lexus NX Hybrid 2018-19"), - ], - CAR.LEXUS_NX_TSS2: [ - ToyotaCarInfo("Lexus NX 2020-21"), - ToyotaCarInfo("Lexus NX Hybrid 2020-21"), - ], - CAR.LEXUS_LC_TSS2: ToyotaCarInfo("Lexus LC 2024"), - CAR.LEXUS_RC: ToyotaCarInfo("Lexus RC 2018-20"), - CAR.LEXUS_RX: [ - ToyotaCarInfo("Lexus RX 2016", "Lexus Safety System+"), - ToyotaCarInfo("Lexus RX 2017-19"), - # Hybrid platforms - ToyotaCarInfo("Lexus RX Hybrid 2016", "Lexus Safety System+"), - ToyotaCarInfo("Lexus RX Hybrid 2017-19"), - ], - CAR.LEXUS_RX_TSS2: [ - ToyotaCarInfo("Lexus RX 2020-22"), - ToyotaCarInfo("Lexus RX Hybrid 2020-22"), - ], -} + LEXUS_CTH = PlatformConfig( + "LEXUS CT HYBRID 2018", + ToyotaCarInfo("Lexus CT Hybrid 2017-18", "Lexus Safety System+"), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), + ) + LEXUS_ES = PlatformConfig( + "LEXUS ES 2018", + [ + ToyotaCarInfo("Lexus ES 2017-18"), + ToyotaCarInfo("Lexus ES Hybrid 2017-18"), + ], + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444), + ) + 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"), + ], + specs=LEXUS_ES.specs, + ) + LEXUS_IS = PlatformConfig( + "LEXUS IS 2018", + ToyotaCarInfo("Lexus IS 2017-19"), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + specs=CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), + ) + LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( + "LEXUS IS 2023", + ToyotaCarInfo("Lexus IS 2022-23"), + specs=LEXUS_IS.specs, + ) + LEXUS_NX = PlatformConfig( + "LEXUS NX 2018", + [ + ToyotaCarInfo("Lexus NX 2018-19"), + ToyotaCarInfo("Lexus NX Hybrid 2018-19"), + ], + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444), + ) + LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( + "LEXUS NX 2020", + [ + ToyotaCarInfo("Lexus NX 2020-21"), + ToyotaCarInfo("Lexus NX Hybrid 2020-21"), + ], + specs=LEXUS_NX.specs, + ) + LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( + "LEXUS LC 2024", + ToyotaCarInfo("Lexus LC 2024"), + specs=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"), + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + specs=LEXUS_IS.specs, + ) + LEXUS_RX = PlatformConfig( + "LEXUS RX 2016", + [ + ToyotaCarInfo("Lexus RX 2016", "Lexus Safety System+"), + ToyotaCarInfo("Lexus RX 2017-19"), + # Hybrid platforms + ToyotaCarInfo("Lexus RX Hybrid 2016", "Lexus Safety System+"), + ToyotaCarInfo("Lexus RX Hybrid 2017-19"), + ], + dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), + specs=CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533), + ) + LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( + "LEXUS RX 2020", + [ + ToyotaCarInfo("Lexus RX 2020-22"), + ToyotaCarInfo("Lexus RX Hybrid 2020-22"), + ], + specs=LEXUS_RX.specs, + ) + LEXUS_GS_F = PlatformConfig( + "LEXUS GS F 2016", + ToyotaCarInfo("Lexus GS F 2016"), + dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), + flags=ToyotaFlags.UNSUPPORTED_DSU, + specs=CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), + ) + # (addr, cars, bus, 1/freq*100, vl) STATIC_DSU_MSGS = [ @@ -439,62 +587,24 @@ FW_QUERY_CONFIG = FwQueryConfig( STEER_THRESHOLD = 100 -DBC = { - CAR.RAV4H: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.RAV4: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), - CAR.PRIUS: dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - CAR.PRIUS_V: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), - CAR.COROLLA: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), - CAR.LEXUS_LC_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.LEXUS_RC: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.LEXUS_RX: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.LEXUS_RX_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.CHR: dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - CAR.CHR_TSS2: dbc_dict('toyota_nodsu_pt_generated', None), - CAR.CAMRY: dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - CAR.CAMRY_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.HIGHLANDER: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.HIGHLANDER_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.AVALON: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.AVALON_2019: dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - CAR.AVALON_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.RAV4_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.RAV4_TSS2_2022: dbc_dict('toyota_nodsu_pt_generated', None), - CAR.RAV4_TSS2_2023: dbc_dict('toyota_nodsu_pt_generated', None), - CAR.COROLLA_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.LEXUS_ES: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), - CAR.LEXUS_ES_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.SIENNA: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.LEXUS_IS: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.LEXUS_IS_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.LEXUS_CTH: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), - CAR.LEXUS_NX: dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), - CAR.LEXUS_NX_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.PRIUS_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.MIRAI: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.ALPHARD_TSS2: dbc_dict('toyota_nodsu_pt_generated', 'toyota_tss2_adas'), - CAR.LEXUS_GS_F: dbc_dict('toyota_new_mc_pt_generated', 'toyota_adas'), -} - # 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}) # Toyota/Lexus Safety Sense 2.0 and 2.5 -TSS2_CAR = {CAR.RAV4_TSS2, CAR.RAV4_TSS2_2022, CAR.RAV4_TSS2_2023, CAR.COROLLA_TSS2, CAR.LEXUS_ES_TSS2, - CAR.LEXUS_RX_TSS2, CAR.HIGHLANDER_TSS2, CAR.PRIUS_TSS2, CAR.CAMRY_TSS2, CAR.LEXUS_IS_TSS2, - CAR.MIRAI, CAR.LEXUS_NX_TSS2, CAR.LEXUS_LC_TSS2, CAR.ALPHARD_TSS2, CAR.AVALON_TSS2, - CAR.CHR_TSS2} +TSS2_CAR = CAR.with_flags(ToyotaFlags.TSS2) -NO_DSU_CAR = TSS2_CAR | {CAR.CHR, CAR.CAMRY} +NO_DSU_CAR = CAR.with_flags(ToyotaFlags.NO_DSU) # the DSU uses the AEB message for longitudinal on these cars -UNSUPPORTED_DSU_CAR = {CAR.LEXUS_IS, CAR.LEXUS_RC, CAR.LEXUS_GS_F} +UNSUPPORTED_DSU_CAR = CAR.with_flags(ToyotaFlags.UNSUPPORTED_DSU) # these cars have a radar which sends ACC messages instead of the camera -RADAR_ACC_CAR = {CAR.RAV4_TSS2_2022, CAR.RAV4_TSS2_2023, CAR.CHR_TSS2} +RADAR_ACC_CAR = CAR.with_flags(ToyotaFlags.RADAR_ACC) -# these cars use the Lane Tracing Assist (LTA) message for lateral control -ANGLE_CONTROL_CAR = {CAR.RAV4_TSS2_2023} +ANGLE_CONTROL_CAR = CAR.with_flags(ToyotaFlags.ANGLE_CONTROL) # no resume button press required -NO_STOP_TIMER_CAR = TSS2_CAR | {CAR.PRIUS_V, CAR.RAV4H, CAR.HIGHLANDER, CAR.SIENNA} +NO_STOP_TIMER_CAR = CAR.with_flags(ToyotaFlags.NO_STOP_TIMER) + +CAR_INFO = CAR.create_carinfo_map() +DBC = CAR.create_dbc_map() diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 015f941261..d437f1fac8 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -de322b3898f8fedb57036b6cf4a0605968138929 +7fe098c307b78bf1f6f003452f9ba0a0eaad83d6 From 341b81c0a5c5f378f749a8ba07514f48f0f9faa5 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Fri, 1 Mar 2024 17:18:03 +0000 Subject: [PATCH 337/923] Ford: use flags for CANFD (#31664) --- selfdrive/car/ford/carcontroller.py | 6 +++--- selfdrive/car/ford/carstate.py | 16 +++++++-------- selfdrive/car/ford/interface.py | 6 +++--- selfdrive/car/ford/values.py | 30 ++++++++++++++++++----------- 4 files changed, 33 insertions(+), 25 deletions(-) diff --git a/selfdrive/car/ford/carcontroller.py b/selfdrive/car/ford/carcontroller.py index 61c46674db..390325a8ec 100644 --- a/selfdrive/car/ford/carcontroller.py +++ b/selfdrive/car/ford/carcontroller.py @@ -1,9 +1,9 @@ from cereal import car -from openpilot.common.numpy_fast import clip from opendbc.can.packer import CANPacker +from openpilot.common.numpy_fast import clip from openpilot.selfdrive.car import apply_std_steer_angle_limits from openpilot.selfdrive.car.ford import fordcan -from openpilot.selfdrive.car.ford.values import CANFD_CAR, CarControllerParams +from openpilot.selfdrive.car.ford.values import CarControllerParams, FordFlags from openpilot.selfdrive.car.interfaces import CarControllerBase from openpilot.selfdrive.controls.lib.drive_helpers import V_CRUISE_MAX @@ -70,7 +70,7 @@ class CarController(CarControllerBase): self.apply_curvature_last = apply_curvature - if self.CP.carFingerprint in CANFD_CAR: + if self.CP.flags & FordFlags.CANFD: # TODO: extended mode mode = 1 if CC.latActive else 0 counter = (self.frame // CarControllerParams.STEER_STEP) % 0xF diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index 34006e8da4..039e245754 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -1,10 +1,10 @@ from cereal import car -from openpilot.common.conversions import Conversions as CV from opendbc.can.can_define import CANDefine from opendbc.can.parser import CANParser -from openpilot.selfdrive.car.interfaces import CarStateBase +from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car.ford.fordcan import CanBus -from openpilot.selfdrive.car.ford.values import CANFD_CAR, CarControllerParams, DBC +from openpilot.selfdrive.car.ford.values import DBC, CarControllerParams, FordFlags +from openpilot.selfdrive.car.interfaces import CarStateBase GearShifter = car.CarState.GearShifter TransmissionType = car.CarParams.TransmissionType @@ -49,7 +49,7 @@ class CarState(CarStateBase): ret.steerFaultPermanent = cp.vl["EPAS_INFO"]["EPAS_Failure"] in (2, 3) ret.espDisabled = cp.vl["Cluster_Info1_FD1"]["DrvSlipCtlMde_D_Rq"] != 0 # 0 is default mode - if self.CP.carFingerprint in CANFD_CAR: + if self.CP.flags & FordFlags.CANFD: # this signal is always 0 on non-CAN FD cars ret.steerFaultTemporary |= cp.vl["Lane_Assist_Data3_FD1"]["LatCtlSte_D_Stat"] not in (1, 2, 3) @@ -91,7 +91,7 @@ class CarState(CarStateBase): # blindspot sensors if self.CP.enableBsm: - cp_bsm = cp_cam if self.CP.carFingerprint in CANFD_CAR else cp + cp_bsm = cp_cam if self.CP.flags & FordFlags.CANFD else cp ret.leftBlindspot = cp_bsm.vl["Side_Detect_L_Stat"]["SodDetctLeft_D_Stat"] != 0 ret.rightBlindspot = cp_bsm.vl["Side_Detect_R_Stat"]["SodDetctRight_D_Stat"] != 0 @@ -122,7 +122,7 @@ class CarState(CarStateBase): ("RCMStatusMessage2_FD1", 10), ] - if CP.carFingerprint in CANFD_CAR: + if CP.flags & FordFlags.CANFD: messages += [ ("Lane_Assist_Data3_FD1", 33), ] @@ -137,7 +137,7 @@ class CarState(CarStateBase): ("BCM_Lamp_Stat_FD1", 1), ] - if CP.enableBsm and CP.carFingerprint not in CANFD_CAR: + if CP.enableBsm and not (CP.flags & FordFlags.CANFD): messages += [ ("Side_Detect_L_Stat", 5), ("Side_Detect_R_Stat", 5), @@ -155,7 +155,7 @@ class CarState(CarStateBase): ("IPMA_Data", 1), ] - if CP.enableBsm and CP.carFingerprint in CANFD_CAR: + if CP.enableBsm and CP.flags & FordFlags.CANFD: messages += [ ("Side_Detect_L_Stat", 5), ("Side_Detect_R_Stat", 5), diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index fd4c381f88..a79b4af2e0 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -3,7 +3,7 @@ from panda import Panda from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.ford.fordcan import CanBus -from openpilot.selfdrive.car.ford.values import CANFD_CAR, Ecu +from openpilot.selfdrive.car.ford.values import Ecu, FordFlags from openpilot.selfdrive.car.interfaces import CarInterfaceBase TransmissionType = car.CarParams.TransmissionType @@ -14,7 +14,7 @@ class CarInterface(CarInterfaceBase): @staticmethod def _get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs): ret.carName = "ford" - ret.dashcamOnly = candidate in CANFD_CAR + ret.dashcamOnly = bool(ret.flags & FordFlags.CANFD) ret.radarUnavailable = True ret.steerControlType = car.CarParams.SteerControlType.angle @@ -36,7 +36,7 @@ class CarInterface(CarInterfaceBase): ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_LONG_CONTROL ret.openpilotLongitudinalControl = True - if candidate in CANFD_CAR: + if ret.flags & FordFlags.CANFD: ret.safetyConfigs[-1].safetyParam |= Panda.FLAG_FORD_CANFD # Auto Transmission: 0x732 ECU or Gear_Shift_by_Wire_FD1 diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index e60b7f0612..985e7bc4b2 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,5 +1,5 @@ from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag import panda.python.uds as uds from cereal import car @@ -39,6 +39,11 @@ class CarControllerParams: pass +class FordFlags(IntFlag): + # Static flags + CANFD = 1 + + class RADAR: DELPHI_ESR = 'ford_fusion_2018_adas' DELPHI_MRR = 'FORD_CADS' @@ -57,7 +62,7 @@ class FordCarInfo(CarInfo): package: str = "Co-Pilot360 Assist+" def init_make(self, CP: car.CarParams): - harness = CarHarness.ford_q4 if CP.carFingerprint in CANFD_CAR else CarHarness.ford_q3 + 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): self.car_parts = CarParts([Device.threex_angled_mount, harness]) else: @@ -69,6 +74,15 @@ class FordPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', RADAR.DELPHI_MRR)) +@dataclass +class FordCANFDPlatformConfig(FordPlatformConfig): + dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('ford_lincoln_base_pt', None)) + + def init(self): + super().init() + self.flags |= FordFlags.CANFD + + class CAR(Platforms): BRONCO_SPORT_MK1 = FordPlatformConfig( "FORD BRONCO SPORT 1ST GEN", @@ -97,19 +111,17 @@ class CAR(Platforms): ], specs=CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) - F_150_MK14 = FordPlatformConfig( + 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"), ], - dbc_dict=dbc_dict('ford_lincoln_base_pt', None), specs=CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.0), ) - F_150_LIGHTNING_MK1 = FordPlatformConfig( + F_150_LIGHTNING_MK1 = FordCANFDPlatformConfig( "FORD F-150 LIGHTNING 1ST GEN", FordCarInfo("Ford F-150 Lightning 2021-23", "Co-Pilot360 Active 2.0"), - dbc_dict=dbc_dict('ford_lincoln_base_pt', None), specs=CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FOCUS_MK4 = FordPlatformConfig( @@ -130,17 +142,13 @@ class CAR(Platforms): ], specs=CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), ) - MUSTANG_MACH_E_MK1 = FordPlatformConfig( + MUSTANG_MACH_E_MK1 = FordCANFDPlatformConfig( "FORD MUSTANG MACH-E 1ST GEN", FordCarInfo("Ford Mustang Mach-E 2021-23", "Co-Pilot360 Active 2.0"), - dbc_dict=dbc_dict('ford_lincoln_base_pt', None), specs=CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio ) -CANFD_CAR = {CAR.F_150_MK14, CAR.F_150_LIGHTNING_MK1, CAR.MUSTANG_MACH_E_MK1} - - DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 ASBUILT_BLOCKS: list[tuple[int, list]] = [ From 2e0db7f8d87457d05fef8156eccb94c949623cf3 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 1 Mar 2024 13:31:43 -0500 Subject: [PATCH 338/923] Hyundai: move car specs to platformconfig (#31661) * specs * override * fixes 1 * fix 3 * fixes 4 * fixes * fixes * fixc * fix number 723124 * that too * fixes * aa --- selfdrive/car/__init__.py | 3 + selfdrive/car/hyundai/interface.py | 191 ----------------------------- selfdrive/car/hyundai/values.py | 99 +++++++++++++-- 3 files changed, 90 insertions(+), 203 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 27d320bb41..b30f24dad7 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -258,6 +258,9 @@ class CarSpecs: minEnableSpeed: float = -1.0 # m/s tireStiffnessFactor: float = 1.0 + def override(self, **kwargs): + return replace(self, **kwargs) + @dataclass(order=True) class PlatformConfig(Freezable): diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 049a63399c..69b5132806 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -1,6 +1,5 @@ from cereal import car from panda import Panda -from openpilot.common.conversions import Conversions as CV from openpilot.selfdrive.car.hyundai.hyundaicanfd import CanBus from openpilot.selfdrive.car.hyundai.values import HyundaiFlags, CAR, DBC, CANFD_CAR, CAMERA_SCC_CAR, CANFD_RADAR_SCC_CAR, \ CANFD_UNSUPPORTED_LONGITUDINAL_CAR, EV_CAR, HYBRID_CAR, LEGACY_SAFETY_MODE_CAR, \ @@ -76,196 +75,6 @@ class CarInterface(CarInterfaceBase): ret.steerLimitTimer = 0.4 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) - if candidate in (CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN): - ret.mass = 1600. if candidate == CAR.AZERA_6TH_GEN else 1675. # ICE is ~average of 2.5L and 3.5L - ret.wheelbase = 2.885 - ret.steerRatio = 14.5 - elif candidate in (CAR.SANTA_FE, CAR.SANTA_FE_2022, CAR.SANTA_FE_HEV_2022, CAR.SANTA_FE_PHEV_2022): - ret.mass = 3982. * CV.LB_TO_KG - ret.wheelbase = 2.766 - # Values from optimizer - ret.steerRatio = 16.55 # 13.8 is spec end-to-end - ret.tireStiffnessFactor = 0.82 - elif candidate in (CAR.SONATA, CAR.SONATA_HYBRID): - ret.mass = 1513. - ret.wheelbase = 2.84 - ret.steerRatio = 13.27 * 1.15 # 15% higher at the center seems reasonable - ret.tireStiffnessFactor = 0.65 - elif candidate == CAR.SONATA_LF: - ret.mass = 1536. - ret.wheelbase = 2.804 - ret.steerRatio = 13.27 * 1.15 # 15% higher at the center seems reasonable - elif candidate == CAR.PALISADE: - ret.mass = 1999. - ret.wheelbase = 2.90 - ret.steerRatio = 15.6 * 1.15 - ret.tireStiffnessFactor = 0.63 - elif candidate in (CAR.ELANTRA, CAR.ELANTRA_GT_I30): - ret.mass = 1275. - ret.wheelbase = 2.7 - ret.steerRatio = 15.4 # 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535 - ret.tireStiffnessFactor = 0.385 # stiffnessFactor settled on 1.0081302973865127 - ret.minSteerSpeed = 32 * CV.MPH_TO_MS - elif candidate == CAR.ELANTRA_2021: - ret.mass = 2800. * CV.LB_TO_KG - ret.wheelbase = 2.72 - ret.steerRatio = 12.9 - ret.tireStiffnessFactor = 0.65 - elif candidate == CAR.ELANTRA_HEV_2021: - ret.mass = 3017. * CV.LB_TO_KG - ret.wheelbase = 2.72 - ret.steerRatio = 12.9 - ret.tireStiffnessFactor = 0.65 - elif candidate == CAR.HYUNDAI_GENESIS: - ret.mass = 2060. - ret.wheelbase = 3.01 - ret.steerRatio = 16.5 - ret.minSteerSpeed = 60 * CV.KPH_TO_MS - elif candidate in (CAR.KONA, CAR.KONA_EV, CAR.KONA_HEV, CAR.KONA_EV_2022, CAR.KONA_EV_2ND_GEN): - ret.mass = {CAR.KONA_EV: 1685., CAR.KONA_HEV: 1425., CAR.KONA_EV_2022: 1743., CAR.KONA_EV_2ND_GEN: 1740.}.get(candidate, 1275.) - ret.wheelbase = {CAR.KONA_EV_2ND_GEN: 2.66, }.get(candidate, 2.6) - ret.steerRatio = {CAR.KONA_EV_2ND_GEN: 13.6, }.get(candidate, 13.42) # Spec - ret.tireStiffnessFactor = 0.385 - elif candidate in (CAR.IONIQ, CAR.IONIQ_EV_LTD, CAR.IONIQ_PHEV_2019, CAR.IONIQ_HEV_2022, CAR.IONIQ_EV_2020, CAR.IONIQ_PHEV): - ret.mass = 1490. # weight per hyundai site https://www.hyundaiusa.com/ioniq-electric/specifications.aspx - ret.wheelbase = 2.7 - ret.steerRatio = 13.73 # Spec - ret.tireStiffnessFactor = 0.385 - if candidate in (CAR.IONIQ, CAR.IONIQ_EV_LTD, CAR.IONIQ_PHEV_2019): - ret.minSteerSpeed = 32 * CV.MPH_TO_MS - elif candidate in (CAR.IONIQ_5, CAR.IONIQ_6): - ret.mass = 1948 - ret.wheelbase = 2.97 - ret.steerRatio = 14.26 - ret.tireStiffnessFactor = 0.65 - elif candidate == CAR.VELOSTER: - ret.mass = 2917. * CV.LB_TO_KG - ret.wheelbase = 2.80 - ret.steerRatio = 13.75 * 1.15 - ret.tireStiffnessFactor = 0.5 - elif candidate == CAR.TUCSON: - ret.mass = 3520. * CV.LB_TO_KG - ret.wheelbase = 2.67 - ret.steerRatio = 14.00 * 1.15 - ret.tireStiffnessFactor = 0.385 - elif candidate == CAR.TUCSON_4TH_GEN: - ret.mass = 1630. # average - ret.wheelbase = 2.756 - ret.steerRatio = 16. - ret.tireStiffnessFactor = 0.385 - elif candidate == CAR.SANTA_CRUZ_1ST_GEN: - ret.mass = 1870. # weight from Limited trim - the only supported trim - ret.wheelbase = 3.000 - # steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf - ret.steerRatio = 14.2 - elif candidate == CAR.CUSTIN_1ST_GEN: - ret.mass = 1690. # from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0 - ret.wheelbase = 3.055 - ret.steerRatio = 17.0 # from learner - elif candidate == CAR.STARIA_4TH_GEN: - ret.mass = 2205. - ret.wheelbase = 3.273 - ret.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 - - # Kia - elif candidate == CAR.KIA_SORENTO: - ret.mass = 1985. - ret.wheelbase = 2.78 - ret.steerRatio = 14.4 * 1.1 # 10% higher at the center seems reasonable - elif candidate in (CAR.KIA_NIRO_EV, CAR.KIA_NIRO_EV_2ND_GEN, CAR.KIA_NIRO_PHEV, CAR.KIA_NIRO_HEV_2021, CAR.KIA_NIRO_HEV_2ND_GEN, CAR.KIA_NIRO_PHEV_2022): - ret.mass = 3543. * CV.LB_TO_KG # average of all the cars - ret.wheelbase = 2.7 - ret.steerRatio = 13.6 # average of all the cars - ret.tireStiffnessFactor = 0.385 - if candidate == CAR.KIA_NIRO_PHEV: - ret.minSteerSpeed = 32 * CV.MPH_TO_MS - elif candidate == CAR.KIA_SELTOS: - ret.mass = 1337. - ret.wheelbase = 2.63 - ret.steerRatio = 14.56 - elif candidate == CAR.KIA_SPORTAGE_5TH_GEN: - ret.mass = 1725. # weight from SX and above trims, average of FWD and AWD versions - ret.wheelbase = 2.756 - ret.steerRatio = 13.6 # steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications - elif candidate in (CAR.KIA_OPTIMA_G4, CAR.KIA_OPTIMA_G4_FL, CAR.KIA_OPTIMA_H, CAR.KIA_OPTIMA_H_G4_FL): - ret.mass = 3558. * CV.LB_TO_KG - ret.wheelbase = 2.80 - ret.steerRatio = 13.75 - ret.tireStiffnessFactor = 0.5 - if candidate == CAR.KIA_OPTIMA_G4: - ret.minSteerSpeed = 32 * CV.MPH_TO_MS - elif candidate in (CAR.KIA_STINGER, CAR.KIA_STINGER_2022): - ret.mass = 1825. - ret.wheelbase = 2.78 - ret.steerRatio = 14.4 * 1.15 # 15% higher at the center seems reasonable - elif candidate == CAR.KIA_FORTE: - ret.mass = 2878. * CV.LB_TO_KG - ret.wheelbase = 2.80 - ret.steerRatio = 13.75 - ret.tireStiffnessFactor = 0.5 - elif candidate == CAR.KIA_CEED: - ret.mass = 1450. - ret.wheelbase = 2.65 - ret.steerRatio = 13.75 - ret.tireStiffnessFactor = 0.5 - elif candidate in (CAR.KIA_K5_2021, CAR.KIA_K5_HEV_2020): - ret.mass = 3381. * CV.LB_TO_KG - ret.wheelbase = 2.85 - ret.steerRatio = 13.27 # 2021 Kia K5 Steering Ratio (all trims) - ret.tireStiffnessFactor = 0.5 - elif candidate == CAR.KIA_EV6: - ret.mass = 2055 - ret.wheelbase = 2.9 - ret.steerRatio = 16. - ret.tireStiffnessFactor = 0.65 - elif candidate in (CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN): - ret.wheelbase = 2.81 - ret.steerRatio = 13.5 # average of the platforms - if candidate == CAR.KIA_SORENTO_4TH_GEN: - ret.mass = 3957 * CV.LB_TO_KG - else: - ret.mass = 4396 * CV.LB_TO_KG - elif candidate == CAR.KIA_CARNIVAL_4TH_GEN: - ret.mass = 2087. - ret.wheelbase = 3.09 - ret.steerRatio = 14.23 - elif candidate == CAR.KIA_K8_HEV_1ST_GEN: - ret.mass = 1630. # https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid - ret.wheelbase = 2.895 - ret.steerRatio = 13.27 # guesstimate from K5 platform - - # Genesis - elif candidate == CAR.GENESIS_GV60_EV_1ST_GEN: - ret.mass = 2205 - ret.wheelbase = 2.9 - # https://www.motor1.com/reviews/586376/2023-genesis-gv60-first-drive/#:~:text=Relative%20to%20the%20related%20Ioniq,5%2FEV6%27s%2014.3%3A1. - ret.steerRatio = 12.6 - elif candidate == CAR.GENESIS_G70: - ret.steerActuatorDelay = 0.1 - ret.mass = 1640.0 - ret.wheelbase = 2.84 - ret.steerRatio = 13.56 - elif candidate == CAR.GENESIS_G70_2020: - ret.mass = 3673.0 * CV.LB_TO_KG - ret.wheelbase = 2.83 - ret.steerRatio = 12.9 - elif candidate == CAR.GENESIS_GV70_1ST_GEN: - ret.mass = 1950. - ret.wheelbase = 2.87 - ret.steerRatio = 14.6 - elif candidate == CAR.GENESIS_G80: - ret.mass = 2060. - ret.wheelbase = 3.01 - ret.steerRatio = 16.5 - elif candidate == CAR.GENESIS_G90: - ret.mass = 2200. - ret.wheelbase = 3.15 - ret.steerRatio = 12.069 - elif candidate == CAR.GENESIS_GV80: - ret.mass = 2258. - ret.wheelbase = 2.95 - ret.steerRatio = 14.14 - # *** longitudinal control *** if candidate in CANFD_CAR: ret.longitudinalTuning.kpV = [0.1] diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index d23d3a0a75..ef17ffc4bf 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -5,7 +5,7 @@ from enum import Enum, IntFlag from cereal import car from panda.python import uds from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car import DbcDict, PlatformConfig, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, p16 @@ -93,6 +93,8 @@ class HyundaiFlags(IntFlag): CLUSTER_GEARS = 2 ** 21 TCU_GEARS = 2 ** 22 + MIN_STEER_32_MPH = 2 ** 23 + class Footnote(Enum): CANFD = CarFootnote( @@ -118,6 +120,9 @@ class HyundaiPlatformConfig(PlatformConfig): if self.flags & HyundaiFlags.MANDO_RADAR: self.dbc_dict = dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated') + if self.flags & HyundaiFlags.MIN_STEER_32_MPH: + self.specs = self.specs.override(minSteerSpeed = 32 * CV.MPH_TO_MS) + @dataclass class HyundaiCanFDPlatformConfig(HyundaiPlatformConfig): @@ -133,6 +138,7 @@ class CAR(Platforms): AZERA_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA 6TH GEN", HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), + specs=CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA HYBRID 6TH GEN", @@ -140,6 +146,7 @@ class CAR(Platforms): 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])), ], + specs=CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), flags=HyundaiFlags.HYBRID ) ELANTRA = HyundaiPlatformConfig( @@ -149,7 +156,9 @@ class CAR(Platforms): 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])), ], - flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS + # steerRatio: 14 is Stock | Settled Params Learner values are steerRatio: 15.401566348670535, stiffnessFactor settled on 1.0081302973865127 + specs=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 I30 N LINE 2019 & GT 2018 DCT", @@ -157,17 +166,20 @@ class CAR(Platforms): 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])), ], - flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS + specs=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])), + specs=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])), + specs=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( @@ -177,100 +189,120 @@ class CAR(Platforms): 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])), ], + specs=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])), - flags=HyundaiFlags.HYBRID + specs=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, + specs=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])), - flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.EV | HyundaiFlags.LEGACY + specs=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])), + specs=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])), - flags=HyundaiFlags.HYBRID + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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, + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=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", @@ -278,6 +310,7 @@ class CAR(Platforms): 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])), ], + specs=CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), flags=HyundaiFlags.TCU_GEARS ) PALISADE = HyundaiPlatformConfig( @@ -286,16 +319,19 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=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])), + specs=SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID ) IONIQ_5 = HyundaiCanFDPlatformConfig( @@ -305,11 +341,13 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE ) TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( @@ -319,14 +357,18 @@ class CAR(Platforms): 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])), ], + specs=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-23", 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 + specs=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])), + specs=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 ) @@ -334,23 +376,28 @@ 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])), - ] + HyundaiCarInfo("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), + HyundaiCarInfo("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), + ], + specs=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])), + specs=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])), + specs=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])), + # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform + specs=CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) ) KIA_NIRO_EV = HyundaiPlatformConfig( "KIA NIRO EV 2020", @@ -360,11 +407,13 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=KIA_NIRO_EV.specs, flags=HyundaiFlags.EV ) KIA_NIRO_PHEV = HyundaiPlatformConfig( @@ -373,7 +422,8 @@ class CAR(Platforms): 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])), ], - flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL + specs=KIA_NIRO_EV.specs, + 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", @@ -381,6 +431,7 @@ class CAR(Platforms): 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])), ], + specs=KIA_NIRO_EV.specs, flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR ) KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( @@ -389,37 +440,44 @@ class CAR(Platforms): HyundaiCarInfo("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], + specs=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])), + specs=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 - flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS + specs=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])), + specs=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])), + specs=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])), + specs=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])), + specs=CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), flags=HyundaiFlags.CHECKSUM_CRC8 ) KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( @@ -428,6 +486,8 @@ class CAR(Platforms): HyundaiCarInfo("Kia Sportage 2023", car_parts=CarParts.common([CarHarness.hyundai_n])), HyundaiCarInfo("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 + specs=CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), ) KIA_SORENTO = HyundaiPlatformConfig( "KIA SORENTO GT LINE 2018", @@ -436,11 +496,13 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=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( @@ -449,20 +511,24 @@ class CAR(Platforms): 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])), ], + specs=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", - car_parts=CarParts.common([CarHarness.hyundai_c])) + car_parts=CarParts.common([CarHarness.hyundai_c])), + specs=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])), + specs=KIA_STINGER.specs, ) KIA_CEED = HyundaiPlatformConfig( "KIA CEED INTRO ED 2019", HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e])), + specs=CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY ) KIA_EV6 = HyundaiCanFDPlatformConfig( @@ -472,6 +538,7 @@ class CAR(Platforms): 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])) ], + specs=CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV ) KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( @@ -480,6 +547,7 @@ class CAR(Platforms): 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])) ], + specs=CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), flags=HyundaiFlags.RADAR_SCC ) @@ -490,16 +558,19 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", HyundaiCarInfo("Genesis G70 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), + specs=CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR ) GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( @@ -508,20 +579,24 @@ class CAR(Platforms): 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])), ], + specs=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])), + specs=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])), + specs=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])), + specs=CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), flags=HyundaiFlags.RADAR_SCC ) From a5ee1638b8d4f7dde23b9160e26d715cd1420202 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 1 Mar 2024 13:32:31 -0500 Subject: [PATCH 339/923] Body: move to car specs (#31666) * specs * override * fixes 1 * fix 3 * fixes 4 * fixes * fixes * fixc * fix number 723124 * that too * fixes * aa * do body real quick too * body too --- selfdrive/car/body/interface.py | 4 ---- selfdrive/car/body/values.py | 3 ++- selfdrive/car/tests/test_platform_configs.py | 3 +-- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/selfdrive/car/body/interface.py b/selfdrive/car/body/interface.py index 12a2d5f304..4d72d2f604 100644 --- a/selfdrive/car/body/interface.py +++ b/selfdrive/car/body/interface.py @@ -14,14 +14,10 @@ class CarInterface(CarInterfaceBase): ret.minSteerSpeed = -math.inf ret.maxLateralAccel = math.inf # TODO: set to a reasonable value - ret.steerRatio = 0.5 ret.steerLimitTimer = 1.0 ret.steerActuatorDelay = 0. - ret.mass = 9 - ret.wheelbase = 0.406 ret.wheelSpeedFactor = SPEED_FROM_RPM - ret.centerToFront = ret.wheelbase * 0.44 ret.radarUnavailable = True ret.openpilotLongitudinalControl = True diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index 441905f28b..d0dd36e15f 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -1,5 +1,5 @@ from cereal import car -from openpilot.selfdrive.car import PlatformConfig, Platforms, dbc_dict +from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -24,6 +24,7 @@ class CAR(Platforms): "COMMA BODY", CarInfo("comma body", package="All"), dbc_dict('comma_body', None), + specs=CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44) ) diff --git a/selfdrive/car/tests/test_platform_configs.py b/selfdrive/car/tests/test_platform_configs.py index 931780963f..cca752705b 100755 --- a/selfdrive/car/tests/test_platform_configs.py +++ b/selfdrive/car/tests/test_platform_configs.py @@ -16,8 +16,7 @@ class TestPlatformConfigs(unittest.TestCase): self.assertIn("pt", platform.config.dbc_dict) self.assertTrue(len(platform.config.platform_str) > 0) - # enable when all cars have specs - #self.assertIsNotNone(platform.config.specs) + self.assertIsNotNone(platform.config.specs) if __name__ == "__main__": From b0eae8c1b7264b2d0c63ee2957689bc1317616f1 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 1 Mar 2024 14:31:51 -0500 Subject: [PATCH 340/923] platformconfig and carspecs are now required, carspecs no longer kwarg (#31667) * required * mock can be a platform! * default is mock * fix that * and that one --- selfdrive/car/__init__.py | 7 +- selfdrive/car/body/values.py | 2 +- selfdrive/car/car_helpers.py | 15 +- selfdrive/car/chrysler/values.py | 20 +-- selfdrive/car/ford/values.py | 16 +-- selfdrive/car/gm/values.py | 28 ++-- selfdrive/car/honda/values.py | 44 +++--- selfdrive/car/hyundai/values.py | 130 +++++++++--------- selfdrive/car/interfaces.py | 18 ++- selfdrive/car/mazda/values.py | 12 +- selfdrive/car/mock/values.py | 18 +-- selfdrive/car/nissan/values.py | 10 +- selfdrive/car/subaru/values.py | 30 ++-- selfdrive/car/tesla/values.py | 4 +- selfdrive/car/tests/test_platform_configs.py | 10 +- selfdrive/car/toyota/values.py | 68 ++++----- selfdrive/car/volkswagen/values.py | 56 ++++---- .../controls/tests/test_state_machine.py | 5 +- 18 files changed, 247 insertions(+), 246 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index b30f24dad7..c7af2da686 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -266,10 +266,11 @@ class CarSpecs: class PlatformConfig(Freezable): platform_str: str car_info: CarInfos - dbc_dict: DbcDict - flags: int = 0 + specs: CarSpecs - specs: CarSpecs | None = None + dbc_dict: DbcDict + + flags: int = 0 def __hash__(self) -> int: return hash(self.platform_str) diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index d0dd36e15f..82b00ee47d 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -23,8 +23,8 @@ class CAR(Platforms): BODY = PlatformConfig( "COMMA BODY", CarInfo("comma body", package="All"), + CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44), dbc_dict('comma_body', None), - specs=CarSpecs(mass=9, wheelbase=0.406, steerRatio=0.5, centerToFrontRatio=0.44) ) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 339be1912c..74499fbbb0 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -11,6 +11,7 @@ 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 from openpilot.selfdrive.car.fw_versions import get_fw_versions_ordered, get_present_ecus, match_fw_to_car, set_obd_multiplexing +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 @@ -191,7 +192,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, car_fingerprint) + car_platform = PLATFORMS.get(car_fingerprint, MOCK.MOCK) return car_platform, finger, vin, car_fw, source, exact_match @@ -212,14 +213,14 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): return CarInterface(CP, CarController, CarState), CP -def write_car_param(fingerprint="mock"): +def write_car_param(platform=MOCK.MOCK): params = Params() - CarInterface, _, _ = interfaces[fingerprint] - CP = CarInterface.get_non_essential_params(fingerprint) + CarInterface, _, _ = interfaces[platform] + CP = CarInterface.get_non_essential_params(platform) params.put("CarParams", CP.to_bytes()) def get_demo_car_params(): - fingerprint="mock" - CarInterface, _, _ = interfaces[fingerprint] - CP = CarInterface.get_non_essential_params(fingerprint) + platform = MOCK.MOCK + CarInterface, _, _ = interfaces[platform] + CP = CarInterface.get_non_essential_params(platform) return CP diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index d6bfd4e0cb..78b22bea45 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -35,22 +35,22 @@ class CAR(Platforms): PACIFICA_2017_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2017", ChryslerCarInfo("Chrysler Pacifica Hybrid 2017"), - specs=ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), + ChryslerCarSpecs(mass=2242., wheelbase=3.089, steerRatio=16.2), ) PACIFICA_2018_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2018", ChryslerCarInfo("Chrysler Pacifica Hybrid 2018"), - specs=PACIFICA_2017_HYBRID.specs, + PACIFICA_2017_HYBRID.specs, ) PACIFICA_2019_HYBRID = ChryslerPlatformConfig( "CHRYSLER PACIFICA HYBRID 2019", ChryslerCarInfo("Chrysler Pacifica Hybrid 2019-23"), - specs=PACIFICA_2017_HYBRID.specs, + PACIFICA_2017_HYBRID.specs, ) PACIFICA_2018 = ChryslerPlatformConfig( "CHRYSLER PACIFICA 2018", ChryslerCarInfo("Chrysler Pacifica 2017-18"), - specs=PACIFICA_2017_HYBRID.specs, + PACIFICA_2017_HYBRID.specs, ) PACIFICA_2020 = ChryslerPlatformConfig( "CHRYSLER PACIFICA 2020", @@ -58,35 +58,35 @@ class CAR(Platforms): ChryslerCarInfo("Chrysler Pacifica 2019-20"), ChryslerCarInfo("Chrysler Pacifica 2021-23", package="All"), ], - specs=PACIFICA_2017_HYBRID.specs, + PACIFICA_2017_HYBRID.specs, ) # Dodge DODGE_DURANGO = ChryslerPlatformConfig( "DODGE DURANGO 2021", ChryslerCarInfo("Dodge Durango 2020-21"), - specs=PACIFICA_2017_HYBRID.specs, + 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"), - specs=ChryslerCarSpecs(mass=1778., wheelbase=2.71, steerRatio=16.7), + 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"), - specs=JEEP_GRAND_CHEROKEE.specs, + JEEP_GRAND_CHEROKEE.specs, ) # Ram RAM_1500 = ChryslerPlatformConfig( "RAM 1500 5TH GEN", 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), - specs=ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), ) RAM_HD = ChryslerPlatformConfig( "RAM HD 5TH GEN", @@ -94,8 +94,8 @@ class CAR(Platforms): ChryslerCarInfo("Ram 2500 2020-24", car_parts=CarParts.common([CarHarness.ram])), ChryslerCarInfo("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), - specs=ChryslerCarSpecs(mass=3405., wheelbase=3.785, steerRatio=15.61, minSteerSpeed=16.), ) diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 985e7bc4b2..fe776fea72 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -87,7 +87,7 @@ class CAR(Platforms): BRONCO_SPORT_MK1 = FordPlatformConfig( "FORD BRONCO SPORT 1ST GEN", FordCarInfo("Ford Bronco Sport 2021-22"), - specs=CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), + CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) ESCAPE_MK4 = FordPlatformConfig( "FORD ESCAPE 4TH GEN", @@ -99,7 +99,7 @@ class CAR(Platforms): 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"), ], - specs=CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), + CarSpecs(mass=1750, wheelbase=2.71, steerRatio=16.7), ) EXPLORER_MK6 = FordPlatformConfig( "FORD EXPLORER 6TH GEN", @@ -109,7 +109,7 @@ class CAR(Platforms): FordCarInfo("Lincoln Aviator 2020-23", "Co-Pilot360 Plus"), FordCarInfo("Lincoln Aviator Plug-in Hybrid 2020-23", "Co-Pilot360 Plus"), # Grand Touring only ], - specs=CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), + CarSpecs(mass=2050, wheelbase=3.025, steerRatio=16.8), ) F_150_MK14 = FordCANFDPlatformConfig( "FORD F-150 14TH GEN", @@ -117,12 +117,12 @@ class CAR(Platforms): FordCarInfo("Ford F-150 2023", "Co-Pilot360 Active 2.0"), FordCarInfo("Ford F-150 Hybrid 2023", "Co-Pilot360 Active 2.0"), ], - specs=CarSpecs(mass=2000, wheelbase=3.69, steerRatio=17.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"), - specs=CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), + CarSpecs(mass=2948, wheelbase=3.70, steerRatio=16.9), ) FOCUS_MK4 = FordPlatformConfig( "FORD FOCUS 4TH GEN", @@ -130,7 +130,7 @@ class CAR(Platforms): 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 ], - specs=CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), + CarSpecs(mass=1350, wheelbase=2.7, steerRatio=15.0), ) MAVERICK_MK1 = FordPlatformConfig( "FORD MAVERICK 1ST GEN", @@ -140,12 +140,12 @@ class CAR(Platforms): FordCarInfo("Ford Maverick 2023", "Co-Pilot360 Assist"), FordCarInfo("Ford Maverick Hybrid 2023", "Co-Pilot360 Assist"), ], - specs=CarSpecs(mass=1650, wheelbase=3.076, steerRatio=17.0), + 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"), - specs=CarSpecs(mass=2200, wheelbase=2.984, steerRatio=17.0), # TODO: check steer ratio + 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 59b4b6ea30..e3414df2bf 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -88,52 +88,52 @@ class CAR(Platforms): HOLDEN_ASTRA = GMPlatformConfig( "HOLDEN ASTRA RS-V BK 2017", GMCarInfo("Holden Astra 2017"), - specs=CarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), + CarSpecs(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"), - specs=CarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45), + CarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45), ) CADILLAC_ATS = GMPlatformConfig( "CADILLAC ATS Premium Performance 2018", GMCarInfo("Cadillac ATS Premium Performance 2018"), - specs=CarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), + CarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) MALIBU = GMPlatformConfig( "CHEVROLET MALIBU PREMIER 2017", GMCarInfo("Chevrolet Malibu Premier 2017"), - specs=CarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), + CarSpecs(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"), - specs=CarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), + CarSpecs(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"), - specs=CarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), + CarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) BUICK_REGAL = GMPlatformConfig( "BUICK REGAL ESSENCE 2018", GMCarInfo("Buick Regal Essence 2018"), - specs=CarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), + CarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) ESCALADE = GMPlatformConfig( "CADILLAC ESCALADE 2017", GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"), - specs=CarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), + CarSpecs(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"), - specs=CarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3), + CarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3), ) ESCALADE_ESV_2019 = GMPlatformConfig( "CADILLAC ESCALADE ESV 2019", GMCarInfo("Cadillac Escalade ESV 2019", "Adaptive Cruise Control (ACC) & LKAS"), - specs=ESCALADE_ESV.specs, + ESCALADE_ESV.specs, ) BOLT_EUV = GMPlatformConfig( "CHEVROLET BOLT EUV 2022", @@ -141,7 +141,7 @@ class CAR(Platforms): 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"), ], - specs=CarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4), + CarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4), ) SILVERADO = GMPlatformConfig( "CHEVROLET SILVERADO 1500 2020", @@ -149,17 +149,17 @@ class CAR(Platforms): 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"), ], - specs=CarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3), + CarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3), ) EQUINOX = GMPlatformConfig( "CHEVROLET EQUINOX 2019", GMCarInfo("Chevrolet Equinox 2019-22"), - specs=CarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), + CarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) TRAILBLAZER = GMPlatformConfig( "CHEVROLET TRAILBLAZER 2021", GMCarInfo("Chevrolet Trailblazer 2021-22"), - specs=CarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4), + CarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4), ) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index abe710528c..5e2e6b52a0 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -116,8 +116,8 @@ class CAR(Platforms): 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), ], + CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39), # steerRatio: 11.82 is spec end-to-end dbc_dict('honda_accord_2018_can_generated', None), - specs=CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39), # steerRatio: 11.82 is spec end-to-end flags=HondaFlags.BOSCH, ) CIVIC_BOSCH = HondaPlatformConfig( @@ -127,15 +127,15 @@ class CAR(Platforms): 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), ], + 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), - specs=CarSpecs(mass=1326, wheelbase=2.7, steerRatio=15.38, centerToFrontRatio=0.4), # steerRatio: 10.93 is end-to-end spec flags=HondaFlags.BOSCH ) CIVIC_BOSCH_DIESEL = HondaPlatformConfig( "HONDA CIVIC SEDAN 1.6 DIESEL 2019", None, # don't show in docs + CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), - specs=CIVIC_BOSCH.specs, flags=HondaFlags.BOSCH ) CIVIC_2022 = HondaPlatformConfig( @@ -144,50 +144,50 @@ class CAR(Platforms): 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"), ], + CIVIC_BOSCH.specs, dbc_dict('honda_civic_ex_2022_can_generated', None), - specs=CIVIC_BOSCH.specs, flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS, ) CRV_5G = HondaPlatformConfig( "HONDA CR-V 2017", HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), + CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), - specs=CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end flags=HondaFlags.BOSCH, ) CRV_HYBRID = HondaPlatformConfig( "HONDA CR-V HYBRID 2019", HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), + CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41), # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end dbc_dict('honda_accord_2018_can_generated', None), - specs=CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41), # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end flags=HondaFlags.BOSCH ) HRV_3G = HondaPlatformConfig( "HONDA HR-V 2023", HondaCarInfo("Honda HR-V 2023", "All"), + CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), dbc_dict('honda_civic_ex_2022_can_generated', None), - specs=CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS ) ACURA_RDX_3G = HondaPlatformConfig( "ACURA RDX 2020", 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), # as spec dbc_dict('acura_rdx_2020_can_generated', None), - specs=CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41), # as spec flags=HondaFlags.BOSCH ) INSIGHT = HondaPlatformConfig( "HONDA INSIGHT 2019", 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), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), - specs=CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39), # as spec flags=HondaFlags.BOSCH ) HONDA_E = HondaPlatformConfig( "HONDA E 2020", 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), dbc_dict('acura_rdx_2020_can_generated', None), - specs=CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71), flags=HondaFlags.BOSCH ) @@ -195,64 +195,64 @@ class CAR(Platforms): ACURA_ILX = HondaPlatformConfig( "ACURA ILX 2016", 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), # 15.3 is spec end-to-end dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=3095 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=18.61, centerToFrontRatio=0.37), # 15.3 is spec end-to-end flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV = HondaPlatformConfig( "HONDA CR-V 2016", 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), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CRV_EU = HondaPlatformConfig( "HONDA CR-V EU 2016", None, # Euro version of CRV Touring, don't show in docs + CRV.specs, dbc_dict('honda_crv_executive_2016_can_generated', 'acura_ilx_2016_nidec'), - specs=CRV.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FIT = HondaPlatformConfig( "HONDA FIT 2018", 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), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=2644 * CV.LB_TO_KG, wheelbase=2.53, steerRatio=13.06, centerToFrontRatio=0.39), flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) FREED = HondaPlatformConfig( "HONDA FREED 2020", 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), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39), # mostly copied from FIT flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) HRV = HondaPlatformConfig( "HONDA HRV 2019", 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'), - specs=HRV_3G.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) ODYSSEY = HondaPlatformConfig( "HONDA ODYSSEY 2018", HondaCarInfo("Honda Odyssey 2018-20"), + CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41), flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_PCM_ACCEL ) ODYSSEY_CHN = HondaPlatformConfig( "HONDA ODYSSEY CHN 2019", None, # 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'), - specs=ODYSSEY.specs, flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES ) ACURA_RDX = HondaPlatformConfig( "ACURA RDX 2018", 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), # as spec dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) PILOT = HondaPlatformConfig( @@ -261,22 +261,22 @@ class CAR(Platforms): 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), ], + CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) RIDGELINE = HondaPlatformConfig( "HONDA RIDGELINE 2017", 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), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - specs=CarSpecs(mass=4515 * CV.LB_TO_KG, wheelbase=3.18, centerToFrontRatio=0.41, steerRatio=15.59), # as spec flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) CIVIC = HondaPlatformConfig( "HONDA CIVIC 2016", 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'), - specs=CarSpecs(mass=1326, wheelbase=2.70, centerToFrontRatio=0.4, steerRatio=15.38), # 10.93 is end-to-end spec flags=HondaFlags.NIDEC | HondaFlags.AUTORESUME_SNG | HondaFlags.ELECTRIC_PARKING_BRAKE, ) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index ef17ffc4bf..8802a36f46 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -138,7 +138,7 @@ class CAR(Platforms): AZERA_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA 6TH GEN", HyundaiCarInfo("Hyundai Azera 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), - specs=CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), + CarSpecs(mass=1600, wheelbase=2.885, steerRatio=14.5), ) AZERA_HEV_6TH_GEN = HyundaiPlatformConfig( "HYUNDAI AZERA HYBRID 6TH GEN", @@ -146,7 +146,7 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), + CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), flags=HyundaiFlags.HYBRID ) ELANTRA = HyundaiPlatformConfig( @@ -157,7 +157,7 @@ class CAR(Platforms): HyundaiCarInfo("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 - specs=CarSpecs(mass=1275, wheelbase=2.7, steerRatio=15.4, tireStiffnessFactor=0.385), + 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( @@ -166,20 +166,20 @@ class CAR(Platforms): 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])), ], - specs=ELANTRA.specs, + 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])), - specs=CarSpecs(mass=2800*CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), + 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])), - specs=CarSpecs(mass=3017 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), + 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( @@ -189,120 +189,120 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5, minSteerSpeed=60 * CV.KPH_TO_MS), + 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])), - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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, - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1275, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1743, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385), + 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, - specs=CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), + 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])), - specs=CarSpecs(mass=3982 * CV.LB_TO_KG, wheelbase=2.766, steerRatio=16.55, tireStiffnessFactor=0.82), + 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])), - specs=SANTA_FE.specs, + 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])), - specs=SANTA_FE.specs, + 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])), - specs=SANTA_FE.specs, + 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])), - specs=CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable + 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])), - specs=CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable + 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])), - specs=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 + 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", @@ -310,7 +310,7 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), + CarSpecs(mass=3520 * CV.LB_TO_KG, wheelbase=2.67, steerRatio=16.1, tireStiffnessFactor=0.385), flags=HyundaiFlags.TCU_GEARS ) PALISADE = HyundaiPlatformConfig( @@ -319,19 +319,19 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1999, wheelbase=2.9, steerRatio=15.6 * 1.15, tireStiffnessFactor=0.63), + 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])), - specs=CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor = 0.5), + 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])), - specs=SONATA.specs, + SONATA.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID ) IONIQ_5 = HyundaiCanFDPlatformConfig( @@ -341,13 +341,13 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65), + 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])), - specs=IONIQ_5.specs, + IONIQ_5.specs, flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE ) TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( @@ -357,18 +357,18 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1630, wheelbase=2.756, steerRatio=16, tireStiffnessFactor=0.385), + 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-23", 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 - specs=CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2), + 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])), - specs=CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner + 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 ) @@ -379,25 +379,25 @@ class CAR(Platforms): HyundaiCarInfo("Kia Forte 2019-21", car_parts=CarParts.common([CarHarness.hyundai_g])), HyundaiCarInfo("Kia Forte 2023", car_parts=CarParts.common([CarHarness.hyundai_e])), ], - specs=CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5) + 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])), - specs=CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims) + 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])), - specs=KIA_K5_2021.specs, + 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])), # mass: https://carprices.ae/brands/kia/2023/k8/1.6-turbo-hybrid, steerRatio: guesstimate from K5 platform - specs=CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) + CarSpecs(mass=1630, wheelbase=2.895, steerRatio=13.27) ) KIA_NIRO_EV = HyundaiPlatformConfig( "KIA NIRO EV 2020", @@ -407,13 +407,13 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=3543 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=13.6, tireStiffnessFactor=0.385), # average of all the cars + 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])), - specs=KIA_NIRO_EV.specs, + KIA_NIRO_EV.specs, flags=HyundaiFlags.EV ) KIA_NIRO_PHEV = HyundaiPlatformConfig( @@ -422,7 +422,7 @@ class CAR(Platforms): 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])), ], - specs=KIA_NIRO_EV.specs, + KIA_NIRO_EV.specs, flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.MIN_STEER_32_MPH ) KIA_NIRO_PHEV_2022 = HyundaiPlatformConfig( @@ -431,7 +431,7 @@ class CAR(Platforms): 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])), ], - specs=KIA_NIRO_EV.specs, + KIA_NIRO_EV.specs, flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR ) KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( @@ -440,44 +440,44 @@ class CAR(Platforms): HyundaiCarInfo("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], - specs=KIA_NIRO_EV.specs, + 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])), - specs=KIA_NIRO_EV.specs, + 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 - specs=CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + 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])), - specs=CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + 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])), - specs=CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + 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])), - specs=CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), + 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])), - specs=CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), + CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), flags=HyundaiFlags.CHECKSUM_CRC8 ) KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( @@ -487,7 +487,7 @@ class CAR(Platforms): HyundaiCarInfo("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 - specs=CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), + CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6), ) KIA_SORENTO = HyundaiPlatformConfig( "KIA SORENTO GT LINE 2018", @@ -496,13 +496,13 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1985, wheelbase=2.78, steerRatio=14.4 * 1.1), # 10% higher at the center seems reasonable + 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])), - specs=CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms + 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( @@ -511,24 +511,24 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms + 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", car_parts=CarParts.common([CarHarness.hyundai_c])), - specs=CarSpecs(mass=1825, wheelbase=2.78, steerRatio=14.4 * 1.15) # 15% higher at the center seems reasonable + 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])), - specs=KIA_STINGER.specs, + KIA_STINGER.specs, ) KIA_CEED = HyundaiPlatformConfig( "KIA CEED INTRO ED 2019", HyundaiCarInfo("Kia Ceed 2019", car_parts=CarParts.common([CarHarness.hyundai_e])), - specs=CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), + CarSpecs(mass=1450, wheelbase=2.65, steerRatio=13.75, tireStiffnessFactor=0.5), flags=HyundaiFlags.LEGACY ) KIA_EV6 = HyundaiCanFDPlatformConfig( @@ -538,7 +538,7 @@ class CAR(Platforms): 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])) ], - specs=CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), + CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65), flags=HyundaiFlags.EV ) KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( @@ -547,7 +547,7 @@ class CAR(Platforms): 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])) ], - specs=CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), + CarSpecs(mass=2087, wheelbase=3.09, steerRatio=14.23), flags=HyundaiFlags.RADAR_SCC ) @@ -558,19 +558,19 @@ class CAR(Platforms): 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])), ], - specs=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. + 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])), - specs=CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), + CarSpecs(mass=1640, wheelbase=2.84, steerRatio=13.56), flags=HyundaiFlags.LEGACY ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", HyundaiCarInfo("Genesis G70 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), - specs=CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), + CarSpecs(mass=3673 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=12.9), flags=HyundaiFlags.MANDO_RADAR ) GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( @@ -579,24 +579,24 @@ class CAR(Platforms): 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])), ], - specs=CarSpecs(mass=1950, wheelbase=2.87, steerRatio=14.6), + 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])), - specs=CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5), + 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])), - specs=CarSpecs(mass=2200, wheelbase=3.15, steerRatio=12.069), + 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])), - specs=CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), + CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14), flags=HyundaiFlags.RADAR_SCC ) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 98b3c63ec7..9a78eea856 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -112,16 +112,14 @@ class CarInterfaceBase(ABC): def get_params(cls, candidate: Platform, fingerprint: dict[int, dict[int, int]], car_fw: list[car.CarParams.CarFw], experimental_long: bool, docs: bool): ret = CarInterfaceBase.get_std_params(candidate) - if hasattr(candidate, "config"): - if candidate.config.specs is not None: - 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 = 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 = cls._get_params(ret, candidate, fingerprint, car_fw, experimental_long, docs) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 5597e9f52f..f45e80c119 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -48,32 +48,32 @@ class CAR(Platforms): CX5 = MazdaPlatformConfig( "MAZDA CX-5", MazdaCarInfo("Mazda CX-5 2017-21"), - specs=CarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) + CarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) CX9 = MazdaPlatformConfig( "MAZDA CX-9", MazdaCarInfo("Mazda CX-9 2016-20"), - specs=CarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) + CarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) MAZDA3 = MazdaPlatformConfig( "MAZDA 3", MazdaCarInfo("Mazda 3 2017-18"), - specs=CarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) + CarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) MAZDA6 = MazdaPlatformConfig( "MAZDA 6", MazdaCarInfo("Mazda 6 2017-20"), - specs=CarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) + CarSpecs(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"), - specs=CX9.specs + CX9.specs ) CX5_2022 = MazdaPlatformConfig( "MAZDA CX-5 2022", MazdaCarInfo("Mazda CX-5 2022-24"), - specs=CX5.specs, + CX5.specs, ) diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index e75665c98f..74e8bb5fc9 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -1,12 +1,14 @@ -from enum import StrEnum - -from openpilot.selfdrive.car.docs_definitions import CarInfo +from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms -class CAR(StrEnum): - MOCK = 'mock' + +class CAR(Platforms): + MOCK = PlatformConfig( + 'mock', + None, + CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13), + {} + ) -CAR_INFO: dict[str, CarInfo | list[CarInfo] | None] = { - CAR.MOCK: None, -} +CAR_INFO = CAR.create_carinfo_map() diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index 7af1700e0b..cb7289389b 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -40,13 +40,13 @@ class CAR(Platforms): XTRAIL = NissanPlaformConfig( "NISSAN X-TRAIL 2017", NissanCarInfo("Nissan X-Trail 2017"), - specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + NissanCarSpecs(mass=1610, wheelbase=2.705) ) LEAF = NissanPlaformConfig( "NISSAN LEAF 2018", NissanCarInfo("Nissan Leaf 2018-23", video_link="https://youtu.be/vaMbtAh_0cY"), - dbc_dict=dbc_dict('nissan_leaf_2018_generated', None), - specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + 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. @@ -54,12 +54,12 @@ class CAR(Platforms): ROGUE = NissanPlaformConfig( "NISSAN ROGUE 2019", NissanCarInfo("Nissan Rogue 2018-20"), - specs=NissanCarSpecs(mass=1610, wheelbase=2.705) + NissanCarSpecs(mass=1610, wheelbase=2.705) ) ALTIMA = NissanPlaformConfig( "NISSAN ALTIMA 2020", NissanCarInfo("Nissan Altima 2019-20", car_parts=CarParts.common([CarHarness.nissan_b])), - specs=NissanCarSpecs(mass=1492, wheelbase=2.824) + NissanCarSpecs(mass=1492, wheelbase=2.824) ) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index c2b2d16d7f..5668678225 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -123,17 +123,17 @@ class CAR(Platforms): ASCENT = SubaruPlatformConfig( "SUBARU ASCENT LIMITED 2019", SubaruCarInfo("Subaru Ascent 2019-21", "All"), - specs=CarSpecs(mass=2031, wheelbase=2.89, steerRatio=13.5), + 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])), - specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), + 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])), - specs=OUTBACK.specs, + OUTBACK.specs, ) IMPREZA = SubaruPlatformConfig( "SUBARU IMPREZA LIMITED 2019", @@ -142,7 +142,7 @@ class CAR(Platforms): 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"), ], - specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=15), ) IMPREZA_2020 = SubaruPlatformConfig( "SUBARU IMPREZA SPORT 2020", @@ -151,74 +151,74 @@ class CAR(Platforms): SubaruCarInfo("Subaru Crosstrek 2020-23"), SubaruCarInfo("Subaru XV 2020-21"), ], - specs=CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), + CarSpecs(mass=1480, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.STEER_RATE_LIMITED, ) # 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])), - specs=CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), + CarSpecs(mass=1668, wheelbase=2.67, steerRatio=17), flags=SubaruFlags.HYBRID, ) FORESTER = SubaruPlatformConfig( "SUBARU FORESTER 2019", SubaruCarInfo("Subaru Forester 2019-21", "All"), - specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=17), + 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"), - specs=FORESTER.specs, + FORESTER.specs, flags=SubaruFlags.HYBRID, ) # Pre-global FORESTER_PREGLOBAL = SubaruPlatformConfig( "SUBARU FORESTER 2017 - 2018", SubaruCarInfo("Subaru Forester 2017-18"), + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), dbc_dict('subaru_forester_2017_generated', None), - specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=20), flags=SubaruFlags.PREGLOBAL, ) LEGACY_PREGLOBAL = SubaruPlatformConfig( "SUBARU LEGACY 2015 - 2018", SubaruCarInfo("Subaru Legacy 2015-18"), + CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), dbc_dict('subaru_outback_2015_generated', None), - specs=CarSpecs(mass=1568, wheelbase=2.67, steerRatio=12.5), flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL = SubaruPlatformConfig( "SUBARU OUTBACK 2015 - 2017", SubaruCarInfo("Subaru Outback 2015-17"), + FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2015_generated', None), - specs=FORESTER_PREGLOBAL.specs, flags=SubaruFlags.PREGLOBAL, ) OUTBACK_PREGLOBAL_2018 = SubaruPlatformConfig( "SUBARU OUTBACK 2018 - 2019", SubaruCarInfo("Subaru Outback 2018-19"), + FORESTER_PREGLOBAL.specs, dbc_dict('subaru_outback_2019_generated', None), - specs=FORESTER_PREGLOBAL.specs, flags=SubaruFlags.PREGLOBAL, ) # Angle LKAS FORESTER_2022 = SubaruPlatformConfig( "SUBARU FORESTER 2022", SubaruCarInfo("Subaru Forester 2022-24", "All", car_parts=CarParts.common([CarHarness.subaru_c])), - specs=FORESTER.specs, + 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])), - specs=OUTBACK.specs, + OUTBACK.specs, flags=SubaruFlags.LKAS_ANGLE, ) ASCENT_2023 = SubaruGen2PlatformConfig( "SUBARU ASCENT 2023", SubaruCarInfo("Subaru Ascent 2023", "All", car_parts=CarParts.common([CarHarness.subaru_d])), - specs=ASCENT.specs, + ASCENT.specs, flags=SubaruFlags.LKAS_ANGLE, ) diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 74d2debe1f..3104506e5b 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -20,12 +20,12 @@ class CAR(Platforms): AP1_MODELS = TeslaPlatformConfig( 'TESLA AP1 MODEL S', CarInfo("Tesla AP1 Model S", "All"), - specs=CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0) + CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0) ) AP2_MODELS = TeslaPlatformConfig( 'TESLA AP2 MODEL S', CarInfo("Tesla AP2 Model S", "All"), - specs=AP1_MODELS.specs + AP1_MODELS.specs ) diff --git a/selfdrive/car/tests/test_platform_configs.py b/selfdrive/car/tests/test_platform_configs.py index cca752705b..6a3bafa390 100755 --- a/selfdrive/car/tests/test_platform_configs.py +++ b/selfdrive/car/tests/test_platform_configs.py @@ -10,13 +10,11 @@ class TestPlatformConfigs(unittest.TestCase): for platform in PLATFORMS.values(): with self.subTest(platform=str(platform)): - if hasattr(platform, "config"): + self.assertTrue(platform.config._frozen) + self.assertIn("pt", platform.config.dbc_dict) + self.assertTrue(len(platform.config.platform_str) > 0) - self.assertTrue(platform.config._frozen) - self.assertIn("pt", platform.config.dbc_dict) - self.assertTrue(len(platform.config.platform_str) > 0) - - self.assertIsNotNone(platform.config.specs) + self.assertIsNotNone(platform.config.specs) if __name__ == "__main__": diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 09d6082f67..9989b9225a 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -88,7 +88,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Alphard 2019-20"), ToyotaCarInfo("Toyota Alphard Hybrid 2021"), ], - specs=CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), + CarSpecs(mass=4305. * CV.LB_TO_KG, wheelbase=3.0, steerRatio=14.2, tireStiffnessFactor=0.444), ) AVALON = PlatformConfig( "TOYOTA AVALON 2016", @@ -96,8 +96,8 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Avalon 2016", "Toyota Safety Sense P"), ToyotaCarInfo("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'), - specs=CarSpecs(mass=3505. * CV.LB_TO_KG, wheelbase=2.82, steerRatio=14.8, tireStiffnessFactor=0.7983), ) AVALON_2019 = PlatformConfig( "TOYOTA AVALON 2019", @@ -105,8 +105,8 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Avalon 2019-21"), ToyotaCarInfo("Toyota Avalon Hybrid 2019-21"), ], + AVALON.specs, dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - specs=AVALON.specs, ) AVALON_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA AVALON 2022", # TSS 2.5 @@ -114,7 +114,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Avalon 2022"), ToyotaCarInfo("Toyota Avalon Hybrid 2022"), ], - specs=AVALON.specs, + AVALON.specs, ) CAMRY = PlatformConfig( "TOYOTA CAMRY 2018", @@ -122,9 +122,9 @@ class CAR(Platforms): 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"), ], + CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_DSU, - specs=CarSpecs(mass=3400. * CV.LB_TO_KG, wheelbase=2.82448, steerRatio=13.7, tireStiffnessFactor=0.7933), ) CAMRY_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA CAMRY 2021", # TSS 2.5 @@ -132,7 +132,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Camry 2021-24", footnotes=[Footnote.CAMRY]), ToyotaCarInfo("Toyota Camry Hybrid 2021-24"), ], - specs=CAMRY.specs, + CAMRY.specs, ) CHR = PlatformConfig( "TOYOTA C-HR 2018", @@ -140,9 +140,9 @@ class CAR(Platforms): ToyotaCarInfo("Toyota C-HR 2017-20"), ToyotaCarInfo("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'), flags=ToyotaFlags.NO_DSU, - specs=CarSpecs(mass=3300. * CV.LB_TO_KG, wheelbase=2.63906, steerRatio=13.6, tireStiffnessFactor=0.7933), ) CHR_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA C-HR 2021", @@ -150,14 +150,14 @@ class CAR(Platforms): ToyotaCarInfo("Toyota C-HR 2021"), ToyotaCarInfo("Toyota C-HR Hybrid 2021-22"), ], + CHR.specs, flags=ToyotaFlags.RADAR_ACC, - specs=CHR.specs, ) COROLLA = PlatformConfig( "TOYOTA COROLLA 2017", 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'), - specs=CarSpecs(mass=2860. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=18.27, tireStiffnessFactor=0.444), ) # LSS2 Lexus UX Hybrid is same as a TSS2 Corolla Hybrid COROLLA_TSS2 = ToyotaTSS2PlatformConfig( @@ -172,7 +172,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Corolla Cross Hybrid (Non-US only) 2020-22", min_enable_speed=7.5), ToyotaCarInfo("Lexus UX Hybrid 2019-23"), ], - specs=CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), + CarSpecs(mass=3060. * CV.LB_TO_KG, wheelbase=2.67, steerRatio=13.9, tireStiffnessFactor=0.444), ) HIGHLANDER = PlatformConfig( "TOYOTA HIGHLANDER 2017", @@ -180,9 +180,9 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Highlander 2017-19", video_link="https://www.youtube.com/watch?v=0wS0wXSLzoo"), ToyotaCarInfo("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'), flags=ToyotaFlags.NO_STOP_TIMER, - specs=CarSpecs(mass=4516. * CV.LB_TO_KG, wheelbase=2.8194, steerRatio=16.0, tireStiffnessFactor=0.8), ) HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA HIGHLANDER 2020", @@ -190,7 +190,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota Highlander 2020-23"), ToyotaCarInfo("Toyota Highlander Hybrid 2020-23"), ], - specs=HIGHLANDER.specs, + HIGHLANDER.specs, ) PRIUS = PlatformConfig( "TOYOTA PRIUS 2017", @@ -199,15 +199,15 @@ class CAR(Platforms): 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"), ], + CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), dbc_dict('toyota_nodsu_pt_generated', 'toyota_adas'), - specs=CarSpecs(mass=3045. * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.74, tireStiffnessFactor=0.6371), ) PRIUS_V = PlatformConfig( "TOYOTA PRIUS v 2017", 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, - specs=CarSpecs(mass=3340. * CV.LB_TO_KG, wheelbase=2.78, steerRatio=17.4, tireStiffnessFactor=0.5533), ) PRIUS_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA PRIUS TSS2 2021", @@ -215,7 +215,7 @@ class CAR(Platforms): 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"), ], - specs=CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), + CarSpecs(mass=3115. * CV.LB_TO_KG, wheelbase=2.70002, steerRatio=13.4, tireStiffnessFactor=0.6371), ) RAV4 = PlatformConfig( "TOYOTA RAV4 2017", @@ -223,8 +223,8 @@ class CAR(Platforms): ToyotaCarInfo("Toyota RAV4 2016", "Toyota Safety Sense P"), ToyotaCarInfo("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'), - specs=CarSpecs(mass=3650. * CV.LB_TO_KG, wheelbase=2.65, steerRatio=16.88, tireStiffnessFactor=0.5533), ) RAV4H = PlatformConfig( "TOYOTA RAV4 HYBRID 2017", @@ -232,9 +232,9 @@ class CAR(Platforms): 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") ], + RAV4.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.NO_STOP_TIMER, - specs=RAV4.specs, ) RAV4_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2019", @@ -242,7 +242,7 @@ class CAR(Platforms): ToyotaCarInfo("Toyota RAV4 2019-21", video_link="https://www.youtube.com/watch?v=wJxjDd42gGA"), ToyotaCarInfo("Toyota RAV4 Hybrid 2019-21"), ], - specs=CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), + CarSpecs(mass=3585. * CV.LB_TO_KG, wheelbase=2.68986, steerRatio=14.3, tireStiffnessFactor=0.7933), ) RAV4_TSS2_2022 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2022", @@ -250,8 +250,8 @@ class CAR(Platforms): ToyotaCarInfo("Toyota RAV4 2022"), ToyotaCarInfo("Toyota RAV4 Hybrid 2022", video_link="https://youtu.be/U0nH9cnrFB0"), ], + RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC, - specs=RAV4_TSS2.specs, ) RAV4_TSS2_2023 = ToyotaTSS2PlatformConfig( "TOYOTA RAV4 2023", @@ -259,28 +259,28 @@ class CAR(Platforms): ToyotaCarInfo("Toyota RAV4 2023-24"), ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), ], + RAV4_TSS2.specs, flags=ToyotaFlags.RADAR_ACC | ToyotaFlags.ANGLE_CONTROL, - specs=RAV4_TSS2.specs, ) MIRAI = ToyotaTSS2PlatformConfig( "TOYOTA MIRAI 2021", # TSS 2.5 ToyotaCarInfo("Toyota Mirai 2021"), - specs=CarSpecs(mass=4300. * CV.LB_TO_KG, wheelbase=2.91, steerRatio=14.8, tireStiffnessFactor=0.8), + 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), + 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, - specs=CarSpecs(mass=4590. * CV.LB_TO_KG, wheelbase=3.03, steerRatio=15.5, tireStiffnessFactor=0.444), ) # Lexus LEXUS_CTH = PlatformConfig( "LEXUS CT HYBRID 2018", 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'), - specs=CarSpecs(mass=3108. * CV.LB_TO_KG, wheelbase=2.6, steerRatio=18.6, tireStiffnessFactor=0.517), ) LEXUS_ES = PlatformConfig( "LEXUS ES 2018", @@ -288,8 +288,8 @@ class CAR(Platforms): ToyotaCarInfo("Lexus ES 2017-18"), ToyotaCarInfo("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'), - specs=CarSpecs(mass=3677. * CV.LB_TO_KG, wheelbase=2.8702, steerRatio=16.0, tireStiffnessFactor=0.444), ) LEXUS_ES_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS ES 2019", @@ -297,19 +297,19 @@ class CAR(Platforms): ToyotaCarInfo("Lexus ES 2019-24"), ToyotaCarInfo("Lexus ES Hybrid 2019-24", video_link="https://youtu.be/BZ29osRVJeg?t=12"), ], - specs=LEXUS_ES.specs, + LEXUS_ES.specs, ) LEXUS_IS = PlatformConfig( "LEXUS IS 2018", 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, - specs=CarSpecs(mass=3736.8 * CV.LB_TO_KG, wheelbase=2.79908, steerRatio=13.3, tireStiffnessFactor=0.444), ) LEXUS_IS_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS IS 2023", ToyotaCarInfo("Lexus IS 2022-23"), - specs=LEXUS_IS.specs, + LEXUS_IS.specs, ) LEXUS_NX = PlatformConfig( "LEXUS NX 2018", @@ -317,8 +317,8 @@ class CAR(Platforms): ToyotaCarInfo("Lexus NX 2018-19"), ToyotaCarInfo("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'), - specs=CarSpecs(mass=4070. * CV.LB_TO_KG, wheelbase=2.66, steerRatio=14.7, tireStiffnessFactor=0.444), ) LEXUS_NX_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS NX 2020", @@ -326,19 +326,19 @@ class CAR(Platforms): ToyotaCarInfo("Lexus NX 2020-21"), ToyotaCarInfo("Lexus NX Hybrid 2020-21"), ], - specs=LEXUS_NX.specs, + LEXUS_NX.specs, ) LEXUS_LC_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS LC 2024", ToyotaCarInfo("Lexus LC 2024"), - specs=CarSpecs(mass=4500. * CV.LB_TO_KG, wheelbase=2.87, steerRatio=13.0, tireStiffnessFactor=0.444), + 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"), + LEXUS_IS.specs, dbc_dict('toyota_tnga_k_pt_generated', 'toyota_adas'), flags=ToyotaFlags.UNSUPPORTED_DSU, - specs=LEXUS_IS.specs, ) LEXUS_RX = PlatformConfig( "LEXUS RX 2016", @@ -349,8 +349,8 @@ class CAR(Platforms): ToyotaCarInfo("Lexus RX Hybrid 2016", "Lexus Safety System+"), ToyotaCarInfo("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'), - specs=CarSpecs(mass=4481. * CV.LB_TO_KG, wheelbase=2.79, steerRatio=16., tireStiffnessFactor=0.5533), ) LEXUS_RX_TSS2 = ToyotaTSS2PlatformConfig( "LEXUS RX 2020", @@ -358,14 +358,14 @@ class CAR(Platforms): ToyotaCarInfo("Lexus RX 2020-22"), ToyotaCarInfo("Lexus RX Hybrid 2020-22"), ], - specs=LEXUS_RX.specs, + LEXUS_RX.specs, ) LEXUS_GS_F = PlatformConfig( "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, - specs=CarSpecs(mass=4034. * CV.LB_TO_KG, wheelbase=2.84988, steerRatio=13.3, tireStiffnessFactor=0.444), ) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 86788dcf64..4bd5edda2c 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -184,7 +184,7 @@ class CAR(Platforms): VWCarInfo("Volkswagen Arteon eHybrid 2020-23", video_link="https://youtu.be/FAomFKPFlDA"), VWCarInfo("Volkswagen CC 2018-22", video_link="https://youtu.be/FAomFKPFlDA"), ], - specs=VolkswagenCarSpecs(mass=1733, wheelbase=2.84), + VolkswagenCarSpecs(mass=1733, wheelbase=2.84), ) ATLAS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN ATLAS 1ST GEN", # Chassis CA @@ -195,7 +195,7 @@ class CAR(Platforms): VWCarInfo("Volkswagen Teramont Cross Sport 2021-22"), VWCarInfo("Volkswagen Teramont X 2021-22"), ], - specs=VolkswagenCarSpecs(mass=2011, wheelbase=2.98), + VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) CRAFTER_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN CRAFTER 2ND GEN", # Chassis SY/SZ @@ -206,7 +206,7 @@ class CAR(Platforms): VWCarInfo("MAN TGE 2017-23", video_link="https://youtu.be/4100gLeabmo"), VWCarInfo("MAN eTGE 2020-23", video_link="https://youtu.be/4100gLeabmo"), ], - specs=VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), + VolkswagenCarSpecs(mass=2100, wheelbase=3.64, minSteerSpeed=50 * CV.KPH_TO_MS), ) GOLF_MK7 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN GOLF 7TH GEN", # Chassis 5G/AU/BA/BE @@ -220,7 +220,7 @@ class CAR(Platforms): VWCarInfo("Volkswagen Golf R 2015-19"), VWCarInfo("Volkswagen Golf SportsVan 2015-20"), ], - specs=VolkswagenCarSpecs(mass=1397, wheelbase=2.62), + VolkswagenCarSpecs(mass=1397, wheelbase=2.62), ) JETTA_MK7 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN JETTA 7TH GEN", # Chassis BU @@ -228,7 +228,7 @@ class CAR(Platforms): VWCarInfo("Volkswagen Jetta 2018-24"), VWCarInfo("Volkswagen Jetta GLI 2021-24"), ], - specs=VolkswagenCarSpecs(mass=1328, wheelbase=2.71), + VolkswagenCarSpecs(mass=1328, wheelbase=2.71), ) PASSAT_MK8 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN PASSAT 8TH GEN", # Chassis 3G @@ -237,12 +237,12 @@ class CAR(Platforms): VWCarInfo("Volkswagen Passat Alltrack 2015-22"), VWCarInfo("Volkswagen Passat GTE 2015-22"), ], - specs=VolkswagenCarSpecs(mass=1551, wheelbase=2.79), + VolkswagenCarSpecs(mass=1551, wheelbase=2.79), ) PASSAT_NMS = VolkswagenPQPlatformConfig( "VOLKSWAGEN PASSAT NMS", # Chassis A3 VWCarInfo("Volkswagen Passat NMS 2017-22"), - specs=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), ) POLO_MK6 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN POLO 6TH GEN", # Chassis AW @@ -250,7 +250,7 @@ class CAR(Platforms): VWCarInfo("Volkswagen Polo 2018-23", footnotes=[Footnote.VW_MQB_A0]), VWCarInfo("Volkswagen Polo GTI 2018-23", footnotes=[Footnote.VW_MQB_A0]), ], - specs=VolkswagenCarSpecs(mass=1230, wheelbase=2.55), + VolkswagenCarSpecs(mass=1230, wheelbase=2.55), ) SHARAN_MK2 = VolkswagenPQPlatformConfig( "VOLKSWAGEN SHARAN 2ND GEN", # Chassis 7N @@ -258,17 +258,17 @@ class CAR(Platforms): VWCarInfo("Volkswagen Sharan 2018-22"), VWCarInfo("SEAT Alhambra 2018-20"), ], - specs=VolkswagenCarSpecs(mass=1639, wheelbase=2.92, minSteerSpeed=50*CV.KPH_TO_MS), + 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"), - specs=VolkswagenCarSpecs(mass=1498, wheelbase=2.69), + VolkswagenCarSpecs(mass=1498, wheelbase=2.69), ) TCROSS_MK1 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN T-CROSS 1ST GEN", # Chassis C1 - car_info=VWCarInfo("Volkswagen T-Cross 2021", footnotes=[Footnote.VW_MQB_A0]), - specs=VolkswagenCarSpecs(mass=1150, wheelbase=2.60), + VWCarInfo("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 @@ -276,12 +276,12 @@ class CAR(Platforms): VWCarInfo("Volkswagen Tiguan 2018-24"), VWCarInfo("Volkswagen Tiguan eHybrid 2021-23"), ], - specs=VolkswagenCarSpecs(mass=1715, wheelbase=2.74), + VolkswagenCarSpecs(mass=1715, wheelbase=2.74), ) TOURAN_MK2 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TOURAN 2ND GEN", # Chassis 1T VWCarInfo("Volkswagen Touran 2016-23"), - specs=VolkswagenCarSpecs(mass=1516, wheelbase=2.79), + VolkswagenCarSpecs(mass=1516, wheelbase=2.79), ) TRANSPORTER_T61 = VolkswagenMQBPlatformConfig( "VOLKSWAGEN TRANSPORTER T6.1", # Chassis 7H/7L @@ -289,12 +289,12 @@ class CAR(Platforms): VWCarInfo("Volkswagen Caravelle 2020"), VWCarInfo("Volkswagen California 2021-23"), ], - specs=VolkswagenCarSpecs(mass=1926, wheelbase=3.00, minSteerSpeed=14.0), + 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]), - specs=VolkswagenCarSpecs(mass=1413, wheelbase=2.63), + VolkswagenCarSpecs(mass=1413, wheelbase=2.63), ) AUDI_A3_MK3 = VolkswagenMQBPlatformConfig( "AUDI A3 3RD GEN", # Chassis 8V/FF @@ -304,47 +304,47 @@ class CAR(Platforms): VWCarInfo("Audi RS3 2018"), VWCarInfo("Audi S3 2015-17"), ], - specs=VolkswagenCarSpecs(mass=1335, wheelbase=2.61), + VolkswagenCarSpecs(mass=1335, wheelbase=2.61), ) AUDI_Q2_MK1 = VolkswagenMQBPlatformConfig( "AUDI Q2 1ST GEN", # Chassis GA VWCarInfo("Audi Q2 2018"), - specs=VolkswagenCarSpecs(mass=1205, wheelbase=2.61), + VolkswagenCarSpecs(mass=1205, wheelbase=2.61), ) AUDI_Q3_MK2 = VolkswagenMQBPlatformConfig( "AUDI Q3 2ND GEN", # Chassis 8U/F3/FS VWCarInfo("Audi Q3 2019-23"), - specs=VolkswagenCarSpecs(mass=1623, wheelbase=2.68), + VolkswagenCarSpecs(mass=1623, wheelbase=2.68), ) SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( "SEAT ATECA 1ST GEN", # Chassis 5F VWCarInfo("SEAT Ateca 2018"), - specs=VolkswagenCarSpecs(mass=1900, wheelbase=2.64), + VolkswagenCarSpecs(mass=1900, wheelbase=2.64), ) SEAT_LEON_MK3 = VolkswagenMQBPlatformConfig( "SEAT LEON 3RD GEN", # Chassis 5F VWCarInfo("SEAT Leon 2014-20"), - specs=VolkswagenCarSpecs(mass=1227, wheelbase=2.64), + 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]), - specs=VolkswagenCarSpecs(mass=1266, wheelbase=2.56), + 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]), - specs=VolkswagenCarSpecs(mass=1265, wheelbase=2.66), + VolkswagenCarSpecs(mass=1265, wheelbase=2.66), ) SKODA_KAROQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KAROQ 1ST GEN", # Chassis NU VWCarInfo("Škoda Karoq 2019-23"), - specs=VolkswagenCarSpecs(mass=1278, wheelbase=2.66), + VolkswagenCarSpecs(mass=1278, wheelbase=2.66), ) SKODA_KODIAQ_MK1 = VolkswagenMQBPlatformConfig( "SKODA KODIAQ 1ST GEN", # Chassis NS VWCarInfo("Škoda Kodiaq 2017-23"), - specs=VolkswagenCarSpecs(mass=1569, wheelbase=2.79), + VolkswagenCarSpecs(mass=1569, wheelbase=2.79), ) SKODA_OCTAVIA_MK3 = VolkswagenMQBPlatformConfig( "SKODA OCTAVIA 3RD GEN", # Chassis NE @@ -352,17 +352,17 @@ class CAR(Platforms): VWCarInfo("Škoda Octavia 2015-19"), VWCarInfo("Škoda Octavia RS 2016"), ], - specs=VolkswagenCarSpecs(mass=1388, wheelbase=2.68), + 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]), - specs=VolkswagenCarSpecs(mass=1192, wheelbase=2.65), + VolkswagenCarSpecs(mass=1192, wheelbase=2.65), ) SKODA_SUPERB_MK3 = VolkswagenMQBPlatformConfig( "SKODA SUPERB 3RD GEN", # Chassis 3V/NP VWCarInfo("Škoda Superb 2015-22"), - specs=VolkswagenCarSpecs(mass=1505, wheelbase=2.84), + VolkswagenCarSpecs(mass=1505, wheelbase=2.84), ) diff --git a/selfdrive/controls/tests/test_state_machine.py b/selfdrive/controls/tests/test_state_machine.py index bdeed9fb7a..d49111752d 100755 --- a/selfdrive/controls/tests/test_state_machine.py +++ b/selfdrive/controls/tests/test_state_machine.py @@ -7,6 +7,7 @@ from openpilot.selfdrive.car.car_helpers import interfaces from openpilot.selfdrive.controls.controlsd import Controls, SOFT_DISABLE_TIME from openpilot.selfdrive.controls.lib.events import Events, ET, Alert, Priority, AlertSize, AlertStatus, VisualAlert, \ AudibleAlert, EVENTS +from openpilot.selfdrive.car.mock.values import CAR as MOCK State = log.ControlsState.OpenpilotState @@ -30,8 +31,8 @@ def make_event(event_types): class TestStateMachine(unittest.TestCase): def setUp(self): - CarInterface, CarController, CarState = interfaces["mock"] - CP = CarInterface.get_non_essential_params("mock") + CarInterface, CarController, CarState = interfaces[MOCK.MOCK] + CP = CarInterface.get_non_essential_params(MOCK.MOCK) CI = CarInterface(CP, CarController, CarState) self.controlsd = Controls(CI=CI) From e0c840cd02e643fc3ace803c8a80af34c6218c8a Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Fri, 1 Mar 2024 15:05:28 -0500 Subject: [PATCH 341/923] VW: Cleanup, migrate center-to-front ratio to CarSpecs (#31668) * VW: Cleanup after PlatformConfig refactor * whitespace fix --- selfdrive/car/volkswagen/interface.py | 5 +---- selfdrive/car/volkswagen/values.py | 1 + 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 374b657512..43a8bcdddc 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -100,11 +100,8 @@ class CarInterface(CarInterfaceBase): ret.vEgoStopping = 0.5 ret.longitudinalTuning.kpV = [0.1] ret.longitudinalTuning.kiV = [0.0] - - # Per-chassis tuning values, override tuning defaults here if desired - ret.autoResumeSng = ret.minEnableSpeed == -1 - ret.centerToFront = ret.wheelbase * 0.45 + return ret # returns a car.CarState diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 4bd5edda2c..8f9ea96f2f 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -132,6 +132,7 @@ class VolkswagenPQPlatformConfig(PlatformConfig): @dataclass(frozen=True, kw_only=True) class VolkswagenCarSpecs(CarSpecs): + centerToFrontRatio: float = 0.45 steerRatio: float = 15.6 From b0496d8294b43bc63dc5cf54c19d029ac7857163 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 1 Mar 2024 16:28:58 -0500 Subject: [PATCH 342/923] can_replay: log fingerprint for hardcoding (#31671) * log * quotes --- tools/replay/can_replay.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index bf6b1e9ae2..d875f25347 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -98,6 +98,10 @@ if __name__ == "__main__": sr = LogReader(args.route_or_segment_name) + CP = sr.first("carParams") + + print(f"carFingerprint (for hardcoding fingerprint): '{CP.carFingerprint}'") + CAN_MSGS = sr.run_across_segments(24, process) print("Finished loading...") From 50a754f4707d8b7cd0b9889b56f4b8fb50ccfec9 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Fri, 1 Mar 2024 16:41:56 -0500 Subject: [PATCH 343/923] VW PQ: Volkswagen Caddy Mk3 (#31670) --- selfdrive/car/tests/routes.py | 1 + selfdrive/car/torque_data/override.toml | 1 + selfdrive/car/volkswagen/fingerprints.py | 11 +++++++++++ selfdrive/car/volkswagen/values.py | 8 ++++++++ 4 files changed, 21 insertions(+) diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 811416ccef..ff747b5938 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -229,6 +229,7 @@ routes = [ 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), diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 339fc533e5..3cf17f3179 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -43,6 +43,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] "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] diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index eab2bc0090..d2c85d0fc5 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -99,6 +99,17 @@ FW_VERSIONS = { b'\xf1\x875Q0907572P \xf1\x890682', ], }, + CAR.CADDY_MK3: { + (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8704E906027T \xf1\x892363', + ], + (Ecu.srs, 0x715, None): [ + b'\xf1\x872K5959655E \xf1\x890018\xf1\x82\x05000P037605', + ], + (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x877N0907572C \xf1\x890211\xf1\x82\x0155', + ], + }, CAR.CRAFTER_MK2: { (Ecu.engine, 0x7e0, None): [ b'\xf1\x8704L906056BP\xf1\x894729', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 8f9ea96f2f..868d6630ef 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -198,6 +198,14 @@ class CAR(Platforms): ], VolkswagenCarSpecs(mass=2011, wheelbase=2.98), ) + CADDY_MK3 = VolkswagenPQPlatformConfig( + "VOLKSWAGEN CADDY 3RD GEN", # Chassis 2K + [ + VWCarInfo("Volkswagen Caddy 2019"), + VWCarInfo("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 [ From 9616b3f71719785f75bf25acdf51f38f19105a3e Mon Sep 17 00:00:00 2001 From: Comma Device Date: Wed, 28 Feb 2024 20:09:24 -0800 Subject: [PATCH 344/923] no amp --- system/hardware/tici/amplifier.py | 1 - system/hardware/tici/hardware.py | 18 +++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/system/hardware/tici/amplifier.py b/system/hardware/tici/amplifier.py index 5725cb8170..af82067467 100755 --- a/system/hardware/tici/amplifier.py +++ b/system/hardware/tici/amplifier.py @@ -97,7 +97,6 @@ CONFIGS = { AmpConfig("Right DAC input mixer: DAI2 right", 0b1, 0x22, 0, 0b00000001), AmpConfig("Volume adjustment smoothing disabled", 0b1, 0x49, 6, 0b01000000), ], - "mici": [], } class Amplifier: diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 5bb1032ba9..8cb02c3d91 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -94,11 +94,7 @@ def get_device_type(): # lru_cache and cache can cause memory leaks when used in classes with open("/sys/firmware/devicetree/base/model") as f: model = f.read().strip('\x00') - model = model.split('comma ')[-1] - # TODO: remove this with AGNOS 7+ - if model.startswith('Qualcomm'): - model = 'tici' - return model + return model.split('comma ')[-1] class Tici(HardwareBase): @cached_property @@ -116,6 +112,8 @@ class Tici(HardwareBase): @cached_property def amplifier(self): + if self.get_device_type() == "mici": + return None return Amplifier() def get_os_version(self): @@ -374,9 +372,10 @@ class Tici(HardwareBase): def set_power_save(self, powersave_enabled): # amplifier, 100mW at idle - self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) - if not powersave_enabled: - self.amplifier.initialize_configuration(self.get_device_type()) + if self.amplifier is not None: + self.amplifier.set_global_shutdown(amp_disabled=powersave_enabled) + if not powersave_enabled: + self.amplifier.initialize_configuration(self.get_device_type()) # *** CPU config *** @@ -414,7 +413,8 @@ class Tici(HardwareBase): return 0 def initialize_hardware(self): - self.amplifier.initialize_configuration(self.get_device_type()) + if self.amplifier is not None: + self.amplifier.initialize_configuration(self.get_device_type()) # Allow thermald to write engagement status to kmsg os.system("sudo chmod a+w /dev/kmsg") From bf20358440830106396780464c21ec9b100ebfbc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 16:11:48 -0800 Subject: [PATCH 345/923] CI: increase test car interfaces examples (#31641) * increase * huh * Revert "huh" This reverts commit 1a652cbed06a7c814711db6f2bc6b3146d3aec04. * no huge fp dicts * ugh * try 300 * test * at least increase a bit --- selfdrive/car/tests/test_car_interfaces.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index a454f616cb..02a8d60e3c 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -22,7 +22,7 @@ from openpilot.selfdrive.test.fuzzy_generation import DrawType, FuzzyGenerator ALL_ECUS = list({ecu for ecus in FW_VERSIONS.values() for ecu in ecus.keys()}) -MAX_EXAMPLES = int(os.environ.get('MAX_EXAMPLES', '20')) +MAX_EXAMPLES = int(os.environ.get('MAX_EXAMPLES', '40')) def get_fuzzy_car_interface_args(draw: DrawType) -> dict: From 81bed0aad857ee3ff41192b8cd8d05db7a7d5ecf Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 16:37:09 -0800 Subject: [PATCH 346/923] Honda Bosch: fix detection for alternate brake signal bug (#31675) statically set alt brake for platforms where we don't need detection yet --- selfdrive/car/honda/interface.py | 5 ++++- selfdrive/car/honda/values.py | 13 ++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 71008e5001..9c39c4694f 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -209,8 +209,11 @@ class CarInterface(CarInterfaceBase): raise ValueError(f"unsupported car {candidate}") # These cars use alternate user brake msg (0x1BE) - if 0x1BE in fingerprint[CAN.pt] and candidate in HONDA_BOSCH: + # 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: ret.flags |= HondaFlags.BOSCH_ALT_BRAKE.value + + if ret.flags & HondaFlags.BOSCH_ALT_BRAKE: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_ALT_BRAKE # These cars use alternate SCM messages (SCM_FEEDBACK AND SCM_BUTTON) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 5e2e6b52a0..aa10cfa80a 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -133,7 +133,7 @@ class CAR(Platforms): ) CIVIC_BOSCH_DIESEL = HondaPlatformConfig( "HONDA CIVIC SEDAN 1.6 DIESEL 2019", - None, # don't show in docs + None, # don't show in docs CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), flags=HondaFlags.BOSCH @@ -153,7 +153,7 @@ class CAR(Platforms): HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), - flags=HondaFlags.BOSCH, + flags=HondaFlags.BOSCH | HondaFlags.BOSCH_ALT_BRAKE, ) CRV_HYBRID = HondaPlatformConfig( "HONDA CR-V HYBRID 2019", @@ -167,14 +167,14 @@ class CAR(Platforms): HondaCarInfo("Honda HR-V 2023", "All"), CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), dbc_dict('honda_civic_ex_2022_can_generated', None), - flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS + flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE ) ACURA_RDX_3G = HondaPlatformConfig( "ACURA RDX 2020", 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), # as spec dbc_dict('acura_rdx_2020_can_generated', None), - flags=HondaFlags.BOSCH + flags=HondaFlags.BOSCH | HondaFlags.BOSCH_ALT_BRAKE ) INSIGHT = HondaPlatformConfig( "HONDA INSIGHT 2019", @@ -208,7 +208,7 @@ class CAR(Platforms): ) CRV_EU = HondaPlatformConfig( "HONDA CR-V EU 2016", - None, # Euro version of CRV Touring, don't show in docs + None, # 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 | HondaFlags.NIDEC_ALT_SCM_MESSAGES, @@ -243,7 +243,7 @@ class CAR(Platforms): ) ODYSSEY_CHN = HondaPlatformConfig( "HONDA ODYSSEY CHN 2019", - None, # Chinese version of Odyssey, don't show in docs + None, # 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 | HondaFlags.NIDEC_ALT_SCM_MESSAGES @@ -344,7 +344,6 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - STEER_THRESHOLD = { # default is 1200, overrides go here CAR.ACURA_RDX: 400, From f1cd16e36794093f5bcc4cdd648dde6b245ed93c Mon Sep 17 00:00:00 2001 From: YassineYousfi Date: Fri, 1 Mar 2024 16:56:33 -0800 Subject: [PATCH 347/923] Recertified Herbalist Model (#31616) * dfa8bce2-a445-45ea-a4b8-e63989b8df08/700 * update model replay ref --- selfdrive/modeld/models/supercombo.onnx | 2 +- selfdrive/test/process_replay/model_replay_ref_commit | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index ce346a406a..68e39514d9 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:c11f99aab832242a604b1bb4c4cf391c9c3d5e90cbc07ab0d4c133473b56a3a4 +oid sha256:cd4b0cc83d5ff275ee77ec430ea686603ad50fd6ad874f599ea6e95b123afc3e size 48193749 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index 3b7b04df80..786c2f2731 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -fd6421f7551573c549480f9d29bb0dee4678344d +e8b359a82316e6dfce3b6fb0fb9684431bfa0a1b From 77d896eb898dd04490862b89bf34434e9d9811c3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 17:16:46 -0800 Subject: [PATCH 348/923] Honda: two base platform configs (#31676) * subclass bosch and nidec * end with comma * one line * remove unused flags * as a test see what happens if we exceeed CP.flags * Revert "as a test see what happens if we exceeed CP.flags" This reverts commit f57a346df5e6f3c6ab19875b843633c0571d16e3. * Update ref_commit --- selfdrive/car/honda/values.py | 94 +++++++++++------------- selfdrive/test/process_replay/ref_commit | 2 +- 2 files changed, 45 insertions(+), 51 deletions(-) diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index aa10cfa80a..a6b7d26567 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -59,8 +59,6 @@ class HondaFlags(IntFlag): NIDEC_ALT_PCM_ACCEL = 32 NIDEC_ALT_SCM_MESSAGES = 64 - AUTORESUME_SNG = 128 - ELECTRIC_PARKING_BRAKE = 256 # Car button codes class CruiseButtons: @@ -100,16 +98,19 @@ class Footnote(Enum): Column.FSR_STEERING) -class HondaPlatformConfig(PlatformConfig): +class HondaBoschPlatformConfig(PlatformConfig): def init(self): - if self.flags & HondaFlags.BOSCH: - self.flags |= HondaFlags.AUTORESUME_SNG - self.flags |= HondaFlags.ELECTRIC_PARKING_BRAKE + self.flags |= HondaFlags.BOSCH + + +class HondaNidecPlatformConfig(PlatformConfig): + def init(self): + self.flags |= HondaFlags.NIDEC class CAR(Platforms): # Bosch Cars - ACCORD = HondaPlatformConfig( + 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), @@ -118,9 +119,8 @@ class CAR(Platforms): ], CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39), # steerRatio: 11.82 is spec end-to-end dbc_dict('honda_accord_2018_can_generated', None), - flags=HondaFlags.BOSCH, ) - CIVIC_BOSCH = HondaPlatformConfig( + CIVIC_BOSCH = HondaBoschPlatformConfig( "HONDA CIVIC (BOSCH) 2019", [ HondaCarInfo("Honda Civic 2019-21", "All", video_link="https://www.youtube.com/watch?v=4Iz1Mz5LGF8", @@ -129,16 +129,14 @@ 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), - flags=HondaFlags.BOSCH ) - CIVIC_BOSCH_DIESEL = HondaPlatformConfig( + CIVIC_BOSCH_DIESEL = HondaBoschPlatformConfig( "HONDA CIVIC SEDAN 1.6 DIESEL 2019", None, # don't show in docs CIVIC_BOSCH.specs, dbc_dict('honda_accord_2018_can_generated', None), - flags=HondaFlags.BOSCH ) - CIVIC_2022 = HondaPlatformConfig( + CIVIC_2022 = HondaBoschPlatformConfig( "HONDA CIVIC 2022", [ HondaCarInfo("Honda Civic 2022-23", "All", video_link="https://youtu.be/ytiOT5lcp6Q"), @@ -146,116 +144,113 @@ class CAR(Platforms): ], CIVIC_BOSCH.specs, dbc_dict('honda_civic_ex_2022_can_generated', None), - flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS, + flags=HondaFlags.BOSCH_RADARLESS, ) - CRV_5G = HondaPlatformConfig( + CRV_5G = HondaBoschPlatformConfig( "HONDA CR-V 2017", HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end dbc_dict('honda_crv_ex_2017_can_generated', None, body_dbc='honda_crv_ex_2017_body_generated'), - flags=HondaFlags.BOSCH | HondaFlags.BOSCH_ALT_BRAKE, + flags=HondaFlags.BOSCH_ALT_BRAKE, ) - CRV_HYBRID = HondaPlatformConfig( + CRV_HYBRID = HondaBoschPlatformConfig( "HONDA CR-V HYBRID 2019", HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41), # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end dbc_dict('honda_accord_2018_can_generated', None), - flags=HondaFlags.BOSCH ) - HRV_3G = HondaPlatformConfig( + HRV_3G = HondaBoschPlatformConfig( "HONDA HR-V 2023", HondaCarInfo("Honda HR-V 2023", "All"), CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), dbc_dict('honda_civic_ex_2022_can_generated', None), - flags=HondaFlags.BOSCH | HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE + flags=HondaFlags.BOSCH_RADARLESS | HondaFlags.BOSCH_ALT_BRAKE, ) - ACURA_RDX_3G = HondaPlatformConfig( + ACURA_RDX_3G = HondaBoschPlatformConfig( "ACURA RDX 2020", 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), # as spec dbc_dict('acura_rdx_2020_can_generated', None), - flags=HondaFlags.BOSCH | HondaFlags.BOSCH_ALT_BRAKE + flags=HondaFlags.BOSCH_ALT_BRAKE, ) - INSIGHT = HondaPlatformConfig( + INSIGHT = HondaBoschPlatformConfig( "HONDA INSIGHT 2019", 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), # as spec dbc_dict('honda_insight_ex_2019_can_generated', None), - flags=HondaFlags.BOSCH ) - HONDA_E = HondaPlatformConfig( + HONDA_E = HondaBoschPlatformConfig( "HONDA E 2020", 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), dbc_dict('acura_rdx_2020_can_generated', None), - flags=HondaFlags.BOSCH ) # Nidec Cars - ACURA_ILX = HondaPlatformConfig( + ACURA_ILX = HondaNidecPlatformConfig( "ACURA ILX 2016", 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), # 15.3 is spec end-to-end dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CRV = HondaPlatformConfig( + CRV = HondaNidecPlatformConfig( "HONDA CR-V 2016", 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), # as spec dbc_dict('honda_crv_touring_2016_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CRV_EU = HondaPlatformConfig( + CRV_EU = HondaNidecPlatformConfig( "HONDA CR-V EU 2016", None, # 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 | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - FIT = HondaPlatformConfig( + FIT = HondaNidecPlatformConfig( "HONDA FIT 2018", 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), dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - FREED = HondaPlatformConfig( + FREED = HondaNidecPlatformConfig( "HONDA FREED 2020", 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), # mostly copied from FIT dbc_dict('honda_fit_ex_2018_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - HRV = HondaPlatformConfig( + HRV = HondaNidecPlatformConfig( "HONDA HRV 2019", 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 | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - ODYSSEY = HondaPlatformConfig( + ODYSSEY = HondaNidecPlatformConfig( "HONDA ODYSSEY 2018", HondaCarInfo("Honda Odyssey 2018-20"), CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41), dbc_dict('honda_odyssey_exl_2018_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_PCM_ACCEL + flags=HondaFlags.NIDEC_ALT_PCM_ACCEL, ) - ODYSSEY_CHN = HondaPlatformConfig( + ODYSSEY_CHN = HondaNidecPlatformConfig( "HONDA ODYSSEY CHN 2019", None, # 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 | HondaFlags.NIDEC_ALT_SCM_MESSAGES + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - ACURA_RDX = HondaPlatformConfig( + ACURA_RDX = HondaNidecPlatformConfig( "ACURA RDX 2018", 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), # as spec dbc_dict('acura_rdx_2018_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - PILOT = HondaPlatformConfig( + PILOT = HondaNidecPlatformConfig( "HONDA PILOT 2017", [ HondaCarInfo("Honda Pilot 2016-22", min_steer_speed=12. * CV.MPH_TO_MS), @@ -263,21 +258,20 @@ class CAR(Platforms): ], CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - RIDGELINE = HondaPlatformConfig( + RIDGELINE = HondaNidecPlatformConfig( "HONDA RIDGELINE 2017", 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), # as spec dbc_dict('acura_ilx_2016_can_generated', 'acura_ilx_2016_nidec'), - flags=HondaFlags.NIDEC | HondaFlags.NIDEC_ALT_SCM_MESSAGES, + flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) - CIVIC = HondaPlatformConfig( + CIVIC = HondaNidecPlatformConfig( "HONDA CIVIC 2016", 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'), - flags=HondaFlags.NIDEC | HondaFlags.AUTORESUME_SNG | HondaFlags.ELECTRIC_PARKING_BRAKE, ) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index d437f1fac8..1dfdca0d89 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -7fe098c307b78bf1f6f003452f9ba0a0eaad83d6 +99a50fe1b645bc1dcbf621e9cb72d151c6896429 From b74e8c91bd5c291408c83be4cbc0fa8d542fe810 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 17:17:52 -0800 Subject: [PATCH 349/923] Hyundai: clean up platform configs (#31677) * formatting * should always end with comma * rest are lower * to avoid confusion, don't subclass from CAN config -- nothing is common --- selfdrive/car/hyundai/values.py | 141 ++++++++++++++--------------- selfdrive/car/volkswagen/values.py | 2 +- 2 files changed, 71 insertions(+), 72 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 8802a36f46..bf0aa58999 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -69,7 +69,7 @@ class HyundaiFlags(IntFlag): HYBRID = 2 ** 10 EV = 2 ** 11 - # Static Flags + # Static flags # If 0x500 is present on bus 1 it probably has a Mando radar outputting radar points. # If no points are outputted by default it might be possible to turn it on using selfdrive/debug/hyundai_enable_radar_points.py @@ -121,15 +121,14 @@ class HyundaiPlatformConfig(PlatformConfig): self.dbc_dict = dbc_dict('hyundai_kia_generic', 'hyundai_kia_mando_front_radar_generated') if self.flags & HyundaiFlags.MIN_STEER_32_MPH: - self.specs = self.specs.override(minSteerSpeed = 32 * CV.MPH_TO_MS) + self.specs = self.specs.override(minSteerSpeed=32 * CV.MPH_TO_MS) @dataclass -class HyundaiCanFDPlatformConfig(HyundaiPlatformConfig): +class HyundaiCanFDPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict("hyundai_canfd", None)) def init(self): - super().init() self.flags |= HyundaiFlags.CANFD @@ -147,7 +146,7 @@ class CAR(Platforms): HyundaiCarInfo("Hyundai Azera Hybrid 2020", "All", car_parts=CarParts.common([CarHarness.hyundai_k])), ], CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5), - flags=HyundaiFlags.HYBRID + flags=HyundaiFlags.HYBRID, ) ELANTRA = HyundaiPlatformConfig( "HYUNDAI ELANTRA 2017", @@ -158,7 +157,7 @@ class CAR(Platforms): ], # 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), - flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH + flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH, ) ELANTRA_GT_I30 = HyundaiPlatformConfig( "HYUNDAI I30 N LINE 2019 & GT 2018 DCT", @@ -167,20 +166,20 @@ class CAR(Platforms): HyundaiCarInfo("Hyundai i30 2017-19", car_parts=CarParts.common([CarHarness.hyundai_e])), ], ELANTRA.specs, - flags=HyundaiFlags.LEGACY | HyundaiFlags.CLUSTER_GEARS | HyundaiFlags.MIN_STEER_32_MPH + 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])), - CarSpecs(mass=2800*CV.LB_TO_KG, wheelbase=2.72, steerRatio=12.9, tireStiffnessFactor=0.65), - flags=HyundaiFlags.CHECKSUM_CRC8 + 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])), + 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 + flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) HYUNDAI_GENESIS = HyundaiPlatformConfig( "HYUNDAI GENESIS 2015-2016", @@ -190,7 +189,7 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.CHECKSUM_6B | HyundaiFlags.LEGACY, ) IONIQ = HyundaiPlatformConfig( "HYUNDAI IONIQ HYBRID 2017-2019", @@ -202,102 +201,102 @@ class CAR(Platforms): "HYUNDAI IONIQ HYBRID 2020-2022", 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 + 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])), 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 + 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])), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), - flags=HyundaiFlags.EV + 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])), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), - flags=HyundaiFlags.HYBRID | HyundaiFlags.MIN_STEER_32_MPH + 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])), CarSpecs(mass=1490, wheelbase=2.7, steerRatio=13.73, tireStiffnessFactor=0.385), - flags=HyundaiFlags.HYBRID + flags=HyundaiFlags.HYBRID, ) KONA = HyundaiPlatformConfig( "HYUNDAI KONA 2020", 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 + flags=HyundaiFlags.CLUSTER_GEARS, ) KONA_EV = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2019", 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 + flags=HyundaiFlags.EV, ) KONA_EV_2022 = HyundaiPlatformConfig( "HYUNDAI KONA ELECTRIC 2022", 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 + 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])), + 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 + 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, CarSpecs(mass=1425, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385), - flags=HyundaiFlags.HYBRID + 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])), + 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 + 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 + 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])), SANTA_FE.specs, - flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID + 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])), SANTA_FE.specs, - flags=HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID + 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])), + 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 + 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])), 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 + flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS, ) STARIA_4TH_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI STARIA 4TH GEN", @@ -311,7 +310,7 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.TCU_GEARS, ) PALISADE = HyundaiPlatformConfig( "HYUNDAI PALISADE 2020", @@ -320,19 +319,19 @@ class CAR(Platforms): HyundaiCarInfo("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 + 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])), - CarSpecs(mass=2917 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75 * 1.15, tireStiffnessFactor = 0.5), - flags=HyundaiFlags.LEGACY | HyundaiFlags.TCU_GEARS + 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])), SONATA.specs, - flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) IONIQ_5 = HyundaiCanFDPlatformConfig( "HYUNDAI IONIQ 5 2022", @@ -342,13 +341,13 @@ class CAR(Platforms): HyundaiCarInfo("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 + 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])), IONIQ_5.specs, - flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE + flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE, ) TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig( "HYUNDAI TUCSON 4TH GEN", @@ -368,8 +367,8 @@ class CAR(Platforms): CUSTIN_1ST_GEN = HyundaiPlatformConfig( "HYUNDAI CUSTIN 1ST GEN", 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 + 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, ) # Kia @@ -385,13 +384,13 @@ class CAR(Platforms): "KIA K5 2021", 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 + 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])), KIA_K5_2021.specs, - flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID + flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID, ) KIA_K8_HEV_1ST_GEN = HyundaiCanFDPlatformConfig( "KIA K8 HYBRID 1ST GEN", @@ -408,13 +407,13 @@ class CAR(Platforms): HyundaiCarInfo("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 + 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])), KIA_NIRO_EV.specs, - flags=HyundaiFlags.EV + flags=HyundaiFlags.EV, ) KIA_NIRO_PHEV = HyundaiPlatformConfig( "KIA NIRO HYBRID 2019", @@ -423,7 +422,7 @@ class CAR(Platforms): HyundaiCarInfo("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 + 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", @@ -432,7 +431,7 @@ class CAR(Platforms): HyundaiCarInfo("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), ], KIA_NIRO_EV.specs, - flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR + flags=HyundaiFlags.HYBRID | HyundaiFlags.MANDO_RADAR, ) KIA_NIRO_HEV_2021 = HyundaiPlatformConfig( "KIA NIRO HYBRID 2021", @@ -441,7 +440,7 @@ class CAR(Platforms): HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], KIA_NIRO_EV.specs, - flags=HyundaiFlags.HYBRID + flags=HyundaiFlags.HYBRID, ) KIA_NIRO_HEV_2ND_GEN = HyundaiCanFDPlatformConfig( "KIA NIRO HYBRID 2ND GEN", @@ -451,34 +450,34 @@ class CAR(Platforms): 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 + 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 + 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])), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), - flags=HyundaiFlags.UNSUPPORTED_LONGITUDINAL | HyundaiFlags.TCU_GEARS + 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])), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), - flags=HyundaiFlags.HYBRID | HyundaiFlags.LEGACY + 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])), CarSpecs(mass=3558 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5), - flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL + flags=HyundaiFlags.HYBRID | HyundaiFlags.UNSUPPORTED_LONGITUDINAL, ) KIA_SELTOS = HyundaiPlatformConfig( "KIA SELTOS 2021", HyundaiCarInfo("Kia Seltos 2021", car_parts=CarParts.common([CarHarness.hyundai_a])), CarSpecs(mass=1337, wheelbase=2.63, steerRatio=14.56), - flags=HyundaiFlags.CHECKSUM_CRC8 + flags=HyundaiFlags.CHECKSUM_CRC8, ) KIA_SPORTAGE_5TH_GEN = HyundaiCanFDPlatformConfig( "KIA SPORTAGE 5TH GEN", @@ -493,17 +492,17 @@ class CAR(Platforms): "KIA SORENTO GT LINE 2018", [ HyundaiCarInfo("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video_link="https://www.youtube.com/watch?v=Fkh3s6WHJz8", - car_parts=CarParts.common([CarHarness.hyundai_e])), + 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])), ], 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 + 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])), - CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms - flags=HyundaiFlags.RADAR_SCC + 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", @@ -511,13 +510,13 @@ class CAR(Platforms): 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])), ], - CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms - flags=HyundaiFlags.RADAR_SCC + 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", - car_parts=CarParts.common([CarHarness.hyundai_c])), + 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( @@ -529,7 +528,7 @@ class CAR(Platforms): "KIA CEED INTRO ED 2019", 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 + flags=HyundaiFlags.LEGACY, ) KIA_EV6 = HyundaiCanFDPlatformConfig( "KIA EV6 2022", @@ -539,7 +538,7 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.EV, ) KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig( "KIA CARNIVAL 4TH GEN", @@ -548,7 +547,7 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.RADAR_SCC, ) # Genesis @@ -559,19 +558,19 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.EV, ) GENESIS_G70 = HyundaiPlatformConfig( "GENESIS G70 2018", 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 + flags=HyundaiFlags.LEGACY, ) GENESIS_G70_2020 = HyundaiPlatformConfig( "GENESIS G70 2020", HyundaiCarInfo("Genesis G70 2020", "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 + flags=HyundaiFlags.MANDO_RADAR, ) GENESIS_GV70_1ST_GEN = HyundaiCanFDPlatformConfig( "GENESIS GV70 1ST GEN", @@ -580,13 +579,13 @@ class CAR(Platforms): HyundaiCarInfo("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 + flags=HyundaiFlags.RADAR_SCC, ) GENESIS_G80 = HyundaiPlatformConfig( "GENESIS G80 2017", 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 + flags=HyundaiFlags.LEGACY, ) GENESIS_G90 = HyundaiPlatformConfig( "GENESIS G90 2017", @@ -597,7 +596,7 @@ class CAR(Platforms): "GENESIS GV80 2023", 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 + flags=HyundaiFlags.RADAR_SCC, ) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 868d6630ef..6ff913b204 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -113,7 +113,7 @@ class VolkswagenFlags(IntFlag): # Detected flags STOCK_HCA_PRESENT = 1 - # Static Flags + # Static flags PQ = 2 From a38a5e8bb4c0eda459ec42dd4e2f42e17e6dfef6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 1 Mar 2024 17:24:22 -0800 Subject: [PATCH 350/923] tici: enable SIM hot swap (#31680) * tici: enable SIM hot swap * only tizi --------- Co-authored-by: Comma Device --- system/hardware/tici/hardware.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 8cb02c3d91..c1cb9da438 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -478,6 +478,12 @@ class Tici(HardwareBase): 'AT+QNVFW="/nv/item_files/ims/IMS_enable",00', 'AT+QNVFW="/nv/item_files/modem/mmode/ue_usage_setting",01', ] + if self.get_device_type() == "tizi": + cmds += [ + # SIM hot swap + 'AT+QSIMDET=1,0', + 'AT+QSIMSTAT=1', + ] # clear out old blue prime initial APN os.system('mmcli -m any --3gpp-set-initial-eps-bearer-settings="apn="') From b57d37162622adff7b50b6992d882d19015418f8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 21:37:09 -0800 Subject: [PATCH 351/923] mazda --- selfdrive/car/mazda/interface.py | 1 - selfdrive/car/mazda/values.py | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index a138318b1a..85be0166ce 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -20,7 +20,6 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.1 ret.steerLimitTimer = 0.8 - ret.tireStiffnessFactor = 0.70 # not optimized yet CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index f45e80c119..ac822f4e9f 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -43,6 +43,10 @@ class MazdaPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('mazda_2017', None)) flags: int = MazdaFlags.GEN1 + def init(self): + # TODO: standardize default specs via subclass (MazdaCarSpecs) + self.specs.override(tireStiffnessFactor=0.7) + class CAR(Platforms): CX5 = MazdaPlatformConfig( From eaf333259943c8069eacfe592b7bc0a26a0fecfb Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 21:37:29 -0800 Subject: [PATCH 352/923] Revert "mazda" This reverts commit b57d37162622adff7b50b6992d882d19015418f8. --- selfdrive/car/mazda/interface.py | 1 + selfdrive/car/mazda/values.py | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 85be0166ce..a138318b1a 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -20,6 +20,7 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.1 ret.steerLimitTimer = 0.8 + ret.tireStiffnessFactor = 0.70 # not optimized yet CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index ac822f4e9f..f45e80c119 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -43,10 +43,6 @@ class MazdaPlatformConfig(PlatformConfig): dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('mazda_2017', None)) flags: int = MazdaFlags.GEN1 - def init(self): - # TODO: standardize default specs via subclass (MazdaCarSpecs) - self.specs.override(tireStiffnessFactor=0.7) - class CAR(Platforms): CX5 = MazdaPlatformConfig( From cfc5faee2a7621bafa9818d18b35f015272c1f10 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 1 Mar 2024 21:52:50 -0800 Subject: [PATCH 353/923] fix compress_vipc width --- tools/camerastream/compressed_vipc.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/camerastream/compressed_vipc.py b/tools/camerastream/compressed_vipc.py index f4b8862a84..df9de096f0 100755 --- a/tools/camerastream/compressed_vipc.py +++ b/tools/camerastream/compressed_vipc.py @@ -25,7 +25,7 @@ ENCODE_SOCKETS = { def decoder(addr, vipc_server, vst, nvidia, W, H, debug=False): sock_name = ENCODE_SOCKETS[vst] if debug: - print("start decoder for %s" % sock_name) + print(f"start decoder for {sock_name}, {W}x{H}") if nvidia: os.environ["NV_LOW_LATENCY"] = "3" # both bLowLatency and CUVID_PKT_ENDOFPICTURE @@ -124,7 +124,7 @@ class CompressedVipc: self.procs = [] for vst in vision_streams: ed = sm[ENCODE_SOCKETS[vst]] - p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, debug, ed.width, ed.height)) + p = multiprocessing.Process(target=decoder, args=(addr, self.vipc_server, vst, nvidia, ed.width, ed.height, debug)) p.start() self.procs.append(p) From 3b5f6cd6b2e695c7be321ff3ce863d98589ff1e1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 1 Mar 2024 23:59:28 -0800 Subject: [PATCH 354/923] [bot] Fingerprints: add missing FW versions from new users (#31610) * Export fingerprints * Update selfdrive/car/toyota/fingerprints.py --- selfdrive/car/chrysler/fingerprints.py | 3 +++ selfdrive/car/honda/fingerprints.py | 1 + selfdrive/car/toyota/fingerprints.py | 1 + 3 files changed, 5 insertions(+) diff --git a/selfdrive/car/chrysler/fingerprints.py b/selfdrive/car/chrysler/fingerprints.py index 1df514e79b..3444b4cc5b 100644 --- a/selfdrive/car/chrysler/fingerprints.py +++ b/selfdrive/car/chrysler/fingerprints.py @@ -38,6 +38,7 @@ FW_VERSIONS = { b'68227902AF', b'68227902AG', b'68227902AH', + b'68227905AG', b'68360252AC', ], (Ecu.srs, 0x744, None): [ @@ -71,6 +72,7 @@ FW_VERSIONS = { b'68340762AD ', b'68340764AD ', b'68352652AE ', + b'68352654AE ', b'68366851AH ', b'68366853AE ', b'68372861AF ', @@ -304,6 +306,7 @@ FW_VERSIONS = { b'68402708AB', b'68402971AD', b'68454144AD', + b'68454145AB', b'68454152AB', b'68454156AB', b'68516650AB', diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index 0ae39751f9..a842baac88 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -805,6 +805,7 @@ FW_VERSIONS = { b'37805-5MR-3250\x00\x00', b'37805-5MR-4070\x00\x00', b'37805-5MR-4080\x00\x00', + b'37805-5MR-4170\x00\x00', b'37805-5MR-4180\x00\x00', b'37805-5MR-A240\x00\x00', b'37805-5MR-A250\x00\x00', diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 6b48408a10..b59e1abea4 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -1266,6 +1266,7 @@ FW_VERSIONS = { }, CAR.LEXUS_ES: { (Ecu.engine, 0x7e0, None): [ + b'\x02333M4100\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02333M4200\x00\x00\x00\x00\x00\x00\x00\x00A4701000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02333R0000\x00\x00\x00\x00\x00\x00\x00\x00A0C01000\x00\x00\x00\x00\x00\x00\x00\x00', ], From b48cbdbc0c95fa5a6fa2523d2f0fcb4aea1615eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Sat, 2 Mar 2024 10:01:23 -0800 Subject: [PATCH 355/923] Update RELEASES.md --- RELEASES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index d0fd530db1..046d376c01 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -11,6 +11,9 @@ Version 0.9.6 (2024-02-27) * Directly outputs curvature for lateral control * New driver monitoring model * Trained on larger dataset +* Model path UI + * Shows where driving model wants to be + * Shows what model is seeing more cleary, but more jittery * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models From 6c11de4b55d99a422830d735f7904d60587f8167 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 2 Mar 2024 12:05:00 -0800 Subject: [PATCH 356/923] fix typo --- RELEASES.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index 046d376c01..4ec4c4fad5 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,7 +1,7 @@ Version 0.9.7 (2024-XX-XX) ======================== * New driving model -* Support for many hybrid Ford models +* Support for hybrid variants of supported Ford models Version 0.9.6 (2024-02-27) ======================== @@ -13,7 +13,7 @@ Version 0.9.6 (2024-02-27) * Trained on larger dataset * Model path UI * Shows where driving model wants to be - * Shows what model is seeing more cleary, but more jittery + * Shows what model is seeing more clearly, but more jittery * AGNOS 9 * comma body streaming and controls over WebRTC * Improved fuzzy fingerprinting for many makes and models From 9b2665f0c1cc82ba681a7760599fce917c8eb93f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 2 Mar 2024 12:23:46 -0800 Subject: [PATCH 357/923] can_replay fixups for bxcan hw --- tools/replay/can_replay.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tools/replay/can_replay.py b/tools/replay/can_replay.py index d875f25347..c7da8caf71 100755 --- a/tools/replay/can_replay.py +++ b/tools/replay/can_replay.py @@ -26,12 +26,10 @@ def send_thread(j: PandaJungle, flock): with flock: j.flash() + j.reset() for i in [0, 1, 2, 3, 0xFFFF]: j.can_clear(i) j.set_can_speed_kbps(i, 500) - j.set_can_data_speed_kbps(i, 500) - j.set_ignition(False) - time.sleep(5) j.set_ignition(True) j.set_panda_power(True) j.set_can_loopback(False) From 6fc0a2102f5c98e8dcbfed40b50b7a2fe8609c4d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 3 Mar 2024 07:21:53 -0800 Subject: [PATCH 358/923] Add Highlander 2024 to car docs --- 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 7ad12189cb..f601da2beb 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -352,6 +352,7 @@ openpilot does not yet support these Toyota models due to a new message authenti * Toyota Venza 2021+ * Toyota Sequoia 2023+ * Toyota Tundra 2022+ +* Toyota Highlander 2024+ * Toyota Corolla Cross 2022+ (only US model) * Lexus NX 2022+ * Toyota bZ4x 2023+ diff --git a/selfdrive/car/CARS_template.md b/selfdrive/car/CARS_template.md index ab4d231fa7..73ddb02899 100644 --- a/selfdrive/car/CARS_template.md +++ b/selfdrive/car/CARS_template.md @@ -65,6 +65,7 @@ openpilot does not yet support these Toyota models due to a new message authenti * Toyota Venza 2021+ * Toyota Sequoia 2023+ * Toyota Tundra 2022+ +* Toyota Highlander 2024+ * Toyota Corolla Cross 2022+ (only US model) * Lexus NX 2022+ * Toyota bZ4x 2023+ From 15955bfcd0cafb7578103705d4de7c465d8364a2 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Sun, 3 Mar 2024 20:40:27 -0500 Subject: [PATCH 359/923] VW: Early EPS faults are temporary, round deux (#31525) * VW: Early EPS faults are temporary, round deux * a bit cleaner * Revert "a bit cleaner" This reverts commit e836f92394eba0ace8d9cc87b5aa5080d6332d17. * a little better * clarity * consolidate * cleanup --- selfdrive/car/volkswagen/carstate.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 48e9ed37d6..9107d41eb3 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -10,6 +10,8 @@ from openpilot.selfdrive.car.volkswagen.values import DBC, CANBUS, NetworkLocati class CarState(CarStateBase): def __init__(self, CP): super().__init__(CP) + self.frame = 0 + self.eps_init_complete = False self.CCP = CarControllerParams(CP) self.button_states = {button.event_type: False for button in self.CCP.BUTTONS} self.esp_hold_confirmation = False @@ -47,18 +49,14 @@ class CarState(CarStateBase): ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = ret.vEgoRaw == 0 - # Update steering angle, rate, yaw rate, and driver input torque. VW send - # the sign/direction in a separate signal so they must be recombined. + # Update EPS position and state info. For signed values, VW sends the sign in a separate signal. ret.steeringAngleDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradwinkel"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradwinkel"])] ret.steeringRateDeg = pt_cp.vl["LWI_01"]["LWI_Lenkradw_Geschw"] * (1, -1)[int(pt_cp.vl["LWI_01"]["LWI_VZ_Lenkradw_Geschw"])] ret.steeringTorque = pt_cp.vl["LH_EPS_03"]["EPS_Lenkmoment"] * (1, -1)[int(pt_cp.vl["LH_EPS_03"]["EPS_VZ_Lenkmoment"])] ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE ret.yawRate = pt_cp.vl["ESP_02"]["ESP_Gierrate"] * (1, -1)[int(pt_cp.vl["ESP_02"]["ESP_VZ_Gierrate"])] * CV.DEG_TO_RAD - - # Verify EPS readiness to accept steering commands hca_status = self.CCP.hca_status_values.get(pt_cp.vl["LH_EPS_03"]["EPS_HCA_Status"]) - ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT") - ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED") + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status) # VW Emergency Assist status tracking and mitigation self.eps_stock_values = pt_cp.vl["LH_EPS_03"] @@ -151,6 +149,7 @@ class CarState(CarStateBase): # Digital instrument clusters expect the ACC HUD lead car distance to be scaled differently self.upscale_lead_car_signal = bool(pt_cp.vl["Kombi_03"]["KBI_Variante"]) + self.frame += 1 return ret def update_pq(self, pt_cp, cam_cp, ext_cp, trans_type): @@ -168,18 +167,14 @@ class CarState(CarStateBase): ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw) ret.standstill = ret.vEgoRaw == 0 - # Update steering angle, rate, yaw rate, and driver input torque. VW send - # the sign/direction in a separate signal so they must be recombined. + # Update EPS position and state info. For signed values, VW sends the sign in a separate signal. ret.steeringAngleDeg = pt_cp.vl["Lenkhilfe_3"]["LH3_BLW"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_BLWSign"])] ret.steeringRateDeg = pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit"] * (1, -1)[int(pt_cp.vl["Lenkwinkel_1"]["Lenkradwinkel_Geschwindigkeit_S"])] ret.steeringTorque = pt_cp.vl["Lenkhilfe_3"]["LH3_LM"] * (1, -1)[int(pt_cp.vl["Lenkhilfe_3"]["LH3_LMSign"])] ret.steeringPressed = abs(ret.steeringTorque) > self.CCP.STEER_DRIVER_ALLOWANCE ret.yawRate = pt_cp.vl["Bremse_5"]["Giergeschwindigkeit"] * (1, -1)[int(pt_cp.vl["Bremse_5"]["Vorzeichen_der_Giergeschwindigk"])] * CV.DEG_TO_RAD - - # Verify EPS readiness to accept steering commands hca_status = self.CCP.hca_status_values.get(pt_cp.vl["Lenkhilfe_2"]["LH2_Sta_HCA"]) - ret.steerFaultPermanent = hca_status in ("DISABLED", "FAULT") - ret.steerFaultTemporary = hca_status in ("INITIALIZING", "REJECTED") + ret.steerFaultTemporary, ret.steerFaultPermanent = self.update_hca_state(hca_status) # Update gas, brakes, and gearshift. ret.gas = pt_cp.vl["Motor_3"]["Fahrpedal_Rohsignal"] / 100.0 @@ -253,8 +248,17 @@ class CarState(CarStateBase): # Additional safety checks performed in CarInterface. ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["ESP_Passiv_getastet"]) + self.frame += 1 return ret + def update_hca_state(self, hca_status): + # Treat INITIALIZING and FAULT as temporary for worst likely EPS recovery time, for cars without factory Lane Assist + # DISABLED means the EPS hasn't been configured to support Lane Assist + self.eps_init_complete = self.eps_init_complete or (hca_status in ("DISABLED", "READY", "ACTIVE") or self.frame > 600) + perm_fault = hca_status == "DISABLED" or (self.eps_init_complete and hca_status in ("INITIALIZING", "FAULT")) + temp_fault = hca_status == "REJECTED" or not self.eps_init_complete + return temp_fault, perm_fault + @staticmethod def get_can_parser(CP): if CP.flags & VolkswagenFlags.PQ: From 1728355498d1e5307e7e96324b9232692d62eab6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 3 Mar 2024 19:15:21 -0800 Subject: [PATCH 360/923] boardd: return earlier from bad unpack (#31687) --- selfdrive/boardd/panda.cc | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/selfdrive/boardd/panda.cc b/selfdrive/boardd/panda.cc index e075887a4d..d738231c7b 100644 --- a/selfdrive/boardd/panda.cc +++ b/selfdrive/boardd/panda.cc @@ -284,6 +284,13 @@ bool Panda::unpack_can_buffer(uint8_t *data, uint32_t &size, std::vector Date: Mon, 4 Mar 2024 17:54:08 +0100 Subject: [PATCH 361/923] Add simple MetaDrive scenario (#31686) --- tools/sim/bridge/common.py | 4 + .../sim/bridge/metadrive/metadrive_bridge.py | 38 +-------- .../sim/bridge/metadrive/metadrive_common.py | 37 +++++++++ .../sim/bridge/metadrive/metadrive_process.py | 25 ++++-- tools/sim/bridge/metadrive/metadrive_world.py | 29 ++++--- tools/sim/lib/common.py | 6 ++ tools/sim/scenarios/metadrive/stay_in_lane.py | 82 +++++++++++++++++++ 7 files changed, 169 insertions(+), 52 deletions(-) create mode 100644 tools/sim/bridge/metadrive/metadrive_common.py create mode 100755 tools/sim/scenarios/metadrive/stay_in_lane.py diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 10e2a055a3..2391df6651 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -171,8 +171,12 @@ Ignition: {self.simulator_state.ignition} Engaged: {self.simulator_state.is_enga steer_out = steer_op if self.simulator_state.is_engaged else steer_manual self.world.apply_controls(steer_out, throttle_out, brake_out) + self.world.read_state() self.world.read_sensors(self.simulator_state) + if self.world.exit_event.is_set(): + self.shutdown() + if self.rk.frame % self.TICKS_PER_FRAME == 0: self.world.tick() self.world.read_cameras() diff --git a/tools/sim/bridge/metadrive/metadrive_bridge.py b/tools/sim/bridge/metadrive/metadrive_bridge.py index c94fca2b95..3190cb81b9 100644 --- a/tools/sim/bridge/metadrive/metadrive_bridge.py +++ b/tools/sim/bridge/metadrive/metadrive_bridge.py @@ -1,48 +1,12 @@ -import numpy as np - -from metadrive.component.sensors.rgb_camera import RGBCamera from metadrive.component.sensors.base_camera import _cuda_enable from metadrive.component.map.pg_map import MapGenerateMethod -from panda3d.core import Texture, GraphicsOutput from openpilot.tools.sim.bridge.common import SimulatorBridge +from openpilot.tools.sim.bridge.metadrive.metadrive_common import RGBCameraRoad, RGBCameraWide from openpilot.tools.sim.bridge.metadrive.metadrive_world import MetaDriveWorld from openpilot.tools.sim.lib.camerad import W, H - -class CopyRamRGBCamera(RGBCamera): - """Camera which copies its content into RAM during the render process, for faster image grabbing.""" - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.cpu_texture = Texture() - self.buffer.addRenderTexture(self.cpu_texture, GraphicsOutput.RTMCopyRam) - - def get_rgb_array_cpu(self): - origin_img = self.cpu_texture - img = np.frombuffer(origin_img.getRamImage().getData(), dtype=np.uint8) - img = img.reshape((origin_img.getYSize(), origin_img.getXSize(), -1)) - img = img[:,:,:3] # RGBA to RGB - # img = np.swapaxes(img, 1, 0) - img = img[::-1] # Flip on vertical axis - return img - - -class RGBCameraWide(CopyRamRGBCamera): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - lens = self.get_lens() - lens.setFov(120) - lens.setNear(0.1) - -class RGBCameraRoad(CopyRamRGBCamera): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - lens = self.get_lens() - lens.setFov(40) - lens.setNear(0.1) - - def straight_block(length): return { "id": "S", diff --git a/tools/sim/bridge/metadrive/metadrive_common.py b/tools/sim/bridge/metadrive/metadrive_common.py new file mode 100644 index 0000000000..42a7eb60dd --- /dev/null +++ b/tools/sim/bridge/metadrive/metadrive_common.py @@ -0,0 +1,37 @@ +import numpy as np + +from metadrive.component.sensors.rgb_camera import RGBCamera +from panda3d.core import Texture, GraphicsOutput + + +class CopyRamRGBCamera(RGBCamera): + """Camera which copies its content into RAM during the render process, for faster image grabbing.""" + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cpu_texture = Texture() + self.buffer.addRenderTexture(self.cpu_texture, GraphicsOutput.RTMCopyRam) + + def get_rgb_array_cpu(self): + origin_img = self.cpu_texture + img = np.frombuffer(origin_img.getRamImage().getData(), dtype=np.uint8) + img = img.reshape((origin_img.getYSize(), origin_img.getXSize(), -1)) + img = img[:,:,:3] # RGBA to RGB + # img = np.swapaxes(img, 1, 0) + img = img[::-1] # Flip on vertical axis + return img + + +class RGBCameraWide(CopyRamRGBCamera): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + lens = self.get_lens() + lens.setFov(120) + lens.setNear(0.1) + + +class RGBCameraRoad(CopyRamRGBCamera): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + lens = self.get_lens() + lens.setFov(40) + lens.setNear(0.1) diff --git a/tools/sim/bridge/metadrive/metadrive_process.py b/tools/sim/bridge/metadrive/metadrive_process.py index aa6ae57976..0e659c7a2d 100644 --- a/tools/sim/bridge/metadrive/metadrive_process.py +++ b/tools/sim/bridge/metadrive/metadrive_process.py @@ -19,7 +19,8 @@ C3_POSITION = Vec3(0.0, 0, 1.22) C3_HPR = Vec3(0, 0,0) -metadrive_state = namedtuple("metadrive_state", ["velocity", "position", "bearing", "steering_angle"]) +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(): # By default, metadrive won't try to use cuda images unless it's used as a sensor for vehicles, so patch that in @@ -46,7 +47,8 @@ def apply_metadrive_patches(): 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, state_send: Connection, exit_event): + controls_recv: Connection, simulation_state_send: Connection, vehicle_state_send: Connection, + exit_event): apply_metadrive_patches() road_image = np.frombuffer(camera_array.get_obj(), dtype=np.uint8).reshape((H, W, 3)) @@ -60,6 +62,13 @@ def metadrive_process(dual_camera: bool, config: dict, camera_array, wide_camera env.reset() env.vehicle.config["max_speed_km_h"] = 1000 + simulation_state = metadrive_simulation_state( + running=True, + done=False, + done_info=None, + ) + simulation_state_send.send(simulation_state) + reset() def get_cam_as_rgb(cam): @@ -78,14 +87,14 @@ def metadrive_process(dual_camera: bool, config: dict, camera_array, wide_camera vc = [0,0] while not exit_event.is_set(): - state = metadrive_state( + vehicle_state = metadrive_vehicle_state( velocity=vec3(x=float(env.vehicle.velocity[0]), y=float(env.vehicle.velocity[1]), z=0), position=env.vehicle.position, bearing=float(math.degrees(env.vehicle.heading_theta)), steering_angle=env.vehicle.steering * env.vehicle.MAX_STEERING ) - state_send.send(state) + vehicle_state_send.send(vehicle_state) if controls_recv.poll(0): while controls_recv.poll(0): @@ -103,7 +112,13 @@ def metadrive_process(dual_camera: bool, config: dict, camera_array, wide_camera obs, _, terminated, _, info = env.step(vc) if terminated: - reset() + done_result = env.done_function("default_agent") + simulation_state = metadrive_simulation_state( + running=False, + done=done_result[0], + done_info=done_result[1], + ) + simulation_state_send.send(simulation_state) if dual_camera: wide_road_image[...] = get_cam_as_rgb("rgb_wide") diff --git a/tools/sim/bridge/metadrive/metadrive_world.py b/tools/sim/bridge/metadrive/metadrive_world.py index 4cbe64393e..312860593d 100644 --- a/tools/sim/bridge/metadrive/metadrive_world.py +++ b/tools/sim/bridge/metadrive/metadrive_world.py @@ -5,7 +5,8 @@ import numpy as np import time from multiprocessing import Pipe, Array -from openpilot.tools.sim.bridge.metadrive.metadrive_process import metadrive_process, metadrive_state +from openpilot.tools.sim.bridge.metadrive.metadrive_process import (metadrive_process, metadrive_simulation_state, + metadrive_vehicle_state) from openpilot.tools.sim.lib.common import SimulatorState, World from openpilot.tools.sim.lib.camerad import W, H @@ -21,14 +22,16 @@ class MetaDriveWorld(World): self.wide_road_image = np.frombuffer(self.wide_camera_array.get_obj(), dtype=np.uint8).reshape((H, W, 3)) self.controls_send, self.controls_recv = Pipe() - self.state_send, self.state_recv = Pipe() + self.simulation_state_send, self.simulation_state_recv = Pipe() + self.vehicle_state_send, self.vehicle_state_recv = Pipe() self.exit_event = multiprocessing.Event() self.metadrive_process = multiprocessing.Process(name="metadrive process", target= functools.partial(metadrive_process, dual_camera, config, self.camera_array, self.wide_camera_array, self.image_lock, - self.controls_recv, self.state_send, self.exit_event)) + self.controls_recv, self.simulation_state_send, + self.vehicle_state_send, self.exit_event)) self.metadrive_process.start() @@ -36,7 +39,7 @@ class MetaDriveWorld(World): print("---- Spawning Metadrive world, this might take awhile ----") print("----------------------------------------------------------") - self.state_recv.recv() # wait for a state message to ensure metadrive is launched + self.vehicle_state_recv.recv() # wait for a state message to ensure metadrive is launched self.steer_ratio = 15 self.vc = [0.0,0.0] @@ -58,13 +61,19 @@ class MetaDriveWorld(World): self.controls_send.send([*self.vc, self.should_reset]) self.should_reset = False + def read_state(self): + while self.simulation_state_recv.poll(0): + md_state: metadrive_simulation_state = self.simulation_state_recv.recv() + if md_state.done: + self.exit_event.set() + def read_sensors(self, state: SimulatorState): - while self.state_recv.poll(0): - md_state: metadrive_state = self.state_recv.recv() - state.velocity = md_state.velocity - state.bearing = md_state.bearing - state.steering_angle = md_state.steering_angle - state.gps.from_xy(md_state.position) + while self.vehicle_state_recv.poll(0): + md_vehicle: metadrive_vehicle_state = self.vehicle_state_recv.recv() + state.velocity = md_vehicle.velocity + state.bearing = md_vehicle.bearing + state.steering_angle = md_vehicle.steering_angle + state.gps.from_xy(md_vehicle.position) state.valid = True def read_cameras(self): diff --git a/tools/sim/lib/common.py b/tools/sim/lib/common.py index 795d7505c7..76224c61de 100644 --- a/tools/sim/lib/common.py +++ b/tools/sim/lib/common.py @@ -69,6 +69,8 @@ class World(ABC): self.road_image = np.zeros((H, W, 3), dtype=np.uint8) self.wide_road_image = np.zeros((H, W, 3), dtype=np.uint8) + self.exit_event = multiprocessing.Event() + @abstractmethod def apply_controls(self, steer_sim, throttle_out, brake_out): pass @@ -77,6 +79,10 @@ class World(ABC): def tick(self): pass + @abstractmethod + def read_state(self): + pass + @abstractmethod def read_sensors(self, simulator_state: SimulatorState): pass diff --git a/tools/sim/scenarios/metadrive/stay_in_lane.py b/tools/sim/scenarios/metadrive/stay_in_lane.py new file mode 100755 index 0000000000..55fb2cb9bd --- /dev/null +++ b/tools/sim/scenarios/metadrive/stay_in_lane.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +from typing import Any +from multiprocessing import Queue + +from metadrive.component.sensors.base_camera import _cuda_enable +from metadrive.component.map.pg_map import MapGenerateMethod + +from openpilot.tools.sim.bridge.common import SimulatorBridge +from openpilot.tools.sim.bridge.metadrive.metadrive_common import RGBCameraRoad, RGBCameraWide +from openpilot.tools.sim.bridge.metadrive.metadrive_world import MetaDriveWorld +from openpilot.tools.sim.lib.camerad import W, H + + +def create_map(): + return dict( + type=MapGenerateMethod.PG_MAP_FILE, + lane_num=2, + lane_width=3.5, + config=[ + { + "id": "S", + "pre_block_socket_index": 0, + "length": 60, + }, + { + "id": "C", + "pre_block_socket_index": 0, + "length": 60, + "radius": 600, + "angle": 45, + "dir": 0, + }, + ] + ) + + +class MetaDriveBridge(SimulatorBridge): + TICKS_PER_FRAME = 5 + + def __init__(self, dual_camera, high_quality): + self.should_render = False + + super().__init__(dual_camera, high_quality) + + def spawn_world(self): + sensors = { + "rgb_road": (RGBCameraRoad, W, H, ) + } + + if self.dual_camera: + sensors["rgb_wide"] = (RGBCameraWide, W, H) + + config = dict( + use_render=self.should_render, + vehicle_config=dict( + enable_reverse=False, + image_source="rgb_road", + ), + sensors=sensors, + image_on_cuda=_cuda_enable, + image_observation=True, + interface_panel=[], + out_of_route_done=True, + on_continuous_line_done=True, + crash_vehicle_done=True, + crash_object_done=True, + traffic_density=0.0, + map_config=create_map(), + decision_repeat=1, + physics_world_step_size=self.TICKS_PER_FRAME/100, + preload_models=False + ) + + return MetaDriveWorld(config, self.dual_camera) + + +if __name__ == "__main__": + queue: Any = Queue() + simulator_bridge = MetaDriveBridge(True, False) + simulator_process = simulator_bridge.run(queue) + simulator_process.join() From 8cd3bc65bfff855e55eda7fc2ecbf6b0da306ea4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 4 Mar 2024 09:45:56 -0800 Subject: [PATCH 362/923] [bot] Bump submodules (#31690) bump submodules Co-authored-by: jnewb1 --- opendbc | 2 +- rednose_repo | 2 +- teleoprtc_repo | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/opendbc b/opendbc index 5f096db742..1745ab5182 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 5f096db742b0c5dcd19976afdb07d5dd098f4b07 +Subproject commit 1745ab51825055cd18748013c4a5e3377319e390 diff --git a/rednose_repo b/rednose_repo index c5762e8bc6..1dc61a60e6 160000 --- a/rednose_repo +++ b/rednose_repo @@ -1 +1 @@ -Subproject commit c5762e8bc6f7338c7a30d2cd1cba8cc64e81ba19 +Subproject commit 1dc61a60e684b4bc8c591a8bce7e24e02aa8f400 diff --git a/teleoprtc_repo b/teleoprtc_repo index 3f9e8176d1..8489ac3c5a 160000 --- a/teleoprtc_repo +++ b/teleoprtc_repo @@ -1 +1 @@ -Subproject commit 3f9e8176d1be3d217528baee09fc418fa980a0c3 +Subproject commit 8489ac3c5aa0b0e2fec397694f9005e2b5a613e4 From 8ec0d87de06c265dcb0526b9a3bce8a397248dc9 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 4 Mar 2024 12:53:42 -0500 Subject: [PATCH 363/923] card: prepare for separate process (#31660) * Card * update ref * bump cpu * sub to caroutput * update ref --- cereal | 2 +- selfdrive/controls/controlsd.py | 64 ++++++++++--------- selfdrive/locationd/torqued.py | 5 +- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/test/test_onroad.py | 2 +- .../plotjuggler/layouts/max-torque-debug.xml | 2 +- .../plotjuggler/layouts/torque-controller.xml | 4 +- tools/tuning/measure_steering_accuracy.py | 4 +- 8 files changed, 46 insertions(+), 39 deletions(-) diff --git a/cereal b/cereal index bfbb0cab83..0172e60275 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit bfbb0cab83e3ad49d85ad1a34ee1241bf1ff782f +Subproject commit 0172e60275b11074ff4e6b65378a12f3936fa95a diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index bd3dd08179..fc68db14e5 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -68,11 +68,15 @@ class CarD: def __init__(self, CI=None): self.can_sock = messaging.sub_sock('can', timeout=20) self.sm = messaging.SubMaster(['pandaStates']) - self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams']) + self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput']) self.can_rcv_timeout_counter = 0 # conseuctive timeout count self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count + self.CC_prev = car.CarState.new_message() + + self.last_actuators = None + self.params = Params() if CI is None: @@ -118,14 +122,12 @@ class CarD: """Initialize CarInterface, once controls are ready""" self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) - def state_update(self, CC: car.CarControl): + def state_update(self): """carState update loop, driven by can""" - # TODO: This should not depend on carControl - # Update carState from CAN can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) - self.CS = self.CI.update(CC, can_strs) + self.CS = self.CI.update(self.CC_prev, can_strs) self.sm.update(0) @@ -143,18 +145,17 @@ class CarD: if can_rcv_valid and REPLAY: self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime + self.state_publish() + return self.CS - def state_publish(self, car_events): + def state_publish(self): """carState and carParams publish loop""" - # TODO: carState should be independent of the event loop - # carState cs_send = messaging.new_message('carState') cs_send.valid = self.CS.canValid cs_send.carState = self.CS - cs_send.carState.events = car_events self.pm.send('carState', cs_send) # carParams - logged every 50 seconds (> 1 per segment) @@ -164,25 +165,36 @@ class CarD: cp_send.carParams = self.CP self.pm.send('carParams', cp_send) + # publish new carOutput + co_send = messaging.new_message('carOutput') + co_send.valid = True + if self.last_actuators is not None: + co_send.carOutput.actuatorsOutput = self.last_actuators + self.pm.send('carOutput', co_send) + def controls_update(self, CC: car.CarControl): """control update loop, driven by carControl""" # send car controls over can now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) - actuators_output, can_sends = self.CI.apply(CC, now_nanos) + self.last_actuators, can_sends = self.CI.apply(CC, now_nanos) self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=self.CS.canValid)) - return actuators_output + self.CC_prev = CC class Controls: def __init__(self, CI=None): self.card = CarD(CI) - self.CP = self.card.CP + self.params = Params() + + with car.CarParams.from_bytes(self.params.get("CarParams", block=True)) as msg: + # TODO: this shouldn't need to be a builder + self.CP = msg.as_builder() + self.CI = self.card.CI - config_realtime_process(4, Priority.CTRL_HIGH) # Ensure the current branch is cached, otherwise the first iteration of controlsd lags self.branch = get_short_branch() @@ -195,12 +207,11 @@ class Controls: self.log_sock = messaging.sub_sock('androidLog') - self.params = Params() ignore = self.sensor_packets + ['testJoystick'] if SIMULATION: ignore += ['driverCameraState', 'managerState'] self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration', - 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', + 'carOutput', 'driverMonitoringState', 'longitudinalPlan', 'liveLocationKalman', 'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', 'testJoystick'] + self.camera_packets + self.sensor_packets, ignore_alive=ignore, ignore_avg_freq=ignore+['radarState', 'testJoystick'], ignore_valid=['testJoystick', ], @@ -212,15 +223,12 @@ class Controls: self.disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") self.is_metric = self.params.get_bool("IsMetric") self.is_ldw_enabled = self.params.get_bool("IsLdwEnabled") - openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") # detect sound card presence and ensure successful init sounds_available = HARDWARE.get_sound_card_online() car_recognized = self.CP.carName != 'mock' - controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly - # cleanup old params if not self.CP.experimentalLongitudinalAvailable: self.params.remove("ExperimentalLongitudinalEnabled") @@ -267,7 +275,7 @@ class Controls: self.can_log_mono_time = 0 - self.startup_event = get_startup_event(car_recognized, controller_available, len(self.CP.carFw) > 0) + self.startup_event = get_startup_event(car_recognized, not self.CP.passive, len(self.CP.carFw) > 0) if not sounds_available: self.events.add(EventName.soundsUnavailable, static=True) @@ -513,7 +521,7 @@ class Controls: def data_sample(self): """Receive data from sockets and update carState""" - CS = self.card.state_update(self.CC) + CS = self.card.state_update() self.sm.update(0) @@ -771,6 +779,8 @@ class Controls: def publish_logs(self, CS, start_time, CC, lac_log): """Send actuators and hud commands to the car, send controlsstate and MPC logging""" + CO = self.sm['carOutput'] + # Orientation and angle rates can be useful for carcontroller # Only calibrated (car) frame is relevant for the carcontroller orientation_value = list(self.sm['liveLocationKalman'].calibratedOrientationNED.value) @@ -833,13 +843,12 @@ class Controls: hudControl.visualAlert = current_alert.visual_alert if not self.CP.passive and self.initialized: - self.last_actuators = self.card.controls_update(CC) - CC.actuatorsOutput = self.last_actuators + self.card.controls_update(CC) if self.CP.steerControlType == car.CarParams.SteerControlType.angle: - self.steer_limited = abs(CC.actuators.steeringAngleDeg - CC.actuatorsOutput.steeringAngleDeg) > \ + self.steer_limited = abs(CC.actuators.steeringAngleDeg - CO.actuatorsOutput.steeringAngleDeg) > \ STEER_ANGLE_SATURATION_THRESHOLD else: - self.steer_limited = abs(CC.actuators.steer - CC.actuatorsOutput.steer) > 1e-2 + self.steer_limited = abs(CC.actuators.steer - CO.actuatorsOutput.steer) > 1e-2 force_decel = (self.sm['driverMonitoringState'].awarenessStatus < 0.) or \ (self.state == State.softDisabling) @@ -896,15 +905,11 @@ class Controls: self.pm.send('controlsState', dat) - car_events = self.events.to_msg() - - self.card.state_publish(car_events) - # onroadEvents - logged every second or on change if (self.sm.frame % int(1. / DT_CTRL) == 0) or (self.events.names != self.events_prev): ce_send = messaging.new_message('onroadEvents', len(self.events)) ce_send.valid = True - ce_send.onroadEvents = car_events + ce_send.onroadEvents = self.events.to_msg() self.pm.send('onroadEvents', ce_send) self.events_prev = self.events.names.copy() @@ -961,6 +966,7 @@ class Controls: def main(): + config_realtime_process(4, Priority.CTRL_HIGH) controls = Controls() controls.controlsd_thread() diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index 69bab8d1fa..b49784d13f 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -159,8 +159,9 @@ class TorqueEstimator(ParameterEstimator): def handle_log(self, t, which, msg): if which == "carControl": self.raw_points["carControl_t"].append(t + self.lag) - self.raw_points["steer_torque"].append(-msg.actuatorsOutput.steer) self.raw_points["active"].append(msg.latActive) + elif which == "carOutput": + self.raw_points["steer_torque"].append(-msg.actuatorsOutput.steer) elif which == "carState": self.raw_points["carState_t"].append(t + self.lag) self.raw_points["vego"].append(msg.vEgo) @@ -218,7 +219,7 @@ def main(demo=False): config_realtime_process([0, 1, 2, 3], 5) pm = messaging.PubMaster(['liveTorqueParameters']) - sm = messaging.SubMaster(['carControl', 'carState', 'liveLocationKalman'], poll='liveLocationKalman') + sm = messaging.SubMaster(['carControl', 'carOutput', 'carState', 'liveLocationKalman'], poll='liveLocationKalman') params = Params() with car.CarParams.from_bytes(params.get("CarParams", block=True)) as CP: diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 1dfdca0d89..46d684211c 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -99a50fe1b645bc1dcbf621e9cb72d151c6896429 +43efe1cf08cba8c86bc1ae8234b3d3d084a40e5d diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 8f8c93ecff..4be9b8a430 100755 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -29,7 +29,7 @@ from openpilot.tools.lib.logreader import LogReader # Baseline CPU usage by process PROCS = { - "selfdrive.controls.controlsd": 41.0, + "selfdrive.controls.controlsd": 46.0, "./loggerd": 14.0, "./encoderd": 17.0, "./camerad": 14.5, diff --git a/tools/plotjuggler/layouts/max-torque-debug.xml b/tools/plotjuggler/layouts/max-torque-debug.xml index 20a49c2181..8cfd30599e 100644 --- a/tools/plotjuggler/layouts/max-torque-debug.xml +++ b/tools/plotjuggler/layouts/max-torque-debug.xml @@ -24,7 +24,7 @@ - + diff --git a/tools/plotjuggler/layouts/torque-controller.xml b/tools/plotjuggler/layouts/torque-controller.xml index 443255968a..d6e4684d63 100644 --- a/tools/plotjuggler/layouts/torque-controller.xml +++ b/tools/plotjuggler/layouts/torque-controller.xml @@ -24,8 +24,8 @@ - - + + diff --git a/tools/tuning/measure_steering_accuracy.py b/tools/tuning/measure_steering_accuracy.py index f804b328de..6abf1338dc 100755 --- a/tools/tuning/measure_steering_accuracy.py +++ b/tools/tuning/measure_steering_accuracy.py @@ -47,7 +47,7 @@ class SteeringAccuracyTool: v_ego = sm['carState'].vEgo active = sm['controlsState'].active - steer = sm['carControl'].actuatorsOutput.steer + steer = sm['carOutput'].actuatorsOutput.steer standstill = sm['carState'].standstill steer_limited = abs(sm['carControl'].actuators.steer - sm['carControl'].actuatorsOutput.steer) > 1e-2 overriding = sm['carState'].steeringPressed @@ -150,7 +150,7 @@ if __name__ == "__main__": messaging.context = messaging.Context() carControl = messaging.sub_sock('carControl', addr=args.addr, conflate=True) - sm = messaging.SubMaster(['carState', 'carControl', 'controlsState', 'modelV2'], addr=args.addr) + sm = messaging.SubMaster(['carState', 'carControl', 'carOutput', 'controlsState', 'modelV2'], addr=args.addr) time.sleep(1) # Make sure all submaster data is available before going further print("waiting for messages...") From 82acb87fae3e2972eb9d3942767c2dcc84c601a7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 4 Mar 2024 10:11:13 -0800 Subject: [PATCH 364/923] bump cereal --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 0172e60275..c5c2a60f1a 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 0172e60275b11074ff4e6b65378a12f3936fa95a +Subproject commit c5c2a60f1aa796e7de464015349db3c336b79220 From bc2407abeb68bce9c0fa94e3c7df1b1d0799e660 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 4 Mar 2024 13:45:32 -0500 Subject: [PATCH 365/923] move card to selfdrive/car/card (#31693) * more obivous dif * release --- release/files_common | 1 + selfdrive/car/card.py | 142 ++++++++++++++++++++++++++++++++ selfdrive/controls/controlsd.py | 128 +--------------------------- 3 files changed, 145 insertions(+), 126 deletions(-) create mode 100755 selfdrive/car/card.py diff --git a/release/files_common b/release/files_common index 1fb05b43a7..5ca624a5fa 100644 --- a/release/files_common +++ b/release/files_common @@ -86,6 +86,7 @@ selfdrive/boardd/pandad.py selfdrive/boardd/tests/test_boardd_loopback.py selfdrive/car/__init__.py +selfdrive/car/card.py selfdrive/car/docs_definitions.py selfdrive/car/car_helpers.py selfdrive/car/fingerprints.py diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py new file mode 100755 index 0000000000..2853ba9771 --- /dev/null +++ b/selfdrive/car/card.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +import os +import time + +import cereal.messaging as messaging + +from cereal import car + +from panda import ALTERNATIVE_EXPERIENCE + +from openpilot.common.params import Params +from openpilot.common.realtime import DT_CTRL + +from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp +from openpilot.selfdrive.car.car_helpers import get_car, get_one_can +from openpilot.selfdrive.car.interfaces import CarInterfaceBase + + +REPLAY = "REPLAY" in os.environ + + +class CarD: + CI: CarInterfaceBase + CS: car.CarState + + def __init__(self, CI=None): + self.can_sock = messaging.sub_sock('can', timeout=20) + self.sm = messaging.SubMaster(['pandaStates']) + self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput']) + + self.can_rcv_timeout_counter = 0 # conseuctive timeout count + self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count + + self.CC_prev = car.CarState.new_message() + + self.last_actuators = None + + self.params = Params() + + if CI is None: + # wait for one pandaState and one CAN packet + print("Waiting for CAN messages...") + get_one_can(self.can_sock) + + num_pandas = len(messaging.recv_one_retry(self.sm.sock['pandaStates']).pandaStates) + experimental_long_allowed = self.params.get_bool("ExperimentalLongitudinalEnabled") + self.CI, self.CP = get_car(self.can_sock, self.pm.sock['sendcan'], experimental_long_allowed, num_pandas) + else: + self.CI, self.CP = CI, CI.CP + + # set alternative experiences from parameters + disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") + self.CP.alternativeExperience = 0 + if not disengage_on_accelerator: + self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS + + car_recognized = self.CP.carName != 'mock' + openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") + + controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly + + self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly + if self.CP.passive: + safety_config = car.CarParams.SafetyConfig.new_message() + safety_config.safetyModel = car.CarParams.SafetyModel.noOutput + self.CP.safetyConfigs = [safety_config] + + # Write previous route's CarParams + prev_cp = self.params.get("CarParamsPersistent") + if prev_cp is not None: + self.params.put("CarParamsPrevRoute", prev_cp) + + # Write CarParams for radard + cp_bytes = self.CP.to_bytes() + self.params.put("CarParams", cp_bytes) + self.params.put_nonblocking("CarParamsCache", cp_bytes) + self.params.put_nonblocking("CarParamsPersistent", cp_bytes) + + def initialize(self): + """Initialize CarInterface, once controls are ready""" + self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) + + def state_update(self): + """carState update loop, driven by can""" + + # Update carState from CAN + can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) + self.CS = self.CI.update(self.CC_prev, can_strs) + + self.sm.update(0) + + can_rcv_valid = len(can_strs) > 0 + + # Check for CAN timeout + if not can_rcv_valid: + self.can_rcv_timeout_counter += 1 + self.can_rcv_cum_timeout_counter += 1 + else: + self.can_rcv_timeout_counter = 0 + + self.can_rcv_timeout = self.can_rcv_timeout_counter >= 5 + + if can_rcv_valid and REPLAY: + self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime + + self.state_publish() + + return self.CS + + def state_publish(self): + """carState and carParams publish loop""" + + # carState + cs_send = messaging.new_message('carState') + cs_send.valid = self.CS.canValid + cs_send.carState = self.CS + self.pm.send('carState', cs_send) + + # carParams - logged every 50 seconds (> 1 per segment) + if (self.sm.frame % int(50. / DT_CTRL) == 0): + cp_send = messaging.new_message('carParams') + cp_send.valid = True + cp_send.carParams = self.CP + self.pm.send('carParams', cp_send) + + # publish new carOutput + co_send = messaging.new_message('carOutput') + co_send.valid = True + if self.last_actuators is not None: + co_send.carOutput.actuatorsOutput = self.last_actuators + self.pm.send('carOutput', co_send) + + def controls_update(self, CC: car.CarControl): + """control update loop, driven by carControl""" + + # send car controls over can + now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) + self.last_actuators, can_sends = self.CI.apply(CC, now_nanos) + self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=self.CS.canValid)) + + self.CC_prev = CC + diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index fc68db14e5..e4f2542ea5 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -10,7 +10,6 @@ import cereal.messaging as messaging from cereal import car, log from cereal.visionipc import VisionIpcClient, VisionStreamType -from panda import ALTERNATIVE_EXPERIENCE from openpilot.common.conversions import Conversions as CV from openpilot.common.numpy_fast import clip @@ -18,9 +17,8 @@ from openpilot.common.params import Params from openpilot.common.realtime import config_realtime_process, Priority, Ratekeeper, DT_CTRL from openpilot.common.swaglog import cloudlog -from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp -from openpilot.selfdrive.car.car_helpers import get_car, get_startup_event, get_one_can -from openpilot.selfdrive.car.interfaces import CarInterfaceBase +from openpilot.selfdrive.car.car_helpers import get_startup_event +from openpilot.selfdrive.car.card import CarD from openpilot.selfdrive.controls.lib.alertmanager import AlertManager, set_offroad_alert from openpilot.selfdrive.controls.lib.drive_helpers import VCruiseHelper, clip_curvature from openpilot.selfdrive.controls.lib.events import Events, ET @@ -61,128 +59,6 @@ ACTIVE_STATES = (State.enabled, State.softDisabling, State.overriding) ENABLED_STATES = (State.preEnabled, *ACTIVE_STATES) -class CarD: - CI: CarInterfaceBase - CS: car.CarState - - def __init__(self, CI=None): - self.can_sock = messaging.sub_sock('can', timeout=20) - self.sm = messaging.SubMaster(['pandaStates']) - self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput']) - - self.can_rcv_timeout_counter = 0 # conseuctive timeout count - self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count - - self.CC_prev = car.CarState.new_message() - - self.last_actuators = None - - self.params = Params() - - if CI is None: - # wait for one pandaState and one CAN packet - print("Waiting for CAN messages...") - get_one_can(self.can_sock) - - num_pandas = len(messaging.recv_one_retry(self.sm.sock['pandaStates']).pandaStates) - experimental_long_allowed = self.params.get_bool("ExperimentalLongitudinalEnabled") - self.CI, self.CP = get_car(self.can_sock, self.pm.sock['sendcan'], experimental_long_allowed, num_pandas) - else: - self.CI, self.CP = CI, CI.CP - - # set alternative experiences from parameters - disengage_on_accelerator = self.params.get_bool("DisengageOnAccelerator") - self.CP.alternativeExperience = 0 - if not disengage_on_accelerator: - self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS - - car_recognized = self.CP.carName != 'mock' - openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") - - controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly - - self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly - if self.CP.passive: - safety_config = car.CarParams.SafetyConfig.new_message() - safety_config.safetyModel = car.CarParams.SafetyModel.noOutput - self.CP.safetyConfigs = [safety_config] - - # Write previous route's CarParams - prev_cp = self.params.get("CarParamsPersistent") - if prev_cp is not None: - self.params.put("CarParamsPrevRoute", prev_cp) - - # Write CarParams for radard - cp_bytes = self.CP.to_bytes() - self.params.put("CarParams", cp_bytes) - self.params.put_nonblocking("CarParamsCache", cp_bytes) - self.params.put_nonblocking("CarParamsPersistent", cp_bytes) - - def initialize(self): - """Initialize CarInterface, once controls are ready""" - self.CI.init(self.CP, self.can_sock, self.pm.sock['sendcan']) - - def state_update(self): - """carState update loop, driven by can""" - - # Update carState from CAN - can_strs = messaging.drain_sock_raw(self.can_sock, wait_for_one=True) - self.CS = self.CI.update(self.CC_prev, can_strs) - - self.sm.update(0) - - can_rcv_valid = len(can_strs) > 0 - - # Check for CAN timeout - if not can_rcv_valid: - self.can_rcv_timeout_counter += 1 - self.can_rcv_cum_timeout_counter += 1 - else: - self.can_rcv_timeout_counter = 0 - - self.can_rcv_timeout = self.can_rcv_timeout_counter >= 5 - - if can_rcv_valid and REPLAY: - self.can_log_mono_time = messaging.log_from_bytes(can_strs[0]).logMonoTime - - self.state_publish() - - return self.CS - - def state_publish(self): - """carState and carParams publish loop""" - - # carState - cs_send = messaging.new_message('carState') - cs_send.valid = self.CS.canValid - cs_send.carState = self.CS - self.pm.send('carState', cs_send) - - # carParams - logged every 50 seconds (> 1 per segment) - if (self.sm.frame % int(50. / DT_CTRL) == 0): - cp_send = messaging.new_message('carParams') - cp_send.valid = True - cp_send.carParams = self.CP - self.pm.send('carParams', cp_send) - - # publish new carOutput - co_send = messaging.new_message('carOutput') - co_send.valid = True - if self.last_actuators is not None: - co_send.carOutput.actuatorsOutput = self.last_actuators - self.pm.send('carOutput', co_send) - - def controls_update(self, CC: car.CarControl): - """control update loop, driven by carControl""" - - # send car controls over can - now_nanos = self.can_log_mono_time if REPLAY else int(time.monotonic() * 1e9) - self.last_actuators, can_sends = self.CI.apply(CC, now_nanos) - self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=self.CS.canValid)) - - self.CC_prev = CC - - class Controls: def __init__(self, CI=None): self.card = CarD(CI) From be2b48183f81c09f7bc5d1e77d880ce40abacb20 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 4 Mar 2024 17:33:52 -0500 Subject: [PATCH 366/923] updated -> move to selfdrive/updated/updated (#31696) * move updated * for release --- release/files_common | 3 ++- scripts/stop_updater.sh | 2 +- selfdrive/manager/process_config.py | 2 +- selfdrive/ui/qt/offroad/software_settings.cc | 4 ++-- selfdrive/{ => updated}/updated.py | 0 5 files changed, 6 insertions(+), 5 deletions(-) rename selfdrive/{ => updated}/updated.py (100%) diff --git a/release/files_common b/release/files_common index 5ca624a5fa..c0be9d3cae 100644 --- a/release/files_common +++ b/release/files_common @@ -53,9 +53,10 @@ tools/replay/*.h selfdrive/__init__.py selfdrive/sentry.py selfdrive/tombstoned.py -selfdrive/updated.py selfdrive/statsd.py +selfdrive/updated/* + system/logmessaged.py system/micd.py system/version.py diff --git a/scripts/stop_updater.sh b/scripts/stop_updater.sh index 4243d30e9f..7f82191823 100755 --- a/scripts/stop_updater.sh +++ b/scripts/stop_updater.sh @@ -1,7 +1,7 @@ #!/usr/bin/env sh # Stop updater -pkill -2 -f selfdrive.updated +pkill -2 -f selfdrive.updated.updated # Remove pending update rm -f /data/safe_staging/finalized/.overlay_consistent diff --git a/selfdrive/manager/process_config.py b/selfdrive/manager/process_config.py index cb6dd8883f..4f292917fd 100644 --- a/selfdrive/manager/process_config.py +++ b/selfdrive/manager/process_config.py @@ -78,7 +78,7 @@ procs = [ PythonProcess("radard", "selfdrive.controls.radard", only_onroad), PythonProcess("thermald", "selfdrive.thermald.thermald", always_run), PythonProcess("tombstoned", "selfdrive.tombstoned", always_run, enabled=not PC), - PythonProcess("updated", "selfdrive.updated", only_offroad, enabled=not PC), + PythonProcess("updated", "selfdrive.updated.updated", only_offroad, enabled=not PC), PythonProcess("uploader", "system.loggerd.uploader", always_run), PythonProcess("statsd", "selfdrive.statsd", always_run), diff --git a/selfdrive/ui/qt/offroad/software_settings.cc b/selfdrive/ui/qt/offroad/software_settings.cc index 15c022db9a..d12db3f878 100644 --- a/selfdrive/ui/qt/offroad/software_settings.cc +++ b/selfdrive/ui/qt/offroad/software_settings.cc @@ -17,7 +17,7 @@ void SoftwarePanel::checkForUpdates() { - std::system("pkill -SIGUSR1 -f selfdrive.updated"); + std::system("pkill -SIGUSR1 -f selfdrive.updated.updated"); } SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { @@ -36,7 +36,7 @@ SoftwarePanel::SoftwarePanel(QWidget* parent) : ListWidget(parent) { if (downloadBtn->text() == tr("CHECK")) { checkForUpdates(); } else { - std::system("pkill -SIGHUP -f selfdrive.updated"); + std::system("pkill -SIGHUP -f selfdrive.updated.updated"); } }); addItem(downloadBtn); diff --git a/selfdrive/updated.py b/selfdrive/updated/updated.py similarity index 100% rename from selfdrive/updated.py rename to selfdrive/updated/updated.py From 09e73f8fb6b681512b1adbe46b2d6e64f0f5f54f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Tue, 5 Mar 2024 00:04:28 +0100 Subject: [PATCH 367/923] webrtcd: allow empty bridge_services_out (#31694) * Test case * Add messaging only if services non empty * Fix webrtcd * Use parametrized_class * Bump to master teleoprtc --- system/webrtc/tests/test_webrtcd.py | 14 +++++++++++--- system/webrtc/webrtcd.py | 25 +++++++++++++++++-------- teleoprtc_repo | 2 +- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/system/webrtc/tests/test_webrtcd.py b/system/webrtc/tests/test_webrtcd.py index c31b63d02b..e5742dba07 100755 --- a/system/webrtc/tests/test_webrtcd.py +++ b/system/webrtc/tests/test_webrtcd.py @@ -11,8 +11,15 @@ from openpilot.system.webrtc.webrtcd import get_stream import aiortc from teleoprtc import WebRTCOfferBuilder +from parameterized import parameterized_class +@parameterized_class(("in_services", "out_services"), [ + (["testJoystick"], ["carState"]), + ([], ["carState"]), + (["testJoystick"], []), + ([], []), +]) class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): async def assertCompletesWithTimeout(self, awaitable, timeout=1): try: @@ -24,7 +31,7 @@ class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): async def test_webrtcd(self): mock_request = MagicMock() async def connect(offer): - body = {'sdp': offer.sdp, 'cameras': offer.video, 'bridge_services_in': [], 'bridge_services_out': ['carState']} + body = {'sdp': offer.sdp, 'cameras': offer.video, 'bridge_services_in': self.in_services, 'bridge_services_out': self.out_services} mock_request.json.side_effect = AsyncMock(return_value=body) response = await get_stream(mock_request) response_json = json.loads(response.text) @@ -33,7 +40,8 @@ class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): builder = WebRTCOfferBuilder(connect) builder.offer_to_receive_video_stream("road") builder.offer_to_receive_audio_stream() - builder.add_messaging() + if len(self.in_services) > 0 or len(self.out_services) > 0: + builder.add_messaging() stream = builder.stream() @@ -42,7 +50,7 @@ class TestWebrtcdProc(unittest.IsolatedAsyncioTestCase): self.assertTrue(stream.has_incoming_video_track("road")) self.assertTrue(stream.has_incoming_audio_track()) - self.assertTrue(stream.has_messaging_channel()) + self.assertEqual(stream.has_messaging_channel(), len(self.in_services) > 0 or len(self.out_services) > 0) video_track, audio_track = stream.get_incoming_video_track("road"), stream.get_incoming_audio_track() await self.assertCompletesWithTimeout(video_track.recv()) diff --git a/system/webrtc/webrtcd.py b/system/webrtc/webrtcd.py index 6c1370eae9..95c8ae337d 100755 --- a/system/webrtc/webrtcd.py +++ b/system/webrtc/webrtcd.py @@ -128,9 +128,14 @@ class StreamSession: self.stream = builder.stream() self.identifier = str(uuid.uuid4()) - self.outgoing_bridge = CerealOutgoingMessageProxy(messaging.SubMaster(outgoing_services)) - self.incoming_bridge = CerealIncomingMessageProxy(messaging.PubMaster(incoming_services)) - self.outgoing_bridge_runner = CerealProxyRunner(self.outgoing_bridge) + self.incoming_bridge: CerealIncomingMessageProxy | None = None + self.outgoing_bridge: CerealOutgoingMessageProxy | None = None + self.outgoing_bridge_runner: CerealProxyRunner | None = None + if len(incoming_services) > 0: + self.incoming_bridge = CerealIncomingMessageProxy(messaging.PubMaster(incoming_services)) + if len(outgoing_services) > 0: + self.outgoing_bridge = CerealOutgoingMessageProxy(messaging.SubMaster(outgoing_services)) + self.outgoing_bridge_runner = CerealProxyRunner(self.outgoing_bridge) self.audio_output: AudioOutputSpeaker | MediaBlackhole | None = None self.run_task: asyncio.Task | None = None @@ -152,6 +157,7 @@ class StreamSession: return await self.stream.start() async def message_handler(self, message: bytes): + assert self.incoming_bridge is not None try: self.incoming_bridge.send(message) except Exception as ex: @@ -161,10 +167,12 @@ class StreamSession: try: await self.stream.wait_for_connection() if self.stream.has_messaging_channel(): - self.stream.set_message_handler(self.message_handler) - channel = self.stream.get_messaging_channel() - self.outgoing_bridge_runner.proxy.add_channel(channel) - self.outgoing_bridge_runner.start() + if self.incoming_bridge is not None: + self.stream.set_message_handler(self.message_handler) + if self.outgoing_bridge_runner is not None: + channel = self.stream.get_messaging_channel() + self.outgoing_bridge_runner.proxy.add_channel(channel) + self.outgoing_bridge_runner.start() if self.stream.has_incoming_audio_track(): track = self.stream.get_incoming_audio_track(buffered=False) self.audio_output = self.audio_output_cls() @@ -181,7 +189,8 @@ class StreamSession: async def post_run_cleanup(self): await self.stream.stop() - self.outgoing_bridge_runner.stop() + if self.outgoing_bridge is not None: + self.outgoing_bridge_runner.stop() if self.audio_output: self.audio_output.stop() diff --git a/teleoprtc_repo b/teleoprtc_repo index 8489ac3c5a..ab2f09706e 160000 --- a/teleoprtc_repo +++ b/teleoprtc_repo @@ -1 +1 @@ -Subproject commit 8489ac3c5aa0b0e2fec397694f9005e2b5a613e4 +Subproject commit ab2f09706e8f64390e196f079ac69e67131b07f5 From deb79a9c443fa1fc1499e40a97757c7d8b6af735 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 4 Mar 2024 19:18:16 -0500 Subject: [PATCH 368/923] card: fix startup condition (#31698) fix default cc --- selfdrive/car/card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 2853ba9771..9231794a6c 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -31,7 +31,7 @@ class CarD: self.can_rcv_timeout_counter = 0 # conseuctive timeout count self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count - self.CC_prev = car.CarState.new_message() + self.CC_prev = car.CarControl.new_message() self.last_actuators = None From 95c748b9f97f80aac1cd0a525d3df5ba43afd383 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 4 Mar 2024 22:41:31 -0500 Subject: [PATCH 369/923] M-TSC: Re-enable in release --- CHANGELOGS.md | 3 +++ selfdrive/controls/lib/turn_speed_controller.py | 5 ++--- selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc | 8 +------- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index fd7c841de1..4668117ca1 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -5,6 +5,9 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) ************************ * UPDATED: Synced with commaai's openpilot * master commit 56e343b (February 27, 2024) +* RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms + * openpilot Longitudianl Control available cars + * Custom Stock Longitudinal Control available cars sunnypilot - 0.9.6.1 (2024-02-27) ======================== diff --git a/selfdrive/controls/lib/turn_speed_controller.py b/selfdrive/controls/lib/turn_speed_controller.py index 28ecf10593..3900d56ab0 100644 --- a/selfdrive/controls/lib/turn_speed_controller.py +++ b/selfdrive/controls/lib/turn_speed_controller.py @@ -3,7 +3,6 @@ import math import time from cereal import custom from openpilot.common.params import Params -from openpilot.system.version import is_release_sp_branch R = 6373000.0 # approximate radius of earth in meters TO_RADIANS = math.pi / 180 @@ -48,7 +47,7 @@ class TurnSpeedController: def __init__(self): self.params = Params() self.mem_params = Params("/dev/shm/params") - self.enabled = self.params.get_bool("TurnSpeedControl") and not is_release_sp_branch() + self.enabled = self.params.get_bool("TurnSpeedControl") self.last_params_update = 0 self._op_enabled = False self._gas_pressed = False @@ -78,7 +77,7 @@ class TurnSpeedController: def update_params(self): t = time.monotonic() if t > self.last_params_update + PARAMS_UPDATE_PERIOD: - self.enabled = self.params.get_bool("TurnSpeedControl") and not is_release_sp_branch() + self.enabled = self.params.get_bool("TurnSpeedControl") self.last_params_update = t def target_speed(self, v_ego, a_ego) -> float: diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc index ef95855722..aaab761f61 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc @@ -470,7 +470,6 @@ void SunnypilotPanel::updateToggles() { QString nnff_loaded = tr("✅ NNLC Loaded"); auto _car_model = QString::fromStdString(params.get("NNFFCarModel")); - const bool is_release_sp = params.getBool("IsReleaseSPBranch"); auto cp_bytes = params.get("CarParamsPersistent"); if (!cp_bytes.empty()) { AlignedBuffer aligned_buf; @@ -503,11 +502,6 @@ void SunnypilotPanel::updateToggles() { } } - if (is_release_sp) { - params.remove("TurnSpeedControl"); - } - m_tsc->setVisible(!is_release_sp); - if (hasLongitudinalControl(CP) || custom_stock_long_param) { v_tsc->setEnabled(true); m_tsc->setEnabled(true); @@ -528,7 +522,7 @@ void SunnypilotPanel::updateToggles() { m_tsc->refresh(); } else { v_tsc->setEnabled(false); - m_tsc->setVisible(false); // TODO: temporarily disable M-TSC until the reimplementation is in place. Remove this line to re-enable the toggle. + m_tsc->setEnabled(false); reverse_acc->setEnabled(false); slc_toggle->setEnabled(false); slcSettings->setEnabled(false); From 32fb58656a46dc428ec43f04f396aee994efd14e Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Tue, 5 Mar 2024 19:36:01 +0100 Subject: [PATCH 370/923] Only print keyboard help on poll start and unknown command (#31710) --- tools/sim/bridge/common.py | 4 ---- tools/sim/lib/keyboard_ctrl.py | 7 +++++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 2391df6651..78ddfa5aa6 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -13,7 +13,6 @@ from openpilot.selfdrive.car.honda.values import CruiseButtons from openpilot.tools.sim.lib.common import SimulatorState, World from openpilot.tools.sim.lib.simulated_car import SimulatedCar from openpilot.tools.sim.lib.simulated_sensors import SimulatedSensors -from openpilot.tools.sim.lib.keyboard_ctrl import KEYBOARD_HELP def rk_loop(function, hz, exit_event: threading.Event): @@ -74,9 +73,6 @@ class SimulatorBridge(ABC): def print_status(self): print( f""" -Keyboard Commands: -{KEYBOARD_HELP} - State: Ignition: {self.simulator_state.ignition} Engaged: {self.simulator_state.is_engaged} """) diff --git a/tools/sim/lib/keyboard_ctrl.py b/tools/sim/lib/keyboard_ctrl.py index 339f4ea6bb..ea255d9ce4 100644 --- a/tools/sim/lib/keyboard_ctrl.py +++ b/tools/sim/lib/keyboard_ctrl.py @@ -49,7 +49,12 @@ def getch() -> str: termios.tcsetattr(STDIN_FD, termios.TCSADRAIN, old_settings) return ch +def print_keyboard_help(): + print(f"Keyboard Commands:\n{KEYBOARD_HELP}") + def keyboard_poll_thread(q: 'Queue[str]'): + print_keyboard_help() + while True: c = getch() if c == '1': @@ -77,6 +82,8 @@ def keyboard_poll_thread(q: 'Queue[str]'): elif c == 'q': q.put("quit") break + else: + print_keyboard_help() def test(q: 'Queue[str]') -> NoReturn: while True: From 9d4d5f6077a4bb0c40eb91ec41154f7903761253 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 5 Mar 2024 14:02:02 -0500 Subject: [PATCH 371/923] torqued: use correct time from carOutput (#31712) fix timings --- selfdrive/locationd/torqued.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/locationd/torqued.py b/selfdrive/locationd/torqued.py index b49784d13f..06f9044738 100755 --- a/selfdrive/locationd/torqued.py +++ b/selfdrive/locationd/torqued.py @@ -161,6 +161,7 @@ class TorqueEstimator(ParameterEstimator): self.raw_points["carControl_t"].append(t + self.lag) self.raw_points["active"].append(msg.latActive) elif which == "carOutput": + self.raw_points["carOutput_t"].append(t + self.lag) self.raw_points["steer_torque"].append(-msg.actuatorsOutput.steer) elif which == "carState": self.raw_points["carState_t"].append(t + self.lag) @@ -173,7 +174,7 @@ class TorqueEstimator(ParameterEstimator): active = np.interp(np.arange(t - MIN_ENGAGE_BUFFER, t, DT_MDL), self.raw_points['carControl_t'], self.raw_points['active']).astype(bool) steer_override = np.interp(np.arange(t - MIN_ENGAGE_BUFFER, t, DT_MDL), self.raw_points['carState_t'], self.raw_points['steer_override']).astype(bool) vego = np.interp(t, self.raw_points['carState_t'], self.raw_points['vego']) - steer = np.interp(t, self.raw_points['carControl_t'], self.raw_points['steer_torque']) + steer = np.interp(t, self.raw_points['carOutput_t'], self.raw_points['steer_torque']) lateral_acc = (vego * yaw_rate) - (np.sin(roll) * ACCELERATION_DUE_TO_GRAVITY) if all(active) and (not any(steer_override)) and (vego > MIN_VEL) and (abs(steer) > STEER_MIN_THRESHOLD) and (abs(lateral_acc) <= LAT_ACC_THRESHOLD): self.filtered_points.add_point(float(steer), float(lateral_acc)) From 032c0878b8f15ffecd372bc12d8be66de2608358 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Tue, 5 Mar 2024 21:14:50 +0100 Subject: [PATCH 372/923] webrtcd: ability to have multiple streams publishing same message (#31700) Use single PubMaster with dynamic services --- system/webrtc/webrtcd.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/system/webrtc/webrtcd.py b/system/webrtc/webrtcd.py index 95c8ae337d..51c86aacc6 100755 --- a/system/webrtc/webrtcd.py +++ b/system/webrtc/webrtcd.py @@ -102,7 +102,21 @@ class CerealProxyRunner: await asyncio.sleep(0.01) +class DynamicPubMaster(messaging.PubMaster): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.lock = asyncio.Lock() + + async def add_services_if_needed(self, services): + async with self.lock: + for service in services: + if service not in self.sock: + self.sock[service] = messaging.pub_sock(service) + + class StreamSession: + shared_pub_master = DynamicPubMaster([]) + def __init__(self, sdp: str, cameras: list[str], incoming_services: list[str], outgoing_services: list[str], debug_mode: bool = False): from aiortc.mediastreams import VideoStreamTrack, AudioStreamTrack from aiortc.contrib.media import MediaBlackhole @@ -129,10 +143,11 @@ class StreamSession: self.identifier = str(uuid.uuid4()) self.incoming_bridge: CerealIncomingMessageProxy | None = None + self.incoming_bridge_services = incoming_services self.outgoing_bridge: CerealOutgoingMessageProxy | None = None self.outgoing_bridge_runner: CerealProxyRunner | None = None if len(incoming_services) > 0: - self.incoming_bridge = CerealIncomingMessageProxy(messaging.PubMaster(incoming_services)) + self.incoming_bridge = CerealIncomingMessageProxy(self.shared_pub_master) if len(outgoing_services) > 0: self.outgoing_bridge = CerealOutgoingMessageProxy(messaging.SubMaster(outgoing_services)) self.outgoing_bridge_runner = CerealProxyRunner(self.outgoing_bridge) @@ -168,6 +183,7 @@ class StreamSession: await self.stream.wait_for_connection() if self.stream.has_messaging_channel(): if self.incoming_bridge is not None: + await self.shared_pub_master.add_services_if_needed(self.incoming_bridge_services) self.stream.set_message_handler(self.message_handler) if self.outgoing_bridge_runner is not None: channel = self.stream.get_messaging_channel() From 638aaa9e53459127a0a1bbd757f85ef1ae16098d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 15:10:58 -0800 Subject: [PATCH 373/923] Platform configs: move tire stiffness into config (#31678) * first one to open PR * mazda * oh it is * fix gm car specs and create MazdaCarSpecs * fix * do honda * ruff --- selfdrive/car/gm/interface.py | 7 ------- selfdrive/car/gm/values.py | 31 +++++++++++++++++------------- selfdrive/car/honda/interface.py | 15 --------------- selfdrive/car/honda/values.py | 33 +++++++++++++++++--------------- selfdrive/car/mazda/interface.py | 1 - selfdrive/car/mazda/values.py | 13 +++++++++---- 6 files changed, 45 insertions(+), 55 deletions(-) diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index e0dde4d0e9..76f6a6b0a6 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -145,15 +145,12 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.00]] ret.lateralTuning.pid.kf = 0.00004 # full torque for 20 deg at 80mph means 0.00007818594 ret.steerActuatorDelay = 0.1 # Default delay, not measured yet - ret.tireStiffnessFactor = 0.444 # not optimized yet ret.steerLimitTimer = 0.4 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: - ret.tireStiffnessFactor = 0.469 # Stock Michelin Energy Saver A/S, LiveParameters - ret.lateralTuning.pid.kpBP = [0., 40.] ret.lateralTuning.pid.kpV = [0., 0.17] ret.lateralTuning.pid.kiBP = [0.] @@ -175,7 +172,6 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.ESCALADE_ESV, CAR.ESCALADE_ESV_2019): ret.minEnableSpeed = -1. # engage speed is decided by pcm - ret.tireStiffnessFactor = 1.0 if candidate == CAR.ESCALADE_ESV: ret.lateralTuning.pid.kiBP, ret.lateralTuning.pid.kpBP = [[10., 41.0], [10., 41.0]] @@ -186,12 +182,10 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.BOLT_EUV: - ret.tireStiffnessFactor = 1.0 ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.SILVERADO: - ret.tireStiffnessFactor = 1.0 # 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 @@ -203,7 +197,6 @@ class CarInterface(CarInterfaceBase): CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) elif candidate == CAR.TRAILBLAZER: - ret.tireStiffnessFactor = 1.0 ret.steerActuatorDelay = 0.2 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index e3414df2bf..bf3c8622c5 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -79,6 +79,11 @@ class GMCarInfo(CarInfo): self.footnotes.append(Footnote.OBD_II) +@dataclass(frozen=True, kw_only=True) +class GMCarSpecs(CarSpecs): + tireStiffnessFactor: float = 0.444 # not optimized yet + + @dataclass 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')) @@ -88,47 +93,47 @@ class CAR(Platforms): HOLDEN_ASTRA = GMPlatformConfig( "HOLDEN ASTRA RS-V BK 2017", GMCarInfo("Holden Astra 2017"), - CarSpecs(mass=1363, wheelbase=2.662, steerRatio=15.7, centerToFrontRatio=0.4), + 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"), - CarSpecs(mass=1607, wheelbase=2.69, steerRatio=17.7, centerToFrontRatio=0.45), + 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"), - CarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), + GMCarSpecs(mass=1601, wheelbase=2.78, steerRatio=15.3), ) MALIBU = GMPlatformConfig( "CHEVROLET MALIBU PREMIER 2017", GMCarInfo("Chevrolet Malibu Premier 2017"), - CarSpecs(mass=1496, wheelbase=2.83, steerRatio=15.8, centerToFrontRatio=0.4), + 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"), - CarSpecs(mass=1975, wheelbase=2.86, steerRatio=14.4, centerToFrontRatio=0.4), + 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"), - CarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), + GMCarSpecs(mass=1712, wheelbase=2.91, steerRatio=15.8, centerToFrontRatio=0.4), ) BUICK_REGAL = GMPlatformConfig( "BUICK REGAL ESSENCE 2018", GMCarInfo("Buick Regal Essence 2018"), - CarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), + GMCarSpecs(mass=1714, wheelbase=2.83, steerRatio=14.4, centerToFrontRatio=0.4), ) ESCALADE = GMPlatformConfig( "CADILLAC ESCALADE 2017", GMCarInfo("Cadillac Escalade 2017", "Driver Assist Package"), - CarSpecs(mass=2564, wheelbase=2.95, steerRatio=17.3), + 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"), - CarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3), + GMCarSpecs(mass=2739, wheelbase=3.302, steerRatio=17.3, tireStiffnessFactor=1.0), ) ESCALADE_ESV_2019 = GMPlatformConfig( "CADILLAC ESCALADE ESV 2019", @@ -141,7 +146,7 @@ class CAR(Platforms): 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"), ], - CarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4), + GMCarSpecs(mass=1669, wheelbase=2.63779, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) SILVERADO = GMPlatformConfig( "CHEVROLET SILVERADO 1500 2020", @@ -149,17 +154,17 @@ class CAR(Platforms): 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"), ], - CarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3), + GMCarSpecs(mass=2450, wheelbase=3.75, steerRatio=16.3, tireStiffnessFactor=1.0), ) EQUINOX = GMPlatformConfig( "CHEVROLET EQUINOX 2019", GMCarInfo("Chevrolet Equinox 2019-22"), - CarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), + GMCarSpecs(mass=1588, wheelbase=2.72, steerRatio=14.4, centerToFrontRatio=0.4), ) TRAILBLAZER = GMPlatformConfig( "CHEVROLET TRAILBLAZER 2021", GMCarInfo("Chevrolet Trailblazer 2021-22"), - CarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4), + GMCarSpecs(mass=1345, wheelbase=2.64, steerRatio=16.8, centerToFrontRatio=0.4, tireStiffnessFactor=1.0), ) diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 9c39c4694f..f791d4b639 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -111,7 +111,6 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.ACCORD: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.8467 if eps_modified: ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.3], [0.09]] @@ -120,12 +119,10 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.ACURA_ILX: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.72 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] elif candidate in (CAR.CRV, CAR.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.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] ret.wheelSpeedFactor = 1.025 @@ -139,28 +136,23 @@ class CarInterface(CarInterfaceBase): else: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.64], [0.192]] - ret.tireStiffnessFactor = 0.677 ret.wheelSpeedFactor = 1.025 elif candidate == CAR.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.tireStiffnessFactor = 0.677 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] ret.wheelSpeedFactor = 1.025 elif candidate == CAR.FIT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.75 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] elif candidate == CAR.FREED: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] - ret.tireStiffnessFactor = 0.75 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.05]] elif candidate in (CAR.HRV, CAR.HRV_3G): ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] - ret.tireStiffnessFactor = 0.5 if candidate == CAR.HRV: ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.16], [0.025]] ret.wheelSpeedFactor = 1.025 @@ -168,17 +160,14 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.8], [0.24]] # TODO: can probably use some tuning elif candidate == CAR.ACURA_RDX: - ret.tireStiffnessFactor = 0.444 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]] elif candidate == CAR.ACURA_RDX_3G: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 3840], [0, 3840]] ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.2], [0.06]] - ret.tireStiffnessFactor = 0.677 elif candidate in (CAR.ODYSSEY, CAR.ODYSSEY_CHN): - ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.28], [0.08]] if candidate == CAR.ODYSSEY_CHN: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 32767], [0, 32767]] # TODO: determine if there is a dead zone at the top end @@ -187,22 +176,18 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.PILOT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] elif candidate == CAR.RIDGELINE: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.444 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.38], [0.11]] elif candidate == CAR.INSIGHT: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] elif candidate == CAR.HONDA_E: ret.lateralParams.torqueBP, ret.lateralParams.torqueV = [[0, 4096], [0, 4096]] # TODO: determine if there is a dead zone at the top end - ret.tireStiffnessFactor = 0.82 ret.lateralTuning.pid.kpV, ret.lateralTuning.pid.kiV = [[0.6], [0.18]] # TODO: can probably use some tuning else: diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index a6b7d26567..4bcbf00735 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -117,7 +117,8 @@ class CAR(Platforms): 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), ], - CarSpecs(mass=3279 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=16.33, centerToFrontRatio=0.39), # steerRatio: 11.82 is spec end-to-end + # 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), dbc_dict('honda_accord_2018_can_generated', None), ) CIVIC_BOSCH = HondaBoschPlatformConfig( @@ -149,40 +150,42 @@ class CAR(Platforms): CRV_5G = HondaBoschPlatformConfig( "HONDA CR-V 2017", HondaCarInfo("Honda CR-V 2017-22", min_steer_speed=12. * CV.MPH_TO_MS), - CarSpecs(mass=3410 * CV.LB_TO_KG, wheelbase=2.66, steerRatio=16.0, centerToFrontRatio=0.41), # steerRatio: 12.3 is spec end-to-end + # 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 CR-V HYBRID 2019", HondaCarInfo("Honda CR-V Hybrid 2017-20", min_steer_speed=12. * CV.MPH_TO_MS), - CarSpecs(mass=1667, wheelbase=2.66, steerRatio=16, centerToFrontRatio=0.41), # mass: mean of 4 models in kg, steerRatio: 12.3 is spec end-to-end + # 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"), - CarSpecs(mass=3125 * CV.LB_TO_KG, wheelbase=2.61, steerRatio=15.2, centerToFrontRatio=0.41), + 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), - CarSpecs(mass=4068 * CV.LB_TO_KG, wheelbase=2.75, steerRatio=11.95, centerToFrontRatio=0.41), # as spec + 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), - CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.0, centerToFrontRatio=0.39), # as spec + 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), - CarSpecs(mass=3338.8 * CV.LB_TO_KG, wheelbase=2.5, centerToFrontRatio=0.5, steerRatio=16.71), + 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), ) @@ -190,14 +193,14 @@ class CAR(Platforms): ACURA_ILX = HondaNidecPlatformConfig( "ACURA ILX 2016", 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), # 15.3 is spec end-to-end + 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), - CarSpecs(mass=3572 * CV.LB_TO_KG, wheelbase=2.62, steerRatio=16.89, centerToFrontRatio=0.41), # as spec + 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, ) @@ -211,14 +214,14 @@ class CAR(Platforms): FIT = HondaNidecPlatformConfig( "HONDA FIT 2018", 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), + 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), - CarSpecs(mass=3086. * CV.LB_TO_KG, wheelbase=2.74, steerRatio=13.06, centerToFrontRatio=0.39), # mostly copied from FIT + 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, ) @@ -232,7 +235,7 @@ class CAR(Platforms): ODYSSEY = HondaNidecPlatformConfig( "HONDA ODYSSEY 2018", HondaCarInfo("Honda Odyssey 2018-20"), - CarSpecs(mass=1900, wheelbase=3.0, steerRatio=14.35, centerToFrontRatio=0.41), + 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, ) @@ -246,7 +249,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), - CarSpecs(mass=3925 * CV.LB_TO_KG, wheelbase=2.68, steerRatio=15.0, centerToFrontRatio=0.38), # as spec + 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, ) @@ -256,14 +259,14 @@ class CAR(Platforms): 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), ], - CarSpecs(mass=4278 * CV.LB_TO_KG, wheelbase=2.86, centerToFrontRatio=0.428, steerRatio=16.0), # as spec + 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'), flags=HondaFlags.NIDEC_ALT_SCM_MESSAGES, ) RIDGELINE = HondaNidecPlatformConfig( "HONDA RIDGELINE 2017", 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), # as spec + 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, ) diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index a138318b1a..85be0166ce 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -20,7 +20,6 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.1 ret.steerLimitTimer = 0.8 - ret.tireStiffnessFactor = 0.70 # not optimized yet CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning) diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index f45e80c119..d8f5aa85dd 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -32,6 +32,11 @@ class MazdaCarInfo(CarInfo): car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.mazda])) +@dataclass(frozen=True, kw_only=True) +class MazdaCarSpecs(CarSpecs): + tireStiffnessFactor: float = 0.7 # not optimized yet + + class MazdaFlags(IntFlag): # Static flags # Gen 1 hardware: same CAN messages and same camera @@ -48,22 +53,22 @@ class CAR(Platforms): CX5 = MazdaPlatformConfig( "MAZDA CX-5", MazdaCarInfo("Mazda CX-5 2017-21"), - CarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) + MazdaCarSpecs(mass=3655 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=15.5) ) CX9 = MazdaPlatformConfig( "MAZDA CX-9", MazdaCarInfo("Mazda CX-9 2016-20"), - CarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) + MazdaCarSpecs(mass=4217 * CV.LB_TO_KG, wheelbase=3.1, steerRatio=17.6) ) MAZDA3 = MazdaPlatformConfig( "MAZDA 3", MazdaCarInfo("Mazda 3 2017-18"), - CarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) + MazdaCarSpecs(mass=2875 * CV.LB_TO_KG, wheelbase=2.7, steerRatio=14.0) ) MAZDA6 = MazdaPlatformConfig( "MAZDA 6", MazdaCarInfo("Mazda 6 2017-20"), - CarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) + MazdaCarSpecs(mass=3443 * CV.LB_TO_KG, wheelbase=2.83, steerRatio=15.5) ) CX9_2021 = MazdaPlatformConfig( "MAZDA CX-9 2021", From fb81cfe3c41fabb33effa4027bb5eed95ced9f19 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Tue, 5 Mar 2024 23:33:39 +0000 Subject: [PATCH 374/923] fw_versions: add more type hints (#31577) * fw_versions: add more type hints * cleanup * fixes * more implicit optional * Update selfdrive/car/fw_versions.py * backslash is unnecessary inside parenthesis --------- Co-authored-by: Shane Smiskol --- selfdrive/car/fw_versions.py | 58 ++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/selfdrive/car/fw_versions.py b/selfdrive/car/fw_versions.py index 7673814195..c200528ca6 100755 --- a/selfdrive/car/fw_versions.py +++ b/selfdrive/car/fw_versions.py @@ -1,19 +1,20 @@ #!/usr/bin/env python3 from collections import defaultdict -from typing import Any, TypeVar from collections.abc import Iterator +from typing import Any, Protocol, TypeVar + from tqdm import tqdm import capnp import panda.python.uds as uds from cereal import car from openpilot.common.params import Params -from openpilot.selfdrive.car.ecu_addrs import get_ecu_addrs -from openpilot.selfdrive.car.fw_query_definitions import AddrType, EcuAddrBusType, FwQueryConfig -from openpilot.selfdrive.car.interfaces import get_interface_attr -from openpilot.selfdrive.car.fingerprints import FW_VERSIONS -from openpilot.selfdrive.car.isotp_parallel_query import IsoTpParallelQuery from openpilot.common.swaglog import cloudlog +from openpilot.selfdrive.car.ecu_addrs import get_ecu_addrs +from openpilot.selfdrive.car.fingerprints import FW_VERSIONS +from openpilot.selfdrive.car.fw_query_definitions import AddrType, EcuAddrBusType, FwQueryConfig, LiveFwVersions, OfflineFwVersions +from openpilot.selfdrive.car.interfaces import get_interface_attr +from openpilot.selfdrive.car.isotp_parallel_query import IsoTpParallelQuery Ecu = car.CarParams.Ecu ESSENTIAL_ECUS = [Ecu.engine, Ecu.eps, Ecu.abs, Ecu.fwdRadar, Ecu.fwdCamera, Ecu.vsa] @@ -38,8 +39,7 @@ def is_brand(brand: str, filter_brand: str | None) -> bool: return filter_brand is None or brand == filter_brand -def build_fw_dict(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], - filter_brand: str = None) -> dict[AddrType, set[bytes]]: +def build_fw_dict(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], filter_brand: str = None) -> dict[AddrType, set[bytes]]: fw_versions_dict: defaultdict[AddrType, set[bytes]] = defaultdict(set) for fw in fw_versions: if is_brand(fw.brand, filter_brand) and not fw.logging: @@ -48,7 +48,12 @@ def build_fw_dict(fw_versions: list[capnp.lib.capnp._DynamicStructBuilder], return dict(fw_versions_dict) -def match_fw_to_car_fuzzy(live_fw_versions, match_brand=None, log=True, exclude=None): +class MatchFwToCar(Protocol): + def __call__(self, live_fw_versions: LiveFwVersions, match_brand: str = None, log: bool = True) -> set[str]: + ... + + +def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, match_brand: str = None, log: bool = True, exclude: str = None) -> set[str]: """Do a fuzzy FW match. This function will return a match, and the number of firmware version that were matched uniquely to that specific car. If multiple ECUs uniquely match to different cars the match is rejected.""" @@ -73,7 +78,7 @@ def match_fw_to_car_fuzzy(live_fw_versions, match_brand=None, log=True, exclude= all_fw_versions[(addr[1], addr[2], f)].append(candidate) matched_ecus = set() - candidate = None + match: str | None = None for addr, versions in live_fw_versions.items(): ecu_key = (addr[0], addr[1]) for version in versions: @@ -82,23 +87,23 @@ def match_fw_to_car_fuzzy(live_fw_versions, match_brand=None, log=True, exclude= if len(candidates) == 1: matched_ecus.add(ecu_key) - if candidate is None: - candidate = candidates[0] + if match is None: + match = candidates[0] # We uniquely matched two different cars. No fuzzy match possible - elif candidate != candidates[0]: + elif match != candidates[0]: return set() # Note that it is possible to match to a candidate without all its ECUs being present # if there are enough matches. FIXME: parameterize this or require all ECUs to exist like exact matching - if len(matched_ecus) >= 2: + if match and len(matched_ecus) >= 2: if log: - cloudlog.error(f"Fingerprinted {candidate} using fuzzy match. {len(matched_ecus)} matching ECUs") - return {candidate} + cloudlog.error(f"Fingerprinted {match} using fuzzy match. {len(matched_ecus)} matching ECUs") + return {match} else: return set() -def match_fw_to_car_exact(live_fw_versions, match_brand=None, log=True, extra_fw_versions=None) -> set[str]: +def match_fw_to_car_exact(live_fw_versions: LiveFwVersions, match_brand: str = None, log: bool = True, extra_fw_versions: dict = None) -> set[str]: """Do an exact FW match. Returns all cars that match the given FW versions for a list of "essential" ECUs. If an ECU is not considered essential the FW version can be missing to get a fingerprint, but if it's present it @@ -139,9 +144,10 @@ def match_fw_to_car_exact(live_fw_versions, match_brand=None, log=True, extra_fw return set(candidates.keys()) - invalid -def match_fw_to_car(fw_versions, allow_exact=True, allow_fuzzy=True, log=True): +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]]: # Try exact matching first - exact_matches = [] + exact_matches: list[tuple[bool, MatchFwToCar]] = [] if allow_exact: exact_matches = [(True, match_fw_to_car_exact)] if allow_fuzzy: @@ -149,7 +155,7 @@ def match_fw_to_car(fw_versions, allow_exact=True, allow_fuzzy=True, log=True): for exact_match, match_func in exact_matches: # For each brand, attempt to fingerprint using all FW returned from its queries - matches = set() + matches: set[str] = set() for brand in VERSIONS.keys(): fw_versions_dict = build_fw_dict(fw_versions, filter_brand=brand) matches |= match_func(fw_versions_dict, match_brand=brand, log=log) @@ -165,12 +171,12 @@ def match_fw_to_car(fw_versions, allow_exact=True, allow_fuzzy=True, log=True): return True, set() -def get_present_ecus(logcan, sendcan, num_pandas=1) -> set[EcuAddrBusType]: +def get_present_ecus(logcan, sendcan, num_pandas: int = 1) -> set[EcuAddrBusType]: params = Params() # queries are split by OBD multiplexing mode queries: dict[bool, list[list[EcuAddrBusType]]] = {True: [], False: []} parallel_queries: dict[bool, list[EcuAddrBusType]] = {True: [], False: []} - responses = set() + responses: set[EcuAddrBusType] = set() for brand, config, r in REQUESTS: # Skip query if no panda available @@ -231,8 +237,8 @@ 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, timeout=0.1, num_pandas=1, debug=False, progress=False) -> \ - list[capnp.lib.capnp._DynamicStructBuilder]: +def get_fw_versions_ordered(logcan, sendcan, 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""" all_car_fw = [] @@ -254,8 +260,8 @@ def get_fw_versions_ordered(logcan, sendcan, ecu_rx_addrs, timeout=0.1, num_pand return all_car_fw -def get_fw_versions(logcan, sendcan, query_brand=None, extra=None, timeout=0.1, num_pandas=1, debug=False, progress=False) -> \ - list[capnp.lib.capnp._DynamicStructBuilder]: +def get_fw_versions(logcan, sendcan, query_brand: str = None, extra: OfflineFwVersions = None, timeout: float = 0.1, num_pandas: int = 1, + debug: bool = False, progress: bool = False) -> list[capnp.lib.capnp._DynamicStructBuilder]: versions = VERSIONS.copy() params = Params() From ecce4663d3f90d69c4592d3496de650c6714a75f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Wed, 6 Mar 2024 01:45:47 +0100 Subject: [PATCH 375/923] RadarInterfaceBase: remove no_radar_sleep field (#31715) Remove no_radar_sleep field from base radar interface --- selfdrive/car/interfaces.py | 1 - 1 file changed, 1 deletion(-) diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 9a78eea856..9e9e668981 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -334,7 +334,6 @@ class RadarInterfaceBase(ABC): self.delay = 0 self.radar_ts = CP.radarTimeStep self.frame = 0 - self.no_radar_sleep = 'NO_RADAR_SLEEP' in os.environ def update(self, can_strings): self.frame += 1 From ccda4119a8ce539c475a820ae53600b048599088 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 17:49:18 -0800 Subject: [PATCH 376/923] Hyundai Azera: allow fingerprinting without comma power (#31717) * do azera * azera is same * need to do this --- selfdrive/car/hyundai/values.py | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index bf0aa58999..babbc189be 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -650,10 +650,16 @@ def match_fw_to_car_fuzzy(live_fw_versions, offline_fw_versions) -> set[str]: expected_dates = {date for _, date in codes if date is not None} # Found platform codes & dates - codes = get_platform_codes(live_fw_versions.get(addr, set())) + found_versions = live_fw_versions.get(addr, set()) + codes = get_platform_codes(found_versions) found_platform_codes = {code for code, _ in codes} found_dates = {date for _, date in codes if date is not None} + # Some models are missing ECUs + if not len(found_versions) and candidate in FW_QUERY_CONFIG.non_essential_ecus.get(ecu[0], []): + valid_found_ecus.add(addr) + continue + # Check platform code + part number matches for any found versions if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): break @@ -801,6 +807,13 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), ], + # 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.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], # FIXME: EPS responds on a few cars from PT + Ecu.transmission: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], + Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], + }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) From 1ffc58a69a94efd70bf215bc9a324f17513bec85 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 17:51:13 -0800 Subject: [PATCH 377/923] Revert "Hyundai Azera: allow fingerprinting without comma power" (#31718) Revert "Hyundai Azera: allow fingerprinting without comma power (#31717)" This reverts commit ccda4119a8ce539c475a820ae53600b048599088. --- selfdrive/car/hyundai/values.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index babbc189be..bf0aa58999 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -650,16 +650,10 @@ def match_fw_to_car_fuzzy(live_fw_versions, offline_fw_versions) -> set[str]: expected_dates = {date for _, date in codes if date is not None} # Found platform codes & dates - found_versions = live_fw_versions.get(addr, set()) - codes = get_platform_codes(found_versions) + codes = get_platform_codes(live_fw_versions.get(addr, set())) found_platform_codes = {code for code, _ in codes} found_dates = {date for _, date in codes if date is not None} - # Some models are missing ECUs - if not len(found_versions) and candidate in FW_QUERY_CONFIG.non_essential_ecus.get(ecu[0], []): - valid_found_ecus.add(addr) - continue - # Check platform code + part number matches for any found versions if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): break @@ -807,13 +801,6 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), ], - # 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.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], # FIXME: EPS responds on a few cars from PT - Ecu.transmission: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], - Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], - }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) From 2d2695cd6e474f1d2c084f912303374dfa93b5bc Mon Sep 17 00:00:00 2001 From: MJ Kim Date: Wed, 6 Mar 2024 11:00:39 +0900 Subject: [PATCH 378/923] Hyundai: AZERA_HEV_6TH_GEN (Update fingerprints.py) (#31684) * Update fingerprints.py Hyundai AZERA_HEV_6TH_GEN * no new CAN fingerprints * no crnr rdr * Update selfdrive/car/hyundai/fingerprints.py --------- Co-authored-by: Shane Smiskol --- 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 d1fc1faabb..f23e173653 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -100,15 +100,18 @@ FW_VERSIONS = { CAR.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', b'\xf1\x00IGH MFC AT KOR LHD 1.00 1.02 99211-G8100 191029', ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00IG MDPS C 1.00 1.00 56310M9600\x00 4IHSC100', b'\xf1\x00IG MDPS C 1.00 1.01 56310M9350\x00 4IH8C101', + b'\xf1\x00IG MDPS C 1.00 1.02 56310M9350\x00 4IH8C102', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00IGhe SCC FHCUP 1.00 1.00 99110-M9100 ', 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', From 6919c3744563e0c24acfd7395fdf297d3152d970 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 18:00:47 -0800 Subject: [PATCH 379/923] Reapply "Hyundai Azera: allow fingerprinting without comma power (#31717)" (#31719) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Revert "Revert "Hyundai Azera: allow fingerprinting without comma power" (#31…" This reverts commit 1ffc58a69a94efd70bf215bc9a324f17513bec85. * we should get EPS * add EPS to non-logging can 0 query --- selfdrive/car/hyundai/values.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index bf0aa58999..ec4dadbcfc 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -731,7 +731,7 @@ FW_QUERY_CONFIG = FwQueryConfig( Request( [HYUNDAI_VERSION_REQUEST_LONG], [HYUNDAI_VERSION_RESPONSE], - whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.cornerRadar, Ecu.hvac], + whitelist_ecus=[Ecu.fwdCamera, Ecu.fwdRadar, Ecu.cornerRadar, Ecu.hvac, Ecu.eps], bus=0, auxiliary=True, ), @@ -801,6 +801,12 @@ FW_QUERY_CONFIG = FwQueryConfig( obd_multiplexing=False, ), ], + # 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], + Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], + }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) From 95a80fd2cd326c9dba3cbbfc5708ef284aec78c6 Mon Sep 17 00:00:00 2001 From: noname314 Date: Wed, 6 Mar 2024 11:08:32 +0900 Subject: [PATCH 380/923] HKG: Add FW versions and Enable Radar Tracks for KOR Sonata DN8 Hybrid 2020 (#31371) * HKG: Add FW versions for KOR Sonata DN8 Hybrid 2020 * HKG: Enable radar tracks for KOR Sonata DN8 Hybrid 2020 * rm extra --------- Co-authored-by: Shane Smiskol --- selfdrive/car/hyundai/fingerprints.py | 5 +++++ selfdrive/debug/hyundai_enable_radar_points.py | 3 +++ 2 files changed, 8 insertions(+) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index f23e173653..59130e3e35 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1479,11 +1479,13 @@ FW_VERSIONS = { CAR.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 ', 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', 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', @@ -1491,12 +1493,14 @@ FW_VERSIONS = { 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', b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.04 99211-L1000 191016', b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.05 99211-L1000 201109', 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', @@ -1506,6 +1510,7 @@ FW_VERSIONS = { ], (Ecu.engine, 0x7e0, None): [ b'\xf1\x87391062J002', + b'\xf1\x87391162J011', b'\xf1\x87391162J012', b'\xf1\x87391162J013', b'\xf1\x87391162J014', diff --git a/selfdrive/debug/hyundai_enable_radar_points.py b/selfdrive/debug/hyundai_enable_radar_points.py index 7735391f4f..e5cae0d470 100755 --- a/selfdrive/debug/hyundai_enable_radar_points.py +++ b/selfdrive/debug/hyundai_enable_radar_points.py @@ -36,6 +36,9 @@ SUPPORTED_FW_VERSIONS = { default_config=b"\x00\x00\x00\x01\x00\x00", tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), # 2021 SONATA HYBRID + b"DNhe SCC FHCUP 1.00 1.00 99110-L5000\x19\x04&\x13' ": ConfigValues( + default_config=b"\x00\x00\x00\x01\x00\x00", + tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), b"DNhe SCC FHCUP 1.00 1.02 99110-L5000 \x01#\x15# ": ConfigValues( default_config=b"\x00\x00\x00\x01\x00\x00", tracks_enabled=b"\x00\x00\x00\x01\x00\x01"), From 9f5d316c7a7e57a329789f1ef8ea026e2648cf32 Mon Sep 17 00:00:00 2001 From: Saber <81108166+Saber422@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:50:06 +0800 Subject: [PATCH 381/923] VW MQB: Add FW for 2023 Karoq (#30713) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * VW MQB: Add FW for 2023 Karoq route name:9c3d97394a78e872|2023-12-12--14-39-47--6 * add to fp --------- Co-authored-by: Shane Smiskol --- selfdrive/car/volkswagen/fingerprints.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index d2c85d0fc5..bf962db439 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -949,6 +949,7 @@ FW_VERSIONS = { }, CAR.SKODA_KAROQ_MK1: { (Ecu.engine, 0x7e0, None): [ + b'\xf1\x8705E906013CL\xf1\x892541', b'\xf1\x8705E906013H \xf1\x892407', b'\xf1\x8705E906018P \xf1\x895472', b'\xf1\x8705E906018P \xf1\x896020', @@ -969,6 +970,7 @@ FW_VERSIONS = { b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563T6090500', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100500', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100600', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', From 5bb223a7bf0629fc48aee7c395f08da3c7364cdf Mon Sep 17 00:00:00 2001 From: dgcntrk <35061839+dgcntrk@users.noreply.github.com> Date: Tue, 5 Mar 2024 20:59:55 -0700 Subject: [PATCH 382/923] Hyundai: add Tucson 2022 PHEV camera FW version (#31408) * Update fingerprints.py Hyundai Tucson 2022 phev * Apply suggestions from code review * format --------- 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 59130e3e35..cc3ac3630b 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1578,6 +1578,7 @@ FW_VERSIONS = { }, CAR.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', b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 2.02 99211-N9000 14E', b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N9210 14G', From 8958dbaa09830f4567600855dfc147ddc4a589a2 Mon Sep 17 00:00:00 2001 From: gkiss1977 <78383776+gkiss1977@users.noreply.github.com> Date: Wed, 6 Mar 2024 05:03:57 +0100 Subject: [PATCH 383/923] Added KIA_EV EU EPS fingerprint (#30937) Co-authored-by: Gabriel Kiss --- 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 cc3ac3630b..c58bbd283e 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1094,6 +1094,7 @@ FW_VERSIONS = { b'\xf1\x00OS MDPS C 1.00 1.03 56310/K4550 4OEDC103', b'\xf1\x00OS MDPS C 1.00 1.04 56310K4000\x00 4OEDC104', b'\xf1\x00OS MDPS C 1.00 1.04 56310K4050\x00 4OEDC104', + b'\xf1\x00OS MDPS C 1.00 1.04 56310-XX000 4OEDC104', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4000 ', From ed395190149c4b509b8bee9e0f18108a5bc6ce8e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 20:08:15 -0800 Subject: [PATCH 384/923] Hyundai: remove OBD ECUs for Sonata 2020+ (#31458) no abs on hybrid, and we have eps! --- selfdrive/car/hyundai/values.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index ec4dadbcfc..4ed638f436 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -804,8 +804,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], - Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN], + Ecu.transmission: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.SONATA], + Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.SONATA], + Ecu.abs: [CAR.SONATA], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From 7cfc571f5698c8f5d5bce2e39ccbd8a56c729395 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 5 Mar 2024 20:43:33 -0800 Subject: [PATCH 385/923] timeless routes (#31119) * timeless route * update sort * update test * fix param name --- common/params.cc | 1 + system/loggerd/logger.cc | 11 +---------- system/loggerd/logger.h | 1 - system/loggerd/tests/loggerd_tests_common.py | 4 ++-- tools/lib/route.py | 6 +++++- 5 files changed, 9 insertions(+), 14 deletions(-) diff --git a/common/params.cc b/common/params.cc index aef2cbdecd..f68e1e4c6b 100644 --- a/common/params.cc +++ b/common/params.cc @@ -188,6 +188,7 @@ std::unordered_map keys = { {"RecordFront", PERSISTENT}, {"RecordFrontLock", PERSISTENT}, // for the internal fleet {"ReplayControlsState", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, + {"RouteCount", PERSISTENT}, {"SnoozeUpdate", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"SshEnabled", PERSISTENT}, {"TermsVersion", PERSISTENT}, diff --git a/system/loggerd/logger.cc b/system/loggerd/logger.cc index 7a829a2f1f..f1b187df7f 100644 --- a/system/loggerd/logger.cc +++ b/system/loggerd/logger.cc @@ -89,15 +89,6 @@ kj::Array logger_build_init_data() { return capnp::messageToFlatArray(msg); } -std::string logger_get_route_name() { - char route_name[64] = {'\0'}; - time_t rawtime = time(NULL); - struct tm timeinfo; - localtime_r(&rawtime, &timeinfo); - strftime(route_name, sizeof(route_name), "%Y-%m-%d--%H-%M-%S", &timeinfo); - return route_name; -} - std::string logger_get_identifier(std::string key) { // a log identifier is a 32 bit counter, plus a 10 character unique ID. // e.g. 000001a3--c20ba54385 @@ -131,7 +122,7 @@ static void log_sentinel(LoggerState *log, SentinelType type, int eixt_signal = } LoggerState::LoggerState(const std::string &log_root) { - route_name = logger_get_route_name(); + route_name = logger_get_identifier("RouteCount"); route_path = log_root + "/" + route_name; init_data = logger_build_init_data(); } diff --git a/system/loggerd/logger.h b/system/loggerd/logger.h index dd3bee150c..7a8490d57a 100644 --- a/system/loggerd/logger.h +++ b/system/loggerd/logger.h @@ -52,5 +52,4 @@ protected: }; kj::Array logger_build_init_data(); -std::string logger_get_route_name(); std::string logger_get_identifier(std::string key); diff --git a/system/loggerd/tests/loggerd_tests_common.py b/system/loggerd/tests/loggerd_tests_common.py index 42eec2a0f4..877c872b6b 100644 --- a/system/loggerd/tests/loggerd_tests_common.py +++ b/system/loggerd/tests/loggerd_tests_common.py @@ -72,8 +72,8 @@ class UploaderTestCase(unittest.TestCase): uploader.force_wifi = True uploader.allow_sleep = False self.seg_num = random.randint(1, 300) - self.seg_format = "2019-04-18--12-52-54--{}" - self.seg_format2 = "2019-05-18--11-22-33--{}" + self.seg_format = "00000004--0ac3964c96--{}" + self.seg_format2 = "00000005--4c4e99b08b--{}" self.seg_dir = self.seg_format.format(self.seg_num) self.params = Params() diff --git a/tools/lib/route.py b/tools/lib/route.py index bd0ccc1fc3..06a3596d69 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -263,6 +263,10 @@ class SegmentRange: def timestamp(self) -> str: return self.m.group("timestamp") + @property + def log_id(self) -> str: + return self.m.group("log_id") + @property def slice(self) -> str: return self.m.group("slice") or "" @@ -291,7 +295,7 @@ class SegmentRange: return list(range(end + 1))[s] def __str__(self) -> str: - return f"{self.dongle_id}/{self.timestamp}" + (f"/{self.slice}" if self.slice else "") + (f"/{self.selector}" if self.selector else "") + return f"{self.dongle_id}/{self.log_id}" + (f"/{self.slice}" if self.slice else "") + (f"/{self.selector}" if self.selector else "") def __repr__(self) -> str: return self.__str__() From eaefdb386fd05780c31b1294b2bb5cab59cb3147 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 21:34:06 -0800 Subject: [PATCH 386/923] Toyota: Highlander can not do sng as standard (#31721) * . * update docs * fix docs * Update selfdrive/car/toyota/interface.py --- docs/CARS.md | 4 ++-- selfdrive/car/toyota/interface.py | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index f601da2beb..654f788908 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -239,9 +239,9 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|Corolla Hatchback 2019-22|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 Hybrid 2020-22|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 Hybrid (Non-US only) 2020-23|All|openpilot|17 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|Highlander 2017-19|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|Highlander 2017-19|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|Highlander 2020-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
|| -|Toyota|Highlander Hybrid 2017-19|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|Highlander Hybrid 2017-19|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|Highlander Hybrid 2020-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
|| |Toyota|Mirai 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|Prius 2016|Toyota Safety Sense P|openpilot available[2](#footnotes)|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
|| diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 7fd5c9435d..c01086c8de 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -43,6 +43,11 @@ class CarInterface(CarInterfaceBase): stop_and_go = candidate in TSS2_CAR + # Detect smartDSU, which intercepts ACC_CMD from the DSU (or radar) allowing openpilot to send it + # 0x2AA is sent by a similar device which intercepts the radar instead of DSU on NO_DSU_CARs + if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): + ret.flags |= ToyotaFlags.SMART_DSU.value + if candidate == CAR.PRIUS: stop_and_go = True # Only give steer angle deadzone to for bad angle sensor prius @@ -68,8 +73,9 @@ class CarInterface(CarInterfaceBase): stop_and_go = True elif candidate in (CAR.HIGHLANDER, CAR.HIGHLANDER_TSS2): - # TODO: TSS-P models can do stop and go, but unclear if it requires sDSU or unplugging DSU - stop_and_go = True + # TODO: TSS-P models can do stop and go, but unclear if it requires sDSU or unplugging DSU. + # For now, don't list stop and go functionality in the docs + stop_and_go = stop_and_go or bool(ret.flags & ToyotaFlags.SMART_DSU.value) elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.AVALON_TSS2): # starting from 2019, all Avalon variants have stop and go @@ -111,11 +117,6 @@ class CarInterface(CarInterfaceBase): # Detect flipped signals and enable for C-HR and others ret.enableBsm = 0x3F6 in fingerprint[0] and candidate in TSS2_CAR - # Detect smartDSU, which intercepts ACC_CMD from the DSU (or radar) allowing openpilot to send it - # 0x2AA is sent by a similar device which intercepts the radar instead of DSU on NO_DSU_CARs - if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): - ret.flags |= ToyotaFlags.SMART_DSU.value - # No radar dbc for cars without DSU which are not TSS 2.0 # TODO: make an adas dbc file for dsu-less models ret.radarUnavailable = DBC[candidate]['radar'] is None or candidate in (NO_DSU_CAR - TSS2_CAR) From 342a20ef8eca413fb4e48fc0dafe6bbca7471d1c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 22:50:14 -0800 Subject: [PATCH 387/923] Toyota Highlander: also check unplugged DSU to enable sng (#31723) * also check unplugged DSU * fix --- selfdrive/car/toyota/interface.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index c01086c8de..2ea67cbaa6 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -48,6 +48,11 @@ class CarInterface(CarInterfaceBase): if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): ret.flags |= ToyotaFlags.SMART_DSU.value + # In TSS2 cars, the camera does long control + found_ecus = [fw.ecu for fw in car_fw] + 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: stop_and_go = True # Only give steer angle deadzone to for bad angle sensor prius @@ -75,7 +80,7 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.HIGHLANDER, CAR.HIGHLANDER_TSS2): # TODO: TSS-P models can do stop and go, but unclear if it requires sDSU or unplugging DSU. # For now, don't list stop and go functionality in the docs - stop_and_go = stop_and_go or bool(ret.flags & ToyotaFlags.SMART_DSU.value) + stop_and_go = stop_and_go or bool(ret.flags & ToyotaFlags.SMART_DSU.value) or (ret.enableDsu and not docs) elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.AVALON_TSS2): # starting from 2019, all Avalon variants have stop and go @@ -121,11 +126,6 @@ class CarInterface(CarInterfaceBase): # TODO: make an adas dbc file for dsu-less models ret.radarUnavailable = DBC[candidate]['radar'] is None or candidate in (NO_DSU_CAR - TSS2_CAR) - # In TSS2 cars, the camera does long control - found_ecus = [fw.ecu for fw in car_fw] - 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 the smartDSU is detected, openpilot can send ACC_CONTROL and the smartDSU will block it from the DSU or radar. # since we don't yet parse radar on TSS2/TSS-P radar-based ACC cars, gate longitudinal behind experimental toggle use_sdsu = bool(ret.flags & ToyotaFlags.SMART_DSU) From 2df61a30eb89b426ad937dbc6446326c04a9c73a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 23:04:41 -0800 Subject: [PATCH 388/923] Toyota: flag for cars without PCM accel limit under 19 mph (#31724) use flags --- selfdrive/car/toyota/interface.py | 13 +++++-------- selfdrive/car/toyota/values.py | 6 ++++-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 2ea67cbaa6..3c16394f1d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -61,9 +61,6 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.25 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.2) - elif candidate == CAR.PRIUS_V: - stop_and_go = True - elif candidate in (CAR.RAV4, CAR.RAV4H): stop_and_go = True if (candidate in CAR.RAV4H) else False @@ -77,11 +74,6 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.CAMRY, CAR.CAMRY_TSS2): stop_and_go = True - elif candidate in (CAR.HIGHLANDER, CAR.HIGHLANDER_TSS2): - # TODO: TSS-P models can do stop and go, but unclear if it requires sDSU or unplugging DSU. - # For now, don't list stop and go functionality in the docs - stop_and_go = stop_and_go or bool(ret.flags & ToyotaFlags.SMART_DSU.value) or (ret.enableDsu and not docs) - elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.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 @@ -116,6 +108,11 @@ class CarInterface(CarInterfaceBase): elif candidate == CAR.MIRAI: stop_and_go = True + # TODO: these models can do stop and go, but unclear if it requires sDSU or unplugging DSU. + # For now, don't list stop and go functionality in the docs + if ret.flags & ToyotaFlags.SNG_WITHOUT_DSU: + stop_and_go = stop_and_go or bool(ret.flags & ToyotaFlags.SMART_DSU.value) or (ret.enableDsu and not docs) + ret.centerToFront = ret.wheelbase * 0.44 # TODO: Some TSS-P platforms have BSM, but are flipped based on region or driving direction. diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 9989b9225a..5a7b88f55b 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -55,6 +55,8 @@ class ToyotaFlags(IntFlag): # these cars use the Lane Tracing Assist (LTA) message for lateral control ANGLE_CONTROL = 128 NO_STOP_TIMER = 256 + # these cars are speculated to allow stop and go when the DSU is unplugged or disabled with sDSU + SNG_WITHOUT_DSU = 512 class Footnote(Enum): @@ -182,7 +184,7 @@ class CAR(Platforms): ], 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'), - flags=ToyotaFlags.NO_STOP_TIMER, + flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) HIGHLANDER_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA HIGHLANDER 2020", @@ -207,7 +209,7 @@ class CAR(Platforms): 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, + flags=ToyotaFlags.NO_STOP_TIMER | ToyotaFlags.SNG_WITHOUT_DSU, ) PRIUS_TSS2 = ToyotaTSS2PlatformConfig( "TOYOTA PRIUS TSS2 2021", From fcd33786ca85a25fb11afc22d4498edd97e6b178 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 23:11:10 -0800 Subject: [PATCH 389/923] Toyota: remove Mirai from interface (#31725) * mirai * just mirai --- selfdrive/car/toyota/interface.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 3c16394f1d..9f3e09cfe7 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -105,9 +105,6 @@ class CarInterface(CarInterfaceBase): elif candidate in (CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2): stop_and_go = True - elif candidate == CAR.MIRAI: - stop_and_go = True - # TODO: these models can do stop and go, but unclear if it requires sDSU or unplugging DSU. # For now, don't list stop and go functionality in the docs if ret.flags & ToyotaFlags.SNG_WITHOUT_DSU: From 1b9df8aca62bd57c81d82c7b8fb5683029b507ae Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 5 Mar 2024 23:23:47 -0800 Subject: [PATCH 390/923] Toyota: move stop and go cars to one tuple (#31726) * One tuple! * rm --- selfdrive/car/toyota/interface.py | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 9f3e09cfe7..783307023d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -61,19 +61,10 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.25 CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.2) - elif candidate in (CAR.RAV4, CAR.RAV4H): - stop_and_go = True if (candidate in CAR.RAV4H) else False - elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2): stop_and_go = True ret.wheelSpeedFactor = 1.035 - elif candidate in (CAR.CHR, CAR.CHR_TSS2): - stop_and_go = True - - elif candidate in (CAR.CAMRY, CAR.CAMRY_TSS2): - stop_and_go = True - elif candidate in (CAR.AVALON, CAR.AVALON_2019, CAR.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 @@ -96,13 +87,8 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00004 break - elif candidate == CAR.SIENNA: - stop_and_go = True - - elif candidate == CAR.LEXUS_CTH: - stop_and_go = True - - elif candidate in (CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2): + elif candidate in (CAR.RAV4H, CAR.CHR, CAR.CAMRY, CAR.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 # TODO: these models can do stop and go, but unclear if it requires sDSU or unplugging DSU. From 0da9a1ea75413a08fb1f2f239b766d5ac3343634 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 6 Mar 2024 00:46:12 -0800 Subject: [PATCH 391/923] [bot] Fingerprints: add missing FW versions from new users (#31682) Export fingerprints --- selfdrive/car/hyundai/fingerprints.py | 5 ++++- selfdrive/car/volkswagen/fingerprints.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index c58bbd283e..fa5296cfa7 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1092,9 +1092,9 @@ FW_VERSIONS = { ], (Ecu.eps, 0x7d4, None): [ b'\xf1\x00OS MDPS C 1.00 1.03 56310/K4550 4OEDC103', + b'\xf1\x00OS MDPS C 1.00 1.04 56310-XX000 4OEDC104', b'\xf1\x00OS MDPS C 1.00 1.04 56310K4000\x00 4OEDC104', b'\xf1\x00OS MDPS C 1.00 1.04 56310K4050\x00 4OEDC104', - b'\xf1\x00OS MDPS C 1.00 1.04 56310-XX000 4OEDC104', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00OSev SCC F-CUP 1.00 1.00 99110-K4000 ', @@ -1555,7 +1555,9 @@ FW_VERSIONS = { b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ', ], (Ecu.fwdCamera, 0x7c4, None): [ + 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', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.01 99211-GI010 211007', b'\xf1\x00NE1 MFC AT EUR RHD 1.00 1.02 99211-GI010 211206', b'\xf1\x00NE1 MFC AT KOR LHD 1.00 1.00 99211-GI020 230719', @@ -1573,6 +1575,7 @@ FW_VERSIONS = { b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00CE MFC AT CAN LHD 1.00 1.04 99211-KL000 221213', b'\xf1\x00CE MFC AT EUR LHD 1.00 1.03 99211-KL000 221011', b'\xf1\x00CE MFC AT USA LHD 1.00 1.04 99211-KL000 221213', ], diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index bf962db439..f6b3c49982 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -969,8 +969,8 @@ FW_VERSIONS = { (Ecu.eps, 0x712, None): [ b'\xf1\x875Q0910143B \xf1\x892201\xf1\x82\x0563T6090500', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100500', - b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700', b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100600', + b'\xf1\x875Q0910143C \xf1\x892211\xf1\x82\x0567T6100700', ], (Ecu.fwdRadar, 0x757, None): [ b'\xf1\x872Q0907572AA\xf1\x890396', From 1644572be282283c20d90a09a606666366da5e4a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 6 Mar 2024 01:04:31 -0800 Subject: [PATCH 392/923] run_process_on_route: print log location --- selfdrive/debug/run_process_on_route.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/debug/run_process_on_route.py b/selfdrive/debug/run_process_on_route.py index 441de9ef57..90db14bc9a 100755 --- a/selfdrive/debug/run_process_on_route.py +++ b/selfdrive/debug/run_process_on_route.py @@ -27,4 +27,5 @@ if __name__ == "__main__": outputs = sorted(inputs + outputs, key=lambda x: x.logMonoTime) fn = f"{args.route.replace('/', '_')}_{args.process}.bz2" + print(f"Saved log to {fn}") save_log(fn, outputs) From a2de0115b3cc46521f395953d97a94cd846c5f9d Mon Sep 17 00:00:00 2001 From: James <91348155+FrogAi@users.noreply.github.com> Date: Wed, 6 Mar 2024 02:06:06 -0700 Subject: [PATCH 393/923] Toyota TSS2: parse distance button (#31722) * Enable the distance button to switch personalities for Toyota/Lexus * Default to the "standard" personality for now * only parsing first * only parse * no personality in card * safe * comment --------- Co-authored-by: Shane Smiskol --- selfdrive/car/toyota/carstate.py | 8 ++++++++ selfdrive/car/toyota/interface.py | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index e4ea0d30f9..caaf7c2e17 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -40,6 +40,9 @@ class CarState(CarStateBase): self.accurate_steer_angle_seen = False self.angle_offset = FirstOrderFilter(None, 60.0, DT_CTRL, initialized=False) + self.prev_distance_button = 0 + self.distance_button = 0 + self.low_speed_lockout = False self.acc_type = 1 self.lkas_hud = {} @@ -163,6 +166,11 @@ class CarState(CarStateBase): if self.CP.carFingerprint != CAR.PRIUS_V: self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"]) + # distance button is wired to the ACC module (camera or radar) + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): + self.prev_distance_button = self.distance_button + self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"] + return ret @staticmethod diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 783307023d..bd982728a5 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -3,10 +3,11 @@ from panda import Panda from panda.python import uds from openpilot.selfdrive.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerParams, TSS2_CAR, RADAR_ACC_CAR, NO_DSU_CAR, \ MIN_ACC_SPEED, EPS_SCALE, UNSUPPORTED_DSU_CAR, NO_STOP_TIMER_CAR, ANGLE_CONTROL_CAR -from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.disable_ecu import disable_ecu from openpilot.selfdrive.car.interfaces import CarInterfaceBase +ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName SteerControlType = car.CarParams.SteerControlType @@ -172,6 +173,9 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): + 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 079b7130978f251a6e67bd9a076a3e1035847706 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 6 Mar 2024 02:40:31 -0800 Subject: [PATCH 394/923] Lexus: add missing IS 2023 FW versions (#31729) * ahh it has a different engine! * flip --- selfdrive/car/toyota/fingerprints.py | 6 ++++++ selfdrive/car/toyota/values.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index b59e1abea4..86d45532fa 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -772,16 +772,22 @@ FW_VERSIONS = { b'\x018966353S1000\x00\x00\x00\x00', b'\x018966353S2000\x00\x00\x00\x00', ], + (Ecu.engine, 0x7e0, None): [ + b'\x02353U0000\x00\x00\x00\x00\x00\x00\x00\x0052422000\x00\x00\x00\x00\x00\x00\x00\x00', + ], (Ecu.abs, 0x7b0, None): [ b'\x01F15265337200\x00\x00\x00\x00', b'\x01F15265342000\x00\x00\x00\x00', + b'\x01F15265343000\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'8965B53450\x00\x00\x00\x00\x00\x00', + b'8965B53800\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821F6201200\x00\x00\x00\x00', b'\x018821F6201300\x00\x00\x00\x00', + b'\x018821F6201400\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x750, 0x6d): [ b'\x028646F5303300\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 5a7b88f55b..4aa04c12ba 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -549,7 +549,7 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.abs: [CAR.RAV4, CAR.COROLLA, CAR.HIGHLANDER, CAR.SIENNA, CAR.LEXUS_IS, CAR.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, - CAR.LEXUS_RC, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2, CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2], + CAR.LEXUS_IS_TSS2, CAR.LEXUS_RC, CAR.LEXUS_NX, CAR.LEXUS_NX_TSS2, CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2], }, extra_ecus=[ # All known ECUs on a late-model Toyota vehicle not queried here: From e399136cb6468728f4d3f6fd888a3d777f1e292c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 6 Mar 2024 09:26:36 -0800 Subject: [PATCH 395/923] don't build cabana on device (#31736) --- SConstruct | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index c08fe48f66..50dbda4b8d 100644 --- a/SConstruct +++ b/SConstruct @@ -388,7 +388,8 @@ SConscript(['selfdrive/SConscript']) if Dir('#tools/cabana/').exists() and GetOption('extras'): SConscript(['tools/replay/SConscript']) - SConscript(['tools/cabana/SConscript']) + if arch != "larch64": + SConscript(['tools/cabana/SConscript']) external_sconscript = GetOption('external_sconscript') if external_sconscript: From 233f0437d901eaa09a233ffb28b44feacced6b52 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 6 Mar 2024 13:56:46 -0500 Subject: [PATCH 396/923] add get_car_interface helper (#31738) add helper --- selfdrive/car/car_helpers.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/car_helpers.py b/selfdrive/car/car_helpers.py index 74499fbbb0..b16e2e5a47 100644 --- a/selfdrive/car/car_helpers.py +++ b/selfdrive/car/car_helpers.py @@ -197,6 +197,11 @@ def fingerprint(logcan, sendcan, num_pandas): return car_platform, finger, vin, car_fw, source, exact_match +def get_car_interface(CP): + CarInterface, CarController, CarState = interfaces[CP.carFingerprint] + return CarInterface(CP, CarController, CarState) + + def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): candidate, fingerprints, vin, car_fw, source, exact_match = fingerprint(logcan, sendcan, num_pandas) @@ -204,14 +209,14 @@ def get_car(logcan, sendcan, experimental_long_allowed, num_pandas=1): cloudlog.event("car doesn't match any fingerprints", fingerprints=repr(fingerprints), error=True) candidate = "mock" - CarInterface, CarController, CarState = interfaces[candidate] + CarInterface, _, _ = interfaces[candidate] CP = CarInterface.get_params(candidate, fingerprints, car_fw, experimental_long_allowed, docs=False) CP.carVin = vin CP.carFw = car_fw CP.fingerprintSource = source CP.fuzzyFingerprint = not exact_match - return CarInterface(CP, CarController, CarState), CP + return get_car_interface(CP), CP def write_car_param(platform=MOCK.MOCK): params = Params() From 25ccb2426c0b54dbf823b9e7e6d63607b37d9c5a Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 6 Mar 2024 14:22:12 -0500 Subject: [PATCH 397/923] cars: remove CAR_INFO map (#31739) * no carinfo map * smaller diff * not on mock --- selfdrive/car/__init__.py | 8 +- selfdrive/car/body/values.py | 2 +- selfdrive/car/chrysler/values.py | 2 +- selfdrive/car/docs.py | 8 +- selfdrive/car/ford/values.py | 2 +- selfdrive/car/gm/values.py | 2 +- selfdrive/car/honda/values.py | 2 +- selfdrive/car/hyundai/values.py | 2 +- selfdrive/car/mazda/values.py | 2 +- selfdrive/car/mock/values.py | 2 +- selfdrive/car/nissan/values.py | 2 +- selfdrive/car/subaru/values.py | 1 - selfdrive/car/tesla/values.py | 2 +- selfdrive/car/tests/test_docs.py | 7 +- selfdrive/car/tests/test_platform_configs.py | 4 +- selfdrive/car/toyota/values.py | 2 +- selfdrive/car/values.py | 14 +- selfdrive/car/volkswagen/values.py | 2 +- tools/cabana/dbc/generate_dbc_json.py | 6 +- .../examples/subaru_fuzzy_fingerprint.ipynb | 210 +++++++++--------- 20 files changed, 145 insertions(+), 137 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index c7af2da686..1f784a4ab2 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -299,14 +299,14 @@ class Platforms(str, ReprEnum): def create_dbc_map(cls) -> dict[str, DbcDict]: return {p: p.config.dbc_dict for p in cls} - @classmethod - def create_carinfo_map(cls) -> dict[str, CarInfos]: - return {p: p.config.car_info for p in cls} - @classmethod def with_flags(cls, flags: IntFlag) -> set['Platforms']: return {p for p in cls if p.config.flags & flags} + @classmethod + def without_flags(cls, flags: IntFlag) -> set['Platforms']: + return {p for p in cls if not (p.config.flags & flags)} + @classmethod def print_debug(cls, flags): platforms_with_flag = defaultdict(list) diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index 82b00ee47d..6e0d0ec596 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -38,5 +38,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 78b22bea45..905e2e7270 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -163,5 +163,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/docs.py b/selfdrive/car/docs.py index caa79a8f87..ce46bd93c2 100755 --- a/selfdrive/car/docs.py +++ b/selfdrive/car/docs.py @@ -11,6 +11,7 @@ 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.car_helpers import interfaces, get_interface_attr +from openpilot.selfdrive.car.values import PLATFORMS def get_all_footnotes() -> dict[Enum, int]: @@ -27,9 +28,10 @@ CARS_MD_TEMPLATE = os.path.join(BASEDIR, "selfdrive", "car", "CARS_template.md") def get_all_car_info() -> list[CarInfo]: all_car_info: list[CarInfo] = [] footnotes = get_all_footnotes() - for model, car_info in get_interface_attr("CAR_INFO", combine_brands=True).items(): + for model, platform in PLATFORMS.items(): + car_info = platform.config.car_info # If available, uses experimental longitudinal limits for the docs - CP = interfaces[model][0].get_params(model, fingerprint=gen_empty_fingerprint(), + 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: @@ -37,7 +39,7 @@ def get_all_car_info() -> list[CarInfo]: # A platform can include multiple car models if not isinstance(car_info, list): - car_info = (car_info,) + car_info = [car_info,] for _car_info in car_info: if not hasattr(_car_info, "row"): diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index fe776fea72..76f505fa9b 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -209,5 +209,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index bf3c8622c5..17822e0c80 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -247,5 +247,5 @@ CAMERA_ACC_CAR = {CAR.BOLT_EUV, CAR.SILVERADO, CAR.EQUINOX, CAR.TRAILBLAZER} STEER_THRESHOLD = 1.0 -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 4bcbf00735..4960380bbc 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -352,5 +352,5 @@ HONDA_NIDEC_ALT_SCM_MESSAGES = CAR.with_flags(HondaFlags.NIDEC_ALT_SCM_MESSAGES) HONDA_BOSCH = CAR.with_flags(HondaFlags.BOSCH) HONDA_BOSCH_RADARLESS = CAR.with_flags(HondaFlags.BOSCH_RADARLESS) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 4ed638f436..29a72ba715 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -847,7 +847,7 @@ LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY) UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() if __name__ == "__main__": diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index d8f5aa85dd..20a3ae0ae1 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -108,5 +108,5 @@ FW_QUERY_CONFIG = FwQueryConfig( ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index 74e8bb5fc9..7e399fab73 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -11,4 +11,4 @@ class CAR(Platforms): ) -CAR_INFO = CAR.create_carinfo_map() + diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index cb7289389b..8d33e0e705 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -63,7 +63,7 @@ class CAR(Platforms): ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() # Default diagnostic session diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 5668678225..acb60628b4 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -263,7 +263,6 @@ FW_QUERY_CONFIG = FwQueryConfig( } ) -CAR_INFO = CAR.create_carinfo_map() DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 3104506e5b..f33e62618c 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -92,5 +92,5 @@ class CarControllerParams: pass -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/tests/test_docs.py b/selfdrive/car/tests/test_docs.py index 0cafb508f7..0ee35dd92d 100755 --- a/selfdrive/car/tests/test_docs.py +++ b/selfdrive/car/tests/test_docs.py @@ -5,10 +5,11 @@ import re import unittest from openpilot.common.basedir import BASEDIR -from openpilot.selfdrive.car.car_helpers import interfaces, get_interface_attr +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_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 @@ -42,10 +43,10 @@ class TestCarDocs(unittest.TestCase): make_model_years[make_model].append(year) def test_missing_car_info(self): - all_car_info_platforms = get_interface_attr("CAR_INFO", combine_brands=True).keys() + 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 exist in CarInfo") + self.assertTrue(platform in all_car_info_platforms, f"Platform: {platform} doesn't have a CarInfo entry") def test_naming_conventions(self): # Asserts market-standard car naming conventions by brand diff --git a/selfdrive/car/tests/test_platform_configs.py b/selfdrive/car/tests/test_platform_configs.py index 6a3bafa390..0b42a2b289 100755 --- a/selfdrive/car/tests/test_platform_configs.py +++ b/selfdrive/car/tests/test_platform_configs.py @@ -11,7 +11,9 @@ class TestPlatformConfigs(unittest.TestCase): for platform in PLATFORMS.values(): with self.subTest(platform=str(platform)): self.assertTrue(platform.config._frozen) - self.assertIn("pt", platform.config.dbc_dict) + + if platform != "mock": + self.assertIn("pt", platform.config.dbc_dict) self.assertTrue(len(platform.config.platform_str) > 0) self.assertIsNotNone(platform.config.specs) diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 4aa04c12ba..048e8b1033 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -608,5 +608,5 @@ ANGLE_CONTROL_CAR = CAR.with_flags(ToyotaFlags.ANGLE_CONTROL) # no resume button press required NO_STOP_TIMER_CAR = CAR.with_flags(ToyotaFlags.NO_STOP_TIMER) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py index 3e27870915..24119e2210 100644 --- a/selfdrive/car/values.py +++ b/selfdrive/car/values.py @@ -1,4 +1,4 @@ -from typing import cast +from typing import Any, Callable, 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 @@ -6,13 +6,21 @@ 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 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 | NISSAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN -BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, NISSAN, SUBARU, TESLA, TOYOTA, 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] 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/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 6ff913b204..36c82abf03 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -416,5 +416,5 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x74f, None)], ) -CAR_INFO = CAR.create_carinfo_map() + DBC = CAR.create_dbc_map() diff --git a/tools/cabana/dbc/generate_dbc_json.py b/tools/cabana/dbc/generate_dbc_json.py index da19e27b77..5a8ef21d8b 100755 --- a/tools/cabana/dbc/generate_dbc_json.py +++ b/tools/cabana/dbc/generate_dbc_json.py @@ -2,13 +2,11 @@ import argparse import json -from openpilot.selfdrive.car.car_helpers import get_interface_attr +from openpilot.selfdrive.car.values import create_platform_map def generate_dbc_json() -> str: - all_cars_by_brand = get_interface_attr("CAR_INFO") - all_dbcs_by_brand = get_interface_attr("DBC") - dbc_map = {car: all_dbcs_by_brand[brand][car]['pt'] for brand, cars in all_cars_by_brand.items() for car in cars if car != 'mock'} + 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/examples/subaru_fuzzy_fingerprint.ipynb b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb index fbd88a769e..dd223667d8 100644 --- a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb +++ b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb @@ -2,15 +2,23 @@ "cells": [ { "cell_type": "code", - "execution_count": 148, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "kj/filesystem-disk-unix.c++:1703: warning: PWD environment variable doesn't match current directory; pwd = /home/batman\n" + ] + } + ], "source": [ "from cereal import car\n", - "from openpilot.selfdrive.car.subaru.values import CAR, PREGLOBAL_CARS\n", + "from openpilot.selfdrive.car.subaru.values import CAR, SubaruFlags\n", "from openpilot.selfdrive.car.subaru.fingerprints import FW_VERSIONS\n", "\n", - "TEST_PLATFORMS = set(c.value for c in CAR) - PREGLOBAL_CARS # preglobal cars seem to have a different format for fingerprints, ignore for now\n", + "TEST_PLATFORMS = CAR.without_flags(SubaruFlags.PREGLOBAL)\n", "\n", "Ecu = car.CarParams.Ecu\n", "\n", @@ -19,22 +27,7 @@ }, { "cell_type": "code", - "execution_count": 149, - "metadata": {}, - "outputs": [], - "source": [ - "from openpilot.selfdrive.car.subaru.values import CAR_INFO\n", - "\n", - "def get_carinfo(model: CAR):\n", - " c = CAR_INFO[model]\n", - " if isinstance(c, list):\n", - " c = c[0]\n", - " return c" - ] - }, - { - "cell_type": "code", - "execution_count": 150, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -66,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 151, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -90,7 +83,7 @@ }, { "cell_type": "code", - "execution_count": 152, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -103,56 +96,60 @@ "SUBARU IMPREZA LIMITED 2019 0c not in dict_keys([b'\\x18', b'\\x19', b' ', b'!', b'\"', b'#'])\n", "SUBARU IMPREZA LIMITED 2019 2e not in dict_keys([b'\\x18', b'\\x19', b' ', b'!', b'\"', b'#'])\n", "SUBARU IMPREZA LIMITED 2019 3f not in dict_keys([b'\\x18', b'\\x19', b' ', b'!', b'\"', b'#'])\n", - "correct_year=True platform=SUBARU ASCENT LIMITED 2019 year=2019 years=[2019, 2020, 2021]\n", - "correct_year=True platform=SUBARU ASCENT LIMITED 2019 year=2021 years=[2019, 2020, 2021]\n", - "correct_year=False platform=SUBARU IMPREZA SPORT 2020 year=2019 years=[2020, 2021, 2022]\n", - "correct_year=False platform=SUBARU IMPREZA SPORT 2020 year=2019 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", - "correct_year=False platform=SUBARU FORESTER 2019 year=2018 years=[2019, 2020, 2021]\n", - "correct_year=False platform=SUBARU FORESTER 2019 year=2018 years=[2019, 2020, 2021]\n", - "correct_year=True platform=SUBARU FORESTER 2019 year=2019 years=[2019, 2020, 2021]\n", - "correct_year=True platform=SUBARU FORESTER 2019 year=2019 years=[2019, 2020, 2021]\n", - "correct_year=True platform=SUBARU FORESTER 2019 year=2020 years=[2019, 2020, 2021]\n", - "correct_year=True platform=SUBARU FORESTER 2019 year=2020 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU OUTBACK 7TH GEN year=2023 years=[2023]\n", + "correct_year=True platform=SUBARU OUTBACK 7TH GEN year=2023 years=[2023]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2022 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2022 years=[2020, 2021, 2022]\n", + "correct_year=False platform=SUBARU CROSSTREK HYBRID 2020 year=2019 years=[2020]\n", + "correct_year=False platform=SUBARU CROSSTREK HYBRID 2020 year=2021 years=[2020]\n", + "correct_year=False platform=SUBARU FORESTER HYBRID 2020 year=2019 years=[2020]\n", + "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2019 years=[2017, 2018, 2019]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2019 years=[2017, 2018, 2019]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2018 years=[2017, 2018, 2019]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2019 years=[2017, 2018, 2019]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2019 years=[2017, 2018, 2019]\n", "correct_year=True platform=SUBARU IMPREZA LIMITED 2019 year=2019 years=[2017, 2018, 2019]\n", - "correct_year=True platform=SUBARU OUTBACK 7TH GEN year=2023 years=[2023]\n", - "correct_year=True platform=SUBARU OUTBACK 7TH GEN year=2023 years=[2023]\n", - "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU LEGACY 7TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=False platform=SUBARU FORESTER 2022 year=2021 years=[2022, 2023]\n", - "correct_year=False platform=SUBARU FORESTER 2022 year=2021 years=[2022, 2023]\n", - "correct_year=True platform=SUBARU FORESTER 2022 year=2022 years=[2022, 2023]\n", - "correct_year=True platform=SUBARU FORESTER 2022 year=2022 years=[2022, 2023]\n", - "correct_year=False platform=SUBARU CROSSTREK HYBRID 2020 year=2019 years=[2020]\n", - "correct_year=False platform=SUBARU CROSSTREK HYBRID 2020 year=2021 years=[2020]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2020 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2022 years=[2020, 2021, 2022]\n", - "correct_year=True platform=SUBARU OUTBACK 6TH GEN year=2022 years=[2020, 2021, 2022]\n", + "correct_year=False platform=SUBARU FORESTER 2022 year=2021 years=[2022, 2023, 2024]\n", + "correct_year=False platform=SUBARU FORESTER 2022 year=2021 years=[2022, 2023, 2024]\n", + "correct_year=True platform=SUBARU FORESTER 2022 year=2022 years=[2022, 2023, 2024]\n", + "correct_year=True platform=SUBARU FORESTER 2022 year=2022 years=[2022, 2023, 2024]\n", + "correct_year=False platform=SUBARU IMPREZA SPORT 2020 year=2019 years=[2020, 2021, 2022]\n", + "correct_year=False platform=SUBARU IMPREZA SPORT 2020 year=2019 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2020 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", + "correct_year=True platform=SUBARU IMPREZA SPORT 2020 year=2021 years=[2020, 2021, 2022]\n", "correct_year=True platform=SUBARU ASCENT 2023 year=2023 years=[2023]\n", - "correct_year=False platform=SUBARU FORESTER HYBRID 2020 year=2019 years=[2020]\n" + "correct_year=True platform=SUBARU ASCENT LIMITED 2019 year=2019 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU ASCENT LIMITED 2019 year=2021 years=[2019, 2020, 2021]\n", + "correct_year=False platform=SUBARU FORESTER 2019 year=2018 years=[2019, 2020, 2021]\n", + "correct_year=False platform=SUBARU FORESTER 2019 year=2018 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU FORESTER 2019 year=2019 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU FORESTER 2019 year=2019 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU FORESTER 2019 year=2020 years=[2019, 2020, 2021]\n", + "correct_year=True platform=SUBARU FORESTER 2019 year=2020 years=[2019, 2020, 2021]\n" ] } ], "source": [ "def test_year_code(platform, year):\n", - " years = [int(y) for y in get_carinfo(platform).year_list]\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", " correct_year = year in years\n", " print(f\"{correct_year=!s: <6} {platform=: <32} {year=: <5} {years=}\")\n", "\n", @@ -163,63 +160,64 @@ }, { "cell_type": "code", - "execution_count": 153, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "in_possible_platforms=True platform=SUBARU ASCENT LIMITED 2019 platforms=['SUBARU ASCENT LIMITED 2019', 'SUBARU ASCENT 2023']\n", - "in_possible_platforms=True platform=SUBARU ASCENT LIMITED 2019 platforms=['SUBARU ASCENT LIMITED 2019', 'SUBARU ASCENT 2023']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", "in_possible_platforms=True platform=SUBARU OUTBACK 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", "in_possible_platforms=True platform=SUBARU OUTBACK 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", - "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", "in_possible_platforms=True platform=SUBARU CROSSTREK HYBRID 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", "in_possible_platforms=True platform=SUBARU CROSSTREK HYBRID 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", - "in_possible_platforms=True platform=SUBARU OUTBACK 6TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU FORESTER HYBRID 2020 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU LEGACY 7TH GEN platforms=['SUBARU OUTBACK 6TH GEN', 'SUBARU LEGACY 7TH GEN', 'SUBARU OUTBACK 7TH GEN']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA LIMITED 2019 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2022 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", + "in_possible_platforms=True platform=SUBARU IMPREZA SPORT 2020 platforms=['SUBARU IMPREZA LIMITED 2019', 'SUBARU IMPREZA SPORT 2020', 'SUBARU CROSSTREK HYBRID 2020']\n", "in_possible_platforms=True platform=SUBARU ASCENT 2023 platforms=['SUBARU ASCENT LIMITED 2019', 'SUBARU ASCENT 2023']\n", - "in_possible_platforms=True platform=SUBARU FORESTER HYBRID 2020 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n" + "in_possible_platforms=True platform=SUBARU ASCENT LIMITED 2019 platforms=['SUBARU ASCENT LIMITED 2019', 'SUBARU ASCENT 2023']\n", + "in_possible_platforms=True platform=SUBARU ASCENT LIMITED 2019 platforms=['SUBARU ASCENT LIMITED 2019', 'SUBARU ASCENT 2023']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n", + "in_possible_platforms=True platform=SUBARU FORESTER 2019 platforms=['SUBARU FORESTER 2019', 'SUBARU FORESTER HYBRID 2020', 'SUBARU FORESTER 2022']\n" ] } ], From 7177ec06312c574aeb21dd261004be44bda5ba29 Mon Sep 17 00:00:00 2001 From: Robbe Derks Date: Wed, 6 Mar 2024 21:14:48 +0100 Subject: [PATCH 398/923] Tesla Raven (#29947) * fingerprinting * wip * bug * fix another bug * fix rebase * clean up raven * forgot to save * one more rename * one more rename * radar fixes * AP1 also has bosch radar * put back dashcamOnly * small fixes * raven flag * fix bug * fix raven flag * bump opendbc * fix radar trigger for non-raven * fix tests? * bump panda * more test fixes * tesla fingerprinting is a bit slower now * fix tests * bump opendbc * bump submodules to master --------- Co-authored-by: Comma Device --- opendbc | 2 +- panda | 2 +- release/files_common | 3 +- selfdrive/car/fw_query_definitions.py | 5 ++ selfdrive/car/tesla/carstate.py | 30 ++++++++--- selfdrive/car/tesla/fingerprints.py | 11 ++++ selfdrive/car/tesla/interface.py | 11 ++-- selfdrive/car/tesla/radar_interface.py | 62 +++++++++++----------- selfdrive/car/tesla/values.py | 34 +++++++----- selfdrive/car/tests/routes.py | 1 + selfdrive/car/tests/test_fw_fingerprint.py | 5 +- selfdrive/car/torque_data/override.toml | 1 + 12 files changed, 105 insertions(+), 62 deletions(-) diff --git a/opendbc b/opendbc index 1745ab5182..ff1f1ff335 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 1745ab51825055cd18748013c4a5e3377319e390 +Subproject commit ff1f1ff335261c469635c57c81817afd04663eab diff --git a/panda b/panda index ea156f7c62..41e9610ff8 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit ea156f7c628a371bea9a15a29f9068d5392534ba +Subproject commit 41e9610ff841e4cf62051c6df09c1870f5d12477 diff --git a/release/files_common b/release/files_common index c0be9d3cae..4286c46c90 100644 --- a/release/files_common +++ b/release/files_common @@ -542,7 +542,8 @@ opendbc/vw_golf_mk4.dbc opendbc/vw_mqb_2010.dbc opendbc/tesla_can.dbc -opendbc/tesla_radar.dbc +opendbc/tesla_radar_bosch_generated.dbc +opendbc/tesla_radar_continental_generated.dbc opendbc/tesla_powertrain.dbc tinygrad_repo/openpilot/compile2.py diff --git a/selfdrive/car/fw_query_definitions.py b/selfdrive/car/fw_query_definitions.py index 80492b4177..236ade49bb 100755 --- a/selfdrive/car/fw_query_definitions.py +++ b/selfdrive/car/fw_query_definitions.py @@ -47,6 +47,11 @@ class StdQueries: MANUFACTURER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ p16(uds.DATA_IDENTIFIER_TYPE.VEHICLE_MANUFACTURER_ECU_SOFTWARE_NUMBER) + SUPPLIER_SOFTWARE_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER) + SUPPLIER_SOFTWARE_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(uds.DATA_IDENTIFIER_TYPE.SYSTEM_SUPPLIER_ECU_SOFTWARE_VERSION_NUMBER) + UDS_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_SOFTWARE_IDENTIFICATION) UDS_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ diff --git a/selfdrive/car/tesla/carstate.py b/selfdrive/car/tesla/carstate.py index 2cb4f09d79..bee652ff30 100644 --- a/selfdrive/car/tesla/carstate.py +++ b/selfdrive/car/tesla/carstate.py @@ -2,7 +2,7 @@ import copy from collections import deque from cereal import car from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car.tesla.values import DBC, CANBUS, GEAR_MAP, DOORS, BUTTONS +from openpilot.selfdrive.car.tesla.values import CAR, DBC, CANBUS, GEAR_MAP, DOORS, BUTTONS from openpilot.selfdrive.car.interfaces import CarStateBase from opendbc.can.parser import CANParser from opendbc.can.can_define import CANDefine @@ -37,13 +37,15 @@ class CarState(CarStateBase): ret.brakePressed = bool(cp.vl["BrakeMessage"]["driverBrakeStatus"] != 1) # Steering wheel - self.hands_on_level = cp.vl["EPAS_sysStatus"]["EPAS_handsOnLevel"] - self.steer_warning = self.can_define.dv["EPAS_sysStatus"]["EPAS_eacErrorCode"].get(int(cp.vl["EPAS_sysStatus"]["EPAS_eacErrorCode"]), None) - steer_status = self.can_define.dv["EPAS_sysStatus"]["EPAS_eacStatus"].get(int(cp.vl["EPAS_sysStatus"]["EPAS_eacStatus"]), None) + epas_status = cp_cam.vl["EPAS3P_sysStatus"] if self.CP.carFingerprint == CAR.MODELS_RAVEN else cp.vl["EPAS_sysStatus"] - ret.steeringAngleDeg = -cp.vl["EPAS_sysStatus"]["EPAS_internalSAS"] + 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) + steer_status = self.can_define.dv["EPAS_sysStatus"]["EPAS_eacStatus"].get(int(epas_status["EPAS_eacStatus"]), None) + + ret.steeringAngleDeg = -epas_status["EPAS_internalSAS"] ret.steeringRateDeg = -cp.vl["STW_ANGLHP_STAT"]["StW_AnglHP_Spd"] # This is from a different angle sensor, and at different rate - ret.steeringTorque = -cp.vl["EPAS_sysStatus"]["EPAS_torsionBarTorque"] + ret.steeringTorque = -epas_status["EPAS_torsionBarTorque"] ret.steeringPressed = (self.hands_on_level > 0) ret.steerFaultPermanent = steer_status == "EAC_FAULT" ret.steerFaultTemporary = (self.steer_warning not in ("EAC_ERROR_IDLE", "EAC_ERROR_HANDS_ON")) @@ -85,7 +87,10 @@ class CarState(CarStateBase): ret.rightBlinker = (cp.vl["GTW_carState"]["BC_indicatorRStatus"] == 1) # Seatbelt - ret.seatbeltUnlatched = (cp.vl["SDM1"]["SDM_bcklDrivStatus"] != 1) + if self.CP.carFingerprint == CAR.MODELS_RAVEN: + ret.seatbeltUnlatched = (cp.vl["DriverSeat"]["buckleStatus"] != 1) + else: + ret.seatbeltUnlatched = (cp.vl["SDM1"]["SDM_bcklDrivStatus"] != 1) # TODO: blindspot @@ -111,9 +116,14 @@ class CarState(CarStateBase): ("DI_state", 10), ("STW_ACTN_RQ", 10), ("GTW_carState", 10), - ("SDM1", 10), ("BrakeMessage", 50), ] + + if CP.carFingerprint == CAR.MODELS_RAVEN: + messages.append(("DriverSeat", 20)) + else: + messages.append(("SDM1", 10)) + return CANParser(DBC[CP.carFingerprint]['chassis'], messages, CANBUS.chassis) @staticmethod @@ -122,4 +132,8 @@ class CarState(CarStateBase): # sig_address, frequency ("DAS_control", 40), ] + + if CP.carFingerprint == CAR.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 772ca59efa..9b6f3865be 100644 --- a/selfdrive/car/tesla/fingerprints.py +++ b/selfdrive/car/tesla/fingerprints.py @@ -25,4 +25,15 @@ FW_VERSIONS = { b'\x10#\x01', ], }, + CAR.MODELS_RAVEN: { + (Ecu.electricBrakeBooster, 0x64d, None): [ + b'1037123-00-A', + ], + (Ecu.fwdRadar, 0x671, None): [ + b'\x01\x00\x99\x02\x01\x00\x10\x00\x00AP8.3.03\x00\x10', + ], + (Ecu.eps, 0x730, None): [ + b'SX_0.0.0 (99),SR013.7', + ], + }, } diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index 537433a350..f989886738 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 from cereal import car from panda import Panda -from openpilot.selfdrive.car.tesla.values import CANBUS +from openpilot.selfdrive.car.tesla.values import CANBUS, CAR from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase @@ -28,19 +28,20 @@ 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) if (CANBUS.autopilot_powertrain in fingerprint.keys()) and (0x2bf in fingerprint[CANBUS.autopilot_powertrain].keys()): ret.openpilotLongitudinalControl = True + flags |= Panda.FLAG_TESLA_LONG_CONTROL ret.safetyConfigs = [ - get_safety_config(car.CarParams.SafetyModel.tesla, Panda.FLAG_TESLA_LONG_CONTROL), - get_safety_config(car.CarParams.SafetyModel.tesla, Panda.FLAG_TESLA_LONG_CONTROL | Panda.FLAG_TESLA_POWERTRAIN), + get_safety_config(car.CarParams.SafetyModel.tesla, flags), + get_safety_config(car.CarParams.SafetyModel.tesla, flags | Panda.FLAG_TESLA_POWERTRAIN), ] else: ret.openpilotLongitudinalControl = False - ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.tesla, 0)] + ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.tesla, flags)] ret.steerLimitTimer = 1.0 ret.steerActuatorDelay = 0.25 - return ret def _update(self, c): diff --git a/selfdrive/car/tesla/radar_interface.py b/selfdrive/car/tesla/radar_interface.py index b3e7c7fcb1..599ab31059 100755 --- a/selfdrive/car/tesla/radar_interface.py +++ b/selfdrive/car/tesla/radar_interface.py @@ -1,38 +1,33 @@ #!/usr/bin/env python3 from cereal import car from opendbc.can.parser import CANParser -from openpilot.selfdrive.car.tesla.values import DBC, CANBUS +from openpilot.selfdrive.car.tesla.values import CAR, DBC, CANBUS from openpilot.selfdrive.car.interfaces import RadarInterfaceBase -RADAR_MSGS_A = list(range(0x310, 0x36E, 3)) -RADAR_MSGS_B = list(range(0x311, 0x36F, 3)) -NUM_POINTS = len(RADAR_MSGS_A) - -def get_radar_can_parser(CP): - # Status messages - messages = [ - ('TeslaRadarSguInfo', 10), - ] - - # Radar tracks. There are also raw point clouds available, - # we don't use those. - for i in range(NUM_POINTS): - msg_id_a = RADAR_MSGS_A[i] - msg_id_b = RADAR_MSGS_B[i] - messages.extend([ - (msg_id_a, 8), - (msg_id_b, 8), - ]) - - return CANParser(DBC[CP.carFingerprint]['radar'], messages, CANBUS.radar) class RadarInterface(RadarInterfaceBase): def __init__(self, CP): super().__init__(CP) - self.rcp = get_radar_can_parser(CP) + self.CP = CP + + if CP.carFingerprint == CAR.MODELS_RAVEN: + messages = [('RadarStatus', 16)] + self.num_points = 40 + self.trigger_msg = 1119 + else: + messages = [('TeslaRadarSguInfo', 10)] + self.num_points = 32 + self.trigger_msg = 878 + + for i in range(self.num_points): + messages.extend([ + (f'RadarPoint{i}_A', 16), + (f'RadarPoint{i}_B', 16), + ]) + + self.rcp = CANParser(DBC[CP.carFingerprint]['radar'], messages, CANBUS.radar) self.updated_messages = set() self.track_id = 0 - self.trigger_msg = RADAR_MSGS_B[-1] def update(self, can_strings): if self.rcp is None: @@ -48,17 +43,24 @@ class RadarInterface(RadarInterfaceBase): # Errors errors = [] - sgu_info = self.rcp.vl['TeslaRadarSguInfo'] if not self.rcp.can_valid: errors.append('canError') - if sgu_info['RADC_HWFail'] or sgu_info['RADC_SGUFail'] or sgu_info['RADC_SensorDirty']: - errors.append('fault') + + if self.CP.carFingerprint == CAR.MODELS_RAVEN: + radar_status = self.rcp.vl['RadarStatus'] + if radar_status['sensorBlocked'] or radar_status['shortTermUnavailable'] or radar_status['vehDynamicsError']: + errors.append('fault') + else: + radar_status = self.rcp.vl['TeslaRadarSguInfo'] + if radar_status['RADC_HWFail'] or radar_status['RADC_SGUFail'] or radar_status['RADC_SensorDirty']: + errors.append('fault') + ret.errors = errors # Radar tracks - for i in range(NUM_POINTS): - msg_a = self.rcp.vl[RADAR_MSGS_A[i]] - msg_b = self.rcp.vl[RADAR_MSGS_B[i]] + for i in range(self.num_points): + msg_a = self.rcp.vl[f'RadarPoint{i}_A'] + msg_b = self.rcp.vl[f'RadarPoint{i}_B'] # Make sure msg A and B are together if msg_a['Index'] != msg_b['Index2']: diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index f33e62618c..43132970b0 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -1,8 +1,7 @@ from collections import namedtuple -from dataclasses import dataclass, field from cereal import car -from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict +from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, PlatformConfig, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarInfo from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -10,24 +9,25 @@ Ecu = car.CarParams.Ecu Button = namedtuple('Button', ['event_type', 'can_addr', 'can_msg', 'values']) - -@dataclass -class TeslaPlatformConfig(PlatformConfig): - dbc_dict: DbcDict = field(default_factory=lambda: dbc_dict('tesla_powertrain', 'tesla_radar', chassis_dbc='tesla_can')) - - class CAR(Platforms): - AP1_MODELS = TeslaPlatformConfig( + AP1_MODELS = PlatformConfig( 'TESLA AP1 MODEL S', CarInfo("Tesla AP1 Model S", "All"), - CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0) + CarSpecs(mass=2100., wheelbase=2.959, steerRatio=15.0), + dbc_dict('tesla_powertrain', 'tesla_radar_bosch_generated', chassis_dbc='tesla_can') ) - AP2_MODELS = TeslaPlatformConfig( + AP2_MODELS = PlatformConfig( 'TESLA AP2 MODEL S', CarInfo("Tesla AP2 Model S", "All"), - AP1_MODELS.specs + AP1_MODELS.specs, + AP1_MODELS.dbc_dict + ) + MODELS_RAVEN = PlatformConfig( + 'TESLA MODEL S RAVEN', + CarInfo("Tesla Model S Raven", "All"), + AP1_MODELS.specs, + dbc_dict('tesla_powertrain', 'tesla_radar_continental_generated', chassis_dbc='tesla_can') ) - FW_QUERY_CONFIG = FwQueryConfig( requests=[ @@ -38,6 +38,13 @@ FW_QUERY_CONFIG = FwQueryConfig( rx_offset=0x08, bus=0, ), + Request( + [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.SUPPLIER_SOFTWARE_VERSION_REQUEST], + [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.SUPPLIER_SOFTWARE_VERSION_RESPONSE], + whitelist_ecus=[Ecu.eps], + rx_offset=0x08, + bus=0, + ), Request( [StdQueries.TESTER_PRESENT_REQUEST, StdQueries.UDS_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.UDS_VERSION_RESPONSE], @@ -48,7 +55,6 @@ FW_QUERY_CONFIG = FwQueryConfig( ] ) - class CANBUS: # Lateral harness chassis = 0 diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index ff747b5938..92ee7fa923 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -289,6 +289,7 @@ routes = [ 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), # Segments that test specific issues # Controls mismatch due to interceptor threshold diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index a8bae29391..b9eadc8cd5 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.3, 2: 9.2} + total_ref_time = {1: 8.4, 2: 9.3} brand_ref_times = { 1: { 'gm': 1.0, @@ -275,13 +275,14 @@ class TestFwFingerprintTiming(unittest.TestCase): 'mazda': 0.1, 'nissan': 0.8, 'subaru': 0.45, - 'tesla': 0.2, + 'tesla': 0.3, 'toyota': 1.6, 'volkswagen': 0.65, }, 2: { 'ford': 1.6, 'hyundai': 1.85, + 'tesla': 0.3, } } diff --git a/selfdrive/car/torque_data/override.toml b/selfdrive/car/torque_data/override.toml index 3cf17f3179..3de33b88db 100644 --- a/selfdrive/car/torque_data/override.toml +++ b/selfdrive/car/torque_data/override.toml @@ -18,6 +18,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"] # 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] # Guess "FORD BRONCO SPORT 1ST GEN" = [nan, 1.5, nan] From 7331b3cc95fbb3bdfb62bb04f0caa8275daa37e2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 6 Mar 2024 13:39:49 -0800 Subject: [PATCH 399/923] it's called esim now --- scripts/cell.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/cell.sh b/scripts/cell.sh index 3f31978af5..4ba007a532 100755 --- a/scripts/cell.sh +++ b/scripts/cell.sh @@ -1,3 +1,3 @@ #!/usr/bin/bash -nmcli connection modify --temporary lte ipv4.route-metric 1 ipv6.route-metric 1 -nmcli con up lte +nmcli connection modify --temporary esim ipv4.route-metric 1 ipv6.route-metric 1 +nmcli con up esim From ba068a0f5822dccddb134b8fc520d1716c4ed1f7 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 6 Mar 2024 18:22:07 -0500 Subject: [PATCH 400/923] with_processes: add standalone context manager (#31746) helpers --- selfdrive/test/helpers.py | 40 +++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index 210a283699..b345b929ec 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -1,3 +1,4 @@ +import contextlib import http.server import os import threading @@ -43,27 +44,34 @@ def release_only(f): f(self, *args, **kwargs) return wrap -def with_processes(processes, init_time=0, ignore_stopped=None): + +@contextlib.contextmanager +def processes_context(processes, init_time=0, ignore_stopped=None): ignore_stopped = [] if ignore_stopped is None else ignore_stopped + # start and assert started + for n, p in enumerate(processes): + managed_processes[p].start() + if n < len(processes) - 1: + time.sleep(init_time) + + assert all(managed_processes[name].proc.exitcode is None for name in processes) + + try: + yield [managed_processes[name] for name in processes] + # assert processes are still started + assert all(managed_processes[name].proc.exitcode is None for name in processes if name not in ignore_stopped) + finally: + for p in processes: + managed_processes[p].stop() + + +def with_processes(processes, init_time=0, ignore_stopped=None): def wrapper(func): @wraps(func) def wrap(*args, **kwargs): - # start and assert started - for n, p in enumerate(processes): - managed_processes[p].start() - if n < len(processes) - 1: - time.sleep(init_time) - assert all(managed_processes[name].proc.exitcode is None for name in processes) - - # call the function - try: - func(*args, **kwargs) - # assert processes are still started - assert all(managed_processes[name].proc.exitcode is None for name in processes if name not in ignore_stopped) - finally: - for p in processes: - managed_processes[p].stop() + with processes_context(processes, init_time, ignore_stopped): + return func(*args, **kwargs) return wrap return wrapper From ac771290414da337e1f800b23b01360c5471ece4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 6 Mar 2024 18:24:46 -0500 Subject: [PATCH 401/923] updated: basic e2e update tests (#31742) * e2e update test * that too * fix * fix * fix running in docker * don't think GHA will work * also test switching branches * it's a test * lets not delete that yet * comment * space --- pyproject.toml | 1 + selfdrive/updated/tests/test_updated.py | 172 ++++++++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100755 selfdrive/updated/tests/test_updated.py diff --git a/pyproject.toml b/pyproject.toml index 99a8602460..0f7734b3b3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ testpaths = [ "selfdrive/thermald", "selfdrive/test/longitudinal_maneuvers", "selfdrive/test/process_replay/test_fuzzy.py", + "selfdrive/updated", "system/camerad", "system/hardware/tici", "system/loggerd", diff --git a/selfdrive/updated/tests/test_updated.py b/selfdrive/updated/tests/test_updated.py new file mode 100755 index 0000000000..d8ce9f3394 --- /dev/null +++ b/selfdrive/updated/tests/test_updated.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python3 +import os +import pathlib +import shutil +import signal +import subprocess +import tempfile +import time +import unittest +from unittest import mock + +import pytest +from openpilot.selfdrive.manager.process import ManagerProcess + + +from openpilot.selfdrive.test.helpers import processes_context +from openpilot.common.params import Params + + +def run(args, **kwargs): + return subprocess.run(args, **kwargs, check=True) + + +def update_release(directory, name, version, release_notes): + with open(directory / "RELEASES.md", "w") as f: + f.write(release_notes) + + (directory / "common").mkdir(exist_ok=True) + + with open(directory / "common" / "version.h", "w") as f: + f.write(f'#define COMMA_VERSION "{version}"') + + run(["git", "add", "."], cwd=directory) + run(["git", "commit", "-m", f"openpilot release {version}"], cwd=directory) + + +@pytest.mark.slow # TODO: can we test overlayfs in GHA? +class TestUpdateD(unittest.TestCase): + def setUp(self): + self.tmpdir = tempfile.mkdtemp() + + run(["sudo", "mount", "-t", "tmpfs", "tmpfs", self.tmpdir]) # overlayfs doesn't work inside of docker unless this is a tmpfs + + self.mock_update_path = pathlib.Path(self.tmpdir) + + self.params = Params() + + self.basedir = self.mock_update_path / "openpilot" + self.basedir.mkdir() + + self.staging_root = self.mock_update_path / "safe_staging" + self.staging_root.mkdir() + + self.remote_dir = self.mock_update_path / "remote" + self.remote_dir.mkdir() + + mock.patch("openpilot.common.basedir.BASEDIR", self.basedir).start() + + os.environ["UPDATER_STAGING_ROOT"] = str(self.staging_root) + os.environ["UPDATER_LOCK_FILE"] = str(self.mock_update_path / "safe_staging_overlay.lock") + + self.MOCK_RELEASES = { + "release3": ("0.1.2", "0.1.2 release notes"), + "master": ("0.1.3", "0.1.3 release notes"), + } + + def set_target_branch(self, branch): + self.params.put("UpdaterTargetBranch", branch) + + def setup_basedir_release(self, release): + self.params = Params() + self.set_target_branch(release) + run(["git", "clone", "-b", release, self.remote_dir, self.basedir]) + + def update_remote_release(self, release): + update_release(self.remote_dir, release, *self.MOCK_RELEASES[release]) + + def setup_remote_release(self, release): + run(["git", "init"], cwd=self.remote_dir) + run(["git", "checkout", "-b", release], cwd=self.remote_dir) + self.update_remote_release(release) + + def tearDown(self): + mock.patch.stopall() + run(["sudo", "umount", "-l", str(self.staging_root / "merged")]) + run(["sudo", "umount", "-l", self.tmpdir]) + shutil.rmtree(self.tmpdir) + + def send_check_for_updates_signal(self, updated: ManagerProcess): + updated.signal(signal.SIGUSR1.value) + + 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 _test_update_params(self, branch, 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") + + def wait_for_idle(self, timeout=5, min_wait_time=2): + start = time.monotonic() + time.sleep(min_wait_time) + + while True: + waited = time.monotonic() - start + if self.params.get("UpdaterState", encoding="utf-8") == "idle": + print(f"waited {waited}s for idle") + break + + if waited > timeout: + raise TimeoutError("timed out waiting for idle") + + time.sleep(1) + + def test_new_release(self): + # Start on release3, simulate a release3 commit, ensure we fetch that update properly + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + time.sleep(1) + self._test_params("release3", False, False) + + self.MOCK_RELEASES["release3"] = ("0.1.3", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", True, False) + + self.send_download_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", False, True) + self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) + + def test_switch_branches(self): + # Start on release3, request to switch to master manually, ensure we switched + self.setup_remote_release("release3") + self.setup_remote_release("master") + self.setup_basedir_release("release3") + + with processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + self.wait_for_idle() + self._test_params("release3", False, False) + + self.set_target_branch("master") + self.send_check_for_updates_signal(updated) + + self.wait_for_idle() + + self._test_params("master", True, False) + + self.send_download_signal(updated) + + self.wait_for_idle() + + self._test_params("master", False, True) + self._test_update_params("master", *self.MOCK_RELEASES["master"]) + + +if __name__ == "__main__": + unittest.main() From 78a46ce72499ce627c50ff95aa630602e71b8e39 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 6 Mar 2024 15:47:44 -0800 Subject: [PATCH 402/923] car values formatting (#31747) values formatting --- selfdrive/car/body/values.py | 1 - selfdrive/car/chrysler/values.py | 1 - selfdrive/car/ford/values.py | 1 - selfdrive/car/gm/values.py | 1 - selfdrive/car/hyundai/values.py | 1 - selfdrive/car/mazda/values.py | 2 -- selfdrive/car/mock/values.py | 4 ---- selfdrive/car/nissan/values.py | 1 - selfdrive/car/subaru/values.py | 1 - selfdrive/car/tesla/values.py | 1 - selfdrive/car/toyota/values.py | 1 - selfdrive/car/values.py | 1 - selfdrive/car/volkswagen/values.py | 1 - 13 files changed, 17 deletions(-) diff --git a/selfdrive/car/body/values.py b/selfdrive/car/body/values.py index 6e0d0ec596..46afa857aa 100644 --- a/selfdrive/car/body/values.py +++ b/selfdrive/car/body/values.py @@ -38,5 +38,4 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 905e2e7270..7dcfa3749e 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -163,5 +163,4 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 76f505fa9b..add40368be 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -209,5 +209,4 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/gm/values.py b/selfdrive/car/gm/values.py index 17822e0c80..5401963ee6 100644 --- a/selfdrive/car/gm/values.py +++ b/selfdrive/car/gm/values.py @@ -247,5 +247,4 @@ CAMERA_ACC_CAR = {CAR.BOLT_EUV, CAR.SILVERADO, CAR.EQUINOX, CAR.TRAILBLAZER} STEER_THRESHOLD = 1.0 - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 29a72ba715..1ed84d9187 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -847,7 +847,6 @@ LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY) UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL) - DBC = CAR.create_dbc_map() if __name__ == "__main__": diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 20a3ae0ae1..b55690f39a 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -107,6 +107,4 @@ FW_QUERY_CONFIG = FwQueryConfig( ], ) - - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/mock/values.py b/selfdrive/car/mock/values.py index 7e399fab73..ddab599a93 100644 --- a/selfdrive/car/mock/values.py +++ b/selfdrive/car/mock/values.py @@ -1,7 +1,6 @@ from openpilot.selfdrive.car import CarSpecs, PlatformConfig, Platforms - class CAR(Platforms): MOCK = PlatformConfig( 'mock', @@ -9,6 +8,3 @@ class CAR(Platforms): CarSpecs(mass=1700, wheelbase=2.7, steerRatio=13), {} ) - - - diff --git a/selfdrive/car/nissan/values.py b/selfdrive/car/nissan/values.py index 8d33e0e705..c0ccb0febf 100644 --- a/selfdrive/car/nissan/values.py +++ b/selfdrive/car/nissan/values.py @@ -63,7 +63,6 @@ class CAR(Platforms): ) - DBC = CAR.create_dbc_map() # Default diagnostic session diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index acb60628b4..cc963404b7 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -265,6 +265,5 @@ FW_QUERY_CONFIG = FwQueryConfig( DBC = CAR.create_dbc_map() - if __name__ == "__main__": CAR.print_debug(SubaruFlags) diff --git a/selfdrive/car/tesla/values.py b/selfdrive/car/tesla/values.py index 43132970b0..ca3bb38a7a 100644 --- a/selfdrive/car/tesla/values.py +++ b/selfdrive/car/tesla/values.py @@ -98,5 +98,4 @@ class CarControllerParams: pass - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 048e8b1033..d9dc8b5eba 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -608,5 +608,4 @@ ANGLE_CONTROL_CAR = CAR.with_flags(ToyotaFlags.ANGLE_CONTROL) # no resume button press required NO_STOP_TIMER_CAR = CAR.with_flags(ToyotaFlags.NO_STOP_TIMER) - DBC = CAR.create_dbc_map() diff --git a/selfdrive/car/values.py b/selfdrive/car/values.py index 24119e2210..0c8249838b 100644 --- a/selfdrive/car/values.py +++ b/selfdrive/car/values.py @@ -18,7 +18,6 @@ BRANDS = [BODY, CHRYSLER, FORD, GM, HONDA, HYUNDAI, MAZDA, MOCK, NISSAN, SUBARU, PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in cast(list[Platform], brand)} - MapFunc = Callable[[Platform], Any] diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 36c82abf03..a45ddf431f 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -416,5 +416,4 @@ FW_QUERY_CONFIG = FwQueryConfig( extra_ecus=[(Ecu.fwdCamera, 0x74f, None)], ) - DBC = CAR.create_dbc_map() From 84797482e909ce017385fb3510d564ee5b08045d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 6 Mar 2024 16:19:08 -0800 Subject: [PATCH 403/923] encoderd: fix large frames (#31681) * encoderd: fix large frames * Update camera_common.cc * just do this for now --------- Co-authored-by: Comma Device --- system/camerad/cameras/camera_common.cc | 6 +++++- system/loggerd/encoder/v4l_encoder.cc | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index 91c6d44f84..fff4a62d31 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -79,8 +79,12 @@ void CameraBuf::init(cl_device_id device_id, cl_context context, CameraState *s, int nv12_height = VENUS_Y_SCANLINES(COLOR_FMT_NV12, rgb_height); assert(nv12_width == VENUS_UV_STRIDE(COLOR_FMT_NV12, rgb_width)); assert(nv12_height/2 == VENUS_UV_SCANLINES(COLOR_FMT_NV12, rgb_height)); - size_t nv12_size = 2346 * nv12_width; // comes from v4l2_format.fmt.pix_mp.plane_fmt[0].sizeimage size_t nv12_uv_offset = nv12_width * nv12_height; + + // the encoder HW tells us the size it wants after setting it up. + // TODO: VENUS_BUFFER_SIZE should give the size, but it's too small. dependent on encoder settings? + size_t nv12_size = (rgb_width >= 2688 ? 2900 : 2346)*nv12_width; + 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); diff --git a/system/loggerd/encoder/v4l_encoder.cc b/system/loggerd/encoder/v4l_encoder.cc index 2bd2863126..853a17abbe 100644 --- a/system/loggerd/encoder/v4l_encoder.cc +++ b/system/loggerd/encoder/v4l_encoder.cc @@ -16,7 +16,12 @@ #define V4L2_QCOM_BUF_FLAG_CODECCONFIG 0x00020000 #define V4L2_QCOM_BUF_FLAG_EOS 0x02000000 -// echo 0x7fffffff > /sys/kernel/debug/msm_vidc/debug_level +/* + kernel debugging: + echo 0xff > /sys/module/videobuf2_core/parameters/debug + echo 0x7fffffff > /sys/kernel/debug/msm_vidc/debug_level + echo 0xff > /sys/devices/platform/soc/aa00000.qcom,vidc/video4linux/video33/dev_debug +*/ const int env_debug_encoder = (getenv("DEBUG_ENCODER") != NULL) ? atoi(getenv("DEBUG_ENCODER")) : 0; static void checked_ioctl(int fd, unsigned long request, void *argp) { From 997bb65e54badbb8d53ae940367a5d4146dc8e01 Mon Sep 17 00:00:00 2001 From: Clark934 Date: Wed, 6 Mar 2024 22:15:14 -0500 Subject: [PATCH 404/923] ruff: set tab size and quote style (#31749) --- pyproject.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 0f7734b3b3..8894d5eca2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -171,6 +171,7 @@ build-backend = "poetry.core.masonry.api" # https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml [tool.ruff] +indent-width = 2 lint.select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF008", "RUF100", "A", "B", "TID251"] lint.ignore = ["E741", "E402", "C408", "ISC003", "B027", "B024"] line-length = 160 @@ -195,3 +196,5 @@ lint.flake8-implicit-str-concat.allow-multiline=false [tool.coverage.run] concurrency = ["multiprocessing", "thread"] +[tool.ruff.format] +quote-style = "preserve" From b4c8e0834d23e757d37b7157dc23eac3ed655bdf Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Thu, 7 Mar 2024 04:16:21 +0100 Subject: [PATCH 405/923] Simulator: Add world status reporting (#31740) --- tools/sim/bridge/common.py | 6 +++--- .../sim/bridge/metadrive/metadrive_bridge.py | 4 +++- tools/sim/bridge/metadrive/metadrive_world.py | 16 +++++++++++++-- tools/sim/lib/common.py | 2 +- tools/sim/scenarios/metadrive/stay_in_lane.py | 20 +++++++++++++------ 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/tools/sim/bridge/common.py b/tools/sim/bridge/common.py index 78ddfa5aa6..34d11bb98c 100644 --- a/tools/sim/bridge/common.py +++ b/tools/sim/bridge/common.py @@ -56,14 +56,14 @@ class SimulatorBridge(ABC): try: self._run(q) finally: - self.close() + self.close("bridge terminated") - def close(self): + def close(self, reason): self.started.value = False self._exit_event.set() if self.world is not None: - self.world.close() + self.world.close(reason) def run(self, queue, retries=-1): bridge_p = Process(name="bridge", target=self.bridge_keep_alive, args=(queue, retries)) diff --git a/tools/sim/bridge/metadrive/metadrive_bridge.py b/tools/sim/bridge/metadrive/metadrive_bridge.py index 3190cb81b9..c2ea92798a 100644 --- a/tools/sim/bridge/metadrive/metadrive_bridge.py +++ b/tools/sim/bridge/metadrive/metadrive_bridge.py @@ -1,3 +1,5 @@ +from multiprocessing import Queue + from metadrive.component.sensors.base_camera import _cuda_enable from metadrive.component.map.pg_map import MapGenerateMethod @@ -80,4 +82,4 @@ class MetaDriveBridge(SimulatorBridge): preload_models=False ) - return MetaDriveWorld(config, self.dual_camera) + return MetaDriveWorld(Queue(), config, self.dual_camera) diff --git a/tools/sim/bridge/metadrive/metadrive_world.py b/tools/sim/bridge/metadrive/metadrive_world.py index 312860593d..3570205069 100644 --- a/tools/sim/bridge/metadrive/metadrive_world.py +++ b/tools/sim/bridge/metadrive/metadrive_world.py @@ -12,8 +12,9 @@ from openpilot.tools.sim.lib.camerad import W, H class MetaDriveWorld(World): - def __init__(self, config, dual_camera = False): + def __init__(self, status_q, config, dual_camera = False): super().__init__(dual_camera) + self.status_q = status_q self.camera_array = Array(ctypes.c_uint8, W*H*3) self.road_image = np.frombuffer(self.camera_array.get_obj(), dtype=np.uint8).reshape((H, W, 3)) self.wide_camera_array = None @@ -34,12 +35,14 @@ class MetaDriveWorld(World): self.vehicle_state_send, self.exit_event)) self.metadrive_process.start() + self.status_q.put({"status": "starting"}) print("----------------------------------------------------------") print("---- Spawning Metadrive world, this might take awhile ----") print("----------------------------------------------------------") self.vehicle_state_recv.recv() # wait for a state message to ensure metadrive is launched + self.status_q.put({"status": "started"}) self.steer_ratio = 15 self.vc = [0.0,0.0] @@ -65,6 +68,11 @@ class MetaDriveWorld(World): while self.simulation_state_recv.poll(0): md_state: metadrive_simulation_state = self.simulation_state_recv.recv() if md_state.done: + self.status_q.put({ + "status": "terminating", + "reason": "done", + "done_info": md_state.done_info + }) self.exit_event.set() def read_sensors(self, state: SimulatorState): @@ -85,6 +93,10 @@ class MetaDriveWorld(World): def reset(self): self.should_reset = True - def close(self): + def close(self, reason: str): + self.status_q.put({ + "status": "terminating", + "reason": reason, + }) self.exit_event.set() self.metadrive_process.join() diff --git a/tools/sim/lib/common.py b/tools/sim/lib/common.py index 76224c61de..168b3aa324 100644 --- a/tools/sim/lib/common.py +++ b/tools/sim/lib/common.py @@ -92,7 +92,7 @@ class World(ABC): pass @abstractmethod - def close(self): + def close(self, reason: str): pass @abstractmethod diff --git a/tools/sim/scenarios/metadrive/stay_in_lane.py b/tools/sim/scenarios/metadrive/stay_in_lane.py index 55fb2cb9bd..6d5f680247 100755 --- a/tools/sim/scenarios/metadrive/stay_in_lane.py +++ b/tools/sim/scenarios/metadrive/stay_in_lane.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -from typing import Any from multiprocessing import Queue from metadrive.component.sensors.base_camera import _cuda_enable @@ -38,7 +37,8 @@ def create_map(): class MetaDriveBridge(SimulatorBridge): TICKS_PER_FRAME = 5 - def __init__(self, dual_camera, high_quality): + def __init__(self, world_status_q, dual_camera, high_quality): + self.world_status_q = world_status_q self.should_render = False super().__init__(dual_camera, high_quality) @@ -72,11 +72,19 @@ class MetaDriveBridge(SimulatorBridge): preload_models=False ) - return MetaDriveWorld(config, self.dual_camera) + return MetaDriveWorld(world_status_q, config, self.dual_camera) if __name__ == "__main__": - queue: Any = Queue() - simulator_bridge = MetaDriveBridge(True, False) - simulator_process = simulator_bridge.run(queue) + command_queue: Queue = Queue() + world_status_q: Queue = Queue() + simulator_bridge = MetaDriveBridge(world_status_q, True, False) + simulator_process = simulator_bridge.run(command_queue) + + while True: + world_status = world_status_q.get() + print(f"World Status: {str(world_status)}") + if world_status["status"] == "terminating": + break + simulator_process.join() From 28b4e9962d907533a367a855d25391a7c08304f1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 6 Mar 2024 23:39:11 -0800 Subject: [PATCH 406/923] Hyundai Palisade: allow fingerprinting without comma power (#31752) * Palisade gets camera, radar, eps * Add versions from d23a555519923793 * add FW from 0af43ba62cc3ffc4 * remove CAN fingerprints! --- selfdrive/car/hyundai/fingerprints.py | 7 ++++--- selfdrive/car/hyundai/values.py | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index fa5296cfa7..1f8fd98939 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -74,9 +74,6 @@ FINGERPRINTS = { { 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 544: 8, 576: 8, 593: 8, 688: 5, 881: 8, 882: 8, 897: 8, 902: 8, 903: 8, 909: 8, 912: 7, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1136: 6, 1151: 6, 1168: 7, 1173: 8, 1180: 8, 1186: 2, 1191: 2, 1265: 4, 1268: 8, 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, 1371: 8, 1407: 8, 1419: 8, 1420: 8, 1425: 2, 1427: 6, 1429: 8, 1430: 8, 1448: 8, 1456: 4, 1470: 8, 1476: 8, 1535: 8 }], - CAR.PALISADE: [{ - 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 546: 8, 547: 8, 548: 8, 549: 8, 576: 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, 913: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1123: 8, 1136: 8, 1151: 6, 1155: 8, 1156: 8, 1157: 4, 1162: 8, 1164: 8, 1168: 7, 1170: 8, 1173: 8, 1180: 8, 1186: 2, 1191: 2, 1193: 8, 1210: 8, 1225: 8, 1227: 8, 1265: 4, 1280: 8, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 8, 1384: 8, 1407: 8, 1419: 8, 1427: 6, 1456: 4, 1470: 8, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2005: 8, 2008: 8, 2012: 8 - }], } FW_VERSIONS = { @@ -727,6 +724,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\x16 58910-S8360', b'\xf1\x00LX ESC \x0b 101\x19\x03\x17 58910-S8330', b'\xf1\x00LX ESC \x0b 102\x19\x05\x07 58910-S8330', b'\xf1\x00LX ESC \x0b 103\x19\t\x07 58910-S8330', @@ -748,10 +746,12 @@ FW_VERSIONS = { 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.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', b'\xf1\x00ON MDPS C 1.00 1.01 56340-S9000 9201', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00LX2 MFC AT KOR LHD 1.00 1.08 99211-S8100 200903', b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.00 99211-S8110 210226', b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.03 99211-S8100 190125', b'\xf1\x00LX2 MFC AT USA LHD 1.00 1.05 99211-S8100 190909', @@ -765,6 +765,7 @@ FW_VERSIONS = { 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", diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 1ed84d9187..13321b4573 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -804,9 +804,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.SONATA], - Ecu.engine: [CAR.AZERA_6TH_GEN, CAR.AZERA_HEV_6TH_GEN, CAR.SONATA], - Ecu.abs: [CAR.SONATA], + 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], }, extra_ecus=[ (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms From 2a29778ae2c7af26cfc014d04dadf15b1c0a5c66 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 00:14:56 -0800 Subject: [PATCH 407/923] HKG: test platform codes per platform (#31753) * test * clean up --- selfdrive/car/hyundai/tests/test_hyundai.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/selfdrive/car/hyundai/tests/test_hyundai.py b/selfdrive/car/hyundai/tests/test_hyundai.py index c7100d03f0..61b11a1992 100755 --- a/selfdrive/car/hyundai/tests/test_hyundai.py +++ b/selfdrive/car/hyundai/tests/test_hyundai.py @@ -98,6 +98,23 @@ class TestHyundaiFingerprint(unittest.TestCase): fws = data.draw(fw_strategy) get_platform_codes(fws) + def test_expected_platform_codes(self): + # Ensures we don't accidentally add multiple platform codes for a car unless it is intentional + for car_model, ecus in FW_VERSIONS.items(): + with self.subTest(car_model=car_model.value): + for ecu, fws in ecus.items(): + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # 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: + 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: + 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}") + # Tests for platform codes, part numbers, and FW dates which Hyundai will use to fuzzy # fingerprint in the absence of full FW matches: def test_platform_code_ecus_available(self): From 4624bb3d7cf30db4fc8d1a68aa0cf21e1ad9ff0c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 00:24:50 -0800 Subject: [PATCH 408/923] Sonata LF: remove CAN fingerprint (#31754) add FW from 7ae1c131629d96e5 --- selfdrive/car/hyundai/fingerprints.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 1f8fd98939..85cb81aa5f 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -32,9 +32,6 @@ FINGERPRINTS = { CAR.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.SONATA_LF: [{ - 66: 8, 67: 8, 68: 8, 127: 8, 273: 8, 274: 8, 275: 8, 339: 8, 356: 4, 399: 8, 447: 8, 512: 6, 544: 8, 593: 8, 608: 8, 688: 5, 790: 8, 809: 8, 832: 8, 884: 8, 897: 8, 899: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1151: 6, 1168: 7, 1170: 8, 1253: 8, 1254: 8, 1255: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1314: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1342: 6, 1345: 8, 1348: 8, 1349: 8, 1351: 8, 1353: 8, 1363: 8, 1365: 8, 1366: 8, 1367: 8, 1369: 8, 1397: 8, 1407: 8, 1415: 8, 1419: 8, 1425: 2, 1427: 6, 1440: 8, 1456: 4, 1470: 8, 1472: 8, 1486: 8, 1487: 8, 1491: 8, 1530: 8, 1532: 5, 2000: 8, 2001: 8, 2004: 8, 2005: 8, 2008: 8, 2009: 8, 2012: 8, 2013: 8, 2014: 8, 2016: 8, 2017: 8, 2024: 8, 2025: 8 - }], CAR.KIA_SORENTO: [{ 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1384: 8, 1407: 8, 1411: 8, 1419: 8, 1425: 2, 1427: 6, 1444: 8, 1456: 4, 1470: 8, 1489: 1 }], @@ -412,6 +409,7 @@ FW_VERSIONS = { b'\xf1\x00LFF LKAS AT USA LHD 1.01 1.02 95740-C1000 E52', ], (Ecu.transmission, 0x7e1, None): [ + b'\xf1\x006T6H0_C2\x00\x006T6B7051\x00\x00TLF0G24SL4;\x08\x12i', b'\xf1\x006T6H0_C2\x00\x006T6B4051\x00\x00TLF0G24NL1\xb0\x9f\xee\xf5', 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', From 9f7c577564ba7f267a1e4d94c3d61ef41149b04c Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 00:53:31 -0800 Subject: [PATCH 409/923] Hyundai Ioniq Hybrid 2017: remove CAN fingerprints fixing mismatch (#31755) * Run bot on 0e13ee2b821302f4 * remove IONIQ CAN fingerprints and move to Niro PHEV (part numbers match!) * remove dups * best guess is Hyundai C (IONIQ is also) --- docs/CARS.md | 3 ++- selfdrive/car/hyundai/fingerprints.py | 8 ++++---- selfdrive/car/hyundai/values.py | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 654f788908..591a76e4cb 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. -# 288 Supported Cars +# 289 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -143,6 +143,7 @@ A supported vehicle is one that just works when you install a comma device. All |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 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
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 85cb81aa5f..5a7cfea5a5 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -53,9 +53,6 @@ FINGERPRINTS = { CAR.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.IONIQ: [{ - 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 352: 8, 356: 4, 524: 8, 544: 8, 576: 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: 6, 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, 1448: 8, 1456: 4, 1470: 8, 1473: 8, 1476: 8, 1507: 8, 1535: 8, 1988: 8, 1996: 8, 2000: 8, 2004: 8, 2005: 8, 2008: 8, 2012: 8, 2013: 8 - }], CAR.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 }], @@ -409,8 +406,8 @@ FW_VERSIONS = { b'\xf1\x00LFF LKAS AT USA LHD 1.01 1.02 95740-C1000 E52', ], (Ecu.transmission, 0x7e1, None): [ - b'\xf1\x006T6H0_C2\x00\x006T6B7051\x00\x00TLF0G24SL4;\x08\x12i', 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', @@ -1179,11 +1176,13 @@ 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', @@ -1195,6 +1194,7 @@ FW_VERSIONS = { b'\xf1\x00DE MDPS C 1.00 1.09 56310G5301\x00 4DEHC109', ], (Ecu.fwdCamera, 0x7c4, None): [ + b'\xf1\x00DEH MFC AT USA LHD 1.00 1.00 95740-G5010 170117', b'\xf1\x00DEP MFC AT USA LHD 1.00 1.00 95740-G5010 170117', b'\xf1\x00DEP MFC AT USA LHD 1.00 1.01 95740-G5010 170424', b'\xf1\x00DEP MFC AT USA LHD 1.00 1.05 99211-G5000 190826', diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 13321b4573..199e0bba4d 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -418,6 +418,7 @@ class CAR(Platforms): 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])), ], From 66680515a79a29feb27d7dc3780232478ccd1ad8 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 01:09:08 -0800 Subject: [PATCH 410/923] Hyundai Genesis: remove CAN fingerprints (#31757) We already have the FW from 1bc85e3b0b53e1ad, 1b85fa0a357240ac, and cb5df08e7b5d0633 --- selfdrive/car/hyundai/fingerprints.py | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 5a7cfea5a5..1bed722537 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -5,21 +5,6 @@ from openpilot.selfdrive.car.hyundai.values import CAR Ecu = car.CarParams.Ecu FINGERPRINTS = { - CAR.HYUNDAI_GENESIS: [{ - 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1024: 2, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1342: 6, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1456: 4 - }, - { - 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1024: 2, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 3, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1378: 4, 1379: 8, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1456: 4 - }, - { - 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 912: 7, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1268: 8, 1280: 1, 1281: 3, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1427: 6, 1434: 2, 1437: 8, 1456: 4 - }, - { - 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1378: 4, 1379: 8, 1384: 5, 1407: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4 - }, - { - 67: 8, 68: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 7, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 5, 897: 8, 902: 8, 903: 6, 916: 8, 1040: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1287: 4, 1292: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1334: 8, 1335: 8, 1345: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1378: 4, 1384: 5, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4 - }], CAR.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 }, From 2e0a4a8574c1d576b898b677b441f1014d536687 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 01:23:05 -0800 Subject: [PATCH 411/923] Hyundai: remove Sorento and G80 CAN fingerprints (#31758) * Add FW * rm can fp --- selfdrive/car/hyundai/fingerprints.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index 1bed722537..6349318fbf 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -17,21 +17,9 @@ FINGERPRINTS = { CAR.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_SORENTO: [{ - 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1265: 4, 1280: 1, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1331: 8, 1332: 8, 1333: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1370: 8, 1371: 8, 1384: 8, 1407: 8, 1411: 8, 1419: 8, 1425: 2, 1427: 6, 1444: 8, 1456: 4, 1470: 8, 1489: 1 - }], CAR.KIA_STINGER: [{ 67: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 576: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 909: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1265: 4, 1280: 1, 1281: 4, 1287: 4, 1290: 8, 1292: 8, 1294: 8, 1312: 8, 1322: 8, 1342: 6, 1345: 8, 1348: 8, 1363: 8, 1369: 8, 1371: 8, 1378: 4, 1379: 8, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1456: 4, 1470: 8 }], - CAR.GENESIS_G80: [{ - 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1024: 2, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1191: 2, 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, 1370: 8, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1434: 2, 1456: 4, 1470: 8 - }, - { - 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 359: 8, 544: 8, 546: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1157: 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, 1342: 6, 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, 1437: 8, 1456: 4, 1470: 8 - }, - { - 67: 8, 68: 8, 127: 8, 304: 8, 320: 8, 339: 8, 356: 4, 358: 6, 544: 8, 593: 8, 608: 8, 688: 5, 809: 8, 832: 8, 854: 7, 870: 7, 871: 8, 872: 8, 897: 8, 902: 8, 903: 8, 916: 8, 1040: 8, 1042: 8, 1056: 8, 1057: 8, 1064: 8, 1078: 4, 1107: 5, 1136: 8, 1151: 6, 1156: 8, 1157: 4, 1162: 8, 1168: 7, 1170: 8, 1173: 8, 1184: 8, 1193: 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, 1371: 8, 1378: 4, 1384: 8, 1407: 8, 1419: 8, 1425: 2, 1427: 6, 1437: 8, 1456: 4, 1470: 8 - }], 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 }], @@ -874,6 +862,7 @@ FW_VERSIONS = { CAR.GENESIS_G80: { (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00DH__ SCC F-CUP 1.00 1.01 96400-B1120 ', + b'\xf1\x00DH__ SCC F-CUP 1.00 1.02 96400-B1120 ', b'\xf1\x00DH__ SCC FHCUP 1.00 1.01 96400-B1110 ', ], (Ecu.fwdCamera, 0x7c4, None): [ @@ -881,10 +870,12 @@ FW_VERSIONS = { 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', 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', @@ -1503,15 +1494,18 @@ FW_VERSIONS = { }, CAR.KIA_SORENTO: { (Ecu.fwdCamera, 0x7c4, None): [ + 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', ], (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): [ From 98a491b1f2f20f6ece847f4ad57369bc429b7e93 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Thu, 7 Mar 2024 09:54:33 +0000 Subject: [PATCH 412/923] Ford: parse distance button (#31733) Ford: parse ACC gap toggle button Use the ACC gap toggle button signal from the SCCM. There are two other signals for "increase" and "decrease" gap buttons, but no supported car has these buttons. --- selfdrive/car/ford/carstate.py | 5 +++++ selfdrive/car/ford/interface.py | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/ford/carstate.py b/selfdrive/car/ford/carstate.py index 039e245754..b3ee6a4649 100644 --- a/selfdrive/car/ford/carstate.py +++ b/selfdrive/car/ford/carstate.py @@ -19,6 +19,9 @@ class CarState(CarStateBase): self.vehicle_sensors_valid = False + self.prev_distance_button = 0 + self.distance_button = 0 + def update(self, cp, cp_cam): ret = car.CarState.new_message() @@ -83,6 +86,8 @@ class CarState(CarStateBase): ret.rightBlinker = cp.vl["Steering_Data_FD1"]["TurnLghtSwtch_D_Stat"] == 2 # TODO: block this going to the camera otherwise it will enable stock TJA ret.genericToggle = bool(cp.vl["Steering_Data_FD1"]["TjaButtnOnOffPress"]) + self.prev_distance_button = self.distance_button + self.distance_button = cp.vl["Steering_Data_FD1"]["AccButtnGapTogglePress"] # lock info ret.doorOpen = any([cp.vl["BodyInfo_3_FD1"]["DrStatDrv_B_Actl"], cp.vl["BodyInfo_3_FD1"]["DrStatPsngr_B_Actl"], diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index a79b4af2e0..ed8b010491 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -1,11 +1,12 @@ from cereal import car from panda import Panda from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car import get_safety_config +from openpilot.selfdrive.car import create_button_events, get_safety_config from openpilot.selfdrive.car.ford.fordcan import CanBus from openpilot.selfdrive.car.ford.values import Ecu, FordFlags from openpilot.selfdrive.car.interfaces import CarInterfaceBase +ButtonType = car.CarState.ButtonEvent.Type TransmissionType = car.CarParams.TransmissionType GearShifter = car.CarState.GearShifter @@ -61,6 +62,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 = self.create_common_events(ret, extra_gears=[GearShifter.manumatic]) if not self.CS.vehicle_sensors_valid: events.add(car.CarEvent.EventName.vehicleSensorsInvalid) From c4ef17ac28fdd2130fb8b9f4463575904739f394 Mon Sep 17 00:00:00 2001 From: Alexandre Nobuharu Sato <66435071+AlexandreSato@users.noreply.github.com> Date: Thu, 7 Mar 2024 07:03:39 -0300 Subject: [PATCH 413/923] Toyota TSS-P: parse distance button from SDSU (#31741) * Toyota TSS-P: parse distance button from SDSU * it's 1000hz wtf... da99509bd910288a/2024-03-04--13-51-30 * add events for SDSU * need to check for CAN filter * clena up * check * whoops --------- Co-authored-by: Shane Smiskol --- selfdrive/car/toyota/carstate.py | 10 +++++++++- selfdrive/car/toyota/interface.py | 5 ++++- selfdrive/car/toyota/values.py | 1 + 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index caaf7c2e17..166f6735a0 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -167,10 +167,13 @@ class CarState(CarStateBase): self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"]) # distance button is wired to the ACC module (camera or radar) + self.prev_distance_button = self.distance_button if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): - self.prev_distance_button = self.distance_button self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"] + elif self.CP.flags & ToyotaFlags.SMART_DSU and not self.CP.flags & ToyotaFlags.RADAR_CAN_FILTER: + self.distance_button = cp.vl["SDSU"]["FD_BUTTON"] + return ret @staticmethod @@ -221,6 +224,11 @@ class CarState(CarStateBase): ("PRE_COLLISION", 33), ] + if CP.flags & ToyotaFlags.SMART_DSU and not CP.flags & ToyotaFlags.RADAR_CAN_FILTER: + messages += [ + ("SDSU", 100), + ] + return CANParser(DBC[CP.carFingerprint]["pt"], messages, 0) @staticmethod diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index bd982728a5..7ad9feed3d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -49,6 +49,9 @@ class CarInterface(CarInterfaceBase): if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR): ret.flags |= ToyotaFlags.SMART_DSU.value + if 0x2AA in fingerprint[0] and candidate in NO_DSU_CAR: + ret.flags |= ToyotaFlags.RADAR_CAN_FILTER.value + # In TSS2 cars, the camera does long control found_ecus = [fw.ecu for fw in car_fw] ret.enableDsu = len(found_ecus) > 0 and Ecu.dsu not in found_ecus and candidate not in (NO_DSU_CAR | UNSUPPORTED_DSU_CAR) \ @@ -173,7 +176,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) or (self.CP.flags & ToyotaFlags.SMART_DSU and not self.CP.flags & ToyotaFlags.RADAR_CAN_FILTER): ret.buttonEvents = create_button_events(self.CS.distance_button, self.CS.prev_distance_button, {1: ButtonType.gapAdjustCruise}) # events diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index d9dc8b5eba..2be7ca1865 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -46,6 +46,7 @@ class ToyotaFlags(IntFlag): HYBRID = 1 SMART_DSU = 2 DISABLE_RADAR = 4 + RADAR_CAN_FILTER = 1024 # Static flags TSS2 = 8 From cec9f591130615c9760bdca18e0439dd62634319 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 03:53:41 -0800 Subject: [PATCH 414/923] Toyota: set distance lines to max (#31728) * press the button * 33hz/2 * fix tests * PCM_CRUISE_SM is a UI message: it goes to 0 when not displayed, and is much lower rate * only change when enabled so we don't hide the welcome message on cruise main button * unbump * then you can get into a weird state * stuff * for unplugged DSU we can still read PCM distance, but not buttons * skip * skip --- selfdrive/car/toyota/carcontroller.py | 14 ++++++++++++-- selfdrive/car/toyota/carstate.py | 18 ++++++++++++------ selfdrive/car/toyota/toyotacan.py | 4 ++-- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index d960114f1b..8e8e0292f2 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -37,6 +37,7 @@ class CarController(CarControllerBase): self.last_standstill = False self.standstill_req = False self.steer_rate_counter = 0 + self.distance_button = 0 self.packer = CANPacker(dbc_name) self.gas = 0 @@ -139,14 +140,23 @@ class CarController(CarControllerBase): if (self.frame % 3 == 0 and self.CP.openpilotLongitudinalControl) or pcm_cancel_cmd: lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged + # Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup + if self.frame % 6 == 0: + if CS.pcm_follow_distance_values.get(CS.pcm_follow_distance, "UNKNOWN") != "FAR" and CS.out.cruiseState.enabled and \ + self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: + self.distance_button = not self.distance_button + else: + self.distance_button = 0 + # Lexus IS uses a different cancellation message if pcm_cancel_cmd and self.CP.carFingerprint in UNSUPPORTED_DSU_CAR: can_sends.append(toyotacan.create_acc_cancel_command(self.packer)) elif self.CP.openpilotLongitudinalControl: - can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert)) + can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert, + self.distance_button)) self.accel = pcm_accel_cmd else: - can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False)) + 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. diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 166f6735a0..65fced80f4 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -43,6 +43,9 @@ class CarState(CarStateBase): self.prev_distance_button = 0 self.distance_button = 0 + self.pcm_follow_distance = 0 + self.pcm_follow_distance_values = can_define.dv['PCM_CRUISE_2']['PCM_FOLLOW_DISTANCE'] + self.low_speed_lockout = False self.acc_type = 1 self.lkas_hud = {} @@ -166,13 +169,16 @@ class CarState(CarStateBase): if self.CP.carFingerprint != CAR.PRIUS_V: self.lkas_hud = copy.copy(cp_cam.vl["LKAS_HUD"]) - # distance button is wired to the ACC module (camera or radar) - self.prev_distance_button = self.distance_button - if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): - self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"] + if self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: + self.pcm_follow_distance = cp.vl["PCM_CRUISE_2"]["PCM_FOLLOW_DISTANCE"] - elif self.CP.flags & ToyotaFlags.SMART_DSU and not self.CP.flags & ToyotaFlags.RADAR_CAN_FILTER: - self.distance_button = cp.vl["SDSU"]["FD_BUTTON"] + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) or (self.CP.flags & ToyotaFlags.SMART_DSU and not self.CP.flags & ToyotaFlags.RADAR_CAN_FILTER): + # distance button is wired to the ACC module (camera or radar) + self.prev_distance_button = self.distance_button + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): + self.distance_button = cp_acc.vl["ACC_CONTROL"]["DISTANCE"] + else: + self.distance_button = cp.vl["SDSU"]["FD_BUTTON"] return ret diff --git a/selfdrive/car/toyota/toyotacan.py b/selfdrive/car/toyota/toyotacan.py index e14e3e53a0..1cc99b41b5 100644 --- a/selfdrive/car/toyota/toyotacan.py +++ b/selfdrive/car/toyota/toyotacan.py @@ -33,12 +33,12 @@ def create_lta_steer_command(packer, steer_control_type, steer_angle, steer_req, return packer.make_can_msg("STEERING_LTA", 0, values) -def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_type, fcw_alert): +def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_type, fcw_alert, distance): # TODO: find the exact canceling bit that does not create a chime values = { "ACCEL_CMD": accel, "ACC_TYPE": acc_type, - "DISTANCE": 0, + "DISTANCE": distance, "MINI_CAR": lead, "PERMIT_BRAKING": 1, "RELEASE_STANDSTILL": not standstill_req, From 7f11517257dab0826dabc79fdccc0e22ab8e957e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 7 Mar 2024 10:28:52 -0500 Subject: [PATCH 415/923] Nissan: Remove unused code (#31768) --- selfdrive/car/nissan/interface.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index a94b97de20..60cc3a0090 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -30,11 +30,6 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_adas, self.cp_cam) - buttonEvents = [] - be = car.CarState.ButtonEvent.new_message() - be.type = car.CarState.ButtonEvent.Type.accelCruise - buttonEvents.append(be) - events = self.create_common_events(ret, extra_gears=[car.CarState.GearShifter.brake]) if self.CS.lkas_enabled: From ca79e3ec0b01a26ff4025bde3b15ded4b38709e5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 11:34:03 -0500 Subject: [PATCH 416/923] and controlsd (#31769) --- selfdrive/car/card.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 9231794a6c..82335500d8 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -70,7 +70,7 @@ class CarD: if prev_cp is not None: self.params.put("CarParamsPrevRoute", prev_cp) - # Write CarParams for radard + # Write CarParams for controls and radard cp_bytes = self.CP.to_bytes() self.params.put("CarParams", cp_bytes) self.params.put_nonblocking("CarParamsCache", cp_bytes) From c39c54a0d81dfe9067be84759e064c3c6b0eec1a Mon Sep 17 00:00:00 2001 From: mike8643 <98910897+mike8643@users.noreply.github.com> Date: Thu, 7 Mar 2024 13:57:41 -0500 Subject: [PATCH 417/923] otisserv: `set_destination` and `locations` endpoints for non-prime users (#243) ios shortcut support --- selfdrive/navd/otisserv.py | 61 +++++++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 11 deletions(-) diff --git a/selfdrive/navd/otisserv.py b/selfdrive/navd/otisserv.py index 1dbf2a5335..d8fca7fc44 100644 --- a/selfdrive/navd/otisserv.py +++ b/selfdrive/navd/otisserv.py @@ -50,7 +50,10 @@ class OtisServ(BaseHTTPRequestHandler): return if self.path == '/?reset=1': params.put("NavDestination", "") - if use_amap: + if self.path == '/locations': + self.get_locations() + return + elif use_amap: if self.path == '/style.css': self.send_response(200) self.send_header("Content-type", "text/css") @@ -108,16 +111,25 @@ class OtisServ(BaseHTTPRequestHandler): if self.get_app_token() is None: self.display_page_app_token() return - self.display_page_addr_input() + if self.path != '/locations': + self.display_page_addr_input() def do_POST(self): use_amap = params.get_bool("EnableAmap") use_gmap = not use_amap and params.get_bool("EnableGmap") postvars = self.parse_POST() - self.send_response(200) - self.send_header("Content-type", "text/html") - self.end_headers() + # set_destination endpoint + if self.path == '/set_destination': + self.send_response(200) + self.send_header("Content-type", "application/json") + self.end_headers() + response_data = {'success': True} + self.wfile.write(json.dumps(response_data).encode('utf-8')) + else: + self.send_response(200) + self.send_header("Content-type", "text/html") + self.end_headers() if use_amap: # amap token @@ -172,6 +184,16 @@ class OtisServ(BaseHTTPRequestHandler): lng, lat = self.gcj02towgs84(lng, lat) params.put('NavDestination', "{\"latitude\": %f, \"longitude\": %f, \"place_name\": \"%s\"}" % (lat, lng, name)) self.to_json(lat, lng, save_type, name) + if postvars is not None: + latitude_value = postvars.get("latitude") + longitude_value = postvars.get("longitude") + if latitude_value is not None and latitude_value != "" and longitude_value is not None and longitude_value != "": + lat = float(latitude_value) + lng = float(longitude_value) + save_type = "recent" + name = postvars.get("place_name", [""]) + params.put('NavDestination', "{\"latitude\": %f, \"longitude\": %f, \"place_name\": \"%s\"}" % (lat, lng, name)) + self.to_json(lat, lng, save_type, name) # favorites if not use_gmap and "fav_val" in postvars: addr = postvars.get("fav_val")[0] @@ -208,12 +230,13 @@ class OtisServ(BaseHTTPRequestHandler): else: self.display_page_addr_input("Place Not Found") return - if use_amap: - self.display_page_amap() - elif use_gmap: - self.display_page_gmap() - else: - self.display_page_addr_input() + if self.path != '/set_destination': + if use_amap: + self.display_page_amap() + elif use_gmap: + self.display_page_gmap() + else: + self.display_page_addr_input() def get_logo(self): self.send_response(200) @@ -223,6 +246,14 @@ class OtisServ(BaseHTTPRequestHandler): self.wfile.write(f.read()) f.close() + def get_locations(self): + self.send_response(200) + self.send_header('Content-type','application/json') + self.end_headers() + val = params.get("ApiCache_NavDestinations", encoding='utf-8') + if val is not None: + self.wfile.write(val.encode('utf-8')) + def get_gmap_css(self): self.wfile.write(bytes(self.get_parsed_template("gmap/style.css"), "utf-8")) @@ -335,6 +366,14 @@ class OtisServ(BaseHTTPRequestHandler): postvars = parse_qs( self.rfile.read(length).decode('utf-8'), keep_blank_values=1) + elif ctype == 'application/json': + length = int(self.headers['content-length']) + post_data = self.rfile.read(length).decode('utf-8') + try: + postvars = json.loads(post_data) + except json.JSONDecodeError: + self.send_error(400, 'Invalid JSON data') + return None else: postvars = {} return postvars From 9cb256891fd68f146d840ef1a68a0adacfd0883e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 14:01:33 -0500 Subject: [PATCH 418/923] test_updated: add test for no update (#31772) no update test --- selfdrive/updated/tests/test_updated.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/selfdrive/updated/tests/test_updated.py b/selfdrive/updated/tests/test_updated.py index d8ce9f3394..10d6e9d5a3 100755 --- a/selfdrive/updated/tests/test_updated.py +++ b/selfdrive/updated/tests/test_updated.py @@ -116,6 +116,22 @@ class TestUpdateD(unittest.TestCase): time.sleep(1) + def test_no_update(self): + # Start on release3, ensure we don't fetch any updates + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with processes_context(["updated"]) as [updated]: + self._test_params("release3", False, False) + time.sleep(1) + self._test_params("release3", False, False) + + self.send_check_for_updates_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", False, False) + def test_new_release(self): # Start on release3, simulate a release3 commit, ensure we fetch that update properly self.setup_remote_release("release3") From a919d27afc9a225978737e86241adbdba336bbdd Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 14:33:40 -0500 Subject: [PATCH 419/923] fix car test routes typing (#31773) * Fix typing * and fix test_car_model * fix --- selfdrive/car/tests/routes.py | 3 ++- selfdrive/car/tests/test_models.py | 25 +++++++++++-------------- tools/car_porting/test_car_model.py | 6 +++++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index 92ee7fa923..265f052b16 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -10,6 +10,7 @@ from openpilot.selfdrive.car.nissan.values import CAR as NISSAN from openpilot.selfdrive.car.mazda.values import CAR as MAZDA from openpilot.selfdrive.car.subaru.values import CAR as SUBARU from openpilot.selfdrive.car.toyota.values import CAR as TOYOTA +from openpilot.selfdrive.car.values import Platform from openpilot.selfdrive.car.volkswagen.values import CAR as VOLKSWAGEN from openpilot.selfdrive.car.tesla.values import CAR as TESLA from openpilot.selfdrive.car.body.values import CAR as COMMA @@ -29,7 +30,7 @@ non_tested_cars = [ class CarTestRoute(NamedTuple): route: str - car_model: str | None + car_model: Platform | None segment: int | None = None diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index b7d20e5a83..1ef8c5b676 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -19,6 +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.controls.controlsd import Controls from openpilot.selfdrive.test.helpers import read_segment_list from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT @@ -64,7 +65,7 @@ def get_test_cases() -> list[tuple[str, CarTestRoute | None]]: @pytest.mark.slow @pytest.mark.shared_download_cache class TestCarModelBase(unittest.TestCase): - car_model: str | None = None + platform: Platform | None = None test_route: CarTestRoute | None = None test_route_on_bucket: bool = True # whether the route is on the preserved CI bucket @@ -93,8 +94,8 @@ class TestCarModelBase(unittest.TestCase): car_fw = msg.carParams.carFw if msg.carParams.openpilotLongitudinalControl: experimental_long = True - if cls.car_model is None and not cls.ci: - cls.car_model = msg.carParams.carFingerprint + if cls.platform is None and not cls.ci: + cls.platform = PLATFORMS.get(msg.carParams.carFingerprint) # Log which can frame the panda safety mode left ELM327, for CAN validity checks elif msg.which() == 'pandaStates': @@ -155,15 +156,11 @@ class TestCarModelBase(unittest.TestCase): if cls.__name__ == 'TestCarModel' or cls.__name__.endswith('Base'): raise unittest.SkipTest - if 'FILTER' in os.environ: - if not cls.car_model.startswith(tuple(os.environ.get('FILTER').split(','))): - raise unittest.SkipTest - if cls.test_route is None: - if cls.car_model in non_tested_cars: - print(f"Skipping tests for {cls.car_model}: missing route") + if cls.platform in non_tested_cars: + print(f"Skipping tests for {cls.platform}: missing route") raise unittest.SkipTest - raise Exception(f"missing test route for {cls.car_model}") + raise Exception(f"missing test route for {cls.platform}") car_fw, can_msgs, experimental_long = cls.get_testing_data() @@ -172,10 +169,10 @@ class TestCarModelBase(unittest.TestCase): cls.can_msgs = sorted(can_msgs, key=lambda msg: msg.logMonoTime) - cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.car_model] - cls.CP = cls.CarInterface.get_params(cls.car_model, cls.fingerprint, car_fw, experimental_long, docs=False) + cls.CarInterface, cls.CarController, cls.CarState = interfaces[cls.platform] + cls.CP = cls.CarInterface.get_params(cls.platform, cls.fingerprint, car_fw, experimental_long, docs=False) assert cls.CP - assert cls.CP.carFingerprint == cls.car_model + assert cls.CP.carFingerprint == cls.platform os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT @@ -478,7 +475,7 @@ class TestCarModelBase(unittest.TestCase): "This is fine to fail for WIP car ports, just let us know and we can upload your routes to the CI bucket.") -@parameterized_class(('car_model', 'test_route'), get_test_cases()) +@parameterized_class(('platform', 'test_route'), get_test_cases()) @pytest.mark.xdist_group_class_property('test_route') class TestCarModel(TestCarModelBase): pass diff --git a/tools/car_porting/test_car_model.py b/tools/car_porting/test_car_model.py index 86980b054b..1dfac7dcf3 100755 --- a/tools/car_porting/test_car_model.py +++ b/tools/car_porting/test_car_model.py @@ -5,6 +5,7 @@ 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 @@ -31,7 +32,10 @@ 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 - test_route = CarTestRoute(route_or_segment_name.route_name.canonical_name, args.car, segment=segment_num) + + platform = PLATFORMS.get(args.car) + + test_route = CarTestRoute(route_or_segment_name.route_name.canonical_name, platform, segment=segment_num) test_suite = create_test_models_suite([test_route], ci=args.ci) unittest.TextTestRunner().run(test_suite) From 8d9b96cf230830b3ce88672e383b4b0e50f7f887 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 15:09:07 -0500 Subject: [PATCH 420/923] test helpers: http server context (#31774) * http context * fix * fix --- selfdrive/test/helpers.py | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index b345b929ec..c157b98b62 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -88,23 +88,28 @@ def read_segment_list(segment_list_path): return [(platform[2:], segment) for platform, segment in zip(seg_list[::2], seg_list[1::2], strict=True)] +@contextlib.contextmanager +def http_server_context(handler, setup=None): + host = '127.0.0.1' + server = http.server.HTTPServer((host, 0), handler) + port = server.server_port + t = threading.Thread(target=server.serve_forever) + t.start() + + if setup is not None: + setup(host, port) + + try: + yield (host, port) + finally: + server.shutdown() + server.server_close() + t.join() + + def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=None): @wraps(func) def inner(*args, **kwargs): - host = '127.0.0.1' - server = http.server.HTTPServer((host, 0), handler) - port = server.server_port - t = threading.Thread(target=server.serve_forever) - t.start() - - if setup is not None: - setup(host, port) - - try: - return func(*args, f'http://{host}:{port}', **kwargs) - finally: - server.shutdown() - server.server_close() - t.join() - + with http_server_context(handler, setup) as (host, port): + return func(*args, f"http://{host}:{port}", **kwargs) return inner From 7bfd2b81e19c75587c965b53278f995ee2ee8a80 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 7 Mar 2024 15:31:46 -0500 Subject: [PATCH 421/923] Toyota: Fix upstream merge conflicts --- selfdrive/car/toyota/interface.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index e3bc7ead5f..6160c4bf2d 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -269,6 +269,9 @@ class CarInterface(CarInterfaceBase): if ret.enableGasInterceptor: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_GAS_INTERCEPTOR + if candidate in UNSUPPORTED_DSU_CAR: + ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_UNSUPPORTED_DSU_CAR + # 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 From 5b5938dc3a0ddc668b57ad98896a38c7b14b480d Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 7 Mar 2024 15:51:43 -0500 Subject: [PATCH 422/923] Update CHANGELOGS.md --- CHANGELOGS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index fd7c841de1..0f35e91564 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -5,6 +5,11 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) ************************ * UPDATED: Synced with commaai's openpilot * master commit 56e343b (February 27, 2024) +* NEW❗: iOS Siri Shortcuts Navigation support thanks to twilsonco and mike86437! + * iOS and macOS Shortcuts to quickly set navigation destinations from your iOS device + * comma Prime support + * Personal Mapbox/Amap/Google Maps token support + * Instructions on how to set up your iOS Siri Shortcuts: https://routinehub.co/shortcut/17677/ sunnypilot - 0.9.6.1 (2024-02-27) ======================== From dcc49077a0b84d4886b617dfeeb3b8310b23813d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 16:00:09 -0500 Subject: [PATCH 423/923] test_updated: basic agnos update test (#31776) test agnos --- selfdrive/updated/tests/test_updated.py | 44 ++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/selfdrive/updated/tests/test_updated.py b/selfdrive/updated/tests/test_updated.py index 10d6e9d5a3..93b6e11383 100755 --- a/selfdrive/updated/tests/test_updated.py +++ b/selfdrive/updated/tests/test_updated.py @@ -21,7 +21,7 @@ def run(args, **kwargs): return subprocess.run(args, **kwargs, check=True) -def update_release(directory, name, version, release_notes): +def update_release(directory, name, version, agnos_version, release_notes): with open(directory / "RELEASES.md", "w") as f: f.write(release_notes) @@ -30,6 +30,9 @@ def update_release(directory, name, 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: + f.write(f'export AGNOS_VERSION="{agnos_version}"') + run(["git", "add", "."], cwd=directory) run(["git", "commit", "-m", f"openpilot release {version}"], cwd=directory) @@ -60,8 +63,8 @@ class TestUpdateD(unittest.TestCase): os.environ["UPDATER_LOCK_FILE"] = str(self.mock_update_path / "safe_staging_overlay.lock") self.MOCK_RELEASES = { - "release3": ("0.1.2", "0.1.2 release notes"), - "master": ("0.1.3", "0.1.3 release notes"), + "release3": ("0.1.2", "1.2", "0.1.2 release notes"), + "master": ("0.1.3", "1.2", "0.1.3 release notes"), } def set_target_branch(self, branch): @@ -97,7 +100,7 @@ class TestUpdateD(unittest.TestCase): self.assertEqual(self.params.get_bool("UpdaterFetchAvailable"), fetch_available) self.assertEqual(self.params.get_bool("UpdateAvailable"), update_available) - def _test_update_params(self, branch, version, release_notes): + def _test_update_params(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") @@ -142,7 +145,7 @@ class TestUpdateD(unittest.TestCase): time.sleep(1) self._test_params("release3", False, False) - self.MOCK_RELEASES["release3"] = ("0.1.3", "0.1.3 release notes") + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.2", "0.1.3 release notes") self.update_remote_release("release3") self.send_check_for_updates_signal(updated) @@ -183,6 +186,37 @@ class TestUpdateD(unittest.TestCase): self._test_params("master", False, True) self._test_update_params("master", *self.MOCK_RELEASES["master"]) + def test_agnos_update(self): + # Start on release3, push an update with an agnos change + self.setup_remote_release("release3") + self.setup_basedir_release("release3") + + with mock.patch("openpilot.system.hardware.AGNOS", "True"), \ + mock.patch("openpilot.system.hardware.tici.hardware.Tici.get_os_version", "1.2"), \ + mock.patch("openpilot.system.hardware.tici.agnos.get_target_slot_number"), \ + mock.patch("openpilot.system.hardware.tici.agnos.flash_agnos_update"), \ + processes_context(["updated"]) as [updated]: + + self._test_params("release3", False, False) + time.sleep(1) + self._test_params("release3", False, False) + + self.MOCK_RELEASES["release3"] = ("0.1.3", "1.3", "0.1.3 release notes") + self.update_remote_release("release3") + + self.send_check_for_updates_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", True, False) + + self.send_download_signal(updated) + + self.wait_for_idle() + + self._test_params("release3", False, True) + self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) + if __name__ == "__main__": unittest.main() From 8ba5d660f38c9d74df208aa79d1c6ae85937f4c5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 17:01:28 -0500 Subject: [PATCH 424/923] common PlatformFlags base class + test for < 32 bits (#31779) * add 32 bit check * space * this is not required * jk yes we do --- selfdrive/car/__init__.py | 5 +++++ selfdrive/car/chrysler/values.py | 5 ++--- selfdrive/car/ford/values.py | 6 +++--- selfdrive/car/honda/values.py | 6 +++--- selfdrive/car/hyundai/values.py | 6 +++--- selfdrive/car/mazda/values.py | 5 ++--- selfdrive/car/subaru/values.py | 6 +++--- selfdrive/car/toyota/values.py | 6 +++--- selfdrive/car/volkswagen/values.py | 6 +++--- 9 files changed, 27 insertions(+), 24 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 1f784a4ab2..525394590d 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -318,3 +318,8 @@ class Platforms(str, ReprEnum): for flag, platforms in platforms_with_flag.items(): print(f"{flag:32s}: {', '.join(p.name for p in platforms)}") + + +class PlatformFlags(IntFlag): + def __init__(self, value: int): + assert value < 2**32, "undefined behaviour with >32 bit flags" diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 7dcfa3749e..72972fcf4f 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -1,16 +1,15 @@ -from enum import IntFlag 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 import CarSpecs, DbcDict, PlatformConfig, PlatformFlags, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu -class ChryslerFlags(IntFlag): +class ChryslerFlags(PlatformFlags): # Detected flags HIGHER_MIN_STEERING_SPEED = 1 diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index add40368be..72131b650b 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,9 +1,9 @@ from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum 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 import AngleRateLimit, CarSpecs, PlatformFlags, dbc_dict, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -39,7 +39,7 @@ class CarControllerParams: pass -class FordFlags(IntFlag): +class FordFlags(PlatformFlags): # Static flags CANFD = 1 diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 4960380bbc..77aa8f6750 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from enum import Enum, IntFlag +from enum import Enum 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 import CarSpecs, PlatformConfig, PlatformFlags, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -45,7 +45,7 @@ class CarControllerParams: self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV) -class HondaFlags(IntFlag): +class HondaFlags(PlatformFlags): # Detected flags # Bosch models with alternate set of LKAS_HUD messages BOSCH_EXT_HUD = 1 diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 199e0bba4d..dfd642e3c0 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -1,11 +1,11 @@ import re from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum 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 import CarSpecs, DbcDict, PlatformConfig, PlatformFlags, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -51,7 +51,7 @@ class CarControllerParams: self.STEER_MAX = 384 -class HyundaiFlags(IntFlag): +class HyundaiFlags(PlatformFlags): # Dynamic Flags CANFD_HDA2 = 1 CANFD_ALT_BUTTONS = 2 diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index b55690f39a..3a2a93ad09 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -1,9 +1,8 @@ from dataclasses import dataclass, field -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 import CarSpecs, DbcDict, PlatformConfig, PlatformFlags, Platforms, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarHarness, CarInfo, CarParts from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -37,7 +36,7 @@ class MazdaCarSpecs(CarSpecs): tireStiffnessFactor: float = 0.7 # not optimized yet -class MazdaFlags(IntFlag): +class MazdaFlags(PlatformFlags): # Static flags # Gen 1 hardware: same CAN messages and same camera GEN1 = 1 diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index cc963404b7..77b30f89be 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -1,9 +1,9 @@ from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum from cereal import car from panda.python import uds -from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, dbc_dict +from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, PlatformFlags, dbc_dict from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Tool, Column from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -52,7 +52,7 @@ class CarControllerParams: BRAKE_LOOKUP_V = [BRAKE_MAX, BRAKE_MIN] -class SubaruFlags(IntFlag): +class SubaruFlags(PlatformFlags): # Detected flags SEND_INFOTAINMENT = 1 DISABLE_EYESIGHT = 2 diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 2be7ca1865..50a4195153 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -1,11 +1,11 @@ import re from collections import defaultdict from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum 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 CarSpecs, PlatformConfig, PlatformFlags, 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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -41,7 +41,7 @@ class CarControllerParams: self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) -class ToyotaFlags(IntFlag): +class ToyotaFlags(PlatformFlags): # Detected flags HYBRID = 1 SMART_DSU = 2 diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index a45ddf431f..5f658fb9eb 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,12 +1,12 @@ from collections import namedtuple from dataclasses import dataclass, field -from enum import Enum, IntFlag +from enum import Enum from cereal import car 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 import PlatformFlags, dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -109,7 +109,7 @@ class CANBUS: cam = 2 -class VolkswagenFlags(IntFlag): +class VolkswagenFlags(PlatformFlags): # Detected flags STOCK_HCA_PRESENT = 1 From 9f0201bdd42e87c15c8d822da12c19f757ea2017 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 17:41:58 -0500 Subject: [PATCH 425/923] vscode: remove non-symlinked openpilot directories from python analysis (#31780) anaylsis --- .vscode/settings.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index daf74ca777..a7c9b2ac44 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -12,5 +12,15 @@ "**/.git": true, "**/.venv": true, "**/__pycache__": true - } + }, + "python.analysis.exclude": [ + "**/.git", + "**/.venv", + "**/__pycache__", + // exclude directories should be using the symlinked version + "common/**", + "selfdrive/**", + "system/**", + "tools/**", + ] } \ No newline at end of file From 257db40d57b158b33dbd834c946fb86c2ed1e9bc Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 17:58:36 -0500 Subject: [PATCH 426/923] ruff: Exclude body and cereal (#31782) --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 8894d5eca2..10b99a9ddc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -177,6 +177,8 @@ lint.ignore = ["E741", "E402", "C408", "ISC003", "B027", "B024"] line-length = 160 target-version="py311" exclude = [ + "body", + "cereal", "panda", "opendbc", "rednose_repo", From 5d710ecf5720fcdf507557b6925a72dd63cc3e66 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 18:30:31 -0500 Subject: [PATCH 427/923] Subaru: log eyesight faults as acc faults (#31716) * log cruise fault * better comment * spacing * backwards * moved * copy the other one * localized Co-authored-by: Shane Smiskol --------- Co-authored-by: Shane Smiskol --- selfdrive/car/subaru/carstate.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/subaru/carstate.py b/selfdrive/car/subaru/carstate.py index ebf0ca9062..821ff2c151 100644 --- a/selfdrive/car/subaru/carstate.py +++ b/selfdrive/car/subaru/carstate.py @@ -29,6 +29,16 @@ class CarState(CarStateBase): cp_brakes = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp ret.brakePressed = cp_brakes.vl["Brake_Status"]["Brake"] == 1 + cp_es_distance = cp_body if self.CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID) else cp_cam + if not (self.CP.flags & SubaruFlags.HYBRID): + eyesight_fault = bool(cp_es_distance.vl["ES_Distance"]["Cruise_Fault"]) + + # if openpilot is controlling long, an eyesight fault is a non-critical fault. otherwise it's an ACC fault + if self.CP.openpilotLongitudinalControl: + ret.carFaultedNonCritical = eyesight_fault + else: + ret.accFaulted = eyesight_fault + cp_wheels = cp_body if self.CP.flags & SubaruFlags.GLOBAL_GEN2 else cp ret.wheelSpeeds = self.get_wheel_speeds( cp_wheels.vl["Wheel_Speeds"]["FL"], @@ -84,7 +94,6 @@ class CarState(CarStateBase): cp.vl["BodyInfo"]["DOOR_OPEN_FL"]]) ret.steerFaultPermanent = cp.vl["Steering_Torque"]["Steer_Error_1"] == 1 - cp_es_distance = cp_body if self.CP.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.HYBRID) else cp_cam if self.CP.flags & SubaruFlags.PREGLOBAL: self.cruise_button = cp_cam.vl["ES_Distance"]["Cruise_Button"] self.ready = not cp_cam.vl["ES_DashStatus"]["Not_Ready_Startup"] From fbe6b2c73ba854de7f73ff99f0d1502cfeb9ef70 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 7 Mar 2024 16:40:13 -0800 Subject: [PATCH 428/923] cgpsd (#31781) * cgpsd * latlong is good * more sentences * little more * cleanup --------- Co-authored-by: Comma Device --- system/qcomgpsd/cgpsd.py | 102 ++++++++++++++++++++++++++++++++++++ system/qcomgpsd/qcomgpsd.py | 4 +- 2 files changed, 104 insertions(+), 2 deletions(-) create mode 100755 system/qcomgpsd/cgpsd.py diff --git a/system/qcomgpsd/cgpsd.py b/system/qcomgpsd/cgpsd.py new file mode 100755 index 0000000000..8c802ef4ef --- /dev/null +++ b/system/qcomgpsd/cgpsd.py @@ -0,0 +1,102 @@ +#!/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 + +""" +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 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?") + + 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 + + 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.flags = 1 if gnrmc[1] == 'A' else 0 + + # TODO: make our own source + gps.source = log.GpsLocationData.SensorSource.qcomdiag + + gps.speed = sfloat(gnrmc[7]) + gps.bearingDeg = sfloat(gnrmc[8]) + + if len(nmea['$GNGGA']): + gngga = nmea['$GNGGA'] + if gngga[10] == 'M': + gps.altitude = sfloat(nmea['$GNGGA'][9]) + + # TODO: set these from the module + gps.horizontalAccuracy = 3. + gps.verticalAccuracy = 3. + 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/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index e8c407a627..25b547cf5e 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -205,10 +205,10 @@ def teardown_quectel(diag): try_setup_logs(diag, []) -def wait_for_modem(): +def wait_for_modem(cmd="AT+QGPS?"): cloudlog.warning("waiting for modem to come up") while True: - ret = subprocess.call("mmcli -m any --timeout 10 --command=\"AT+QGPS?\"", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True) + ret = subprocess.call(f"mmcli -m any --timeout 10 --command=\"{cmd}\"", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True) if ret == 0: return time.sleep(0.1) From 6de71bcddb83510cb48125f4e0440d4328c393a4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 7 Mar 2024 17:02:11 -0800 Subject: [PATCH 429/923] better comment --- .vscode/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a7c9b2ac44..811306f399 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -17,10 +17,10 @@ "**/.git", "**/.venv", "**/__pycache__", - // exclude directories should be using the symlinked version + // exclude directories that should be using the symlinked version "common/**", "selfdrive/**", "system/**", "tools/**", ] -} \ No newline at end of file +} From 428397a18ba734f5ec73c18cfe35d16e2c0b040f Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 7 Mar 2024 17:24:29 -0800 Subject: [PATCH 430/923] cgpsd: check checksums and log some accuracies (#31784) * check checksum * some accuracy --------- Co-authored-by: Comma Device --- system/qcomgpsd/cgpsd.py | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/system/qcomgpsd/cgpsd.py b/system/qcomgpsd/cgpsd.py index 8c802ef4ef..c0edc721fa 100755 --- a/system/qcomgpsd/cgpsd.py +++ b/system/qcomgpsd/cgpsd.py @@ -8,6 +8,7 @@ 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' @@ -32,6 +33,11 @@ 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?") @@ -58,6 +64,13 @@ def main(): 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) @@ -81,11 +94,15 @@ def main(): if len(nmea['$GNGGA']): gngga = nmea['$GNGGA'] if gngga[10] == 'M': - gps.altitude = sfloat(nmea['$GNGGA'][9]) + 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.horizontalAccuracy = 3. - gps.verticalAccuracy = 3. gps.bearingAccuracyDeg = 5. gps.speedAccuracy = 3. From 90442e35971b273d36832bf90188dd010a32507e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 18:57:15 -0800 Subject: [PATCH 431/923] Subaru: make OBD query logging (#31785) * make OBD query logging * Update selfdrive/car/subaru/values.py Co-authored-by: Justin Newberry * wording --------- Co-authored-by: Justin Newberry --- selfdrive/car/subaru/values.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 77b30f89be..a4eb5ba7f9 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -234,21 +234,24 @@ FW_QUERY_CONFIG = FwQueryConfig( [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission], + logging=True, ), + # Non-OBD requests # Some Eyesight modules fail on TESTER_PRESENT_REQUEST # TODO: check if this resolves the fingerprinting issue for the 2023 Ascent and other new Subaru cars Request( [SUBARU_VERSION_REQUEST], [SUBARU_VERSION_RESPONSE], whitelist_ecus=[Ecu.fwdCamera], + bus=0, ), - # Non-OBD requests Request( [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], whitelist_ecus=[Ecu.abs, Ecu.eps, Ecu.fwdCamera, Ecu.engine, Ecu.transmission], bus=0, ), + # GEN2 powertrain bus query Request( [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], From fd51bfb27bbdd089833810bec49e67e4ce7a1800 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 7 Mar 2024 18:57:27 -0800 Subject: [PATCH 432/923] tools: update replay route parsing for timeless format --- tools/replay/route.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/replay/route.cc b/tools/replay/route.cc index d0ddf7f3c8..d5847a94b8 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -18,7 +18,7 @@ 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})([|_/]))?(\d{4}-\d{2}-\d{2}--\d{2}-\d{2}-\d{2})(?:(--|/)(\d*))?$)"); + QRegExp rx(R"(^(?:([a-z0-9]{16})([|_/]))?(.{20})(?:(--|/)(\d*))?$)"); if (rx.indexIn(str) == -1) return {}; const QStringList list = rx.capturedTexts(); From 158e36976b8793610ac1f39f51d82f5eeeb099b2 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 7 Mar 2024 19:22:06 -0800 Subject: [PATCH 433/923] fix old route sorting (#31787) * fix old route sorting * cleanup * Update system/loggerd/uploader.py --------- Co-authored-by: Comma Device --- system/loggerd/uploader.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 33ee8c1850..832a227798 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -44,7 +44,9 @@ class FakeResponse: def get_directory_sort(d: str) -> list[str]: - return [s.rjust(10, '0') for s in d.rsplit('--', 1)] + # ensure old format is sorted sooner + o = ["0", ] if d.startswith("2024-") else ["1", ] + return o + [s.rjust(10, '0') for s in d.rsplit('--', 1)] def listdir_by_creation(d: str) -> list[str]: if not os.path.isdir(d): From fdab60cad733836051fa7af237db50b9f842542e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 19:56:22 -0800 Subject: [PATCH 434/923] longitudinal planner: start at personality param (#31788) start at param --- selfdrive/controls/lib/longitudinal_planner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index 018768f248..2b1fd01112 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -63,8 +63,8 @@ class LongitudinalPlanner: self.solverExecutionTime = 0.0 self.params = Params() self.param_read_counter = 0 - self.read_param() self.personality = log.LongitudinalPersonality.standard + self.read_param() def read_param(self): try: From 782b707824b6a0df65db01bd1f4f8533faaa25e7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 7 Mar 2024 20:10:12 -0800 Subject: [PATCH 435/923] HKG CAN FD: add instrument cluster ECU (#31790) * Add instrument cluster in case it can tell us more about the car * and i thought I wanted to remove this test! --- selfdrive/car/hyundai/values.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index dfd642e3c0..9d27052f0c 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -710,7 +710,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] +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] FW_QUERY_CONFIG = FwQueryConfig( requests=[ @@ -810,10 +811,11 @@ FW_QUERY_CONFIG = FwQueryConfig( Ecu.abs: [CAR.PALISADE, CAR.SONATA], }, extra_ecus=[ - (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms - (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) - (Ecu.hvac, 0x7b3, None), # HVAC Control Assembly + (Ecu.adas, 0x730, None), # ADAS Driving ECU on HDA2 platforms + (Ecu.parkingAdas, 0x7b1, None), # ADAS Parking ECU (may exist on all platforms) + (Ecu.hvac, 0x7b3, None), # HVAC Control Assembly (Ecu.cornerRadar, 0x7b7, None), + (Ecu.combinationMeter, 0x7c6, None), # CAN FD Instrument cluster ], # Custom fuzzy fingerprinting function using platform codes, part numbers + FW dates: match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, From 99610c88195301c65c35ba0d4b41ad09d242a269 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 00:15:21 -0800 Subject: [PATCH 436/923] Revert "common PlatformFlags base class + test for < 32 bits" (#31793) Revert "common PlatformFlags base class + test for < 32 bits (#31779)" This reverts commit 8ba5d660f38c9d74df208aa79d1c6ae85937f4c5. --- selfdrive/car/__init__.py | 5 ----- selfdrive/car/chrysler/values.py | 5 +++-- selfdrive/car/ford/values.py | 6 +++--- selfdrive/car/honda/values.py | 6 +++--- selfdrive/car/hyundai/values.py | 6 +++--- selfdrive/car/mazda/values.py | 5 +++-- selfdrive/car/subaru/values.py | 6 +++--- selfdrive/car/toyota/values.py | 6 +++--- selfdrive/car/volkswagen/values.py | 6 +++--- 9 files changed, 24 insertions(+), 27 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 525394590d..1f784a4ab2 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -318,8 +318,3 @@ class Platforms(str, ReprEnum): for flag, platforms in platforms_with_flag.items(): print(f"{flag:32s}: {', '.join(p.name for p in platforms)}") - - -class PlatformFlags(IntFlag): - def __init__(self, value: int): - assert value < 2**32, "undefined behaviour with >32 bit flags" diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index 72972fcf4f..7dcfa3749e 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -1,15 +1,16 @@ +from enum import IntFlag from dataclasses import dataclass, field from cereal import car from panda.python import uds -from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, PlatformFlags, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu -class ChryslerFlags(PlatformFlags): +class ChryslerFlags(IntFlag): # Detected flags HIGHER_MIN_STEERING_SPEED = 1 diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index 72131b650b..add40368be 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,9 +1,9 @@ from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag import panda.python.uds as uds from cereal import car -from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, PlatformFlags, dbc_dict, DbcDict, PlatformConfig, Platforms +from openpilot.selfdrive.car import AngleRateLimit, CarSpecs, dbc_dict, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -39,7 +39,7 @@ class CarControllerParams: pass -class FordFlags(PlatformFlags): +class FordFlags(IntFlag): # Static flags CANFD = 1 diff --git a/selfdrive/car/honda/values.py b/selfdrive/car/honda/values.py index 77aa8f6750..4960380bbc 100644 --- a/selfdrive/car/honda/values.py +++ b/selfdrive/car/honda/values.py @@ -1,10 +1,10 @@ from dataclasses import dataclass -from enum import Enum +from enum import Enum, IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV from panda.python import uds -from openpilot.selfdrive.car import CarSpecs, PlatformConfig, PlatformFlags, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -45,7 +45,7 @@ class CarControllerParams: self.STEER_LOOKUP_V = [v * -1 for v in CP.lateralParams.torqueV][1:][::-1] + list(CP.lateralParams.torqueV) -class HondaFlags(PlatformFlags): +class HondaFlags(IntFlag): # Detected flags # Bosch models with alternate set of LKAS_HUD messages BOSCH_EXT_HUD = 1 diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 9d27052f0c..e79da0f473 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -1,11 +1,11 @@ import re from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag 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, PlatformFlags, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, p16 @@ -51,7 +51,7 @@ class CarControllerParams: self.STEER_MAX = 384 -class HyundaiFlags(PlatformFlags): +class HyundaiFlags(IntFlag): # Dynamic Flags CANFD_HDA2 = 1 CANFD_ALT_BUTTONS = 2 diff --git a/selfdrive/car/mazda/values.py b/selfdrive/car/mazda/values.py index 3a2a93ad09..b55690f39a 100644 --- a/selfdrive/car/mazda/values.py +++ b/selfdrive/car/mazda/values.py @@ -1,8 +1,9 @@ from dataclasses import dataclass, field +from enum import IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, PlatformFlags, Platforms, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -36,7 +37,7 @@ class MazdaCarSpecs(CarSpecs): tireStiffnessFactor: float = 0.7 # not optimized yet -class MazdaFlags(PlatformFlags): +class MazdaFlags(IntFlag): # Static flags # Gen 1 hardware: same CAN messages and same camera GEN1 = 1 diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index a4eb5ba7f9..5e135ca658 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -1,9 +1,9 @@ from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag from cereal import car from panda.python import uds -from openpilot.selfdrive.car import CarSpecs, DbcDict, PlatformConfig, Platforms, PlatformFlags, dbc_dict +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.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 @@ -52,7 +52,7 @@ class CarControllerParams: BRAKE_LOOKUP_V = [BRAKE_MAX, BRAKE_MIN] -class SubaruFlags(PlatformFlags): +class SubaruFlags(IntFlag): # Detected flags SEND_INFOTAINMENT = 1 DISABLE_EYESIGHT = 2 diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 50a4195153..2be7ca1865 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -1,11 +1,11 @@ import re from collections import defaultdict from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag from cereal import car from openpilot.common.conversions import Conversions as CV -from openpilot.selfdrive.car import CarSpecs, PlatformConfig, PlatformFlags, Platforms +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.fw_query_definitions import FwQueryConfig, Request, StdQueries @@ -41,7 +41,7 @@ class CarControllerParams: self.STEER_DELTA_DOWN = 25 # always lower than 45 otherwise the Rav4 faults (Prius seems ok with 50) -class ToyotaFlags(PlatformFlags): +class ToyotaFlags(IntFlag): # Detected flags HYBRID = 1 SMART_DSU = 2 diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 5f658fb9eb..a45ddf431f 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,12 +1,12 @@ from collections import namedtuple from dataclasses import dataclass, field -from enum import Enum +from enum import Enum, IntFlag from cereal import car 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 PlatformFlags, dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms +from openpilot.selfdrive.car import dbc_dict, CarSpecs, DbcDict, PlatformConfig, Platforms from openpilot.selfdrive.car.docs_definitions import CarFootnote, CarHarness, CarInfo, CarParts, Column, \ Device from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 @@ -109,7 +109,7 @@ class CANBUS: cam = 2 -class VolkswagenFlags(PlatformFlags): +class VolkswagenFlags(IntFlag): # Detected flags STOCK_HCA_PRESENT = 1 From e964c5944d4342b6e08ca872eacf9d524a49b479 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 02:49:24 -0800 Subject: [PATCH 437/923] LogReader: fix sort by time and union types (#31565) * fix :( * test_sort_by_time * this isn't required * not slow, and just compare sorted * messy * works * clean up * clean up * not here * clean up * clean up * clean up * makes network call --------- Co-authored-by: Justin Newberry --- tools/lib/logreader.py | 2 +- tools/lib/tests/test_logreader.py | 39 +++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 6247bbc9db..7a1e972e19 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -248,7 +248,7 @@ are uploaded or auto fallback to qlogs with '/a' selector at the end of the rout def _get_lr(self, i): if i not in self.__lrs: - self.__lrs[i] = _LogFileReader(self.logreader_identifiers[i]) + self.__lrs[i] = _LogFileReader(self.logreader_identifiers[i], sort_by_time=self.sort_by_time, only_union_types=self.only_union_types) return self.__lrs[i] def __iter__(self): diff --git a/tools/lib/tests/test_logreader.py b/tools/lib/tests/test_logreader.py index 2141915b87..fc72202b26 100755 --- a/tools/lib/tests/test_logreader.py +++ b/tools/lib/tests/test_logreader.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import capnp import contextlib import io import shutil @@ -11,6 +12,7 @@ import requests from parameterized import parameterized from unittest import mock +from cereal import log as capnp_log from openpilot.tools.lib.logreader import LogIterable, LogReader, comma_api_source, parse_indirect, ReadMode, InternalUnavailableException from openpilot.tools.lib.route import SegmentRange from openpilot.tools.lib.url_file import URLFileException @@ -216,6 +218,43 @@ class TestLogReader(unittest.TestCase): log_len = len(list(lr)) self.assertEqual(qlog_len, log_len) + @pytest.mark.slow + def test_sort_by_time(self): + msgs = list(LogReader(f"{TEST_ROUTE}/0/q")) + self.assertNotEqual(msgs, sorted(msgs, key=lambda m: m.logMonoTime)) + + msgs = list(LogReader(f"{TEST_ROUTE}/0/q", sort_by_time=True)) + self.assertEqual(msgs, sorted(msgs, key=lambda m: m.logMonoTime)) + + def test_only_union_types(self): + with tempfile.NamedTemporaryFile() as qlog: + # write valid Event messages + num_msgs = 100 + with open(qlog.name, "wb") as f: + f.write(b"".join(capnp_log.Event.new_message().to_bytes() for _ in range(num_msgs))) + + msgs = list(LogReader(qlog.name)) + self.assertEqual(len(msgs), num_msgs) + [m.which() for m in msgs] + + # append non-union Event message + event_msg = capnp_log.Event.new_message() + non_union_bytes = bytearray(event_msg.to_bytes()) + non_union_bytes[event_msg.total_size.word_count * 8] = 0xff # set discriminant value out of range using Event word offset + with open(qlog.name, "ab") as f: + f.write(non_union_bytes) + + # ensure new message is added, but is not a union type + msgs = list(LogReader(qlog.name)) + self.assertEqual(len(msgs), num_msgs + 1) + with self.assertRaises(capnp.KjException): + [m.which() for m in msgs] + + # should not be added when only_union_types=True + msgs = list(LogReader(qlog.name, only_union_types=True)) + self.assertEqual(len(msgs), num_msgs) + [m.which() for m in msgs] + if __name__ == "__main__": unittest.main() From c30688fe3a04fe8a60f6805210e39296bdca825e Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 8 Mar 2024 13:42:17 -0500 Subject: [PATCH 438/923] test_updated: more consistent test (#31786) * consistent * bump timeout * bump again --- selfdrive/updated/tests/test_updated.py | 48 +++++++++++++++---------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/selfdrive/updated/tests/test_updated.py b/selfdrive/updated/tests/test_updated.py index 93b6e11383..4245763e99 100755 --- a/selfdrive/updated/tests/test_updated.py +++ b/selfdrive/updated/tests/test_updated.py @@ -85,9 +85,12 @@ class TestUpdateD(unittest.TestCase): def tearDown(self): mock.patch.stopall() - run(["sudo", "umount", "-l", str(self.staging_root / "merged")]) - run(["sudo", "umount", "-l", self.tmpdir]) - shutil.rmtree(self.tmpdir) + try: + run(["sudo", "umount", "-l", str(self.staging_root / "merged")]) + run(["sudo", "umount", "-l", self.tmpdir]) + shutil.rmtree(self.tmpdir) + except Exception: + print("cleanup failed...") def send_check_for_updates_signal(self, updated: ManagerProcess): updated.signal(signal.SIGUSR1.value) @@ -104,21 +107,28 @@ class TestUpdateD(unittest.TestCase): 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") - def wait_for_idle(self, timeout=5, min_wait_time=2): + def wait_for_condition(self, condition, timeout=12): start = time.monotonic() - time.sleep(min_wait_time) - while True: waited = time.monotonic() - start - if self.params.get("UpdaterState", encoding="utf-8") == "idle": - print(f"waited {waited}s for idle") - break + if condition(): + print(f"waited {waited}s for condition ") + return waited if waited > timeout: - raise TimeoutError("timed out waiting for idle") + raise TimeoutError("timed out waiting for condition") time.sleep(1) + def wait_for_idle(self): + self.wait_for_condition(lambda: self.params.get("UpdaterState", encoding="utf-8") == "idle") + + def wait_for_fetch_available(self): + self.wait_for_condition(lambda: self.params.get_bool("UpdaterFetchAvailable")) + + def wait_for_update_available(self): + self.wait_for_condition(lambda: self.params.get_bool("UpdateAvailable")) + def test_no_update(self): # Start on release3, ensure we don't fetch any updates self.setup_remote_release("release3") @@ -126,7 +136,7 @@ class TestUpdateD(unittest.TestCase): with processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) - time.sleep(1) + self.wait_for_idle() self._test_params("release3", False, False) self.send_check_for_updates_signal(updated) @@ -142,7 +152,7 @@ class TestUpdateD(unittest.TestCase): with processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) - time.sleep(1) + self.wait_for_idle() self._test_params("release3", False, False) self.MOCK_RELEASES["release3"] = ("0.1.3", "1.2", "0.1.3 release notes") @@ -150,13 +160,13 @@ class TestUpdateD(unittest.TestCase): self.send_check_for_updates_signal(updated) - self.wait_for_idle() + self.wait_for_fetch_available() self._test_params("release3", True, False) self.send_download_signal(updated) - self.wait_for_idle() + self.wait_for_update_available() self._test_params("release3", False, True) self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) @@ -175,13 +185,13 @@ class TestUpdateD(unittest.TestCase): self.set_target_branch("master") self.send_check_for_updates_signal(updated) - self.wait_for_idle() + self.wait_for_fetch_available() self._test_params("master", True, False) self.send_download_signal(updated) - self.wait_for_idle() + self.wait_for_update_available() self._test_params("master", False, True) self._test_update_params("master", *self.MOCK_RELEASES["master"]) @@ -198,7 +208,7 @@ class TestUpdateD(unittest.TestCase): processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) - time.sleep(1) + self.wait_for_idle() self._test_params("release3", False, False) self.MOCK_RELEASES["release3"] = ("0.1.3", "1.3", "0.1.3 release notes") @@ -206,13 +216,13 @@ class TestUpdateD(unittest.TestCase): self.send_check_for_updates_signal(updated) - self.wait_for_idle() + self.wait_for_fetch_available() self._test_params("release3", True, False) self.send_download_signal(updated) - self.wait_for_idle() + self.wait_for_update_available() self._test_params("release3", False, True) self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) From b93f6ce4f6fd34d33f990e86bde22b5cec49f2da Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 8 Mar 2024 13:46:57 -0500 Subject: [PATCH 439/923] updated: prep for new updater (#31695) * wip * wip * wip * wip * wip * wip * wip * proc * release * fix * this should move here * e2e update test * that too * fix * fix * fix running in docker * don't think GHA will work * also test switching branches * it's a test * lets not delete that yet * fix * fix2 * fix * fix * tests too * fix * cleanup / init * test agnos update * test agnos * move this back up * no diff --- selfdrive/updated/common.py | 100 ++++++ selfdrive/updated/git.py | 241 ++++++++++++++ .../tests/{test_updated.py => test_base.py} | 40 ++- selfdrive/updated/tests/test_git.py | 22 ++ selfdrive/updated/updated.py | 300 +++--------------- 5 files changed, 419 insertions(+), 284 deletions(-) create mode 100644 selfdrive/updated/common.py create mode 100644 selfdrive/updated/git.py rename selfdrive/updated/tests/{test_updated.py => test_base.py} (86%) mode change 100755 => 100644 create mode 100644 selfdrive/updated/tests/test_git.py diff --git a/selfdrive/updated/common.py b/selfdrive/updated/common.py new file mode 100644 index 0000000000..c522e075d5 --- /dev/null +++ b/selfdrive/updated/common.py @@ -0,0 +1,100 @@ +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 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 "" diff --git a/selfdrive/updated/git.py b/selfdrive/updated/git.py new file mode 100644 index 0000000000..29f95eeeff --- /dev/null +++ b/selfdrive/updated/git.py @@ -0,0 +1,241 @@ +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, parse_release_notes, 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: + 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_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] + 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}" + + def release_notes_branch(self, basedir) -> str: + with open(os.path.join(basedir, "RELEASES.md"), "r") as f: + return parse_release_notes(f.read()) + + def describe_current_channel(self) -> tuple[str, str]: + return self.describe_branch(BASEDIR), self.release_notes_branch(BASEDIR) + + def describe_ready_channel(self) -> tuple[str, str]: + if self.update_ready(): + return self.describe_branch(FINALIZED), self.release_notes_branch(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_updated.py b/selfdrive/updated/tests/test_base.py old mode 100755 new mode 100644 similarity index 86% rename from selfdrive/updated/tests/test_updated.py rename to selfdrive/updated/tests/test_base.py index 4245763e99..f500145b6f --- a/selfdrive/updated/tests/test_updated.py +++ b/selfdrive/updated/tests/test_base.py @@ -1,4 +1,3 @@ -#!/usr/bin/env python3 import os import pathlib import shutil @@ -33,12 +32,14 @@ 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}"') - run(["git", "add", "."], cwd=directory) - run(["git", "commit", "-m", f"openpilot release {version}"], cwd=directory) - @pytest.mark.slow # TODO: can we test overlayfs in GHA? -class TestUpdateD(unittest.TestCase): +class BaseUpdateTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + if "Base" in cls.__name__: + raise unittest.SkipTest + def setUp(self): self.tmpdir = tempfile.mkdtemp() @@ -73,15 +74,15 @@ class TestUpdateD(unittest.TestCase): def setup_basedir_release(self, release): self.params = Params() self.set_target_branch(release) - run(["git", "clone", "-b", release, self.remote_dir, self.basedir]) def update_remote_release(self, release): - update_release(self.remote_dir, release, *self.MOCK_RELEASES[release]) + raise NotImplementedError("") def setup_remote_release(self, release): - run(["git", "init"], cwd=self.remote_dir) - run(["git", "checkout", "-b", release], cwd=self.remote_dir) - self.update_remote_release(release) + raise NotImplementedError("") + + def additional_context(self): + raise NotImplementedError("") def tearDown(self): mock.patch.stopall() @@ -134,7 +135,7 @@ class TestUpdateD(unittest.TestCase): self.setup_remote_release("release3") self.setup_basedir_release("release3") - with processes_context(["updated"]) as [updated]: + with self.additional_context(), processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) self.wait_for_idle() self._test_params("release3", False, False) @@ -150,7 +151,7 @@ class TestUpdateD(unittest.TestCase): self.setup_remote_release("release3") self.setup_basedir_release("release3") - with processes_context(["updated"]) as [updated]: + with self.additional_context(), processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) self.wait_for_idle() self._test_params("release3", False, False) @@ -177,7 +178,7 @@ class TestUpdateD(unittest.TestCase): self.setup_remote_release("master") self.setup_basedir_release("release3") - with processes_context(["updated"]) as [updated]: + with self.additional_context(), processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) self.wait_for_idle() self._test_params("release3", False, False) @@ -201,10 +202,11 @@ class TestUpdateD(unittest.TestCase): self.setup_remote_release("release3") self.setup_basedir_release("release3") - with mock.patch("openpilot.system.hardware.AGNOS", "True"), \ - mock.patch("openpilot.system.hardware.tici.hardware.Tici.get_os_version", "1.2"), \ - mock.patch("openpilot.system.hardware.tici.agnos.get_target_slot_number"), \ - mock.patch("openpilot.system.hardware.tici.agnos.flash_agnos_update"), \ + with self.additional_context(), \ + mock.patch("openpilot.system.hardware.AGNOS", "True"), \ + mock.patch("openpilot.system.hardware.tici.hardware.Tici.get_os_version", "1.2"), \ + mock.patch("openpilot.system.hardware.tici.agnos.get_target_slot_number"), \ + mock.patch("openpilot.system.hardware.tici.agnos.flash_agnos_update"), \ processes_context(["updated"]) as [updated]: self._test_params("release3", False, False) @@ -226,7 +228,3 @@ class TestUpdateD(unittest.TestCase): self._test_params("release3", False, True) self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/selfdrive/updated/tests/test_git.py b/selfdrive/updated/tests/test_git.py new file mode 100644 index 0000000000..1a9c78242d --- /dev/null +++ b/selfdrive/updated/tests/test_git.py @@ -0,0 +1,22 @@ +import contextlib +from openpilot.selfdrive.updated.tests.test_base import BaseUpdateTest, run, update_release + + +class TestUpdateDGitStrategy(BaseUpdateTest): + def update_remote_release(self, release): + update_release(self.remote_dir, release, *self.MOCK_RELEASES[release]) + run(["git", "add", "."], cwd=self.remote_dir) + run(["git", "commit", "-m", f"openpilot release {release}"], cwd=self.remote_dir) + + def setup_remote_release(self, release): + run(["git", "init"], cwd=self.remote_dir) + run(["git", "checkout", "-b", release], cwd=self.remote_dir) + self.update_remote_release(release) + + def setup_basedir_release(self, release): + super().setup_basedir_release(release) + run(["git", "clone", "-b", release, self.remote_dir, self.basedir]) + + @contextlib.contextmanager + def additional_context(self): + yield diff --git a/selfdrive/updated/updated.py b/selfdrive/updated/updated.py index b6b395f254..92034cc806 100755 --- a/selfdrive/updated/updated.py +++ b/selfdrive/updated/updated.py @@ -1,35 +1,21 @@ #!/usr/bin/env python3 import os -import re +from pathlib import Path 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 - -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")) +from openpilot.selfdrive.updated.git import GitUpdateStrategy 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 @@ -71,147 +57,13 @@ 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() -> None: +def handle_agnos_update(fetched_path) -> 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"], OVERLAY_MERGED).strip() + echo -n $AGNOS_VERSION"], fetched_path).strip() cloudlog.info(f"AGNOS version check: {cur_version} vs {updated_version}") if cur_version == updated_version: @@ -223,61 +75,44 @@ def handle_agnos_update() -> None: cloudlog.info(f"Beginning background installation for AGNOS {updated_version}") set_offroad_alert("Offroad_NeosUpdate", True) - manifest_path = os.path.join(OVERLAY_MERGED, "system/hardware/tici/agnos.json") + manifest_path = os.path.join(fetched_path, "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 - @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 init(self): + self.strategy.init() - @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 - - @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() - - def get_commit_hash(self, path: str = OVERLAY_MERGED) -> str: - return run(["git", "rev-parse", "HEAD"], path).rstrip() + def cleanup(self): + self.strategy.cleanup() 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) - self.params.put_bool("UpdaterFetchAvailable", self.update_available) - if len(self.branches): - self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) + if self.params.get("UpdaterTargetBranch") is None: + self.params.put("UpdaterTargetBranch", self.strategy.current_channel()) + + self.params.put_bool("UpdaterFetchAvailable", self.strategy.update_available()) + + available_channels = self.strategy.get_available_channels() + self.params.put("UpdaterAvailableBranches", ','.join(available_channels)) last_update = datetime.datetime.utcnow() if update_success: @@ -292,32 +127,14 @@ class Updater: else: self.params.put("LastUpdateException", exception) - # Write out current and new version info - def get_description(basedir: str) -> str: - if not os.path.exists(basedir): - return "" + description_current, release_notes_current = self.strategy.describe_current_channel() + description_ready, release_notes_ready = self.strategy.describe_ready_channel() - 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) + 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()) # Handle user prompt for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): @@ -341,67 +158,24 @@ class Updater: def check_for_update(self) -> None: cloudlog.info("checking for updates") - 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]})") + self.strategy.update_available() 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) - 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)) + self.strategy.fetch_update() # TODO: show agnos download progress if AGNOS: - handle_agnos_update() + handle_agnos_update(self.strategy.fetched_path()) # Create the finalized, ready-to-swap update self.params.put("UpdaterState", "finalizing update...") - finalize_update() + self.strategy.finalize_update() cloudlog.info("finalize success!") @@ -450,7 +224,7 @@ def main() -> None: exception = None try: # TODO: reuse overlay from previous updated instance if it looks clean - init_overlay() + updater.init() # ensure we have some params written soon after startup updater.set_params(False, update_failed_count, exception) @@ -486,11 +260,11 @@ def main() -> None: returncode=e.returncode ) exception = f"command failed: {e.cmd}\n{e.output}" - OVERLAY_INIT.unlink(missing_ok=True) + updater.cleanup() except Exception as e: cloudlog.exception("uncaught updated exception, shouldn't happen") exception = str(e) - OVERLAY_INIT.unlink(missing_ok=True) + updater.cleanup() try: params.put("UpdaterState", "idle") From a0389d7120624b35fb169d680889ae56e1adb10a Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 8 Mar 2024 11:32:38 -0800 Subject: [PATCH 440/923] add hasFix field to gpsLocation (#31778) * add hasFix field to gpsLocation * migration * update refs for ubloxd * cereal master --- cereal | 2 +- selfdrive/locationd/locationd.cc | 4 +--- selfdrive/locationd/test/test_locationd.py | 1 + .../locationd/test/test_locationd_scenarios.py | 3 ++- selfdrive/test/process_replay/migration.py | 17 +++++++++++++++++ selfdrive/test/process_replay/ref_commit | 2 +- system/qcomgpsd/qcomgpsd.py | 4 ++-- system/ubloxd/ublox_msg.cc | 1 + 8 files changed, 26 insertions(+), 8 deletions(-) diff --git a/cereal b/cereal index c5c2a60f1a..cf7bb3e749 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit c5c2a60f1aa796e7de464015349db3c336b79220 +Subproject commit cf7bb3e74974879abef94286fab4d39398fe402b diff --git a/selfdrive/locationd/locationd.cc b/selfdrive/locationd/locationd.cc index 26999cd684..2ac392a778 100644 --- a/selfdrive/locationd/locationd.cc +++ b/selfdrive/locationd/locationd.cc @@ -308,14 +308,12 @@ void Localizer::input_fake_gps_observations(double current_time) { } void Localizer::handle_gps(double current_time, const cereal::GpsLocationData::Reader& log, const double sensor_time_offset) { - // ignore the message if the fix is invalid - bool gps_invalid_flag = (log.getFlags() % 2 == 0); bool gps_unreasonable = (Vector2d(log.getHorizontalAccuracy(), log.getVerticalAccuracy()).norm() >= SANE_GPS_UNCERTAINTY); bool gps_accuracy_insane = ((log.getVerticalAccuracy() <= 0) || (log.getSpeedAccuracy() <= 0) || (log.getBearingAccuracyDeg() <= 0)); bool gps_lat_lng_alt_insane = ((std::abs(log.getLatitude()) > 90) || (std::abs(log.getLongitude()) > 180) || (std::abs(log.getAltitude()) > ALTITUDE_SANITY_CHECK)); bool gps_vel_insane = (floatlist2vector(log.getVNED()).norm() > TRANS_SANITY_CHECK); - if (gps_invalid_flag || gps_unreasonable || gps_accuracy_insane || gps_lat_lng_alt_insane || gps_vel_insane) { + if (!log.getHasFix() || gps_unreasonable || gps_accuracy_insane || gps_lat_lng_alt_insane || gps_vel_insane) { //this->gps_valid = false; this->determine_gps_mode(current_time); return; diff --git a/selfdrive/locationd/test/test_locationd.py b/selfdrive/locationd/test/test_locationd.py index 78de9216dc..cd032dbaf0 100755 --- a/selfdrive/locationd/test/test_locationd.py +++ b/selfdrive/locationd/test/test_locationd.py @@ -38,6 +38,7 @@ class TestLocationdProc(unittest.TestCase): if name == "gpsLocationExternal": msg.gpsLocationExternal.flags = 1 + msg.gpsLocationExternal.hasFix = True msg.gpsLocationExternal.verticalAccuracy = 1.0 msg.gpsLocationExternal.speedAccuracy = 1.0 msg.gpsLocationExternal.bearingAccuracyDeg = 1.0 diff --git a/selfdrive/locationd/test/test_locationd_scenarios.py b/selfdrive/locationd/test/test_locationd_scenarios.py index f48c83ce46..3fdd47275f 100755 --- a/selfdrive/locationd/test/test_locationd_scenarios.py +++ b/selfdrive/locationd/test/test_locationd_scenarios.py @@ -6,6 +6,7 @@ from collections import defaultdict from enum import Enum from openpilot.tools.lib.logreader import LogReader +from openpilot.selfdrive.test.process_replay.migration import migrate_all from openpilot.selfdrive.test.process_replay.process_replay import replay_process_with_name TEST_ROUTE = "ff2bd20623fcaeaa|2023-09-05--10-14-54/4" @@ -107,7 +108,7 @@ class TestLocationdScenarios(unittest.TestCase): @classmethod def setUpClass(cls): - cls.logs = list(LogReader(TEST_ROUTE)) + cls.logs = migrate_all(LogReader(TEST_ROUTE)) def test_base(self): """ diff --git a/selfdrive/test/process_replay/migration.py b/selfdrive/test/process_replay/migration.py index ef74314172..d480309169 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -7,9 +7,11 @@ from openpilot.selfdrive.manager.process_config import managed_processes from panda import Panda +# TODO: message migration should happen in-place def migrate_all(lr, old_logtime=False, manager_states=False, panda_states=False, camera_states=False): msgs = migrate_sensorEvents(lr, old_logtime) msgs = migrate_carParams(msgs, old_logtime) + msgs = migrate_gpsLocation(msgs) if manager_states: msgs = migrate_managerState(msgs) if panda_states: @@ -35,6 +37,21 @@ def migrate_managerState(lr): return all_msgs +def migrate_gpsLocation(lr): + all_msgs = [] + for msg in lr: + if msg.which() in ('gpsLocation', 'gpsLocationExternal'): + new_msg = msg.as_builder() + g = getattr(new_msg, new_msg.which()) + # hasFix is a newer field + if not g.hasFix and g.flags == 1: + g.hasFix = True + all_msgs.append(new_msg.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/ref_commit b/selfdrive/test/process_replay/ref_commit index 46d684211c..97646ce064 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -43efe1cf08cba8c86bc1ae8234b3d3d084a40e5d +d53d44c21a89d7925d5ad16938e14794907f28b1 \ No newline at end of file diff --git a/system/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index 25b547cf5e..859e024e68 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -352,8 +352,8 @@ def main() -> NoReturn: gps.bearingAccuracyDeg = report["q_FltHeadingUncRad"] * 180/math.pi if (report["q_FltHeadingUncRad"] != 0) else 180 gps.speedAccuracy = math.sqrt(sum([x**2 for x in vNEDsigma])) # quectel gps verticalAccuracy is clipped to 500, set invalid if so - gps.flags = 1 if gps.verticalAccuracy != 500 else 0 - if gps.flags: + gps.hasFix = gps.verticalAccuracy != 500 + if gps.hasFix: want_assistance = False stop_download_event.set() pm.send('gpsLocation', msg) diff --git a/system/ubloxd/ublox_msg.cc b/system/ubloxd/ublox_msg.cc index eb1a1e4b19..26b33a1e32 100644 --- a/system/ubloxd/ublox_msg.cc +++ b/system/ubloxd/ublox_msg.cc @@ -127,6 +127,7 @@ kj::Array UbloxMsgParser::gen_nav_pvt(ubx_t::nav_pvt_t *msg) { auto gpsLoc = msg_builder.initEvent().initGpsLocationExternal(); gpsLoc.setSource(cereal::GpsLocationData::SensorSource::UBLOX); gpsLoc.setFlags(msg->flags()); + gpsLoc.setHasFix((msg->flags() % 2) == 1); gpsLoc.setLatitude(msg->lat() * 1e-07); gpsLoc.setLongitude(msg->lon() * 1e-07); gpsLoc.setAltitude(msg->height() * 1e-03); From 358461896c115027a6372504505a4cd9be8dbeb2 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 8 Mar 2024 16:09:47 -0500 Subject: [PATCH 441/923] add helper for serving a directory (#31802) directory http server --- selfdrive/test/helpers.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/selfdrive/test/helpers.py b/selfdrive/test/helpers.py index c157b98b62..fe47637bdd 100644 --- a/selfdrive/test/helpers.py +++ b/selfdrive/test/helpers.py @@ -113,3 +113,12 @@ def with_http_server(func, handler=http.server.BaseHTTPRequestHandler, setup=Non with http_server_context(handler, setup) as (host, port): return func(*args, f"http://{host}:{port}", **kwargs) return inner + + +def DirectoryHttpServer(directory) -> type[http.server.SimpleHTTPRequestHandler]: + # creates an http server that serves files from directory + class Handler(http.server.SimpleHTTPRequestHandler): + def __init__(self, *args, **kwargs): + super().__init__(*args, directory=str(directory), **kwargs) + + return Handler From 33d1b127c9e7a3d563014a13f174939be202238d Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 8 Mar 2024 13:18:55 -0800 Subject: [PATCH 442/923] much commit --- release/check-submodules.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/release/check-submodules.sh b/release/check-submodules.sh index 5f4e307e49..bff8d7a28f 100755 --- a/release/check-submodules.sh +++ b/release/check-submodules.sh @@ -1,7 +1,7 @@ #!/bin/bash while read hash submodule ref; do - git -C $submodule fetch --depth 1000 origin master + git -C $submodule fetch --depth 2000 origin master git -C $submodule branch -r --contains $hash | grep "origin/master" if [ "$?" -eq 0 ]; then echo "$submodule ok" From bfd6ab68b5fb65da10b4c5c70c5b5782c998d4fe Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 8 Mar 2024 13:29:42 -0800 Subject: [PATCH 443/923] cgpsd: use hasFix --- system/qcomgpsd/cgpsd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/qcomgpsd/cgpsd.py b/system/qcomgpsd/cgpsd.py index c0edc721fa..04a92d4a45 100755 --- a/system/qcomgpsd/cgpsd.py +++ b/system/qcomgpsd/cgpsd.py @@ -83,7 +83,7 @@ def main(): dt = datetime.datetime.strptime(f"{date} {gnrmc[1]}", '%d%m%y %H%M%S.%f') gps.unixTimestampMillis = dt.timestamp()*1e3 - gps.flags = 1 if gnrmc[1] == 'A' else 0 + gps.hasFix = gnrmc[1] == 'A' # TODO: make our own source gps.source = log.GpsLocationData.SensorSource.qcomdiag From 74bf9dcdc7835f427eff132be8d32a86543a0cd4 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 8 Mar 2024 16:46:16 -0500 Subject: [PATCH 444/923] updated: more common helpers (#31804) update more helpers --- selfdrive/updated/common.py | 15 +++++++++++++++ selfdrive/updated/git.py | 17 ++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/selfdrive/updated/common.py b/selfdrive/updated/common.py index c522e075d5..6847147995 100644 --- a/selfdrive/updated/common.py +++ b/selfdrive/updated/common.py @@ -86,6 +86,11 @@ def set_consistent_flag(consistent: bool) -> None: 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 @@ -98,3 +103,13 @@ def parse_release_notes(releases_md: str) -> str: 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 index 29f95eeeff..921b32ede2 100644 --- a/selfdrive/updated/git.py +++ b/selfdrive/updated/git.py @@ -12,7 +12,8 @@ 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, parse_release_notes, set_consistent_flag, run +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") @@ -127,8 +128,7 @@ class GitUpdateStrategy(UpdateStrategy): return list(self.branches.keys()) def update_ready(self) -> bool: - consistent_file = Path(os.path.join(FINALIZED, ".overlay_consistent")) - if consistent_file.is_file(): + 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 @@ -165,8 +165,7 @@ class GitUpdateStrategy(UpdateStrategy): 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] + version = get_version(basedir) commit_unix_ts = run(["git", "show", "-s", "--format=%ct", "HEAD"], basedir).rstrip() dt = datetime.datetime.fromtimestamp(int(commit_unix_ts)) @@ -175,16 +174,12 @@ class GitUpdateStrategy(UpdateStrategy): cloudlog.exception("updater.get_description") return f"{version} / {branch} / {commit} / {commit_date}" - def release_notes_branch(self, basedir) -> str: - with open(os.path.join(basedir, "RELEASES.md"), "r") as f: - return parse_release_notes(f.read()) - def describe_current_channel(self) -> tuple[str, str]: - return self.describe_branch(BASEDIR), self.release_notes_branch(BASEDIR) + 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), self.release_notes_branch(FINALIZED) + return self.describe_branch(FINALIZED), get_release_notes(FINALIZED) return "", "" From 06ab3de4de18553c8dfba936f9cfb59885899aba Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Fri, 8 Mar 2024 14:11:08 -0800 Subject: [PATCH 445/923] update cavli config --- system/hardware/tici/hardware.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index c1cb9da438..45d20d976b 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -468,8 +468,9 @@ class Tici(HardwareBase): # use sim slot 'AT^SIMSWAP=1', - # configure ECM mode - 'AT$QCPCFG=usbNet,1' + # ethernet config + 'AT$QCPCFG=usbNet,0', + 'AT$QCNETDEVCTL=3,1', ] else: cmds += [ From 9c8a27ad2492cf613543103709ae8e3c4a3f5b31 Mon Sep 17 00:00:00 2001 From: Michel Le Bihan Date: Sat, 9 Mar 2024 00:13:02 +0100 Subject: [PATCH 446/923] simulator: Increase map size to contain road (#31805) --- tools/sim/scenarios/metadrive/stay_in_lane.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/sim/scenarios/metadrive/stay_in_lane.py b/tools/sim/scenarios/metadrive/stay_in_lane.py index 6d5f680247..17d3d28a2d 100755 --- a/tools/sim/scenarios/metadrive/stay_in_lane.py +++ b/tools/sim/scenarios/metadrive/stay_in_lane.py @@ -67,6 +67,7 @@ class MetaDriveBridge(SimulatorBridge): crash_object_done=True, traffic_density=0.0, map_config=create_map(), + map_region_size=2048, decision_repeat=1, physics_world_step_size=self.TICKS_PER_FRAME/100, preload_models=False From bc81daee8b9d4364e17918196692ea62be20e9c5 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Fri, 8 Mar 2024 18:31:24 -0500 Subject: [PATCH 447/923] test_updated: check the version and consistency of finalized dir (#31808) * check finalized * also check consistent --- selfdrive/updated/tests/test_base.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/selfdrive/updated/tests/test_base.py b/selfdrive/updated/tests/test_base.py index f500145b6f..9065899eb8 100644 --- a/selfdrive/updated/tests/test_base.py +++ b/selfdrive/updated/tests/test_base.py @@ -104,9 +104,12 @@ class BaseUpdateTest(unittest.TestCase): self.assertEqual(self.params.get_bool("UpdaterFetchAvailable"), fetch_available) self.assertEqual(self.params.get_bool("UpdateAvailable"), update_available) - def _test_update_params(self, branch, version, agnos_version, release_notes): + 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) def wait_for_condition(self, condition, timeout=12): start = time.monotonic() @@ -170,7 +173,7 @@ class BaseUpdateTest(unittest.TestCase): self.wait_for_update_available() self._test_params("release3", False, True) - self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) + self._test_finalized_update("release3", *self.MOCK_RELEASES["release3"]) def test_switch_branches(self): # Start on release3, request to switch to master manually, ensure we switched @@ -195,7 +198,7 @@ class BaseUpdateTest(unittest.TestCase): self.wait_for_update_available() self._test_params("master", False, True) - self._test_update_params("master", *self.MOCK_RELEASES["master"]) + self._test_finalized_update("master", *self.MOCK_RELEASES["master"]) def test_agnos_update(self): # Start on release3, push an update with an agnos change @@ -227,4 +230,4 @@ class BaseUpdateTest(unittest.TestCase): self.wait_for_update_available() self._test_params("release3", False, True) - self._test_update_params("release3", *self.MOCK_RELEASES["release3"]) + self._test_finalized_update("release3", *self.MOCK_RELEASES["release3"]) From 7eb1e958848c6fdb0865da95eaba991252ca9fd6 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Fri, 8 Mar 2024 16:43:18 -0800 Subject: [PATCH 448/923] camerad: OS04C10 operational (#31674) * 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 * add base comment * clean up * make orders clear * not abcd --------- Co-authored-by: Comma Device --- system/camerad/cameras/camera_common.cc | 8 +- system/camerad/cameras/real_debayer.cl | 169 ++++++++++++++------- system/camerad/sensors/ar0231.cc | 8 +- system/camerad/sensors/os04c10.cc | 53 +++---- system/camerad/sensors/os04c10_registers.h | 155 ++++++++++--------- system/camerad/sensors/ox03c10.cc | 6 +- system/camerad/sensors/sensor.h | 4 - 7 files changed, 232 insertions(+), 171 deletions(-) diff --git a/system/camerad/cameras/camera_common.cc b/system/camerad/cameras/camera_common.cc index fff4a62d31..aa815bfadf 100644 --- a/system/camerad/cameras/camera_common.cc +++ b/system/camerad/cameras/camera_common.cc @@ -27,14 +27,18 @@ public: "-cl-fast-relaxed-math -cl-denorms-are-zero " "-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 -DCAM_NUM=%d%s", + "-DIS_OX=%d -DIS_OS=%d -DIS_BGGR=%d -DCAM_NUM=%d%s", 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, s->camera_num, s->camera_num==1 ? " -DVIGNETTING" : ""); + 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)); + } void queue(cl_command_queue q, cl_mem cam_buf_cl, cl_mem buf_cl, int width, int height, cl_event *debayer_event) { diff --git a/system/camerad/cameras/real_debayer.cl b/system/camerad/cameras/real_debayer.cl index e15a873d6d..5f8d046cb5 100644 --- a/system/camerad/cameras/real_debayer.cl +++ b/system/camerad/cameras/real_debayer.cl @@ -8,7 +8,7 @@ float3 color_correct(float3 rgb) { // color correction - #if IS_OX + #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); @@ -20,6 +20,8 @@ float3 color_correct(float3 rgb) { #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; @@ -35,6 +37,9 @@ float3 color_correct(float3 rgb) { } 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) { @@ -85,6 +90,24 @@ float4 val4_from_12(uchar8 pvs, float gain) { } +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); +} + float get_k(float a, float b, float c, float d) { return 2.0 - (fabs(a - b) + fabs(c - d)); } @@ -94,20 +117,51 @@ __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 y_top_mod = (gid_y == 0) ? 2: 0; - const int y_bot_mod = (gid_y == (RGB_HEIGHT/2 - 1)) ? 1: 3; + 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]; - int start = (2 * gid_y - 1) * FRAME_STRIDE + (3 * gid_x - 2) + (FRAME_STRIDE * FRAME_OFFSET); + #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 + FRAME_STRIDE*y_top_mod); - dat[1] = vload8(0, in + start + FRAME_STRIDE*1); - dat[2] = vload8(0, in + start + FRAME_STRIDE*2); - dat[3] = vload8(0, in + start + FRAME_STRIDE*y_bot_mod); + 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 @@ -118,60 +172,69 @@ __kernel void debayer10(const __global uchar * in, __global uchar * out) const float gain = 1.0; #endif - // process them to floats - float4 va = val4_from_12(dat[0], gain); - float4 vb = val4_from_12(dat[1], gain); - float4 vc = val4_from_12(dat[2], gain); - float4 vd = val4_from_12(dat[3], gain); + 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) { - va.s0 = va.s2; - vb.s0 = vb.s2; - vc.s0 = vc.s2; - vd.s0 = vd.s2; + 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) { - va.s3 = va.s1; - vb.s3 = vb.s1; - vc.s3 = vc.s1; - vd.s3 = vd.s1; + 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(va.s0, vb.s1, va.s2, vb.s1); - const float k02 = get_k(va.s2, vb.s1, vc.s2, vb.s1); - const float k03 = get_k(vc.s0, vb.s1, vc.s2, vb.s1); - const float k04 = get_k(va.s0, vb.s1, vc.s0, vb.s1); - rgb.x = (k02*vb.s2+k04*vb.s0)/(k02+k04); // R_G1 - rgb.y = vb.s1; // G1(R) - rgb.z = (k01*va.s1+k03*vc.s1)/(k01+k03); // B_G1 - rgb_out[0] = convert_uchar3_sat(color_correct(clamp(rgb, 0.0, 1.0)) * 255.0); + 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(va.s1, vc.s1, va.s3, vc.s3); - const float k12 = get_k(va.s2, vb.s1, vb.s3, vc.s2); - const float k13 = get_k(va.s1, va.s3, vc.s1, vc.s3); - const float k14 = get_k(va.s2, vb.s3, vc.s2, vb.s1); - rgb.x = vb.s2; // R - rgb.y = (k11*(va.s2+vc.s2)*0.5+k13*(vb.s3+vb.s1)*0.5)/(k11+k13); // G_R - rgb.z = (k12*(va.s3+vc.s1)*0.5+k14*(va.s1+vc.s3)*0.5)/(k12+k14); // B_R - rgb_out[1] = 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(vb.s0, vd.s0, vb.s2, vd.s2); - const float k22 = get_k(vb.s1, vc.s0, vc.s2, vd.s1); - const float k23 = get_k(vb.s0, vb.s2, vd.s0, vd.s2); - const float k24 = get_k(vb.s1, vc.s2, vd.s1, vc.s0); - rgb.x = (k22*(vb.s2+vd.s0)*0.5+k24*(vb.s0+vd.s2)*0.5)/(k22+k24); // R_B - rgb.y = (k21*(vb.s1+vd.s1)*0.5+k23*(vc.s2+vc.s0)*0.5)/(k21+k23); // G_B - rgb.z = vc.s1; // B - rgb_out[2] = 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(vb.s1, vc.s2, vb.s3, vc.s2); - const float k32 = get_k(vb.s3, vc.s2, vd.s3, vc.s2); - const float k33 = get_k(vd.s1, vc.s2, vd.s3, vc.s2); - const float k34 = get_k(vb.s1, vc.s2, vd.s1, vc.s2); - rgb.x = (k31*vb.s2+k33*vd.s2)/(k31+k33); // R_G2 - rgb.y = vc.s2; // G2(B) - rgb.z = (k32*vc.s3+k34*vc.s1)/(k32+k34); // B_G2 - rgb_out[3] = 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)( diff --git a/system/camerad/sensors/ar0231.cc b/system/camerad/sensors/ar0231.cc index 1ca4b3f1ad..5c4934fb61 100644 --- a/system/camerad/sensors/ar0231.cc +++ b/system/camerad/sensors/ar0231.cc @@ -80,14 +80,14 @@ float ar0231_parse_temp_sensor(uint16_t calib1, uint16_t calib2, uint16_t data_r AR0231::AR0231() { image_sensor = cereal::FrameData::ImageSensor::AR0231; data_word = true; - frame_width = FRAME_WIDTH; - frame_height = FRAME_HEIGHT; - frame_stride = FRAME_STRIDE; + frame_width = 1928; + frame_height = 1208; + frame_stride = (frame_width * 12 / 8) + 4; extra_height = AR0231_REGISTERS_HEIGHT + AR0231_STATS_HEIGHT; registers_offset = 0; frame_offset = AR0231_REGISTERS_HEIGHT; - stats_offset = AR0231_REGISTERS_HEIGHT + FRAME_HEIGHT; + stats_offset = AR0231_REGISTERS_HEIGHT + frame_height; start_reg_array.assign(std::begin(start_reg_array_ar0231), std::end(start_reg_array_ar0231)); init_reg_array.assign(std::begin(init_array_ar0231), std::end(init_array_ar0231)); diff --git a/system/camerad/sensors/os04c10.cc b/system/camerad/sensors/os04c10.cc index 449e06be83..aaef9986b5 100644 --- a/system/camerad/sensors/os04c10.cc +++ b/system/camerad/sensors/os04c10.cc @@ -10,14 +10,11 @@ const float sensor_analog_gains_OS04C10[] = { 10.5, 11.0, 11.5, 12.0, 12.5, 13.0, 13.5, 14.0, 14.5, 15.0, 15.5}; const uint32_t os04c10_analog_gains_reg[] = { - 0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, 0x190, 0x1B0, - 0x1D0, 0x1F0, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, 0x300, - 0x320, 0x360, 0x3A0, 0x3E0, 0x400, 0x440, 0x480, 0x4C0, 0x500, 0x540, 0x580, - 0x5C0, 0x600, 0x640, 0x680, 0x700, 0x780, 0x800, 0x880, 0x900, 0x980, 0xA00, - 0xA80, 0xB00, 0xB80, 0xC00, 0xC80, 0xD00, 0xD80, 0xE00, 0xE80, 0xF00, 0xF80}; - -const uint32_t VS_TIME_MIN_OS04C10 = 1; -//const uint32_t VS_TIME_MAX_OS04C10 = 34; // vs < 35 + 0x080, 0x088, 0x090, 0x098, 0x0A0, 0x0A8, 0x0B0, 0x0B8, 0x0C0, 0x0C8, 0x0D8, + 0x0E8, 0x0F8, 0x100, 0x110, 0x120, 0x130, 0x140, 0x150, 0x160, 0x170, 0x180, + 0x190, 0x1B0, 0x1D0, 0x1F0, 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, + 0x2E0, 0x300, 0x320, 0x340, 0x380, 0x3C0, 0x400, 0x440, 0x480, 0x4C0, 0x500, + 0x540, 0x580, 0x5C0, 0x600, 0x640, 0x680, 0x6C0, 0x700, 0x740, 0x780, 0x7C0}; } // namespace @@ -25,15 +22,9 @@ OS04C10::OS04C10() { image_sensor = cereal::FrameData::ImageSensor::OS04C10; data_word = false; - frame_width = 1920; - frame_height = 1080; - frame_stride = (1920*10/8); - - /* - frame_width = 0xa80; - frame_height = 0x5f0; - frame_stride = 0xd20; - */ + frame_width = 2688; + frame_height = 1520; + frame_stride = (frame_width * 12 / 8); // no alignment extra_height = 0; frame_offset = 0; @@ -42,17 +33,17 @@ 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_10; - frame_data_type = 0x2b; + mipi_format = CAM_FORMAT_MIPI_RAW_12; + frame_data_type = 0x2c; mclk_frequency = 24000000; // Hz - dc_gain_factor = 7.32; + dc_gain_factor = 1; dc_gain_min_weight = 1; // always on is fine 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 = 2016; + exposure_time_max = 2200; analog_gain_min_idx = 0x0; analog_gain_rec_idx = 0x0; // 1x analog_gain_max_idx = 0x36; @@ -62,30 +53,22 @@ OS04C10::OS04C10() { for (int i = 0; i <= analog_gain_max_idx; i++) { sensor_analog_gains[i] = sensor_analog_gains_OS04C10[i]; } - min_ev = (exposure_time_min + VS_TIME_MIN_OS04C10) * sensor_analog_gains[analog_gain_min_idx]; + min_ev = (exposure_time_min) * sensor_analog_gains[analog_gain_min_idx]; max_ev = exposure_time_max * dc_gain_factor * sensor_analog_gains[analog_gain_max_idx]; target_grey_factor = 0.01; } std::vector OS04C10::getExposureRegisters(int exposure_time, int new_exp_g, bool dc_gain_enabled) const { - // t_HCG&t_LCG + t_VS on LPD, t_SPD on SPD - uint32_t hcg_time = exposure_time; - //uint32_t lcg_time = hcg_time; - //uint32_t spd_time = std::min(std::max((uint32_t)exposure_time, (exposure_time_max + VS_TIME_MAX_OS04C10) / 3), exposure_time_max + VS_TIME_MAX_OS04C10); - //uint32_t vs_time = std::min(std::max((uint32_t)exposure_time / 40, VS_TIME_MIN_OS04C10), VS_TIME_MAX_OS04C10); - + uint32_t long_time = exposure_time; uint32_t real_gain = os04c10_analog_gains_reg[new_exp_g]; - hcg_time = 100; - real_gain = 0x320; + // uint32_t short_time = long_time > exposure_time_min*8 ? long_time / 8 : exposure_time_min; return { - {0x3501, hcg_time>>8}, {0x3502, hcg_time&0xFF}, - //{0x3581, lcg_time>>8}, {0x3582, lcg_time&0xFF}, - //{0x3541, spd_time>>8}, {0x3542, spd_time&0xFF}, - //{0x35c2, vs_time&0xFF}, - + {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_registers.h b/system/camerad/sensors/os04c10_registers.h index ad91a02950..f2388d91b8 100644 --- a/system/camerad/sensors/os04c10_registers.h +++ b/system/camerad/sensors/os04c10_registers.h @@ -4,43 +4,33 @@ 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_1920x1080_MIPI728Mbps_Linear12bit_20FPS_4Lane_MCLK24MHz + // OS04C10_AA_00_02_17_wAO_2688x1524_MIPI728Mbps_Linear12bit_20FPS_4Lane_MCLK24MHz {0x0103, 0x01}, - {0x0301, 0x84}, + + // PLL + {0x0301, 0xe4}, {0x0303, 0x01}, - {0x0305, 0x5b}, + {0x0305, 0xb6}, {0x0306, 0x01}, {0x0307, 0x17}, {0x0323, 0x04}, {0x0324, 0x01}, {0x0325, 0x62}, + {0x3012, 0x06}, {0x3013, 0x02}, {0x3016, 0x72}, {0x3021, 0x03}, {0x3106, 0x21}, {0x3107, 0xa1}, - {0x3500, 0x00}, - {0x3501, 0x00}, - {0x3502, 0x40}, - {0x3503, 0x88}, - {0x3508, 0x07}, - {0x3509, 0xc0}, - {0x350a, 0x04}, - {0x350b, 0x00}, - {0x350c, 0x07}, - {0x350d, 0xc0}, - {0x350e, 0x04}, - {0x350f, 0x00}, - {0x3510, 0x00}, - {0x3511, 0x00}, - {0x3512, 0x20}, + + // ? {0x3624, 0x00}, {0x3625, 0x4c}, - {0x3660, 0x00}, + {0x3660, 0x04}, {0x3666, 0xa5}, {0x3667, 0xa5}, - {0x366a, 0x64}, + {0x366a, 0x50}, {0x3673, 0x0d}, {0x3672, 0x0d}, {0x3671, 0x0d}, @@ -63,22 +53,22 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x36a0, 0x12}, {0x36a1, 0x5d}, {0x36a2, 0x66}, - {0x370a, 0x00}, + {0x370a, 0x02}, {0x370e, 0x0c}, {0x3710, 0x00}, {0x3713, 0x00}, {0x3725, 0x02}, {0x372a, 0x03}, {0x3738, 0xce}, - {0x3748, 0x00}, - {0x374a, 0x00}, - {0x374c, 0x00}, - {0x374e, 0x00}, + {0x3748, 0x02}, + {0x374a, 0x02}, + {0x374c, 0x02}, + {0x374e, 0x02}, {0x3756, 0x00}, - {0x3757, 0x0e}, + {0x3757, 0x00}, {0x3767, 0x00}, {0x3771, 0x00}, - {0x377b, 0x20}, + {0x377b, 0x28}, {0x377c, 0x00}, {0x377d, 0x0c}, {0x3781, 0x03}, @@ -111,6 +101,8 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3d8d, 0xe2}, {0x3f00, 0x0b}, {0x3f06, 0x04}, + + // BLC {0x400a, 0x01}, {0x400b, 0x50}, {0x400e, 0x08}, @@ -118,7 +110,7 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4045, 0x7e}, {0x4047, 0x7e}, {0x4049, 0x7e}, - {0x4090, 0x14}, + {0x4090, 0x04}, {0x40b0, 0x00}, {0x40b1, 0x00}, {0x40b2, 0x00}, @@ -128,24 +120,25 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x40b7, 0x00}, {0x40b8, 0x00}, {0x40b9, 0x00}, - {0x40ba, 0x00}, + {0x40ba, 0x01}, + {0x4301, 0x00}, {0x4303, 0x00}, {0x4502, 0x04}, {0x4503, 0x00}, {0x4504, 0x06}, {0x4506, 0x00}, - {0x4507, 0x64}, + {0x4507, 0x47}, {0x4803, 0x00}, {0x480c, 0x32}, - {0x480e, 0x00}, - {0x4813, 0x00}, + {0x480e, 0x04}, + {0x4813, 0xe4}, {0x4819, 0x70}, {0x481f, 0x30}, {0x4823, 0x3f}, {0x4825, 0x30}, {0x4833, 0x10}, - {0x484b, 0x07}, + {0x484b, 0x27}, {0x488b, 0x00}, {0x4d00, 0x04}, {0x4d01, 0xad}, @@ -156,31 +149,37 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4d0b, 0x01}, {0x4e00, 0x2a}, {0x4e0d, 0x00}, + + // ISP {0x5001, 0x09}, {0x5004, 0x00}, {0x5080, 0x04}, - {0x5036, 0x00}, + {0x5036, 0x80}, {0x5180, 0x70}, {0x5181, 0x10}, + + // DPC {0x520a, 0x03}, {0x520b, 0x06}, {0x520c, 0x0c}, + {0x580b, 0x0f}, {0x580d, 0x00}, {0x580f, 0x00}, {0x5820, 0x00}, {0x5821, 0x00}, + {0x301c, 0xf8}, {0x301e, 0xb4}, - {0x301f, 0xd0}, - {0x3022, 0x01}, + {0x301f, 0xf0}, + {0x3022, 0x61}, {0x3109, 0xe7}, {0x3600, 0x00}, {0x3610, 0x65}, {0x3611, 0x85}, {0x3613, 0x3a}, {0x3615, 0x60}, - {0x3621, 0x90}, + {0x3621, 0xb0}, {0x3620, 0x0c}, {0x3629, 0x00}, {0x3661, 0x04}, @@ -194,9 +193,9 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3701, 0x12}, {0x3703, 0x28}, {0x3704, 0x0e}, - {0x3706, 0x4a}, + {0x3706, 0x9d}, {0x3709, 0x4a}, - {0x370b, 0xa2}, + {0x370b, 0x48}, {0x370c, 0x01}, {0x370f, 0x04}, {0x3714, 0x24}, @@ -206,19 +205,19 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3720, 0x00}, {0x3724, 0x13}, {0x373f, 0xb0}, - {0x3741, 0x4a}, - {0x3743, 0x4a}, - {0x3745, 0x4a}, - {0x3747, 0x4a}, - {0x3749, 0xa2}, - {0x374b, 0xa2}, - {0x374d, 0xa2}, - {0x374f, 0xa2}, + {0x3741, 0x9d}, + {0x3743, 0x9d}, + {0x3745, 0x9d}, + {0x3747, 0x9d}, + {0x3749, 0x48}, + {0x374b, 0x48}, + {0x374d, 0x48}, + {0x374f, 0x48}, {0x3755, 0x10}, {0x376c, 0x00}, - {0x378d, 0x30}, - {0x3790, 0x4a}, - {0x3791, 0xa2}, + {0x378d, 0x3c}, + {0x3790, 0x01}, + {0x3791, 0x01}, {0x3798, 0x40}, {0x379e, 0x00}, {0x379f, 0x04}, @@ -249,29 +248,25 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4041, 0x07}, {0x4008, 0x02}, {0x4009, 0x0d}, - {0x3800, 0x01}, - {0x3801, 0x80}, - {0x3802, 0x00}, - {0x3803, 0xdc}, - {0x3804, 0x09}, - {0x3805, 0x0f}, - {0x3806, 0x05}, - {0x3807, 0x23}, - {0x3808, 0x07}, - {0x3809, 0x80}, - {0x380a, 0x04}, - {0x380b, 0x38}, - {0x380c, 0x04}, - {0x380d, 0x2e}, - {0x380e, 0x12}, - {0x380f, 0x70}, + + // 2704x1536 -> 2688x1520 out + {0x3800, 0x00}, {0x3801, 0x00}, + {0x3802, 0x00}, {0x3803, 0x00}, + {0x3804, 0x0a}, {0x3805, 0x8f}, + {0x3806, 0x05}, {0x3807, 0xff}, + {0x3808, 0x0a}, {0x3809, 0x80}, + {0x380a, 0x05}, {0x380b, 0xf0}, {0x3811, 0x08}, {0x3813, 0x08}, {0x3814, 0x01}, {0x3815, 0x01}, {0x3816, 0x01}, {0x3817, 0x01}, - {0x3820, 0xB0}, + + {0x380c, 0x08}, {0x380d, 0x5c}, // HTS + {0x380e, 0x09}, {0x380f, 0x38}, // VTS + + {0x3820, 0xb0}, {0x3821, 0x00}, {0x3880, 0x25}, {0x3882, 0x20}, @@ -281,12 +276,12 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x3cae, 0x00}, {0x4000, 0xf3}, {0x4001, 0x60}, - {0x4003, 0x40}, + {0x4003, 0x80}, {0x4300, 0xff}, {0x4302, 0x0f}, {0x4305, 0x83}, {0x4505, 0x84}, - {0x4809, 0x1e}, + {0x4809, 0x0e}, {0x480a, 0x04}, {0x4837, 0x15}, {0x4c00, 0x08}, @@ -294,5 +289,25 @@ const struct i2c_random_wr_payload init_array_os04c10[] = { {0x4c04, 0x00}, {0x4c05, 0x00}, {0x5000, 0xf9}, - {0x3c8c, 0x10}, + {0x3822, 0x14}, + + // initialize exposure + {0x3503, 0x88}, + + // long + {0x3500, 0x00}, {0x3501, 0x00}, {0x3502, 0x80}, + {0x3508, 0x00}, {0x3509, 0x80}, + {0x350a, 0x04}, {0x350b, 0x00}, + + // short + // {0x3510, 0x00}, {0x3511, 0x00}, {0x3512, 0x10}, + // {0x350c, 0x00}, {0x350d, 0x80}, + // {0x350e, 0x04}, {0x350f, 0x00}, + + // wb + {0x5100, 0x06}, {0x5101, 0xcb}, + {0x5102, 0x04}, {0x5103, 0x00}, + {0x5104, 0x08}, {0x5105, 0xde}, + + {0x5106, 0x02}, {0x5107, 0x00}, }; diff --git a/system/camerad/sensors/ox03c10.cc b/system/camerad/sensors/ox03c10.cc index 1f0609820b..c74274872f 100644 --- a/system/camerad/sensors/ox03c10.cc +++ b/system/camerad/sensors/ox03c10.cc @@ -24,9 +24,9 @@ const uint32_t VS_TIME_MAX_OX03C10 = 34; // vs < 35 OX03C10::OX03C10() { image_sensor = cereal::FrameData::ImageSensor::OX03C10; data_word = false; - frame_width = FRAME_WIDTH; - frame_height = FRAME_HEIGHT; - frame_stride = FRAME_STRIDE; // (0xa80*12//8) + frame_width = 1928; + frame_height = 1208; + frame_stride = (frame_width * 12 / 8) + 4; extra_height = 16; // top 2 + bot 14 frame_offset = 2; diff --git a/system/camerad/sensors/sensor.h b/system/camerad/sensors/sensor.h index 4e2194d914..d97fd32a9c 100644 --- a/system/camerad/sensors/sensor.h +++ b/system/camerad/sensors/sensor.h @@ -12,10 +12,6 @@ #include "system/camerad/sensors/os04c10_registers.h" #define ANALOG_GAIN_MAX_CNT 55 -const size_t FRAME_WIDTH = 1928; -const size_t FRAME_HEIGHT = 1208; -const size_t FRAME_STRIDE = 2896; // for 12 bit output. 1928 * 12 / 8 + 4 (alignment) - class SensorInfo { public: From 66adf8781eb09631687ca4809e92136cbbdc7f56 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 17:00:07 -0800 Subject: [PATCH 449/923] Subaru: extra logging request for camera (#31783) * 7f - service not supported in active session * update refs * rm short * Apply suggestions from code review * bus 0 --- selfdrive/car/subaru/values.py | 7 +++++++ selfdrive/car/tests/test_fw_fingerprint.py | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 5e135ca658..0bf5e782f5 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -245,6 +245,13 @@ FW_QUERY_CONFIG = FwQueryConfig( whitelist_ecus=[Ecu.fwdCamera], bus=0, ), + Request( + [StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], + [StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], + whitelist_ecus=[Ecu.fwdCamera], + bus=0, + logging=True, + ), Request( [StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index b9eadc8cd5..cc5496210e 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.4, 2: 9.3} + total_ref_time = {1: 8.5, 2: 9.4} brand_ref_times = { 1: { 'gm': 1.0, @@ -274,7 +274,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'hyundai': 1.05, 'mazda': 0.1, 'nissan': 0.8, - 'subaru': 0.45, + 'subaru': 0.55, 'tesla': 0.3, 'toyota': 1.6, 'volkswagen': 0.65, From 3862911ae697ec34f29fae41a434373d258cbc3d Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 17:01:31 -0800 Subject: [PATCH 450/923] [bot] Fingerprints: add missing FW versions from new users (#31732) Export fingerprints --- selfdrive/car/subaru/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/subaru/fingerprints.py b/selfdrive/car/subaru/fingerprints.py index 90fa6093d9..9f6177b4c0 100644 --- a/selfdrive/car/subaru/fingerprints.py +++ b/selfdrive/car/subaru/fingerprints.py @@ -26,6 +26,7 @@ FW_VERSIONS = { b'\xd1,\xa0q\x07', ], (Ecu.transmission, 0x7e1, None): [ + b'\x00>\xf0\x00\x00', b'\x00\xfe\xf7\x00\x00', b'\x01\xfe\xf7\x00\x00', b'\x01\xfe\xf9\x00\x00', From 5be3f0b7dbb1209f8e2543bfb6f0003e3fda01b6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 19:36:33 -0800 Subject: [PATCH 451/923] Subaru: log alt request (#31812) * add alt query (same as Hyundai) * refs --- selfdrive/car/subaru/values.py | 14 ++++++++++++++ selfdrive/car/tests/test_fw_fingerprint.py | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 0bf5e782f5..6f799e2206 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -228,6 +228,13 @@ SUBARU_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ SUBARU_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ p16(uds.DATA_IDENTIFIER_TYPE.APPLICATION_DATA_IDENTIFICATION) +# The EyeSight ECU takes 10s to respond to SUBARU_VERSION_REQUEST properly, +# log this alternate manufacturer-specific query +SUBARU_ALT_VERSION_REQUEST = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER]) + \ + p16(0xf100) +SUBARU_ALT_VERSION_RESPONSE = bytes([uds.SERVICE_TYPE.READ_DATA_BY_IDENTIFIER + 0x40]) + \ + p16(0xf100) + FW_QUERY_CONFIG = FwQueryConfig( requests=[ Request( @@ -245,6 +252,13 @@ FW_QUERY_CONFIG = FwQueryConfig( whitelist_ecus=[Ecu.fwdCamera], bus=0, ), + Request( + [SUBARU_ALT_VERSION_REQUEST], + [SUBARU_ALT_VERSION_RESPONSE], + whitelist_ecus=[Ecu.fwdCamera], + bus=0, + logging=True, + ), Request( [StdQueries.DEFAULT_DIAGNOSTIC_REQUEST, StdQueries.TESTER_PRESENT_REQUEST, SUBARU_VERSION_REQUEST], [StdQueries.DEFAULT_DIAGNOSTIC_RESPONSE, StdQueries.TESTER_PRESENT_RESPONSE, SUBARU_VERSION_RESPONSE], diff --git a/selfdrive/car/tests/test_fw_fingerprint.py b/selfdrive/car/tests/test_fw_fingerprint.py index cc5496210e..d9bea3b965 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.6, 2: 9.5} brand_ref_times = { 1: { 'gm': 1.0, @@ -274,7 +274,7 @@ class TestFwFingerprintTiming(unittest.TestCase): 'hyundai': 1.05, 'mazda': 0.1, 'nissan': 0.8, - 'subaru': 0.55, + 'subaru': 0.65, 'tesla': 0.3, 'toyota': 1.6, 'volkswagen': 0.65, From 1589adddf17effbb526aafaaa2b4572542a98759 Mon Sep 17 00:00:00 2001 From: Yasushi Oh Date: Fri, 8 Mar 2024 21:49:12 -0800 Subject: [PATCH 452/923] bugfix: add support for Bronco Sport 2023 (#31794) * bugfix: add support for Bronco Sport 2023 * Apply suggestions from code review * update docs --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/ford/fingerprints.py | 3 +++ selfdrive/car/ford/values.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 591a76e4cb..8854a801ab 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -35,7 +35,7 @@ A supported vehicle is one that just works when you install a comma device. All |Chrysler|Pacifica Hybrid 2019-23|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
|| |comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None|| |Dodge|Durango 2020-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
|| -|Ford|Bronco Sport 2021-22|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|Bronco Sport 2021-23|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|Escape 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Escape Hybrid 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Ford|Escape Plug-in Hybrid 2020-22|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 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 a5d465849a..504d27e681 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -8,16 +8,19 @@ FW_VERSIONS = { (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', + b'LX6C-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x760, None): [ b'LX6C-2D053-RD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'LX6C-2D053-RE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'LX6C-2D053-RF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ b'LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x706, None): [ b'M1PT-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'M1PT-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], }, CAR.ESCAPE_MK4: { diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index add40368be..15c0d3bdb7 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-22"), + FordCarInfo("Ford Bronco Sport 2021-23"), CarSpecs(mass=1625, wheelbase=2.67, steerRatio=17.7), ) ESCAPE_MK4 = FordPlatformConfig( From 2c353a25a47a5ad6274b982c419ed21be3bfb213 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 23:26:01 -0800 Subject: [PATCH 453/923] longitudinal personality: display in Toyota instrument cluster (#31760) * 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 * revert longplan * revert this * Fix check * more appropriate up here * consistenet * Update selfdrive/car/toyota/carstate.py * Update ref_commit --- selfdrive/car/toyota/carcontroller.py | 6 +++--- selfdrive/car/toyota/carstate.py | 1 - selfdrive/controls/controlsd.py | 1 + selfdrive/test/process_replay/ref_commit | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index 8e8e0292f2..71a595996d 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -141,9 +141,9 @@ class CarController(CarControllerBase): lead = hud_control.leadVisible or CS.out.vEgo < 12. # at low speed we always assume the lead is present so ACC can be engaged # Press distance button until we are at the correct bar length. Only change while enabled to avoid skipping startup popup - if self.frame % 6 == 0: - if CS.pcm_follow_distance_values.get(CS.pcm_follow_distance, "UNKNOWN") != "FAR" and CS.out.cruiseState.enabled and \ - self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: + if self.frame % 6 == 0 and self.CP.openpilotLongitudinalControl: + desired_distance = 4 - hud_control.leadDistanceBars + if CS.out.cruiseState.enabled and CS.pcm_follow_distance != desired_distance: self.distance_button = not self.distance_button else: self.distance_button = 0 diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 65fced80f4..5d99467f25 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -44,7 +44,6 @@ class CarState(CarStateBase): self.distance_button = 0 self.pcm_follow_distance = 0 - self.pcm_follow_distance_values = can_define.dv['PCM_CRUISE_2']['PCM_FOLLOW_DISTANCE'] self.low_speed_lockout = False self.acc_type = 1 diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index e4f2542ea5..29358cb7b6 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -680,6 +680,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.rightLaneVisible = True hudControl.leftLaneVisible = True diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 97646ce064..fe7d954a80 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -d53d44c21a89d7925d5ad16938e14794907f28b1 \ No newline at end of file +653f68e6be4689dc9dce1a93cb726d37b9c588d3 From a475417220d675fd1d27fd8dac89a2a23334d8ed Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 8 Mar 2024 23:28:23 -0800 Subject: [PATCH 454/923] [bot] Fingerprints: add missing FW versions from new users (#31731) * Export fingerprints * Update selfdrive/car/toyota/fingerprints.py --- selfdrive/car/honda/fingerprints.py | 1 + selfdrive/car/toyota/fingerprints.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/selfdrive/car/honda/fingerprints.py b/selfdrive/car/honda/fingerprints.py index a842baac88..83c2c3f1eb 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -39,6 +39,7 @@ FW_VERSIONS = { b'37805-6B2-A810\x00\x00', b'37805-6B2-A820\x00\x00', b'37805-6B2-A920\x00\x00', + b'37805-6B2-A960\x00\x00', b'37805-6B2-AA10\x00\x00', b'37805-6B2-C520\x00\x00', b'37805-6B2-C540\x00\x00', diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index 86d45532fa..64ad53a880 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -639,6 +639,7 @@ FW_VERSIONS = { (Ecu.dsu, 0x791, None): [ b'881510E01100\x00\x00\x00\x00', b'881510E01200\x00\x00\x00\x00', + b'881510E02200\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'8821F4702100\x00\x00\x00\x00', @@ -686,6 +687,7 @@ FW_VERSIONS = { b'\x01896630EB1000\x00\x00\x00\x00', b'\x01896630EB1100\x00\x00\x00\x00', b'\x01896630EB1200\x00\x00\x00\x00', + b'\x01896630EB1300\x00\x00\x00\x00', b'\x01896630EB2000\x00\x00\x00\x00', b'\x01896630EB2100\x00\x00\x00\x00', b'\x01896630EB2200\x00\x00\x00\x00', @@ -1141,6 +1143,7 @@ FW_VERSIONS = { b'\x01F15264283300\x00\x00\x00\x00', b'\x01F152642F1000\x00\x00\x00\x00', b'\x01F152642F8000\x00\x00\x00\x00', + b'\x01F152642F8100\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'\x028965B0R11000\x00\x00\x00\x008965B0R12000\x00\x00\x00\x00', @@ -1153,6 +1156,7 @@ FW_VERSIONS = { b'\x01896634AF0000\x00\x00\x00\x00', b'\x01896634AJ2000\x00\x00\x00\x00', b'\x01896634AL5000\x00\x00\x00\x00', + b'\x01896634AL6000\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ b'\x018821F0R03100\x00\x00\x00\x00', From 682f16d1b5c9c5d618711d864a16efde80af8e14 Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Sun, 10 Mar 2024 04:54:54 +0000 Subject: [PATCH 455/923] Ford: fix counter in LateralMotionControl2 message (#31806) The counter should be between 0-15 inclusive. This only affects CAN FD cars. --- selfdrive/car/ford/carcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/ford/carcontroller.py b/selfdrive/car/ford/carcontroller.py index 390325a8ec..7ce2ded6e3 100644 --- a/selfdrive/car/ford/carcontroller.py +++ b/selfdrive/car/ford/carcontroller.py @@ -73,7 +73,7 @@ class CarController(CarControllerBase): if self.CP.flags & FordFlags.CANFD: # TODO: extended mode mode = 1 if CC.latActive else 0 - counter = (self.frame // CarControllerParams.STEER_STEP) % 0xF + counter = (self.frame // CarControllerParams.STEER_STEP) % 0x10 can_sends.append(fordcan.create_lat_ctl2_msg(self.packer, self.CAN, mode, 0., 0., -apply_curvature, 0., counter)) else: can_sends.append(fordcan.create_lat_ctl_msg(self.packer, self.CAN, CC.latActive, 0., 0., -apply_curvature, 0.)) From 5ca733c41525b1c796e00a09518cea74f0bd0436 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sun, 10 Mar 2024 00:00:32 -0500 Subject: [PATCH 456/923] GM: Parse distance button from steering wheel (#31762) --- selfdrive/car/gm/carstate.py | 5 +++++ selfdrive/car/gm/interface.py | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index c3d061de78..a1129c59c8 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -26,11 +26,16 @@ class CarState(CarStateBase): self.cam_lka_steering_cmd_counter = 0 self.buttons_counter = 0 + self.prev_distance_button = 0 + self.distance_button = 0 + def update(self, pt_cp, cam_cp, loopback_cp): ret = car.CarState.new_message() self.prev_cruise_buttons = self.cruise_buttons + self.prev_distance_button = self.distance_button self.cruise_buttons = pt_cp.vl["ASCMSteeringButton"]["ACCButtons"] + self.distance_button = pt_cp.vl["ASCMSteeringButton"]["DistanceButton"] self.buttons_counter = pt_cp.vl["ASCMSteeringButton"]["RollingCounter"] self.pscm_status = copy.copy(pt_cp.vl["PSCMStatus"]) # This is to avoid a fault where you engage while still moving backwards after shifting to D. diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 76f6a6b0a6..1336e23c70 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -208,8 +208,12 @@ class CarInterface(CarInterfaceBase): # Don't add event if transitioning from INIT, unless it's to an actual button if self.CS.cruise_buttons != CruiseButtons.UNPRESS or self.CS.prev_cruise_buttons != CruiseButtons.INIT: - ret.buttonEvents = create_button_events(self.CS.cruise_buttons, self.CS.prev_cruise_buttons, BUTTONS_DICT, - unpressed_btn=CruiseButtons.UNPRESS) + ret.buttonEvents = [ + *create_button_events(self.CS.cruise_buttons, self.CS.prev_cruise_buttons, BUTTONS_DICT, + unpressed_btn=CruiseButtons.UNPRESS), + *create_button_events(self.CS.distance_button, self.CS.prev_distance_button, + {1: ButtonType.gapAdjustCruise}) + ] # The ECM allows enabling on falling edge of set, but only rising edge of resume events = self.create_common_events(ret, extra_gears=[GearShifter.sport, GearShifter.low, From 1fe61569f720a30db58379b451452b84239c2e37 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 9 Mar 2024 23:31:50 -0800 Subject: [PATCH 457/923] fix status -> state typo --- selfdrive/ui/ui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/ui.py b/selfdrive/ui/ui.py index ea2ee51a45..660495b1de 100755 --- a/selfdrive/ui/ui.py +++ b/selfdrive/ui/ui.py @@ -52,7 +52,7 @@ if __name__ == "__main__": onroad = sm.all_checks(['deviceState']) and sm['deviceState'].started if onroad: cs = sm['controlsState'] - color = ("grey" if str(cs.status) in ("overriding", "preEnabled") else "green") if cs.enabled else "blue" + color = ("grey" if str(cs.state) in ("overriding", "preEnabled") else "green") if cs.enabled else "blue" bg.setText("\U0001F44D" if cs.engageable else "\U0001F6D1") bg.setStyleSheet(f"font-size: 100px; background-color: {color};") bg.show() From 4d1b1001526970012364b843cbbb997bfd983842 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sat, 9 Mar 2024 23:33:24 -0800 Subject: [PATCH 458/923] cgpsd: use a real source --- cereal | 2 +- system/qcomgpsd/cgpsd.py | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index cf7bb3e749..93d3df3210 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit cf7bb3e74974879abef94286fab4d39398fe402b +Subproject commit 93d3df3210a8c4f4c7e6f45950f73dc8a2f09a2c diff --git a/system/qcomgpsd/cgpsd.py b/system/qcomgpsd/cgpsd.py index 04a92d4a45..54d3c623f3 100755 --- a/system/qcomgpsd/cgpsd.py +++ b/system/qcomgpsd/cgpsd.py @@ -57,6 +57,10 @@ def main(): # 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) @@ -85,8 +89,7 @@ def main(): gps.hasFix = gnrmc[1] == 'A' - # TODO: make our own source - gps.source = log.GpsLocationData.SensorSource.qcomdiag + gps.source = log.GpsLocationData.SensorSource.unicore gps.speed = sfloat(gnrmc[7]) gps.bearingDeg = sfloat(gnrmc[8]) From d651bc802b540089acb4c3b9d5d984fb8b554487 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sun, 10 Mar 2024 00:12:18 -0800 Subject: [PATCH 459/923] ButtonParamControl: use buttonClicked (#31817) --- selfdrive/ui/qt/widgets/controls.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index e4630c6590..f6e099ce50 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -223,10 +223,8 @@ public: button_group->addButton(button, i); } - QObject::connect(button_group, QOverload::of(&QButtonGroup::buttonToggled), [=](int id, bool checked) { - if (checked) { - params.put(key, std::to_string(id)); - } + QObject::connect(button_group, QOverload::of(&QButtonGroup::buttonClicked), [=](int id) { + params.put(key, std::to_string(id)); }); } From 1b6178a77d723fc4b96c5010f0d37164f98ecd27 Mon Sep 17 00:00:00 2001 From: Mauricio Alvarez Leon <65101411+BBBmau@users.noreply.github.com> Date: Sun, 10 Mar 2024 10:11:41 -0700 Subject: [PATCH 460/923] Add autoconnect support for hidden WiFi networks (#31789) * add autoconnect to WifiManager::connect * set wifi/hidden to true * typo * add condition to only set connection[wireless][hidden] to true when connecting to a hidden network * default false value for is_hidden --- selfdrive/ui/qt/network/networking.cc | 10 +++++----- selfdrive/ui/qt/network/wifi_manager.cc | 3 ++- selfdrive/ui/qt/network/wifi_manager.h | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/selfdrive/ui/qt/network/networking.cc b/selfdrive/ui/qt/network/networking.cc index 5354a01fa0..d7cdddff44 100644 --- a/selfdrive/ui/qt/network/networking.cc +++ b/selfdrive/ui/qt/network/networking.cc @@ -82,11 +82,11 @@ void Networking::connectToNetwork(const Network n) { if (wifi->isKnownConnection(n.ssid)) { wifi->activateWifiConnection(n.ssid); } else if (n.security_type == SecurityType::OPEN) { - wifi->connect(n); + wifi->connect(n, false); } else if (n.security_type == SecurityType::WPA) { QString pass = InputDialog::getText(tr("Enter password"), this, tr("for \"%1\"").arg(QString::fromUtf8(n.ssid)), true, 8); if (!pass.isEmpty()) { - wifi->connect(n, pass); + wifi->connect(n, false, pass); } } } @@ -96,7 +96,7 @@ void Networking::wrongPassword(const QString &ssid) { const Network &n = wifi->seenNetworks.value(ssid); QString pass = InputDialog::getText(tr("Wrong password"), this, tr("for \"%1\"").arg(QString::fromUtf8(n.ssid)), true, 8); if (!pass.isEmpty()) { - wifi->connect(n, pass); + wifi->connect(n, false, pass); } } } @@ -192,9 +192,9 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid hidden_network.ssid = ssid.toUtf8(); if (!pass.isEmpty()) { hidden_network.security_type = SecurityType::WPA; - wifi->connect(hidden_network, pass); + wifi->connect(hidden_network, true, pass); } else { - wifi->connect(hidden_network); + wifi->connect(hidden_network, true); } emit requestWifiScreen(); } diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index ebb5cb8736..111726330d 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -166,7 +166,7 @@ SecurityType WifiManager::getSecurityType(const QVariantMap &properties) { } } -void WifiManager::connect(const Network &n, const QString &password, const QString &username) { +void WifiManager::connect(const Network &n, const bool is_hidden, const QString &password, const QString &username) { setCurrentConnecting(n.ssid); forgetConnection(n.ssid); // Clear all connections that may already exist to the network we are connecting Connection connection; @@ -176,6 +176,7 @@ void WifiManager::connect(const Network &n, const QString &password, const QStri connection["connection"]["autoconnect-retries"] = 0; connection["802-11-wireless"]["ssid"] = n.ssid; + connection["802-11-wireless"]["hidden"] = is_hidden; connection["802-11-wireless"]["mode"] = "infrastructure"; if (n.security_type == SecurityType::WPA) { diff --git a/selfdrive/ui/qt/network/wifi_manager.h b/selfdrive/ui/qt/network/wifi_manager.h index 7debffa452..933f25c9d4 100644 --- a/selfdrive/ui/qt/network/wifi_manager.h +++ b/selfdrive/ui/qt/network/wifi_manager.h @@ -52,7 +52,7 @@ public: std::optional activateWifiConnection(const QString &ssid); NetworkType currentNetworkType(); void updateGsmSettings(bool roaming, QString apn, bool metered); - void connect(const Network &ssid, const QString &password = {}, const QString &username = {}); + void connect(const Network &ssid, const bool is_hidden = false, const QString &password = {}, const QString &username = {}); // Tethering functions void setTetheringEnabled(bool enabled); From f6665f8488b9d407a710dda3dce7344acebf5e67 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 10 Mar 2024 14:29:50 -0700 Subject: [PATCH 461/923] thermald: add deviceType to logs (#31819) * thermald: add deviceType to logs * fix --- cereal | 2 +- selfdrive/thermald/thermald.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/cereal b/cereal index 93d3df3210..724d1d22ac 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 93d3df3210a8c4f4c7e6f45950f73dc8a2f09a2c +Subproject commit 724d1d22ac877ff75058f0d62860cf51c27f3546 diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 93ebd3ab87..bfc50c4478 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -216,6 +216,7 @@ def thermald_thread(end_event, hw_queue) -> None: 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: From 7436aa8b053aeccfc9bacb06bfaf4a42b3ec5f78 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 10 Mar 2024 16:39:40 -0700 Subject: [PATCH 462/923] modeld: prep for camera transform refactor (#31820) * modeld: prep for camera transform refactor * update refs * add pub * do setup --- selfdrive/modeld/modeld.py | 4 ++-- selfdrive/test/process_replay/model_replay.py | 20 +++++++++++-------- .../test/process_replay/process_replay.py | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index e086b8aaf8..fe523dbd35 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -153,7 +153,7 @@ def main(demo=False): # messaging pm = PubMaster(["modelV2", "cameraOdometry"]) - sm = SubMaster(["carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel", "navInstruction", "carControl"]) + sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "navModel", "navInstruction", "carControl"]) publish_state = PublishState() params = Params() @@ -225,7 +225,7 @@ def main(demo=False): is_rhd = sm["driverMonitoringState"].isRHD frame_id = sm["roadCameraState"].frameId lateral_control_params = np.array([sm["carState"].vEgo, steer_delay], dtype=np.float32) - if sm.updated["liveCalibration"]: + 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) diff --git a/selfdrive/test/process_replay/model_replay.py b/selfdrive/test/process_replay/model_replay.py index 97b7c7c46c..94895285df 100755 --- a/selfdrive/test/process_replay/model_replay.py +++ b/selfdrive/test/process_replay/model_replay.py @@ -107,14 +107,17 @@ 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"}) dmodeld_logs = trim_logs_to_max_frames(lr, MAX_FRAMES, {"driverCameraState"}, {"driverEncodeIdx", "carParams"}) + if not SEND_EXTRA_INPUTS: - modeld_logs = [msg for msg in modeld_logs if msg.which() not in ["liveCalibration",]] - dmodeld_logs = [msg for msg in dmodeld_logs if msg.which() not in ["liveCalibration",]] - # initial calibration - cal_msg = next(msg for msg in lr if msg.which() == "liveCalibration").as_builder() - cal_msg.logMonoTime = lr[0].logMonoTime - modeld_logs.insert(0, cal_msg.as_reader()) - dmodeld_logs.insert(0, cal_msg.as_reader()) + modeld_logs = [msg for msg in modeld_logs if msg.which() != 'liveCalibration'] + dmodeld_logs = [msg for msg in dmodeld_logs if msg.which() != 'liveCalibration'] + + # initial setup + for s in ('liveCalibration', 'deviceState'): + msg = next(msg for msg in lr if msg.which() == s).as_builder() + msg.logMonoTime = lr[0].logMonoTime + modeld_logs.insert(1, msg.as_reader()) + dmodeld_logs.insert(1, msg.as_reader()) modeld = get_process_config("modeld") dmonitoringmodeld = get_process_config("dmonitoringmodeld") @@ -218,7 +221,8 @@ if __name__ == "__main__": results[TEST_ROUTE]["models"] = compare_logs(cmp_log, log_msgs, tolerance=tolerance, ignore_fields=ignore) diff_short, diff_long, failed = format_diff(results, log_paths, ref_commit) - print(diff_long) + if "CI" in os.environ: + print(diff_long) print('-------------\n'*5) print(diff_short) with open("model_diff.txt", "w") as f: diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 5119be0a8c..233f5d746a 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -546,7 +546,7 @@ CONFIGS = [ ), ProcessConfig( proc_name="modeld", - pubs=["roadCameraState", "wideRoadCameraState", "liveCalibration", "driverMonitoringState"], + pubs=["deviceState", "roadCameraState", "wideRoadCameraState", "liveCalibration", "driverMonitoringState"], subs=["modelV2", "cameraOdometry"], ignore=["logMonoTime", "modelV2.frameDropPerc", "modelV2.modelExecutionTime"], should_recv_callback=ModeldCameraSyncRcvCallback(), From 6a7a99805839a7e2012b55c2282d545ee21bdff4 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 10 Mar 2024 16:44:21 -0700 Subject: [PATCH 463/923] 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 464/923] refactor camera transformations (#31818) * refactor camera transormations * update users * more stuff * more fix * swap * tici * lil shorter --- common/transformations/camera.py | 86 ++++++++++---------- 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, 114 insertions(+), 135 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 +@dataclass(frozen=True) +class CameraConfig: + width: int + height: int + focal_length: float -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) + @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] + ]) -# 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 + @property + def intrinsics_inv(self): + # aka 'K_inv' aka view_frame_from_camera_frame + return np.linalg.inv(self.intrinsics) -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]]) +@dataclass(frozen=True) +class DeviceCameraConfig: + fcam: CameraConfig + dcam: CameraConfig + ecam: CameraConfig -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]]) +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) -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]]) +DEVICE_CAMERAS = { + # A "device camera" is defined by a device type and sensor -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] + # 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 465/923] 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 466/923] 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 467/923] [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 ef727550a97298341208337529109fd34841d101 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 11 Mar 2024 14:28:55 -0400 Subject: [PATCH 468/923] Params: `BACKUP` ParamKeyType for sunnylink's Settings Backup --- common/params.cc | 226 +++++++++++++++++++++++------------------------ common/params.h | 1 + 2 files changed, 114 insertions(+), 113 deletions(-) diff --git a/common/params.cc b/common/params.cc index 195f4e0a11..607225f72f 100644 --- a/common/params.cc +++ b/common/params.cc @@ -110,17 +110,17 @@ std::unordered_map keys = { {"CurrentBootlog", PERSISTENT}, {"CurrentRoute", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"DisableLogging", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, - {"DisablePowerDown", PERSISTENT}, - {"DisableUpdates", PERSISTENT}, - {"DisengageOnAccelerator", PERSISTENT}, + {"DisablePowerDown", PERSISTENT | BACKUP}, + {"DisableUpdates", PERSISTENT | BACKUP}, + {"DisengageOnAccelerator", PERSISTENT | BACKUP}, {"DmModelInitialized", CLEAR_ON_ONROAD_TRANSITION}, {"DongleId", PERSISTENT}, {"DoReboot", CLEAR_ON_MANAGER_START}, {"DoShutdown", CLEAR_ON_MANAGER_START}, {"DoUninstall", CLEAR_ON_MANAGER_START}, - {"ExperimentalLongitudinalEnabled", PERSISTENT | DEVELOPMENT_ONLY}, - {"ExperimentalMode", PERSISTENT}, - {"ExperimentalModeConfirmed", PERSISTENT}, + {"ExperimentalLongitudinalEnabled", PERSISTENT | DEVELOPMENT_ONLY | BACKUP}, + {"ExperimentalMode", PERSISTENT | BACKUP}, + {"ExperimentalModeConfirmed", PERSISTENT | BACKUP}, {"FirmwareQueryDone", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"ForcePowerDown", PERSISTENT}, {"GitBranch", PERSISTENT}, @@ -130,17 +130,17 @@ std::unordered_map keys = { {"GithubSshKeys", PERSISTENT}, {"GithubUsername", PERSISTENT}, {"GitRemote", PERSISTENT}, - {"GsmApn", PERSISTENT}, - {"GsmMetered", PERSISTENT}, - {"GsmRoaming", PERSISTENT}, + {"GsmApn", PERSISTENT | BACKUP}, + {"GsmMetered", PERSISTENT | BACKUP}, + {"GsmRoaming", PERSISTENT | BACKUP}, {"HardwareSerial", PERSISTENT}, {"HasAcceptedTerms", PERSISTENT}, {"IMEI", PERSISTENT}, {"InstallDate", PERSISTENT}, {"IsDriverViewEnabled", CLEAR_ON_MANAGER_START}, {"IsEngaged", PERSISTENT}, - {"IsLdwEnabled", PERSISTENT}, - {"IsMetric", PERSISTENT}, + {"IsLdwEnabled", PERSISTENT | BACKUP}, + {"IsMetric", PERSISTENT | BACKUP}, {"IsOffroad", CLEAR_ON_MANAGER_START}, {"IsOnroad", PERSISTENT}, {"IsRhdDetected", PERSISTENT}, @@ -149,7 +149,7 @@ std::unordered_map keys = { {"IsTakingSnapshot", CLEAR_ON_MANAGER_START}, {"IsTestedBranch", CLEAR_ON_MANAGER_START}, {"JoystickDebugMode", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, - {"LanguageSetting", PERSISTENT}, + {"LanguageSetting", PERSISTENT | BACKUP}, {"LastAthenaPingTime", CLEAR_ON_MANAGER_START}, {"LastGPSPosition", PERSISTENT}, {"LastManagerExitReason", CLEAR_ON_MANAGER_START}, @@ -159,12 +159,12 @@ std::unordered_map keys = { {"LastUpdateTime", PERSISTENT}, {"LiveParameters", PERSISTENT}, {"LiveTorqueParameters", PERSISTENT | DONT_LOG}, - {"LongitudinalPersonality", PERSISTENT}, + {"LongitudinalPersonality", PERSISTENT | BACKUP}, {"NavDestination", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"NavDestinationWaypoints", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"NavPastDestinations", PERSISTENT}, - {"NavSettingLeftSide", PERSISTENT}, - {"NavSettingTime24h", PERSISTENT}, + {"NavSettingLeftSide", PERSISTENT | BACKUP}, + {"NavSettingTime24h", PERSISTENT | BACKUP}, {"NetworkMetered", PERSISTENT}, {"ObdMultiplexingChanged", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"ObdMultiplexingEnabled", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, @@ -182,12 +182,12 @@ std::unordered_map keys = { {"Offroad_UnofficialHardware", CLEAR_ON_MANAGER_START}, {"Offroad_UpdateFailed", CLEAR_ON_MANAGER_START}, {"Offroad_OSMUpdateRequired", CLEAR_ON_MANAGER_START}, - {"OpenpilotEnabledToggle", PERSISTENT}, + {"OpenpilotEnabledToggle", PERSISTENT | BACKUP}, {"PandaHeartbeatLost", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"PandaSomResetTriggered", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, {"PandaSignatures", CLEAR_ON_MANAGER_START}, {"PrimeType", PERSISTENT}, - {"RecordFront", PERSISTENT}, + {"RecordFront", PERSISTENT | BACKUP}, {"RecordFrontLock", PERSISTENT}, // for the internal fleet {"ReplayControlsState", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"SnoozeUpdate", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, @@ -210,114 +210,114 @@ std::unordered_map keys = { {"Version", PERSISTENT}, {"VisionRadarToggle", PERSISTENT}, - {"AccMadsCombo", PERSISTENT}, - {"AmapKey1", PERSISTENT}, - {"AmapKey2", PERSISTENT}, - {"ApiCache_DriveStats", PERSISTENT}, - {"AutoLaneChangeTimer", PERSISTENT}, - {"AutoLaneChangeBsmDelay", PERSISTENT}, - {"BelowSpeedPause", PERSISTENT}, - {"BrakeLights", PERSISTENT}, - {"BrightnessControl", PERSISTENT}, - {"ButtonAutoHide", PERSISTENT}, - {"CameraControl", PERSISTENT}, - {"CameraControlToggle", PERSISTENT}, - {"CameraOffset", PERSISTENT}, - {"CarModel", PERSISTENT}, - {"CarModelText", PERSISTENT}, - {"ChevronInfo", PERSISTENT}, - {"CustomBootScreen", PERSISTENT}, - {"CustomDrivingModel", PERSISTENT}, - {"CustomMapboxTokenPk", PERSISTENT}, - {"CustomMapboxTokenSk", PERSISTENT}, - {"CustomOffsets", PERSISTENT}, - {"CustomStockLong", PERSISTENT}, - {"CustomTorqueLateral", PERSISTENT}, - {"DevUIInfo", PERSISTENT}, - {"DisableOnroadUploads", PERSISTENT}, - {"DisengageLateralOnBrake", PERSISTENT}, - {"DrivingModelGeneration", PERSISTENT}, - {"DrivingModelMetadataText", PERSISTENT}, - {"DrivingModelName", PERSISTENT}, - {"DrivingModelText", PERSISTENT}, - {"DrivingModelUrl", PERSISTENT}, - {"DynamicExperimentalControl", PERSISTENT}, - {"DynamicLaneProfile", PERSISTENT}, - {"EnableAmap", PERSISTENT}, - {"EnableGmap", PERSISTENT}, - {"EnableMads", PERSISTENT}, - {"EnableSlc", PERSISTENT}, - {"EndToEndLongAlertLead", PERSISTENT}, - {"EndToEndLongAlertLight", PERSISTENT}, - {"EndToEndLongAlertUI", PERSISTENT}, - {"EndToEndLongToggle", PERSISTENT}, - {"EnforceTorqueLateral", PERSISTENT}, - {"EnhancedScc", PERSISTENT}, - {"FeatureStatus", PERSISTENT}, + {"AccMadsCombo", PERSISTENT | BACKUP}, + {"AmapKey1", PERSISTENT | BACKUP}, + {"AmapKey2", PERSISTENT | BACKUP}, + {"ApiCache_DriveStats", PERSISTENT | BACKUP}, + {"AutoLaneChangeTimer", PERSISTENT | BACKUP}, + {"AutoLaneChangeBsmDelay", PERSISTENT | BACKUP}, + {"BelowSpeedPause", PERSISTENT | BACKUP}, + {"BrakeLights", PERSISTENT | BACKUP}, + {"BrightnessControl", PERSISTENT | BACKUP}, + {"ButtonAutoHide", PERSISTENT | BACKUP}, + {"CameraControl", PERSISTENT | BACKUP}, + {"CameraControlToggle", PERSISTENT | BACKUP}, + {"CameraOffset", PERSISTENT | BACKUP}, + {"CarModel", PERSISTENT | BACKUP}, + {"CarModelText", PERSISTENT | BACKUP}, + {"ChevronInfo", PERSISTENT | BACKUP}, + {"CustomBootScreen", PERSISTENT | BACKUP}, + {"CustomDrivingModel", PERSISTENT | BACKUP}, + {"CustomMapboxTokenPk", PERSISTENT | BACKUP}, + {"CustomMapboxTokenSk", PERSISTENT | BACKUP}, + {"CustomOffsets", PERSISTENT | BACKUP}, + {"CustomStockLong", PERSISTENT | BACKUP}, + {"CustomTorqueLateral", PERSISTENT | BACKUP}, + {"DevUIInfo", PERSISTENT | BACKUP}, + {"DisableOnroadUploads", PERSISTENT | BACKUP}, + {"DisengageLateralOnBrake", PERSISTENT | BACKUP}, + {"DrivingModelGeneration", PERSISTENT | BACKUP}, + {"DrivingModelMetadataText", PERSISTENT | BACKUP}, + {"DrivingModelName", PERSISTENT | BACKUP}, + {"DrivingModelText", PERSISTENT | BACKUP}, + {"DrivingModelUrl", PERSISTENT | BACKUP}, + {"DynamicExperimentalControl", PERSISTENT | BACKUP}, + {"DynamicLaneProfile", PERSISTENT | BACKUP}, + {"EnableAmap", PERSISTENT | BACKUP}, + {"EnableGmap", PERSISTENT | BACKUP}, + {"EnableMads", PERSISTENT | BACKUP}, + {"EnableSlc", PERSISTENT | BACKUP}, + {"EndToEndLongAlertLead", PERSISTENT | BACKUP}, + {"EndToEndLongAlertLight", PERSISTENT | BACKUP}, + {"EndToEndLongAlertUI", PERSISTENT | BACKUP}, + {"EndToEndLongToggle", PERSISTENT | BACKUP}, + {"EnforceTorqueLateral", PERSISTENT | BACKUP}, + {"EnhancedScc", PERSISTENT | BACKUP}, + {"FeatureStatus", PERSISTENT | BACKUP}, {"FleetManagerPin", PERSISTENT}, - {"GmapKey", PERSISTENT}, - {"HandsOnWheelMonitoring", PERSISTENT}, - {"HideVEgoUi", PERSISTENT}, - {"HkgSmoothStop", PERSISTENT}, + {"GmapKey", PERSISTENT | BACKUP}, + {"HandsOnWheelMonitoring", PERSISTENT | BACKUP}, + {"HideVEgoUi", PERSISTENT | BACKUP}, + {"HkgSmoothStop", PERSISTENT | BACKUP}, {"HotspotOnBoot", PERSISTENT}, {"HotspotOnBootConfirmed", PERSISTENT}, - {"LastCarModel", PERSISTENT}, + {"LastCarModel", PERSISTENT | BACKUP}, {"LastSpeedLimitSignTap", PERSISTENT}, - {"LiveTorque", PERSISTENT}, - {"LiveTorqueRelaxed", PERSISTENT}, - {"LkasToggle", PERSISTENT}, - {"MadsCruiseMain", PERSISTENT}, - {"MadsIconToggle", PERSISTENT}, - {"MapboxFullScreen", PERSISTENT}, + {"LiveTorque", PERSISTENT | BACKUP}, + {"LiveTorqueRelaxed", PERSISTENT | BACKUP}, + {"LkasToggle", PERSISTENT | BACKUP}, + {"MadsCruiseMain", PERSISTENT | BACKUP}, + {"MadsIconToggle", PERSISTENT | BACKUP}, + {"MapboxFullScreen", PERSISTENT | BACKUP}, {"MapTargetVelocities", PERSISTENT}, - {"Map3DBuildings", PERSISTENT}, - {"MaxTimeOffroad", PERSISTENT}, - {"NavModelText", PERSISTENT}, - {"NavModelUrl", PERSISTENT}, - {"NNFF", PERSISTENT}, - {"NNFFCarModel", PERSISTENT}, - {"OnroadScreenOff", PERSISTENT}, - {"OnroadScreenOffBrightness", PERSISTENT}, - {"OnroadScreenOffEvent", PERSISTENT}, - {"OnroadSettings", PERSISTENT}, + {"Map3DBuildings", PERSISTENT | BACKUP}, + {"MaxTimeOffroad", PERSISTENT | BACKUP}, + {"NavModelText", PERSISTENT | BACKUP}, + {"NavModelUrl", PERSISTENT | BACKUP}, + {"NNFF", PERSISTENT | BACKUP}, + {"NNFFCarModel", PERSISTENT | BACKUP}, + {"OnroadScreenOff", PERSISTENT | BACKUP}, + {"OnroadScreenOffBrightness", PERSISTENT | BACKUP}, + {"OnroadScreenOffEvent", PERSISTENT | BACKUP}, + {"OnroadSettings", PERSISTENT | BACKUP}, {"OsmLocal", PERSISTENT}, {"OsmLocationName", PERSISTENT}, {"OsmLocationTitle", PERSISTENT}, {"OsmLocationUrl", PERSISTENT}, {"OsmWayTest", PERSISTENT}, {"OsmDownloadedDate", PERSISTENT}, - {"PathOffset", PERSISTENT}, - {"QuietDrive", PERSISTENT}, - {"RoadEdge", PERSISTENT}, - {"ReverseAccChange", PERSISTENT}, - {"ReverseDmCam", PERSISTENT}, - {"ScreenRecorder", PERSISTENT}, - {"ShowDebugUI", PERSISTENT}, - {"SidebarTemperatureOptions", PERSISTENT}, - {"SpeedLimitControlPolicy", PERSISTENT}, - {"SpeedLimitEngageType", PERSISTENT}, - {"SpeedLimitValueOffset", PERSISTENT}, - {"SpeedLimitOffsetType", PERSISTENT}, - {"SpeedLimitWarningFlash", PERSISTENT}, - {"SpeedLimitWarningType", PERSISTENT}, - {"SpeedLimitWarningValueOffset", PERSISTENT}, - {"SpeedLimitWarningOffsetType", PERSISTENT}, - {"StandStillTimer", PERSISTENT}, - {"StockLongToyota", PERSISTENT}, - {"SubaruManualParkingBrakeSng", PERSISTENT}, - {"TorqueDeadzoneDeg", PERSISTENT}, - {"TorqueFriction", PERSISTENT}, - {"TorqueMaxLatAccel", PERSISTENT}, - {"TorquedOverride", PERSISTENT}, - {"ToyotaSnG", PERSISTENT}, - {"ToyotaTSS2Long", PERSISTENT}, - {"TrueVEgoUi", PERSISTENT}, - {"TurnSpeedControl", PERSISTENT}, - {"TurnVisionControl", PERSISTENT}, + {"PathOffset", PERSISTENT | BACKUP}, + {"QuietDrive", PERSISTENT | BACKUP}, + {"RoadEdge", PERSISTENT | BACKUP}, + {"ReverseAccChange", PERSISTENT | BACKUP}, + {"ReverseDmCam", PERSISTENT | BACKUP}, + {"ScreenRecorder", PERSISTENT | BACKUP}, + {"ShowDebugUI", PERSISTENT | BACKUP}, + {"SidebarTemperatureOptions", PERSISTENT | BACKUP}, + {"SpeedLimitControlPolicy", PERSISTENT | BACKUP}, + {"SpeedLimitEngageType", PERSISTENT | BACKUP}, + {"SpeedLimitValueOffset", PERSISTENT | BACKUP}, + {"SpeedLimitOffsetType", PERSISTENT | BACKUP}, + {"SpeedLimitWarningFlash", PERSISTENT | BACKUP}, + {"SpeedLimitWarningType", PERSISTENT | BACKUP}, + {"SpeedLimitWarningValueOffset", PERSISTENT | BACKUP}, + {"SpeedLimitWarningOffsetType", PERSISTENT | BACKUP}, + {"StandStillTimer", PERSISTENT | BACKUP}, + {"StockLongToyota", PERSISTENT | BACKUP}, + {"SubaruManualParkingBrakeSng", PERSISTENT | BACKUP}, + {"TorqueDeadzoneDeg", PERSISTENT | BACKUP}, + {"TorqueFriction", PERSISTENT | BACKUP}, + {"TorqueMaxLatAccel", PERSISTENT | BACKUP}, + {"TorquedOverride", PERSISTENT | BACKUP}, + {"ToyotaSnG", PERSISTENT | BACKUP}, + {"ToyotaTSS2Long", PERSISTENT | BACKUP}, + {"TrueVEgoUi", PERSISTENT | BACKUP}, + {"TurnSpeedControl", PERSISTENT | BACKUP}, + {"TurnVisionControl", PERSISTENT | BACKUP}, {"DriverCameraHardwareMissing", PERSISTENT}, - {"VisionCurveLaneless", PERSISTENT}, - {"VwAccType", PERSISTENT}, - {"VwCCOnly", PERSISTENT}, + {"VisionCurveLaneless", PERSISTENT | BACKUP}, + {"VwAccType", PERSISTENT | BACKUP}, + {"VwCCOnly", PERSISTENT | BACKUP}, {"Offroad_SupersededUpdate", PERSISTENT}, // PFEIFER - MAPD {{ diff --git a/common/params.h b/common/params.h index d726a6185f..b40371f976 100644 --- a/common/params.h +++ b/common/params.h @@ -16,6 +16,7 @@ enum ParamKeyType { CLEAR_ON_OFFROAD_TRANSITION = 0x10, DONT_LOG = 0x20, DEVELOPMENT_ONLY = 0x40, + BACKUP = 0x80, ALL = 0xFFFFFFFF }; From 6768f13f6a9e5df40c438aae7f81b7fefeac8208 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 11 Mar 2024 11:36:45 -0700 Subject: [PATCH 469/923] [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 470/923] 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 471/923] 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 472/923] [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 473/923] 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 474/923] 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 475/923] 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 0daa1e846bc180aa37aa757848536243a4656be4 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 00:06:02 -0400 Subject: [PATCH 476/923] Map: Use `latActive` and `longActive` for navigation path color change --- selfdrive/ui/qt/maps/map.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index d505e4f5ff..3d6e35f383 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -163,8 +163,9 @@ void MapWindow::updateState(const UIState &s) { if (sm.updated("modelV2")) { // set path color on change, and show map on rising edge of navigate on openpilot + auto car_control = sm["carControl"].getCarControl(); bool nav_enabled = sm["modelV2"].getModelV2().getNavEnabled() && - sm["controlsState"].getControlsState().getEnabled(); + (car_control.getLatActive() || car_control.getLongActive()); if (nav_enabled != uiState()->scene.navigate_on_openpilot) { if (loaded_once) { m_map->setPaintProperty("navLayer", "line-color", getNavPathColor(nav_enabled)); 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 477/923] 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 478/923] 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 479/923] 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 480/923] 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 481/923] 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 482/923] 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 483/923] 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 484/923] 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 485/923] 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 486/923] 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 487/923] 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 488/923] 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 489/923] 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 490/923] 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 491/923] 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 492/923] 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 493/923] [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 7dc9d336b5af24fae9594e340f7403553c2e6c97 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 14:55:25 +0000 Subject: [PATCH 494/923] ui: Lead car chevron improvements --- CHANGELOGS.md | 4 ++ .../qt/offroad/sunnypilot/visuals_settings.cc | 6 +-- selfdrive/ui/qt/onroad.cc | 38 ++++++++++++------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 4668117ca1..8bd8afcb66 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -8,6 +8,10 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) * RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms * openpilot Longitudianl Control available cars * Custom Stock Longitudinal Control available cars +* UI Updates + * Display Metrics Below Chevron + * NEW❗: Metrics is now being displayed below the chevron instead of above + * NEW❗: Display both Distance and Speed simultaneously sunnypilot - 0.9.6.1 (2024-02-27) ======================== diff --git a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc index 1d812444cb..2747602e3b 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc @@ -82,12 +82,12 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { dev_ui_settings->showDescription(); // Visuals: Display Metrics above Chevron - std::vector chevron_info_settings_texts{tr("Off"), tr("Distance"), tr("Speed")}; + std::vector chevron_info_settings_texts{tr("Off"), tr("Distance"), tr("Speed"), tr("Distance\nSpeed")}; chevron_info_settings = new ButtonParamControl( - "ChevronInfo", "Metrics above Chevron", "Display useful metrics above the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).", + "ChevronInfo", "Display Metrics Below Chevron", "Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).", "../assets/offroad/icon_blank.png", chevron_info_settings_texts, - 320 + 340 ); chevron_info_settings->showDescription(); diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index ee9f0d0119..ba20466ee4 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -1899,21 +1899,31 @@ void AnnotatedCameraWidget::drawLead(QPainter &painter, const cereal::RadarState painter.setBrush(redColor(fillAlpha)); painter.drawPolygon(chevron, std::size(chevron)); - if (num == 0) { // Display the distance to the 0th lead car - QString dist = ""; - if (chevron_data == 1) dist = QString::number(radar_d_rel,'f', 1) + "m"; - else if (chevron_data == 2) { - if (isMetric) dist = QString::number((radar_v_rel + v_ego) * 3.6,'f', 0) + "km/h"; - else dist = QString::number((radar_v_rel + v_ego) * 2.236936,'f', 0) + "mph"; + if (num == 0) { // Display metrics to the 0th lead car + QStringList chevron_text[2]; + if (chevron_data == 1 || chevron_data == 3) { + chevron_text[0].append(QString::number(radar_d_rel,'f', 1) + " " + "m"); + } + if (chevron_data == 2 || chevron_data == 3) { + chevron_text[chevron_data - 2].append(QString::number((radar_v_rel + v_ego) * (isMetric ? MS_TO_KPH : MS_TO_MPH),'f', 0) + " " + (isMetric ? "km/h" : "mph")); + } + + int str_w = 200; // Width of the text box, might need adjustment + int str_h = 50; // Height of the text box, adjust as necessary + painter.setFont(InterFont(45, QFont::Bold)); + // Calculate the center of the chevron and adjust the text box position + float text_y = y + sz + 12; // Position the text at the bottom of the chevron + QRect textRect(x - str_w / 2, text_y, str_w, str_h); // Adjust the rectangle to center the text horizontally at the chevron's bottom + QPoint shadow_offset(2, 2); + for (int i = 0; i < 2; ++i) { + if (!chevron_text[i].isEmpty()) { + painter.setPen(QColor(0x0, 0x0, 0x0, 200)); // Draw shadow + painter.drawText(textRect.translated(shadow_offset.x(), shadow_offset.y() + i * str_h), Qt::AlignBottom | Qt::AlignHCenter, chevron_text[i].at(0)); + painter.setPen(QColor(0xff, 0xff, 0xff)); // Draw text + painter.drawText(textRect.translated(0, i * str_h), Qt::AlignBottom | Qt::AlignHCenter, chevron_text[i].at(0)); + painter.setPen(Qt::NoPen); // Reset pen to default + } } - int str_w = 200; - painter.setFont(InterFont(44, QFont::DemiBold)); - painter.setPen(QColor(0x0, 0x0, 0x0 , 200)); // Shadow - float lock_indicator_dx = 2; // Avoid downward cross sights - painter.drawText(QRect(x + 2 + lock_indicator_dx, y - 50 + 2, str_w, 50), Qt::AlignBottom | Qt::AlignLeft, dist); - painter.setPen(QColor(0xff, 0xff, 0xff)); - painter.drawText(QRect(x + lock_indicator_dx, y - 50, str_w, 50), Qt::AlignBottom | Qt::AlignLeft, dist); - painter.setPen(Qt::NoPen); } painter.restore(); From de7f14dbd7f0f127f5903f10ed610da829eb67e6 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 12 Mar 2024 11:50:26 -0700 Subject: [PATCH 495/923] 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 496/923] 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 497/923] 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 498/923] 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 499/923] 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 920d4cdcc363aee2167acb70d7f36c9782377e3c Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 12 Mar 2024 21:13:47 -0400 Subject: [PATCH 500/923] Remove PNG and WAV from LFS --- .gitattributes | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 8781a7371f..912d2b3866 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,10 +5,10 @@ *.dlc filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text *.svg filter=lfs diff=lfs merge=lfs -text -*.png filter=lfs diff=lfs merge=lfs -text +#*.png filter=lfs diff=lfs merge=lfs -text *.gif filter=lfs diff=lfs merge=lfs -text *.ttf filter=lfs diff=lfs merge=lfs -text -*.wav filter=lfs diff=lfs merge=lfs -text +#*.wav filter=lfs diff=lfs merge=lfs -text selfdrive/car/tests/test_models_segs.txt filter=lfs diff=lfs merge=lfs -text system/hardware/tici/updater filter=lfs diff=lfs merge=lfs -text From a8192920737216fe07bd2f273efdee67669b8483 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Tue, 12 Mar 2024 23:04:17 -0400 Subject: [PATCH 501/923] 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 502/923] 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 503/923] 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 504/923] 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 505/923] 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 506/923] 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 e2d6a9ab3e52c0d0a5cb93c27e527611b08c0f70 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 13 Mar 2024 13:22:23 -0400 Subject: [PATCH 507/923] Params: Do not backup Driving Model Selector params --- common/params.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/params.cc b/common/params.cc index 607225f72f..0ad913c9fe 100644 --- a/common/params.cc +++ b/common/params.cc @@ -227,7 +227,7 @@ std::unordered_map keys = { {"CarModelText", PERSISTENT | BACKUP}, {"ChevronInfo", PERSISTENT | BACKUP}, {"CustomBootScreen", PERSISTENT | BACKUP}, - {"CustomDrivingModel", PERSISTENT | BACKUP}, + {"CustomDrivingModel", PERSISTENT}, {"CustomMapboxTokenPk", PERSISTENT | BACKUP}, {"CustomMapboxTokenSk", PERSISTENT | BACKUP}, {"CustomOffsets", PERSISTENT | BACKUP}, @@ -236,11 +236,11 @@ std::unordered_map keys = { {"DevUIInfo", PERSISTENT | BACKUP}, {"DisableOnroadUploads", PERSISTENT | BACKUP}, {"DisengageLateralOnBrake", PERSISTENT | BACKUP}, - {"DrivingModelGeneration", PERSISTENT | BACKUP}, - {"DrivingModelMetadataText", PERSISTENT | BACKUP}, - {"DrivingModelName", PERSISTENT | BACKUP}, - {"DrivingModelText", PERSISTENT | BACKUP}, - {"DrivingModelUrl", PERSISTENT | BACKUP}, + {"DrivingModelGeneration", PERSISTENT}, + {"DrivingModelMetadataText", PERSISTENT}, + {"DrivingModelName", PERSISTENT}, + {"DrivingModelText", PERSISTENT}, + {"DrivingModelUrl", PERSISTENT}, {"DynamicExperimentalControl", PERSISTENT | BACKUP}, {"DynamicLaneProfile", PERSISTENT | BACKUP}, {"EnableAmap", PERSISTENT | BACKUP}, From 98918b6afef5964b6e149ee0c46c785b2518891d Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 14:23:16 -0400 Subject: [PATCH 508/923] 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 28efb5388befc385152d820b2bfeeffee4d1daf3 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Wed, 13 Mar 2024 18:29:58 +0000 Subject: [PATCH 509/923] sunnylink: Registration API --- common/api/__init__.py | 53 ++++--------- common/api/base.py | 49 ++++++++++++ common/api/comma_connect.py | 11 +++ common/api/sunnylink.py | 118 ++++++++++++++++++++++++++++ common/params.cc | 1 + launch_chffrplus.sh | 3 +- release/files_common | 4 + selfdrive/athena/registration.py | 3 + selfdrive/manager/mapd_installer.py | 1 - selfdrive/manager/sunnylink.py | 17 ++++ 10 files changed, 222 insertions(+), 38 deletions(-) create mode 100644 common/api/base.py create mode 100644 common/api/comma_connect.py create mode 100644 common/api/sunnylink.py create mode 100755 selfdrive/manager/sunnylink.py diff --git a/common/api/__init__.py b/common/api/__init__.py index 79875023a2..ab18ed1abc 100644 --- a/common/api/__init__.py +++ b/common/api/__init__.py @@ -1,46 +1,27 @@ -import jwt -import os -import requests -from datetime import datetime, timedelta -from openpilot.system.hardware.hw import Paths -from openpilot.system.version import get_version +from .comma_connect import CommaConnectApi +from .sunnylink import SunnylinkApi -API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') -class Api(): - def __init__(self, dongle_id): - self.dongle_id = dongle_id - with open(Paths.persist_root()+'/comma/id_rsa') as f: - self.private_key = f.read() +class Api: + def __init__(self, dongle_id, use_sunnylink=False): + if use_sunnylink: + self.service = SunnylinkApi(dongle_id) + else: + self.service = CommaConnectApi(dongle_id) + + def request(self, method, endpoint, **params): + return self.service.request(method, endpoint, **params) def get(self, *args, **kwargs): - return self.request('GET', *args, **kwargs) + return self.service.get(*args, **kwargs) def post(self, *args, **kwargs): - return self.request('POST', *args, **kwargs) - - def request(self, method, endpoint, timeout=None, access_token=None, **params): - return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + return self.service.post(*args, **kwargs) def get_token(self, expiry_hours=1): - now = datetime.utcnow() - payload = { - 'identity': self.dongle_id, - 'nbf': now, - 'iat': now, - 'exp': now + timedelta(hours=expiry_hours) - } - token = jwt.encode(payload, self.private_key, algorithm='RS256') - if isinstance(token, bytes): - token = token.decode('utf8') - return token + return self.service.get_token(expiry_hours) -def api_get(endpoint, method='GET', timeout=None, access_token=None, **params): - headers = {} - if access_token is not None: - headers['Authorization'] = "JWT " + access_token - - headers['User-Agent'] = "openpilot-" + get_version() - - return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params) +def api_get(endpoint, method='GET', timeout=None, access_token=None, use_sunnylink=False, **params): + return CommaConnectApi(None).api_get(endpoint, method, timeout, access_token, **params) if not use_sunnylink else \ + SunnylinkApi(None).api_get(endpoint, method, timeout, access_token, **params) diff --git a/common/api/base.py b/common/api/base.py new file mode 100644 index 0000000000..a61566c3ba --- /dev/null +++ b/common/api/base.py @@ -0,0 +1,49 @@ +import jwt +import requests +from datetime import datetime, timedelta +from openpilot.system.hardware.hw import Paths +from openpilot.system.version import get_version + + +class BaseApi: + def __init__(self, dongle_id, api_host, user_agent="openpilot-"): + self.dongle_id = dongle_id + self.api_host = api_host + self.user_agent = user_agent + with open(Paths.persist_root()+'/comma/id_rsa') as f: + self.private_key = f.read() + + def get(self, *args, **kwargs): + return self.request('GET', *args, **kwargs) + + def post(self, *args, **kwargs): + return self.request('POST', *args, **kwargs) + + def request(self, method, endpoint, timeout=None, access_token=None, **params): + return self.api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) + + def _get_token(self, expiry_hours=1, **extra_payload): + now = datetime.utcnow() + payload = { + 'identity': self.dongle_id, + 'nbf': now, + 'iat': now, + 'exp': now + timedelta(hours=expiry_hours), + **extra_payload + } + token = jwt.encode(payload, self.private_key, algorithm='RS256') + if isinstance(token, bytes): + token = token.decode('utf8') + return token + + def get_token(self, expiry_hours=1): + return self._get_token(expiry_hours) + + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, **params): + headers = {} + if access_token is not None: + headers['Authorization'] = "JWT " + access_token + + headers['User-Agent'] = self.user_agent + get_version() + + return requests.request(method, self.api_host + "/" + endpoint, timeout=timeout, headers=headers, params=params) diff --git a/common/api/comma_connect.py b/common/api/comma_connect.py new file mode 100644 index 0000000000..1c705f3722 --- /dev/null +++ b/common/api/comma_connect.py @@ -0,0 +1,11 @@ +import os + +from openpilot.common.api.base import BaseApi + +API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') + + +class CommaConnectApi(BaseApi): + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "openpilot-" diff --git a/common/api/sunnylink.py b/common/api/sunnylink.py new file mode 100644 index 0000000000..9166760dc7 --- /dev/null +++ b/common/api/sunnylink.py @@ -0,0 +1,118 @@ +import os +import time +import jwt +import json +from pathlib import Path +from datetime import datetime, timedelta +from openpilot.common.params import Params +from openpilot.system.hardware import HARDWARE +from openpilot.system.hardware.hw import Paths + +from openpilot.common.api.base import BaseApi + +API_HOST = os.getenv('SUNNYLINK_API_HOST', 'https://stg.api.sunnypilot.ai') +UNREGISTERED_SUNNYLINK_DONGLE_ID = "UnregisteredDevice" +MAX_RETRIES = 6 + + +class SunnylinkApi(BaseApi): + def __init__(self, dongle_id): + super().__init__(dongle_id, API_HOST) + self.user_agent = "sunnypilot-" + self.spinner = None + + def get_token(self, expiry_hours=1): + # Add your additional data here + additional_data = {} + return super()._get_token(expiry_hours, **additional_data) + + def _status_update(self, message): + print(message) + if self.spinner: + self.spinner.update(message) + time.sleep(0.5) + + def _resolve_dongle_ids(self, params): + sunnylink_dongle_id = params.get("SunnylinkDongleId", encoding='utf-8') + comma_dongle_id = self.dongle_id or params.get("DongleId", encoding='utf-8') + return sunnylink_dongle_id, comma_dongle_id + + def _resolve_imeis(self, params): + imei1, imei2 = None, None + imei_try = 0 + while imei1 is None and imei2 is None and imei_try < MAX_RETRIES: + try: + imei1, imei2 = params.get("IMEI", encoding='utf8') or HARDWARE.get_imei(0), HARDWARE.get_imei(1) + except Exception: + self._status_update(f"Error getting imei, trying again... [{imei_try+1}/{MAX_RETRIES}]") + time.sleep(1) + imei_try += 1 + return imei1, imei2 + + def _resolve_serial(self, params): + serial = params.get("HardwareSerial", encoding='utf8') or HARDWARE.get_serial() + return serial + + def register_device(self, spinner=None, timeout=60, verbose=False): + self.spinner = spinner + params = Params() + + sunnylink_dongle_id, comma_dongle_id = self._resolve_dongle_ids(params) + + if comma_dongle_id is None: + self._status_update("Comma dongle ID not found, deferring sunnylink's registration to comma's registration process.") + return None + + imei1, imei2 = self._resolve_imeis(params) + serial = self._resolve_serial(params) + + if sunnylink_dongle_id not in (None, UNREGISTERED_SUNNYLINK_DONGLE_ID): + return sunnylink_dongle_id + + privkey_path = Path(Paths.persist_root()+"/comma/id_rsa") + pubkey_path = Path(Paths.persist_root()+"/comma/id_rsa.pub") + + if not pubkey_path.is_file(): + sunnylink_dongle_id = UNREGISTERED_SUNNYLINK_DONGLE_ID + self._status_update("Public key not found, setting dongle ID to unregistered.") + else: + with pubkey_path.open() as f1, privkey_path.open() as f2: + public_key = f1.read() + private_key = f2.read() + + start_time = time.monotonic() + backoff = 1 + while True: + register_token = jwt.encode({'register': True, 'exp': datetime.utcnow() + timedelta(hours=1)}, private_key, algorithm='RS256') + try: + if verbose or time.monotonic() - start_time < timeout / 2: + self._status_update("Registering device to sunnylink...") + elif time.monotonic() - start_time >= timeout / 2: + self._status_update("Still registering device to sunnylink...") + + resp = self.api_get("v2/pilotauth/", method='POST', timeout=15, imei=imei1, imei2=imei2, serial=serial, comma_dongle_id=comma_dongle_id, public_key=public_key, register_token=register_token) + + if resp.status_code != 200: + raise Exception(f"Failed to register with sunnylink. Status code: {resp.status_code}") + else: + dongleauth = json.loads(resp.text) + sunnylink_dongle_id = dongleauth["dongle_id"] + if sunnylink_dongle_id: + self._status_update("Device registered successfully.") + break + except Exception as e: + if verbose: + self._status_update(f"Waiting {backoff}s before retry, Exception occurred during registration: [{str(e)}]") + backoff = min(backoff * 2, 60) + time.sleep(backoff) + + if time.monotonic() - start_time > timeout: + self._status_update(f"Giving up on sunnylink's registration after {timeout}s. Will retry on next boot.") + time.sleep(3) + break + + if sunnylink_dongle_id: + params.put("SunnylinkDongleId", sunnylink_dongle_id) + + self.spinner = None + return sunnylink_dongle_id diff --git a/common/params.cc b/common/params.cc index 0ad913c9fe..e06508a283 100644 --- a/common/params.cc +++ b/common/params.cc @@ -305,6 +305,7 @@ std::unordered_map keys = { {"StandStillTimer", PERSISTENT | BACKUP}, {"StockLongToyota", PERSISTENT | BACKUP}, {"SubaruManualParkingBrakeSng", PERSISTENT | BACKUP}, + {"SunnylinkDongleId", PERSISTENT}, {"TorqueDeadzoneDeg", PERSISTENT | BACKUP}, {"TorqueFriction", PERSISTENT | BACKUP}, {"TorqueMaxLatAccel", PERSISTENT | BACKUP}, diff --git a/launch_chffrplus.sh b/launch_chffrplus.sh index e2ea717d13..9ef8ae2c0a 100755 --- a/launch_chffrplus.sh +++ b/launch_chffrplus.sh @@ -86,7 +86,8 @@ function launch { if [ ! -f $DIR/prebuilt ]; then ./build.py fi - ./mapd_installer.py && ./manager.py + + ./sunnylink.py; ./mapd_installer.py; ./manager.py # if broken, keep on screen error while true; do sleep 1; done diff --git a/release/files_common b/release/files_common index 1378fa903f..b8bf8c709f 100644 --- a/release/files_common +++ b/release/files_common @@ -44,6 +44,9 @@ common/transformations/transformations.pxd common/transformations/transformations.pyx common/api/__init__.py +common/api/base.py +common/api/comma_connect.py +common/api/sunnylink.py release/* @@ -329,6 +332,7 @@ selfdrive/manager/__init__.py selfdrive/manager/build.py selfdrive/manager/helpers.py selfdrive/manager/mapd_installer.py +selfdrive/manager/sunnylink.py selfdrive/manager/manager.py selfdrive/manager/process_config.py selfdrive/manager/process.py diff --git a/selfdrive/athena/registration.py b/selfdrive/athena/registration.py index 6574d9ac20..840aa6541c 100755 --- a/selfdrive/athena/registration.py +++ b/selfdrive/athena/registration.py @@ -6,6 +6,7 @@ from pathlib import Path from datetime import datetime, timedelta from openpilot.common.api import api_get +from openpilot.common.api.sunnylink import SunnylinkApi from openpilot.common.params import Params from openpilot.common.spinner import Spinner from openpilot.selfdrive.controls.lib.alertmanager import set_offroad_alert @@ -86,6 +87,8 @@ def register(show_spinner=False) -> str | None: if time.monotonic() - start_time > 60 and show_spinner: spinner.update(f"registering device - serial: {serial}, IMEI: ({imei1}, {imei2})") + SunnylinkApi(dongle_id).register_device(spinner if show_spinner else None) + if show_spinner: spinner.close() diff --git a/selfdrive/manager/mapd_installer.py b/selfdrive/manager/mapd_installer.py index 2767115861..ec11e4aeb1 100755 --- a/selfdrive/manager/mapd_installer.py +++ b/selfdrive/manager/mapd_installer.py @@ -139,5 +139,4 @@ if __name__ == "__main__": install_manager.update_installed_version(VERSION) else: spinner.update(f"Checking if mapd is installed and valid. Prebuilt [{is_prebuilt()}]") - time.sleep(1) install_manager.non_prebuilt_install() diff --git a/selfdrive/manager/sunnylink.py b/selfdrive/manager/sunnylink.py new file mode 100755 index 0000000000..6b9b4a8318 --- /dev/null +++ b/selfdrive/manager/sunnylink.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python3 +from openpilot.common.api.sunnylink import SunnylinkApi +from openpilot.common.spinner import Spinner +from openpilot.system.version import is_prebuilt + + +if __name__ == "__main__": + spinner = Spinner() + extra_args = {} + if not is_prebuilt(): + extra_args = { + "verbose": True, + "timeout": 60 + } + + SunnylinkApi(None).register_device(spinner, **extra_args) + spinner.close() From 0efb62c11caeeccbbc366a0798975e525368a631 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 14:40:26 -0400 Subject: [PATCH 510/923] 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 5b9a397078cfc72da05a2d6ad80bec730cddf3a6 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 13 Mar 2024 19:50:00 +0000 Subject: [PATCH 511/923] sunnylink: Config Backup --- CHANGELOGS.md | 8 + selfdrive/ui/SConscript | 3 +- selfdrive/ui/qt/api.cc | 138 +++++- selfdrive/ui/qt/api.h | 11 +- selfdrive/ui/qt/offroad/experimental_mode.cc | 2 +- selfdrive/ui/qt/offroad/settings.cc | 1 + .../offroad/sunnypilot/sunnylink_settings.cc | 437 ++++++++++++++++++ .../offroad/sunnypilot/sunnylink_settings.h | 97 ++++ selfdrive/ui/qt/offroad/sunnypilot_main.h | 1 + selfdrive/ui/qt/request_repeater.cc | 2 +- selfdrive/ui/qt/request_repeater.h | 2 +- selfdrive/ui/qt/util.cc | 10 + selfdrive/ui/qt/util.h | 1 + selfdrive/ui/ui.cc | 14 + selfdrive/ui/ui.h | 29 ++ system/hardware/hw.h | 4 + 16 files changed, 747 insertions(+), 13 deletions(-) create mode 100644 selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc create mode 100644 selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 8bd8afcb66..57a373c944 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -5,6 +5,14 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) ************************ * UPDATED: Synced with commaai's openpilot * master commit 56e343b (February 27, 2024) +* NEW❗: Config Backup (Alpha access only for GitHub Sponsors and Patreon supporters) + * Remotely back up and restore sunnypilot settings easily + * Device registration with sunnylink ensures a secure, integrated experience across services + * AES encryption derived from the device's RSA private key is used for utmost security + * Settings are encrypted on-device, transmitted securely via HTTPS, and stored encrypted on sunnylink + * Prevents loss of settings after device resets, offering peace of mind through end-to-end encryption + * Early alpha access to all current and previous GitHub Sponsors and Patreon supporters + * Go to https://discord.gg/sunnypilot and reach out to one of the moderators to confirm your alpha access * RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms * openpilot Longitudianl Control available cars * Custom Stock Longitudinal Control available cars diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index f5f37882e5..fe1831f505 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -33,7 +33,8 @@ widgets_src += ["qt/offroad/sunnypilot/display_settings.cc", "qt/offroad/sunnypi "qt/offroad/sunnypilot/monitoring_settings.cc", "qt/offroad/sunnypilot/osm_settings.cc", "qt/offroad/sunnypilot/custom_offsets_settings.cc", "qt/widgets/sunnypilot/drive_stats.cc", "qt/offroad/sunnypilot/software_settings_sp.cc", "qt/offroad/sunnypilot/models_fetcher.cc", - "qt/offroad/sunnypilot/speed_limit_warning_settings.cc", "qt/offroad/sunnypilot/speed_limit_policy_settings.cc"] + "qt/offroad/sunnypilot/speed_limit_warning_settings.cc", "qt/offroad/sunnypilot/speed_limit_policy_settings.cc", + "qt/offroad/sunnypilot/sunnylink_settings.cc"] qt_env['CPPDEFINES'] = [] if maps: diff --git a/selfdrive/ui/qt/api.cc b/selfdrive/ui/qt/api.cc index 0e321d4e10..bcde113215 100644 --- a/selfdrive/ui/qt/api.cc +++ b/selfdrive/ui/qt/api.cc @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include @@ -43,11 +45,130 @@ QByteArray rsa_sign(const QByteArray &data) { return sig; } -QString create_jwt(const QJsonObject &payloads, int expiry) { +void derive_aes_key_iv_from_rsa(EVP_PKEY *rsa_key, unsigned char *aes_key, unsigned char *aes_iv) { + unsigned char hash[SHA256_DIGEST_LENGTH]; + size_t pub_len; + unsigned char *pub_key; + + // Convert RSA key to public key in DER format for simplicity + pub_len = i2d_PublicKey(rsa_key, NULL); + pub_key = (unsigned char *)malloc(pub_len); + unsigned char *tmp = pub_key; + i2d_PublicKey(rsa_key, &tmp); + + // Hash the public key to derive bytes for AES key and IV + SHA256(pub_key, pub_len, hash); + + // Assuming AES-256-CBC, we need 32 bytes for the key and 16 for the IV + memcpy(aes_key, hash, 32); // First 32 bytes for AES key + memcpy(aes_iv, hash + 32 - 16, 16); // Last 16 bytes for AES IV + + free(pub_key); +} + +EVP_PKEY *load_public_key(const char *file) { + EVP_PKEY *key = NULL; + FILE *fp = fopen(file, "r"); + if (fp) { + key = PEM_read_PUBKEY(fp, NULL, NULL, NULL); + fclose(fp); + } + return key; +} + +EVP_PKEY *load_private_key(const char *file) { + EVP_PKEY *key = NULL; + FILE *fp = fopen(file, "r"); + if (fp) { + key = PEM_read_PrivateKey(fp, NULL, NULL, NULL); + fclose(fp); + } + return key; +} + +QByteArray rsa_encrypt(const QByteArray &data) { + EVP_PKEY *rsa_key = load_public_key(Path::rsa_pub_file().c_str()); // Load your RSA key + unsigned char aes_key[32], aes_iv[16]; + derive_aes_key_iv_from_rsa(rsa_key, aes_key, aes_iv); + + EVP_CIPHER_CTX *ctx; + if (!(ctx = EVP_CIPHER_CTX_new())) { + // Handle error: Allocate memory failed + return {}; + } + + if (EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, aes_key, aes_iv) != 1) { + qDebug() << "Failed to initialize encryption"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + + int ciphertext_len; + int len = data.size(); + unsigned char out[len + AES_BLOCK_SIZE]; + auto *in = (unsigned char*) data.constData(); + if (EVP_EncryptUpdate(ctx, out, &ciphertext_len, in, len) != 1) { + qDebug() << "Failed to update encryption"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + + if (EVP_EncryptFinal_ex(ctx, out + ciphertext_len, &len) != 1) { + // Handle error: Encryption finalize failed + qDebug() << "Failed to finalize encryption"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + + //qDebug() << "Encrypted data length: %d", ciphertext_len + len; // Print the length of encrypted data + EVP_CIPHER_CTX_free(ctx); + return {reinterpret_cast(out), ciphertext_len + len}; +} + +QByteArray rsa_decrypt(const QByteArray &data) { + EVP_PKEY *rsa_key = load_public_key(Path::rsa_pub_file().c_str()); // Load your RSA key + unsigned char aes_key[32], aes_iv[16]; + derive_aes_key_iv_from_rsa(rsa_key, aes_key, aes_iv); + + EVP_CIPHER_CTX *ctx; + if (!(ctx = EVP_CIPHER_CTX_new())) { + qDebug() << "Failed to allocate memory for EVP_CIPHER_CTX"; + return {}; + } + + if (EVP_DecryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, aes_key, aes_iv) != 1) { + qDebug() << "Failed to initialize EVP"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + + int len = data.size(); + unsigned char out[len + AES_BLOCK_SIZE]; + auto *in = (unsigned char*) data.constData(); + if (EVP_DecryptUpdate(ctx, out, &len, in, len) != 1) { + qDebug() << "Failed to update decryption"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + + int final_len; + if (EVP_DecryptFinal_ex(ctx, out + len, &final_len) != 1) { + qDebug() << "Failed to finalize decryption"; + EVP_CIPHER_CTX_free(ctx); + return {}; + } + EVP_CIPHER_CTX_free(ctx); + + //qDebug() << "Decrypted data length: %d", len + final_len; // Print the length of decrypted data + return {reinterpret_cast(out), len + final_len}; +} + +QString create_jwt(const QJsonObject &payloads, int expiry, bool sunnylink) { QJsonObject header = {{"alg", "RS256"}}; auto t = QDateTime::currentSecsSinceEpoch(); - QJsonObject payload = {{"identity", getDongleId().value_or("")}, {"nbf", t}, {"iat", t}, {"exp", t + expiry}}; + auto dongle_id = sunnylink ? getSunnylinkDongleId() : getDongleId(); + QJsonObject payload = {{"identity", dongle_id.value_or("")}, {"nbf", t}, {"iat", t}, {"exp", t + expiry}}; for (auto it = payloads.begin(); it != payloads.end(); ++it) { payload.insert(it.key(), it.value()); } @@ -64,7 +185,7 @@ QString create_jwt(const QJsonObject &payloads, int expiry) { } // namespace CommaApi -HttpRequest::HttpRequest(QObject *parent, bool create_jwt, int timeout) : create_jwt(create_jwt), QObject(parent) { +HttpRequest::HttpRequest(QObject *parent, bool create_jwt, int timeout, const bool sunnylink) : create_jwt(create_jwt), sunnylink(sunnylink), QObject(parent) { networkTimer = new QTimer(this); networkTimer->setSingleShot(true); networkTimer->setInterval(timeout); @@ -79,14 +200,14 @@ bool HttpRequest::timeout() const { return reply && reply->error() == QNetworkReply::OperationCanceledError; } -void HttpRequest::sendRequest(const QString &requestURL, const HttpRequest::Method method) { +void HttpRequest::sendRequest(const QString &requestURL, const HttpRequest::Method method, const QByteArray &payload) { if (active()) { qDebug() << "HttpRequest is active"; return; } QString token; if (create_jwt) { - token = CommaApi::create_jwt(); + token = CommaApi::create_jwt({}, 3600, sunnylink); } else { QString token_json = QString::fromStdString(util::read_file(util::getenv("HOME") + "/.comma/auth.json")); QJsonDocument json_d = QJsonDocument::fromJson(token_json.toUtf8()); @@ -96,6 +217,9 @@ void HttpRequest::sendRequest(const QString &requestURL, const HttpRequest::Meth QNetworkRequest request; request.setUrl(QUrl(requestURL)); request.setRawHeader("User-Agent", getUserAgent().toUtf8()); + if (!payload.isEmpty()) { + request.setRawHeader("Content-Type", "application/json"); + } if (!token.isEmpty()) { request.setRawHeader(QByteArray("Authorization"), ("JWT " + token).toUtf8()); @@ -105,6 +229,10 @@ void HttpRequest::sendRequest(const QString &requestURL, const HttpRequest::Meth reply = nam()->get(request); } else if (method == HttpRequest::Method::DELETE) { reply = nam()->deleteResource(request); + } else if (method == HttpRequest::Method::POST) { + reply = nam()->post(request, payload); + } else if (method == HttpRequest::Method::PUT) { + reply = nam()->put(request, payload); } networkTimer->start(); diff --git a/selfdrive/ui/qt/api.h b/selfdrive/ui/qt/api.h index ad64d7e722..bbebc502e5 100644 --- a/selfdrive/ui/qt/api.h +++ b/selfdrive/ui/qt/api.h @@ -11,7 +11,9 @@ namespace CommaApi { const QString BASE_URL = util::getenv("API_HOST", "https://api.commadotai.com").c_str(); QByteArray rsa_sign(const QByteArray &data); -QString create_jwt(const QJsonObject &payloads = {}, int expiry = 3600); +QByteArray rsa_encrypt(const QByteArray &data); +QByteArray rsa_decrypt(const QByteArray &data); +QString create_jwt(const QJsonObject &payloads = {}, int expiry = 3600, bool sunnylink = false); } // namespace CommaApi @@ -23,10 +25,10 @@ class HttpRequest : public QObject { Q_OBJECT public: - enum class Method {GET, DELETE}; + enum class Method {GET, DELETE, POST, PUT}; - explicit HttpRequest(QObject* parent, bool create_jwt = true, int timeout = 20000); - void sendRequest(const QString &requestURL, const Method method = Method::GET); + explicit HttpRequest(QObject* parent, bool create_jwt = true, int timeout = 20000, const bool sunnylink = false); + void sendRequest(const QString &requestURL, const Method method = Method::GET, const QByteArray &payload = {}); bool active() const; bool timeout() const; @@ -40,6 +42,7 @@ private: static QNetworkAccessManager *nam(); QTimer *networkTimer = nullptr; bool create_jwt; + bool sunnylink; private slots: void requestTimeout(); diff --git a/selfdrive/ui/qt/offroad/experimental_mode.cc b/selfdrive/ui/qt/offroad/experimental_mode.cc index b99220c1d1..b2c6f3323a 100644 --- a/selfdrive/ui/qt/offroad/experimental_mode.cc +++ b/selfdrive/ui/qt/offroad/experimental_mode.cc @@ -13,7 +13,7 @@ ExperimentalModeButton::ExperimentalModeButton(QWidget *parent) : QPushButton(pa experimental_pixmap = QPixmap("../assets/img_experimental_grey.svg").scaledToWidth(img_width, Qt::SmoothTransformation); // go to toggles and expand experimental mode description - connect(this, &QPushButton::clicked, [=]() { emit openSettings(2, "ExperimentalMode"); }); + connect(this, &QPushButton::clicked, [=]() { emit openSettings(3, "ExperimentalMode"); }); setFixedHeight(125); QHBoxLayout *main_layout = new QHBoxLayout; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 1d25b9e9ab..0d805ff8f5 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -534,6 +534,7 @@ SettingsWindow::SettingsWindow(QWidget *parent) : QFrame(parent) { QList panels = { PanelInfo(" " + tr("Device"), device, "../assets/navigation/icon_home.svg"), PanelInfo(" " + tr("Network"), new Networking(this), "../assets/offroad/icon_network.png"), + PanelInfo(" " + tr("sunnylink"), new SunnylinkPanel(this), "../assets/offroad/icon_wifi_strength_full.svg"), PanelInfo(" " + tr("Toggles"), toggles, "../assets/offroad/icon_toggle.png"), PanelInfo(" " + tr("Software"), new SoftwarePanelSP(this), "../assets/offroad/icon_software.png"), PanelInfo(" " + tr("sunnypilot"), new SunnypilotPanel(this), "../assets/offroad/icon_openpilot.png"), diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc new file mode 100644 index 0000000000..e306047501 --- /dev/null +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc @@ -0,0 +1,437 @@ +#include "selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h" + +SunnylinkPanel::SunnylinkPanel(QWidget* parent) : QFrame(parent) { + main_layout = new QStackedLayout(this); + + ListWidget *list = new ListWidget(this, false); + list->addItem(new LabelControl(tr("sunnylink Dongle ID"), getSunnylinkDongleId().value_or(tr("N/A")))); + list->addItem(horizontal_line()); + + popup = new SunnylinkSponsorPopup(this); + sponsorBtn = new ButtonControl( + tr("Sponsor Status"), tr("SPONSOR"), + tr("Become a sponsor of sunnypilot to get early access to sunnylink features.") + ); + list->addItem(sponsorBtn); + connect(sponsorBtn, &ButtonControl::clicked, [=]() { + popup->exec(); + }); + list->addItem(horizontal_line()); + + list->addItem(new LabelControl(tr("Manage Settings"))); + + backup_settings = new BackupSettings; + + // Backup Settings + backupSettings = new SubPanelButton(tr("Backup Settings"), 720, this); + backupSettings->setObjectName("backup_btn"); + // Set margin on the outside of the button + QVBoxLayout* backupSettingsLayout = new QVBoxLayout; + backupSettingsLayout->setContentsMargins(0, 0, 0, 30); + backupSettingsLayout->addWidget(backupSettings); + connect(backupSettings, &QPushButton::clicked, [=]() { + is_backup = true; + backup_settings->started(); + if (uiState()->isSubscriber()) { + if (ConfirmationDialog::confirm(tr("Are you sure you want to backup sunnypilot settings?"), tr("Backup"), this)) { + backup_settings->sendParams(backup_settings->backupParams()); + } else { + backup_settings->finished(); + } + } else { + if (ConfirmationDialog::confirm(tr("Early alpha access only. Become a sponsor to get early access to sunnylink features."), tr("Become a Sponsor"), this)) { + popup->exec(); + } + backup_settings->finished(); + } + is_backup = false; + }); + connect(backup_settings, &BackupSettings::updateLabels, this, &SunnylinkPanel::updateLabels); + + // Restore Settings + restoreSettings = new SubPanelButton(tr("Restore Settings"), 720, this); + restoreSettings->setObjectName("restore_btn"); + // Set margin on the outside of the button + QVBoxLayout* restoreSettingsLayout = new QVBoxLayout; + restoreSettingsLayout->setContentsMargins(0, 0, 0, 30); + restoreSettingsLayout->addWidget(restoreSettings); + connect(restoreSettings, &QPushButton::clicked, [=]() { + is_restore = true; + backup_settings->started(); + if (uiState()->isSubscriber()) { + if (ConfirmationDialog::confirm(tr("Are you sure you want to restore the last backed up sunnypilot settings?"), tr("Restore"), this)) { + backup_settings->getParams(); + } else { + backup_settings->finished(); + } + } else { + if (ConfirmationDialog::confirm(tr("Early alpha access only. Become a sponsor to get early access to sunnylink features."), tr("Become a Sponsor"), this)) { + popup->exec(); + } + backup_settings->finished(); + } + is_restore = false; + }); + connect(backup_settings, &BackupSettings::updateLabels, this, &SunnylinkPanel::updateLabels); + + // Settings Restore and Settings Backup in the same horizontal space + QHBoxLayout *settings_layout = new QHBoxLayout; + settings_layout->setContentsMargins(0, 0, 0, 30); + settings_layout->addWidget(backupSettings); + settings_layout->addSpacing(10); + settings_layout->addWidget(restoreSettings); + settings_layout->setAlignment(Qt::AlignLeft); + list->addItem(settings_layout); + + connect(uiState(), &UIState::offroadTransition, [=](bool offroad) { + is_onroad = !offroad; + updateLabels(); + }); + + sunnylinkScreen = new QWidget(this); + QVBoxLayout* vlayout = new QVBoxLayout(sunnylinkScreen); + vlayout->setContentsMargins(50, 20, 50, 20); + + vlayout->addWidget(new ScrollView(list, this), 1); + main_layout->addWidget(sunnylinkScreen); + + getSubscriber(); + + updateLabels(); +} + +void SunnylinkPanel::showEvent(QShowEvent* event) { + getSubscriber(true); + updateLabels(); // For snappier feeling +} + +void SunnylinkPanel::hideEvent(QHideEvent* event) { + sub_repeater->deleteLater(); +} + +void SunnylinkPanel::updateLabels() { + if (!isVisible()) { + return; + } + + bool is_sub = uiState()->isSubscriber(); + + sponsorBtn->setEnabled(!is_onroad); + sponsorBtn->setText(is_sub ? tr("THANKS") + " ❤️" : tr("SPONSOR")); + sponsorBtn->setValue(is_sub ? tr("Sponsor") : tr("Not Sponsor")); + + backupSettings->setEnabled(!backup_settings->in_progress && !is_onroad); + restoreSettings->setEnabled(!backup_settings->in_progress && !is_onroad); + + backupSettings->setText(backup_settings->in_progress && is_backup ? tr("Backing up...") : tr("Backup Settings")); + restoreSettings->setText(backup_settings->in_progress && is_restore ? tr("Restoring...") : tr("Restore Settings")); + + update(); +} + +void SunnylinkPanel::getSubscriber(bool poll) { + if (auto sl_dongle_id = getSunnylinkDongleId()) { + QString url = "https://stg.api.sunnypilot.ai/device/" + *sl_dongle_id + "/roles"; + + init_sub_request = new HttpRequest(this, true, 10000, true); + QObject::connect(init_sub_request, &HttpRequest::requestDone, [=](const QString &resp, bool success) { + replyFinished(resp, success); + updateLabels(); + init_sub_request->deleteLater(); + }); + init_sub_request->sendRequest(url); + + if (poll) { + sub_repeater = new RequestRepeater(this, url, "", 60, false, true); + QObject::connect(sub_repeater, &RequestRepeater::requestDone, [=](const QString &resp, bool success) { + replyFinished(resp, success); + updateLabels(); + }); + } + } +} + +void SunnylinkPanel::replyFinished(const QString &response, bool success) { + if (!success) return; + + SunnylinkRoleType role_type; + + if (response == "[]") { + role_type = static_cast(int(SunnylinkRoleType::SL_UNKNOWN)); + uiState()->setSunnylinkRoleType(role_type); + qDebug() << "JSON Parse failed on getting sponsor status"; + return; + } + + // TODO: Refactor to check additional role types with new mapping on the server side when implemented + QJsonDocument doc = QJsonDocument::fromJson(response.toUtf8()); + QJsonArray jsonArray = doc.array(); + + for (const QJsonValue &value : jsonArray) { + QJsonObject json = value.toObject(); + role_type = static_cast(int(sunnylinkRoleTypeValue(QString(json["role_type"].toString())))); + + uiState()->setSunnylinkRoleType(role_type); + } +} + +BackupSettings::BackupSettings(QWidget* parent) : QFrame(parent) { +} + +QByteArray BackupSettings::backupParams(const bool encrypt) { + // Call the readAll() method from the Params class to get all parameters. + std::map allParams = params.readAll(); + + // Create a QJsonObject. + QJsonObject payload; + + // Iterate over the map returned by readAll(). + QJsonObject converted_params; + for (const auto& kv : allParams) { + if ( !(params.getKeyType(kv.first) & BACKUP) ) + continue; // Skip this iteration if the key does not have the BACKUP flag + + // For each key-value pair in the map, add an entry to the QJsonObject. + converted_params.insert(QString::fromStdString(kv.first), QString::fromStdString(kv.second)); + } + + // Convert the QJsonObject to a QJsonDocument. + QJsonDocument jsonDoc(converted_params); + + // Convert the QJsonDocument to a QByteArray. + QByteArray jsonData = jsonDoc.toJson(); + + // Compress the QByteArray. + QByteArray compressedData = qCompress(jsonData); + + QByteArray processed_data = encrypt ? CommaApi::rsa_encrypt(compressedData) : compressedData; + + // Encode the compressed QByteArray in Base64. + QString converted_params_processed_base64_data = QString(processed_data.toBase64()); + + payload["is_encrypted"] = encrypt; + payload["config"] = converted_params_processed_base64_data; + // Create a sub-object for sunnypilot_version + QJsonObject version; + QStringList versioning = getVersion().split('.'); + version["major"] = versioning.value(0, 0).toInt(); + version["minor"] = versioning.value(1, 0).toInt(); + version["patch"] = versioning.value(2, 0).toInt(); + version["build"] = versioning.value(3, 0).toInt(); + version["branch"] = QString::fromStdString(params.get("GitBranch")); + payload["sunnypilot_version"] = version; + + // Convert the QJsonObject payload to QByteArray + QByteArray payloadData = QJsonDocument(payload).toJson(); + + return payloadData; +} + +void BackupSettings::sendParams(const QByteArray &payload) { + if (auto sl_dongle_id = getSunnylinkDongleId()) { + QString url = "https://stg.api.sunnypilot.ai/backup/" + *sl_dongle_id; + HttpRequest *request = new HttpRequest(this, true, 10000, true); + QObject::connect(request, &HttpRequest::requestDone, [=](const QString &resp, bool success) { + if (success && resp != "[]") { + ConfirmationDialog::alert(tr("Settings backed up for sunnylink Device ID: ") + *sl_dongle_id, this); + } else if (resp == "[]") { + ConfirmationDialog::alert(tr("Settings updated successfully, but no additional data was returned by the server."), this); + } else { + ConfirmationDialog::alert(tr("OOPS! We made a booboo.") + "\n" + tr("Please try again later."), this); + } + + QObject::connect(request, &QObject::destroyed, this, &BackupSettings::finished); + + request->deleteLater(); + }); + + request->sendRequest(url, HttpRequest::Method::PUT, payload); + } +} + +void BackupSettings::restoreParams(const QString &resp) { + // Convert the response QString to a QByteArray + QByteArray jsonData = resp.toUtf8(); + + // Parse the JSON data into a QJsonDocument + QJsonDocument jsonDoc = QJsonDocument::fromJson(jsonData); + + // Check if the JSON document is an object + if (jsonDoc.isObject()) { + // Convert the JSON document to a QJsonObject + QJsonObject jsonObject = jsonDoc.object(); + + // Get the "config" object from the JSON object + const QJsonValue configValue = jsonObject.value("config"); + const QJsonValue isEncryptedValue = jsonObject.value("is_encrypted"); + + const bool isEncrypted = isEncryptedValue.isBool() && isEncryptedValue.toBool(); + // Check if the "config" key exists and its value is a string + if (configValue.isString()) { + // Decode the Base64-encoded "config" value + const QByteArray configJsonDataDecoded = QByteArray::fromBase64(configValue.toString().toUtf8()); + const QByteArray configJsonDataCompressed = isEncrypted ? CommaApi::rsa_decrypt(configJsonDataDecoded) : configJsonDataDecoded; + const QByteArray configJsonData = qUncompress(configJsonDataCompressed); + + // Convert the decompressed JSON data to a QJsonDocument + const QJsonDocument configJsonDoc = QJsonDocument::fromJson(configJsonData); + + // Get the QJsonObject from the QJsonDocument + QJsonObject configJsonObject = configJsonDoc.object(); + + // Iterate over the "config" QJsonObject and process the data + for (auto it = configJsonObject.begin(); it != configJsonObject.end(); ++it) { + if ( !(params.getKeyType(it.key().toStdString()) & BACKUP) ) + continue; // Skip this iteration if the key does not have the BACKUP flag + + // Process each key-value pair as needed + params.put(it.key().toStdString(), it.value().toString().toStdString()); + } + } else { + qDebug() << "Error: 'config' value is not a string or 'config' key not found"; + } + } else { + qDebug() << "Error: JSON document is not an object"; + } +} + +void BackupSettings::getParams() { + if (auto sl_dongle_id = getSunnylinkDongleId()) { + QString url = "https://stg.api.sunnypilot.ai/backup/" + *sl_dongle_id; + HttpRequest *request = new HttpRequest(this, true, 10000, true); + QObject::connect(request, &HttpRequest::requestDone, [=](const QString &resp, bool success) { + bool restart_ui = false; + if (success && resp != "[]") { + restoreParams(resp); + ConfirmationDialog::alert(tr("Settings restored. Confirm to restart the interface."), this); + restart_ui = true; + } else if (resp == "[]") { + ConfirmationDialog::alert(tr("No settings found to restore."), this); + } else { + ConfirmationDialog::alert(tr("OOPS! We made a booboo.") + "\n" + tr("Please try again later."), this); + } + + QObject::connect(request, &QObject::destroyed, [=]() { + finished(); + + if (restart_ui) { + qApp->exit(18); + watchdog_kick(0); + } + }); + + request->deleteLater(); + }); + + request->sendRequest(url); + } +} + +void BackupSettings::started() { + in_progress = true; + emit updateLabels(); +} + +void BackupSettings::finished() { + in_progress = false; + emit updateLabels(); +} + +// Sponsor Upsell +using qrcodegen::QrCode; + +SunnylinkSponsorQRWidget::SunnylinkSponsorQRWidget(QWidget* parent) : QWidget(parent) { + timer = new QTimer(this); + connect(timer, &QTimer::timeout, this, &SunnylinkSponsorQRWidget::refresh); +} + +void SunnylinkSponsorQRWidget::showEvent(QShowEvent *event) { + refresh(); + timer->start(5 * 60 * 1000); + device()->setOffroadBrightness(100); +} + +void SunnylinkSponsorQRWidget::hideEvent(QHideEvent *event) { + timer->stop(); + device()->setOffroadBrightness(BACKLIGHT_OFFROAD); +} + +void SunnylinkSponsorQRWidget::refresh() { + QString qrString = "https://github.com/sponsors/sunnyhaibin"; + this->updateQrCode(qrString); + update(); +} + +void SunnylinkSponsorQRWidget::updateQrCode(const QString &text) { + QrCode qr = QrCode::encodeText(text.toUtf8().data(), QrCode::Ecc::LOW); + qint32 sz = qr.getSize(); + QImage im(sz, sz, QImage::Format_RGB32); + + QRgb black = qRgb(0, 0, 0); + QRgb white = qRgb(255, 255, 255); + for (int y = 0; y < sz; y++) { + for (int x = 0; x < sz; x++) { + im.setPixel(x, y, qr.getModule(x, y) ? black : white); + } + } + + // Integer division to prevent anti-aliasing + int final_sz = ((width() / sz) - 1) * sz; + img = QPixmap::fromImage(im.scaled(final_sz, final_sz, Qt::KeepAspectRatio), Qt::MonoOnly); +} + +void SunnylinkSponsorQRWidget::paintEvent(QPaintEvent *e) { + QPainter p(this); + p.fillRect(rect(), Qt::white); + + QSize s = (size() - img.size()) / 2; + p.drawPixmap(s.width(), s.height(), img); +} + +SunnylinkSponsorPopup::SunnylinkSponsorPopup(QWidget *parent) : DialogBase(parent) { + QHBoxLayout *hlayout = new QHBoxLayout(this); + hlayout->setContentsMargins(0, 0, 0, 0); + hlayout->setSpacing(0); + + setStyleSheet("SunnylinkSponsorPopup { background-color: #E0E0E0; }"); + + // text + QVBoxLayout *vlayout = new QVBoxLayout(); + vlayout->setContentsMargins(85, 70, 50, 70); + vlayout->setSpacing(50); + hlayout->addLayout(vlayout, 1); + { + QPushButton *close = new QPushButton(QIcon(":/icons/close.svg"), "", this); + close->setIconSize(QSize(80, 80)); + close->setStyleSheet("border: none;"); + vlayout->addWidget(close, 0, Qt::AlignLeft); + QObject::connect(close, &QPushButton::clicked, this, &QDialog::reject); + + //vlayout->addSpacing(30); + + QLabel *title = new QLabel(tr("Early Access: Become a sunnypilot Sponsor"), this); + title->setStyleSheet("font-size: 75px; color: black;"); + title->setWordWrap(true); + vlayout->addWidget(title); + + QLabel *instructions = new QLabel(QString(R"( +
    +
  1. %1
  2. +
  3. %2
  4. +
  5. %3
  6. +
+ )").arg(tr("Scan the QR code to visit sunnyhaibin's GitHub Sponsors page")) + .arg(tr("Choose your sponsorship tier and confirm your support")) + .arg(tr("Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status")), this); + + instructions->setStyleSheet("font-size: 47px; font-weight: bold; color: black;"); + instructions->setWordWrap(true); + vlayout->addWidget(instructions); + + vlayout->addStretch(); + } + + // QR code + SunnylinkSponsorQRWidget *qr = new SunnylinkSponsorQRWidget(this); + hlayout->addWidget(qr, 1); +} diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h new file mode 100644 index 0000000000..dabbcd3ab8 --- /dev/null +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h @@ -0,0 +1,97 @@ +#pragma once + +#include +#include +#include +#include + +#include + +#include "common/watchdog.h" +#include "selfdrive/ui/ui.h" +#include "selfdrive/ui/qt/api.h" +#include "selfdrive/ui/qt/util.h" +#include "selfdrive/ui/qt/request_repeater.h" +#include "selfdrive/ui/qt/widgets/controls.h" +#include "selfdrive/ui/qt/widgets/scrollview.h" + +// sponsor QR code +class SunnylinkSponsorQRWidget : public QWidget { + Q_OBJECT + +public: + explicit SunnylinkSponsorQRWidget(QWidget* parent = 0); + void paintEvent(QPaintEvent*) override; + +private: + QPixmap img; + QTimer *timer; + void updateQrCode(const QString &text); + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +private slots: + void refresh(); +}; + + +// sponsor popup widget +class SunnylinkSponsorPopup : public DialogBase { + Q_OBJECT + +public: + explicit SunnylinkSponsorPopup(QWidget* parent); +}; + +class BackupSettings : public QFrame { + Q_OBJECT + +public: + explicit BackupSettings(QWidget *parent = nullptr); + void sendParams(const QByteArray &payload); + void getParams(); + QByteArray backupParams(const bool encrypt = true); + void restoreParams(const QString &resp); + void started(); + void finished(); + bool in_progress = false; + +signals: + void updateLabels(); + +private: + Params params; +}; + +class SunnylinkPanel : public QFrame { + Q_OBJECT + +public: + explicit SunnylinkPanel(QWidget *parent = nullptr); + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; + +public slots: + void updateLabels(); + +private: + void getSubscriber(bool poll = false); + void replyFinished(const QString &response, bool success); + + QStackedLayout* main_layout = nullptr; + QWidget* sunnylinkScreen = nullptr; + ScrollView *scrollView = nullptr; + RequestRepeater* sub_repeater = nullptr; + HttpRequest* init_sub_request = nullptr; + + LabelControl *sunnylinkId; + BackupSettings *backup_settings; + SubPanelButton *restoreSettings; + SubPanelButton *backupSettings; + SunnylinkSponsorPopup *popup; + ButtonControl* sponsorBtn; + + bool is_onroad = false; + bool is_backup = false; + bool is_restore = false; +}; diff --git a/selfdrive/ui/qt/offroad/sunnypilot_main.h b/selfdrive/ui/qt/offroad/sunnypilot_main.h index 4f8ace83b5..fe4526db08 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot_main.h +++ b/selfdrive/ui/qt/offroad/sunnypilot_main.h @@ -8,3 +8,4 @@ #include "selfdrive/ui/qt/offroad/sunnypilot/monitoring_settings.h" #include "selfdrive/ui/qt/offroad/sunnypilot/osm_settings.h" #include "selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.h" +#include "selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.h" diff --git a/selfdrive/ui/qt/request_repeater.cc b/selfdrive/ui/qt/request_repeater.cc index 7aa731898c..a560f6aad6 100644 --- a/selfdrive/ui/qt/request_repeater.cc +++ b/selfdrive/ui/qt/request_repeater.cc @@ -1,7 +1,7 @@ #include "selfdrive/ui/qt/request_repeater.h" RequestRepeater::RequestRepeater(QObject *parent, const QString &requestURL, const QString &cacheKey, - int period, bool while_onroad) : HttpRequest(parent) { + int period, bool while_onroad, bool sunnylink) : HttpRequest(parent, true, 20000, sunnylink) { timer = new QTimer(this); timer->setTimerType(Qt::VeryCoarseTimer); QObject::connect(timer, &QTimer::timeout, [=]() { diff --git a/selfdrive/ui/qt/request_repeater.h b/selfdrive/ui/qt/request_repeater.h index c0e2758273..0c866ba70b 100644 --- a/selfdrive/ui/qt/request_repeater.h +++ b/selfdrive/ui/qt/request_repeater.h @@ -6,7 +6,7 @@ class RequestRepeater : public HttpRequest { public: - RequestRepeater(QObject *parent, const QString &requestURL, const QString &cacheKey = "", int period = 0, bool while_onroad=false); + RequestRepeater(QObject *parent, const QString &requestURL, const QString &cacheKey = "", int period = 0, bool while_onroad=false, bool sunnylink = false); private: Params params; diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index 167282e397..9f567a68d8 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -43,6 +43,16 @@ std::optional getDongleId() { } } +std::optional getSunnylinkDongleId() { + std::string id = Params().get("SunnylinkDongleId"); + + if (!id.empty() && (id != "UnregisteredDevice")) { + return QString::fromStdString(id); + } else { + return {}; + } +} + QMap getSupportedLanguages() { QFile f(":/languages.json"); f.open(QIODevice::ReadOnly | QIODevice::Text); diff --git a/selfdrive/ui/qt/util.h b/selfdrive/ui/qt/util.h index 65fa952c2b..21507bfb1f 100644 --- a/selfdrive/ui/qt/util.h +++ b/selfdrive/ui/qt/util.h @@ -17,6 +17,7 @@ QString getVersion(); QString getBrand(); QString getUserAgent(); std::optional getDongleId(); +std::optional getSunnylinkDongleId(); QMap getSupportedLanguages(); QMap getCarNames(); void setQtSurfaceFormat(); diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index de12b0f05a..a278d8506a 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -431,6 +431,20 @@ void UIState::setPrimeType(PrimeType type) { } } +void UIState::setSunnylinkRoleType(SunnylinkRoleType type) { + if (type != role_type) { + bool prev_subscriber = isSubscriber(); + + role_type = type; + emit sunnylinkRoleTypeChanged(role_type); + + bool subscriber = isSubscriber(); + if (prev_subscriber != subscriber) { + emit sunnylinkRoleChanged(subscriber); + } + } +} + Device::Device(QObject *parent) : brightness_filter(BACKLIGHT_OFFROAD, BACKLIGHT_TS, BACKLIGHT_DT), QObject(parent) { setAwake(true); resetInteractiveTimeout(); diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 43f44340b7..08749a17c7 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -135,6 +135,27 @@ enum PrimeType { PURPLE = 5, }; +enum SunnylinkRoleType { + SL_UNKNOWN = -1, + SL_READ_ONLY = 0, + SL_SPONSOR = 1, + SL_ADMIN = 2, // Internal use only +}; + +inline const QMap sunnylinkRoleTypeConverted() { + QMap map; + map["Unknown"] = SunnylinkRoleType::SL_UNKNOWN; + map["ReadOnly"] = SunnylinkRoleType::SL_READ_ONLY; + map["Sponsor"] = SunnylinkRoleType::SL_SPONSOR; + map["Admin"] = SunnylinkRoleType::SL_ADMIN; // Internal use only + return map; +} + +inline const int sunnylinkRoleTypeValue(const QString &roleType) { + static QMap map = sunnylinkRoleTypeConverted(); + return map.value(roleType, SunnylinkRoleType::SL_UNKNOWN); // Default to UNKNOWN if not found +} + const QColor bg_colors [] = { [STATUS_DISENGAGED] = QColor(0x17, 0x33, 0x49, 0xc8), [STATUS_OVERRIDE] = QColor(0x91, 0x9b, 0x95, 0xf1), @@ -273,6 +294,10 @@ public: inline PrimeType primeType() const { return prime_type; } inline bool hasPrime() const { return prime_type != PrimeType::UNKNOWN && prime_type != PrimeType::NONE; } + void setSunnylinkRoleType(SunnylinkRoleType type); + inline SunnylinkRoleType sunnylinkRoleType() const { return role_type; } + inline bool isSubscriber() const { return role_type != SunnylinkRoleType::SL_UNKNOWN && role_type != SunnylinkRoleType::SL_READ_ONLY; } + int fb_w = 0, fb_h = 0; std::unique_ptr sm; @@ -290,6 +315,9 @@ signals: void primeChanged(bool prime); void primeTypeChanged(PrimeType prime_type); + void sunnylinkRoleChanged(bool subscriber); + void sunnylinkRoleTypeChanged(SunnylinkRoleType role_type); + private slots: void update(); @@ -297,6 +325,7 @@ private: QTimer *timer; bool started_prev = false; PrimeType prime_type = PrimeType::UNKNOWN; + SunnylinkRoleType role_type = SunnylinkRoleType::SL_UNKNOWN; bool last_mads_enabled = false; bool mads_path_state = false; diff --git a/system/hardware/hw.h b/system/hardware/hw.h index 394807ccb5..fe6cf20a50 100644 --- a/system/hardware/hw.h +++ b/system/hardware/hw.h @@ -37,6 +37,10 @@ namespace Path { return Hardware::PC() ? Path::comma_home() + "/persist/comma/id_rsa" : "/persist/comma/id_rsa"; } + inline std::string rsa_pub_file() { + return Hardware::PC() ? Path::comma_home() + "/persist/comma/id_rsa.pub" : "/persist/comma/id_rsa.pub"; + } + inline std::string swaglog_ipc() { return "ipc:///tmp/logmessage" + Path::openpilot_prefix(); } From d09dd75884edf0df96c912554a35cdcd38cf8e27 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 13 Mar 2024 17:01:56 -0400 Subject: [PATCH 512/923] 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 handle_agnos_update(fetched_path) -> None: + +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() -> 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 + + @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() + + def get_commit_hash(self, path: str = OVERLAY_MERGED) -> str: + return run(["git", "rev-parse", "HEAD"], path).rstrip() 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) - if self.params.get("UpdaterTargetBranch") is None: - self.params.put("UpdaterTargetBranch", self.strategy.current_channel()) - - self.params.put_bool("UpdaterFetchAvailable", self.strategy.update_available()) - - 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 ded33897213dc234748c877902f40432ecf30711 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 13 Mar 2024 22:32:22 +0000 Subject: [PATCH 513/923] FCA: Fix upstream merge conflicts --- selfdrive/car/chrysler/interface.py | 3 +++ selfdrive/car/chrysler/values.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 36284bd23c..9c6f0f71a8 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -61,8 +61,11 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.2 ret.wheelbase = 3.88 # Older EPS FW allow steer to zero + # 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. + if any(fw.ecu == 'eps' and fw.fwVersion in (b"68273275AF", b"68273275AG", b"68312176AE", b"68312176AG",) for fw in car_fw): + ret.minEnableSpeed = 0. elif candidate == CAR.RAM_HD: ret.steerActuatorDelay = 0.2 diff --git a/selfdrive/car/chrysler/values.py b/selfdrive/car/chrysler/values.py index e6dffaded9..396e447886 100644 --- a/selfdrive/car/chrysler/values.py +++ b/selfdrive/car/chrysler/values.py @@ -91,7 +91,7 @@ class CAR(Platforms): "RAM 1500 5TH GEN", ChryslerCarInfo("Ram 1500 2019-24", car_parts=CarParts.common([CarHarness.ram])), dbc_dict('chrysler_ram_dt_generated', None), - specs=ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=14.5), + specs=ChryslerCarSpecs(mass=2493., wheelbase=3.88, steerRatio=16.3, minSteerSpeed=0.5, minEnableSpeed=14.5), ) RAM_HD = ChryslerPlatformConfig( "RAM HD 5TH GEN", From 5e775a1e66835a10a89b33e6e5a79dae107b013e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 13 Mar 2024 22:33:36 +0000 Subject: [PATCH 514/923] Hyundai CAN: Fix `Navi_HU` check for cars that do not have this signal --- selfdrive/car/hyundai/carstate.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index 3782367592..927fe2ebd8 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -313,7 +313,7 @@ class CarState(CarStateBase): speed_limit_clu_bus_canfd = cp if self.CP.flags & HyundaiFlags.CANFD_HDA2 else cp_cam self._speed_limit_clu = speed_limit_clu_bus_canfd.vl["CLUSTER_SPEED_LIMIT"]["SPEED_LIMIT_1"] else: - sl_can_nav = cp.vl["Navi_HU"]["SpeedLim_Nav_Clu"] + sl_can_nav = cp.vl["Navi_HU"]["SpeedLim_Nav_Clu"] if self.CP.spFlags & HyundaiFlagsSP.SP_NAV_MSG else 0 sl_can_cam = cp_cam.vl["LKAS12"]["CF_Lkas_TsrSpeed_Display_Clu"] if self.CP.spFlags & HyundaiFlagsSP.SP_LKAS12 else None self._speed_limit_clu = sl_can_cam if sl_can_cam is not None and sl_can_cam not in (0, 255) else sl_can_nav From 1f154928dc3356577124c33d62c4f437b5c4f453 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 14 Mar 2024 04:39:33 +0000 Subject: [PATCH 515/923] Translations: Prepare for sunnypilot custom texts --- selfdrive/ui/qt/offroad/settings.cc | 6 +- selfdrive/ui/qt/offroad/settings.h | 2 +- .../ui/qt/offroad/sunnypilot/mads_settings.cc | 4 +- .../ui/qt/offroad/sunnypilot/osm_settings.cc | 32 +- .../ui/qt/offroad/sunnypilot/osm_settings.h | 24 +- .../sunnypilot/software_settings_sp.cc | 39 +- .../offroad/sunnypilot/software_settings_sp.h | 2 +- .../speed_limit_control_settings.cc | 4 +- .../sunnypilot/speed_limit_policy_settings.h | 12 +- .../speed_limit_warning_settings.cc | 4 +- .../offroad/sunnypilot/sunnylink_settings.cc | 4 +- .../offroad/sunnypilot/sunnypilot_settings.cc | 28 +- .../offroad/sunnypilot/sunnypilot_settings.h | 4 +- .../qt/offroad/sunnypilot/vehicle_settings.cc | 22 +- .../qt/offroad/sunnypilot/vehicle_settings.h | 1 + .../qt/offroad/sunnypilot/visuals_settings.cc | 6 +- selfdrive/ui/translations/main_ar.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_de.ts | 1520 ++++++++++++++++- selfdrive/ui/translations/main_fr.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_ja.ts | 1520 ++++++++++++++++- selfdrive/ui/translations/main_ko.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_pt-BR.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_th.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_tr.ts | 1520 ++++++++++++++++- selfdrive/ui/translations/main_zh-CHS.ts | 1516 +++++++++++++++- selfdrive/ui/translations/main_zh-CHT.ts | 1516 +++++++++++++++- 26 files changed, 15187 insertions(+), 179 deletions(-) diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 0d805ff8f5..1e2535195c 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -267,7 +267,7 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { addItem(new LabelControl(tr("Serial"), params.get("HardwareSerial").c_str())); fleetManagerPin = new ButtonControl( - tr(pin_title) + pin, tr("TOGGLE"), + pin_title + pin, tr("TOGGLE"), tr("Enable or disable PIN requirement for Fleet Manager access.")); connect(fleetManagerPin, &ButtonControl::clicked, [=]() { if (params.getBool("FleetManagerPin")) { @@ -417,12 +417,12 @@ void DevicePanel::refreshPin() { QFile require("/data/params/d/FleetManagerPin"); if (!require.exists()) { setSpacing(50); - fleetManagerPin->setTitle(QString(pin_title) + "OFF"); + fleetManagerPin->setTitle(pin_title + tr("OFF")); } else if (f.open(QIODevice::ReadOnly | QIODevice::Text)) { pin = f.readAll(); f.close(); setSpacing(50); - fleetManagerPin->setTitle(QString(pin_title) + pin); + fleetManagerPin->setTitle(pin_title + pin); } } diff --git a/selfdrive/ui/qt/offroad/settings.h b/selfdrive/ui/qt/offroad/settings.h index 3ef846eb83..4f12609269 100644 --- a/selfdrive/ui/qt/offroad/settings.h +++ b/selfdrive/ui/qt/offroad/settings.h @@ -66,7 +66,7 @@ private: Params params; ButtonControl *fleetManagerPin; - const char *pin_title = "Fleet Manager PIN: "; + QString pin_title = tr("Fleet Manager PIN:") + " "; QString pin = "OFF"; QFileSystemWatcher *fs_watch; }; diff --git a/selfdrive/ui/qt/offroad/sunnypilot/mads_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/mads_settings.cc index f28479aa3c..e213cc19a7 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/mads_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/mads_settings.cc @@ -33,7 +33,9 @@ MadsSettings::MadsSettings(QWidget* parent) : QWidget(parent) { // Disengage Lateral on Brake (DLOB) std::vector dlob_settings_texts{tr("Remain Active"), tr("Pause Steering")}; dlob_settings = new ButtonParamControl( - "DisengageLateralOnBrake", "Steering Mode After Braking", "Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot.\n\nRemain Active: ALC will remain active even after the brake pedal is pressed.\nPause Steering: ALC will be paused after the brake pedal is manually pressed.", + "DisengageLateralOnBrake", + tr("Steering Mode After Braking"), + tr("Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot.\n\nRemain Active: ALC will remain active even after the brake pedal is pressed.\nPause Steering: ALC will be paused after the brake pedal is manually pressed."), "../assets/offroad/icon_blank.png", dlob_settings_texts, 500 diff --git a/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.cc index 958d338138..236e4406cf 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.cc @@ -29,17 +29,17 @@ OsmPanel::OsmPanel(QWidget *parent) : QFrame(parent) { } ButtonControl *OsmPanel::setupOsmDeleteMapsButton(QWidget *parent) { - osmDeleteMapsBtn = new ButtonControl(tr("Downloaded Maps"), tr("Delete Maps")); // Updated on updateLabels() + osmDeleteMapsBtn = new ButtonControl(tr("Downloaded Maps"), tr("DELETE")); // Updated on updateLabels() connect(osmDeleteMapsBtn, &ButtonControl::clicked, [=]() { - if (showConfirmationDialog(parent, "This will delete ALL downloaded maps\n\nAre you sure you want to delete all the maps?", "Yes, delete all the maps.")) { + if (showConfirmationDialog(parent, tr("This will delete ALL downloaded maps\n\nAre you sure you want to delete all the maps?"), tr("Yes, delete all the maps."))) { QtConcurrent::run([=]() { QDir dir(MAP_PATH); osmDeleteMapsBtn->setEnabled(false); - osmDeleteMapsBtn->setText("Deleting..."); + osmDeleteMapsBtn->setText("⌛"); dir.removeRecursively(); updateMapSize(); osmDeleteMapsBtn->setEnabled(true); - osmDeleteMapsBtn->setText("DELETE"); + osmDeleteMapsBtn->setText(tr("DELETE")); }); updateLabels(); } @@ -65,7 +65,7 @@ ButtonControl *OsmPanel::setupOsmDownloadButton(QWidget *parent) { osmDownloadBtn = new ButtonControl(tr("Country"), tr("SELECT")); connect(osmDownloadBtn, &ButtonControl::clicked, [=]() { osmDownloadBtn->setEnabled(false); - osmDownloadBtn->setValue("Fetching Country list..."); + osmDownloadBtn->setValue(tr("Fetching Country list...")); const std::vector> locations = getOsmLocations(); osmDownloadBtn->setEnabled(true); osmDownloadBtn->setValue(""); @@ -108,12 +108,12 @@ ButtonControl *OsmPanel::setupUsStatesButton(QWidget *parent) { connect(usStatesBtn, &ButtonControl::clicked, [=]() { const std::tuple allStatesOption = std::make_tuple("All States (~4.8 GB)", "All"); usStatesBtn->setEnabled(false); - usStatesBtn->setValue("Fetching State list..."); + usStatesBtn->setValue(tr("Fetching State list...")); const std::vector> locations = getUsStatesLocations(allStatesOption); usStatesBtn->setEnabled(true); usStatesBtn->setValue(""); const QString initTitle = QString::fromStdString(params.get("OsmStateTitle")); - const QString currentTitle = ((initTitle == std::get<0>(allStatesOption)) || (initTitle.length() == 0)) ? "All" : initTitle; + const QString currentTitle = ((initTitle == std::get<0>(allStatesOption)) || (initTitle.length() == 0)) ? tr("All") : initTitle; QStringList locationTitles; for (auto &loc: locations) { @@ -223,10 +223,10 @@ void OsmPanel::updateDownloadProgress() { const int downloaded_files = extractIntFromJson(osmDownloadProgress, "downloaded_files"); download_failed_state = total_files && osm_download_in_progress && !lastDownloadedTimePoint.has_value() && downloaded_files < total_files; - const auto updateButtonText = processUpdateStatus(pending_update_check, total_files, downloaded_files, osmDownloadProgress, download_failed_state); + QString updateButtonText = processUpdateStatus(pending_update_check, total_files, downloaded_files, osmDownloadProgress, download_failed_state); - osmUpdateBtn->setValue(tr(updateButtonText.c_str())); - osmUpdateBtn->setText(tr(osm_download_in_progress && !download_failed_state ? "Check status" : "Force Update")); + osmUpdateBtn->setValue(updateButtonText); + osmUpdateBtn->setText(osm_download_in_progress && !download_failed_state ? tr("REFRESH") : tr("UPDATE")); osmDeleteMapsBtn->setValue(formatSize(mapsDirSize)); } @@ -234,24 +234,24 @@ int OsmPanel::extractIntFromJson(const QJsonObject& json, const QString& key) { return (json.contains(key)) ? json[key].toInt() : 0; } -std::string OsmPanel::processUpdateStatus(bool pending_update, int total_files, int downloaded_files, const QJsonObject& json, bool failed_state) { +QString OsmPanel::processUpdateStatus(bool pending_update, int total_files, int downloaded_files, const QJsonObject& json, bool failed_state) { if (pending_update && !osm_download_in_progress && !total_files) { lastDownloadedTimePoint.reset(); - return "Download starting..."; + return tr("Download starting..."); } else if (failed_state) { - return "Error: Invalid download. Retry."; + return tr("Error: Invalid download. Retry."); } else if (osm_download_in_progress && total_files > downloaded_files) { - return formatDownloadStatus(json).toStdString(); + return formatDownloadStatus(json); } else if (osm_download_in_progress && downloaded_files >= total_files) { osm_download_in_progress = false; lastDownloadedTimePoint.reset(); - return "Download complete!"; + return tr("Download complete!"); } if (lastDownloadedTimePoint.has_value()) { QDateTime dateTime = QDateTime::fromTime_t(std::chrono::system_clock::to_time_t(lastDownloadedTimePoint.value())); //fromMSecsSinceEpoch(duration); dateTime = dateTime.toLocalTime(); - return QString("%1").arg(dateTime.toString("yyyy-MM-dd HH:mm:ss")).toStdString(); + return QString("%1").arg(dateTime.toString("yyyy-MM-dd HH:mm:ss")); } return ""; diff --git a/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.h index 199b224b17..2f9cf8455f 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/osm_settings.h @@ -62,7 +62,7 @@ private: void updateLabels(); void updateDownloadProgress(); static int extractIntFromJson(const QJsonObject& json, const QString& key); - std::string processUpdateStatus(bool pending_update_check, int total_files, int downloaded_files, const QJsonObject& json, bool failed_state); + QString processUpdateStatus(bool pending_update_check, int total_files, int downloaded_files, const QJsonObject& json, bool failed_state); ConfirmationDialog* confirmationDialog; LabelControl *mapdVersion; @@ -101,25 +101,25 @@ private: QString formattedTime; if (minutes > 0) { - formattedTime = QString::number(minutes) + "m "; + formattedTime = QString::number(minutes) + tr("m "); } - formattedTime += QString::number(seconds) + "s"; + formattedTime += QString::number(seconds) + tr("s"); return formattedTime; } static QString calculateElapsedTime(const QJsonObject &jsonData, const std::chrono::system_clock::time_point &startTime) { using namespace std::chrono; if (!jsonData.contains("total_files") || !jsonData.contains("downloaded_files")) - return "Calculating..."; + return tr("Calculating..."); const int totalFiles = jsonData["total_files"].toInt(); const int downloadedFiles = jsonData["downloaded_files"].toInt(); - if (downloadedFiles >= totalFiles || totalFiles <= 0) return "Downloaded"; + if (downloadedFiles >= totalFiles || totalFiles <= 0) return tr("Downloaded"); const long elapsed = duration_cast(system_clock::now() - startTime).count(); - if (elapsed == 0 || downloadedFiles == 0) return "Calculating..."; + if (elapsed == 0 || downloadedFiles == 0) return tr("Calculating..."); return formatTime(elapsed); } @@ -132,7 +132,7 @@ private: constexpr int minDataPoints = 3; constexpr int historySize = 10; - static QString lastETA = "Calculating ETA..."; + static QString lastETA = tr("Calculating ETA..."); if (duration_cast(steady_clock::now() - lastUpdateTime).count() < 1) { return lastETA; @@ -145,7 +145,7 @@ private: const int downloadedFiles = jsonData["downloaded_files"].toInt(); if (totalFiles <= 0 || downloadedFiles >= totalFiles) { - return totalFiles <= 0 ? "Ready" : "Downloaded"; + return totalFiles <= 0 ? tr("Ready") : tr("Downloaded"); } const long elapsed = duration_cast(system_clock::now() - startTime).count(); @@ -166,7 +166,7 @@ private: const long remainingTime = static_cast((totalFiles - downloadedFiles) / avgRate); if (remainingTime <= 0) return lastETA; - lastETA = formatTime(remainingTime) + " remaining"; + lastETA = tr("Time remaining: ") + formatTime(remainingTime); lastUpdateTime = steady_clock::now(); return lastETA; } @@ -179,8 +179,8 @@ private: const int total_files = json["total_files"].toInt(); const int downloaded_files = json["downloaded_files"].toInt(); - if (total_files <= 0) return "Ready"; - if (downloaded_files >= total_files) return "Downloaded"; + if (total_files <= 0) return tr("Ready"); + if (downloaded_files >= total_files) return tr("Downloaded"); const int percentage = static_cast(100.0 * downloaded_files / total_files); return QString::asprintf("%d/%d (%d%%)", downloaded_files, total_files, percentage); @@ -188,7 +188,7 @@ private: QString formatSize(quint64 size) const { if (size == 0 && (!mapSizeFuture.has_value() || mapSizeFuture.value().isRunning())) { - return QString("Calculating..."); + return tr("Calculating..."); } constexpr qint64 kb = 1024; diff --git a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc index 17e219ec7c..f288170054 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc @@ -106,35 +106,44 @@ void SoftwarePanelSP::HandleModelDownloadProgressReport() { // Driving model status if (isDownloadingModel()) { - description += downloadingTemplate.arg("Driving", drivingModelName, QString::number(modelDownloadProgress.value_or(0.0), 'f', 2)); + description += QString(tr("Downloading Driving model") + " [%1]... (%2%)") + .arg(drivingModelName) + .arg(QString::number(modelDownloadProgress.value_or(0.0), 'f', 2)); } else { - if (modelFromCache) drivingModelName += " (CACHED)"; - description += downloadedTemplate.arg("Driving", drivingModelName); + if (modelFromCache) drivingModelName += QString(" " + tr("(CACHED)")); + description += QString(tr("Driving model") + " [%1] " + tr("downloaded") + .arg(drivingModelName)); } // Navigation model status if (isDownloadingNavModel()) { if (!description.isEmpty()) description += "\n"; // Add newline if driving model status is already appended - description += downloadingTemplate.arg("Navigation", navModelName, - QString::number(navModelDownloadProgress.value_or(0.0), 'f', 2)); + description += QString(tr("Downloading Navigation model") + " [%1]... (%2%)") + .arg(navModelName) + .arg(QString::number(navModelDownloadProgress.value_or(0.0), 'f', 2)); } else { - if (navModelFromCache) navModelName += " (CACHED)"; + if (navModelFromCache) navModelName += QString(" " + tr("(CACHED)")); if (!description.isEmpty()) description += "\n"; // Ensure newline separation - description += downloadedTemplate.arg("Navigation", navModelName); + description += QString(tr("Navigation model") + " [%1] " + tr("downloaded") + .arg(navModelName)); } + // Metadata status if (isDownloadingMetadata()) { if (!description.isEmpty()) description += "\n"; - description += downloadingTemplate.arg("Metadata", metadataName, QString::number(metadataDownloadProgress.value_or(0.0), 'f', 2)); + description += QString(tr("Downloading Metadata model") + " [%1]... (%2%)") + .arg(metadataName) + .arg(QString::number(metadataDownloadProgress.value_or(0.0), 'f', 2)); } else { - if (metadataFromCache) metadataName += " (CACHED)"; + if (metadataFromCache) metadataName += QString(" " + tr("(CACHED)")); if (!description.isEmpty()) description += "\n"; - description += downloadedTemplate.arg("Metadata", metadataName); + description += QString(tr("Metadata model") + " [%1] " + tr("downloaded") + .arg(metadataName)); } if (model_download_failed) { - description = "Downloads have failed, please try swapping the model!\n" - "Failed:\n" + failed_downloads_description; + description = tr("Downloads have failed, please try swapping the model!") + "\n" + + tr("Failed:") + "\n" + failed_downloads_description; LOGE("MODEL DOWNLOADS FAILED!!!"); } @@ -178,7 +187,7 @@ void SoftwarePanelSP::HandleModelDownloadProgressReport() { void SoftwarePanelSP::handleCurrentModelLblBtnClicked() { // Disabling label button and displaying fetching message currentModelLblBtn->setEnabled(false); - currentModelLblBtn->setValue("Fetching models..."); + currentModelLblBtn->setValue(tr("Fetching models...")); checkNetwork(); const auto currentModelName = QString::fromStdString(params.get("DrivingModelName")); @@ -265,8 +274,8 @@ void SoftwarePanelSP::updateLabels() { } void SoftwarePanelSP::showResetParamsDialog() { - const auto confirmMsg = tr( - "Download has started in the background.\nWe STRONGLY suggest you to reset calibration, would you like to do that now?"); + const auto confirmMsg = tr("Download has started in the background.") + "\n" + + tr("We STRONGLY suggest you to reset calibration. Would you like to do that now?"); const auto button_text = tr("Reset Calibration"); // If user confirms, remove specified parameters diff --git a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.h b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.h index 6c39e502a6..384a592de4 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.h @@ -53,7 +53,7 @@ private: static inline bool showConfirmationDialog(QWidget *parent, const QString &message = QString(), const QString &confirmButtonText = QString(), const bool show_metered_warning = false) { const QString warning_message = show_metered_warning ? tr("Warning: You are on a metered connection!") : QString(); const QString final_message = QString("%1%2").arg(!message.isEmpty() ? message+"\n" : QString(), warning_message); - const QString final_buttonText = !confirmButtonText.isEmpty() ? confirmButtonText : QString("Continue%1").arg(show_metered_warning ? " on Metered" : ""); + const QString final_buttonText = !confirmButtonText.isEmpty() ? confirmButtonText : QString(tr("Continue") + " %1").arg(show_metered_warning ? tr("on Metered") : ""); return ConfirmationDialog::confirm(final_message, final_buttonText, parent); } diff --git a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_control_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_control_settings.cc index ca69c49bf8..c93fea612b 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_control_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_control_settings.cc @@ -80,7 +80,7 @@ void SlcSettings::updateToggles() { speed_limit_offset_settings->setEnabled(speed_limit_control); slvo->setEnabled(speed_limit_control && QString::fromStdString(params.get("SpeedLimitOffsetType")) != "0"); - QString speed_limit_engage_condition_text = pcm_cruise_op_long ? "This platform defaults to Auto mode. User Confirm mode is not supported on this platform.

" : ""; + QString speed_limit_engage_condition_text = pcm_cruise_op_long ? tr("This platform defaults to Auto mode. User Confirm mode is not supported on this platform.") + "

" : ""; QString speed_limit_engage_condition_param = pcm_cruise_op_long ? "0" : "SpeedLimitEngageType"; if (pcm_cruise_op_long) { speed_limit_engage_settings->setDisabledSelectedButton("1"); // "User Confirm" disabled @@ -124,7 +124,7 @@ void SpeedLimitValueOffset::refresh() { option = ""; unit = "N/A"; } else if (offset_type == "1") { - unit = is_metric ? " km/h" : " mph"; + unit = " " + (is_metric ? tr("km/h") : tr("mph")); } else if (offset_type == "2") { unit = " %"; } diff --git a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_policy_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_policy_settings.h index 4544d2e8ef..5b7ef66a68 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_policy_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_policy_settings.h @@ -54,12 +54,12 @@ private: // Add this line outside the class definition inline const std::vector SpeedLimitPolicySettings::speed_limit_policy_texts{ - tr("Nav\nOnly"), - tr("Map\nOnly"), - tr("Car\nOnly"), - tr("Nav\nFirst"), - tr("Map\nFirst"), - tr("Car\nFirst"), + tr("Nav") + "\n" + tr("Only"), + tr("Map") + "\n" + tr("Only"), + tr("Car") + "\n" + tr("Only"), + tr("Nav") + "\n" + tr("First"), + tr("Map") + "\n" + tr("First"), + tr("Car") + "\n" + tr("First"), }; inline const std::vector SpeedLimitPolicySettings::speed_limit_policy_descriptions{ diff --git a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc index 47a5450eda..6b355e2740 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/speed_limit_warning_settings.cc @@ -108,9 +108,9 @@ void SpeedLimitWarningValueOffset::refresh() { if (offset_type == "0") { option = ""; - unit = "N/A"; + unit = tr("N/A"); } else if (offset_type == "1") { - unit = is_metric ? " km/h" : " mph"; + unit = " " + (is_metric ? tr("km/h") : tr("mph")); } else if (offset_type == "2") { unit = " %"; } diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc index e306047501..4e709fd72f 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc @@ -33,7 +33,7 @@ SunnylinkPanel::SunnylinkPanel(QWidget* parent) : QFrame(parent) { is_backup = true; backup_settings->started(); if (uiState()->isSubscriber()) { - if (ConfirmationDialog::confirm(tr("Are you sure you want to backup sunnypilot settings?"), tr("Backup"), this)) { + if (ConfirmationDialog::confirm(tr("Are you sure you want to backup sunnypilot settings?"), tr("Back Up"), this)) { backup_settings->sendParams(backup_settings->backupParams()); } else { backup_settings->finished(); @@ -233,7 +233,7 @@ void BackupSettings::sendParams(const QByteArray &payload) { HttpRequest *request = new HttpRequest(this, true, 10000, true); QObject::connect(request, &HttpRequest::requestDone, [=](const QString &resp, bool success) { if (success && resp != "[]") { - ConfirmationDialog::alert(tr("Settings backed up for sunnylink Device ID: ") + *sl_dongle_id, this); + ConfirmationDialog::alert(tr("Settings backed up for sunnylink Device ID:") + " " + *sl_dongle_id, this); } else if (resp == "[]") { ConfirmationDialog::alert(tr("Settings updated successfully, but no additional data was returned by the server."), this); } else { diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc index aaab761f61..56e783072f 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.cc @@ -243,7 +243,7 @@ SunnypilotPanel::SunnypilotPanel(QWidget *parent) : QFrame(parent) { std::vector dlp_settings_texts{tr("Laneful"), tr("Laneless"), tr("Auto")}; dlp_settings = new ButtonParamControl( - "DynamicLaneProfile", "Dynamic Lane Profile", "", + "DynamicLaneProfile", tr("Dynamic Lane Profile"), "", "../assets/offroad/icon_blank.png", dlp_settings_texts, 340 @@ -367,8 +367,8 @@ SunnypilotPanel::SunnypilotPanel(QWidget *parent) : QFrame(parent) { friction->setEnabled(params.getBool("IsOffroad") || state); lat_accel_factor->setEnabled(params.getBool("IsOffroad") || state); - friction->setTitle(state ? "FRICTION - Live && Offline" : "FRICTION - Offline Only"); - lat_accel_factor->setTitle(state ? "LAT_ACCEL_FACTOR - Live && Offline" : "LAT_ACCEL_FACTOR - Offline Only"); + friction->setTitle("FRICTION - " + (state ? tr("Real-time and Offline") : tr("Offline Only"))); + lat_accel_factor->setTitle("LAT_ACCEL_FACTOR - " + (state ? ("Real-time and Offline") : tr("Offline Only"))); friction->refresh(); lat_accel_factor->refresh(); @@ -442,10 +442,10 @@ void SunnypilotPanel::updateToggles() { QString driving_model_text = QString("" + driving_model_name + ""); dlp_settings->setEnabled(model_use_lateral_planner); toggles["VisionCurveLaneless"]->setVisible(model_use_lateral_planner); - auto dlp_incompatible_desc = tr("Dynamic Lane Profile is not available with the current Driving Model [") + driving_model_text + tr("]."); + QString dlp_incompatible_desc = "" + tr("Dynamic Lane Profile is not available with the current Driving Model") + " [" + driving_model_text + "]"; toggles["CustomOffsets"]->setEnabled(model_use_lateral_planner); - auto custom_offsets_incompatible_desc = tr("Custom Offsets is not available with the current Driving Model [") + driving_model_text + tr("]."); + QString custom_offsets_incompatible_desc = "" + tr("Custom Offsets is not available with the current Driving Model") + " [" + driving_model_text + "]"; auto enforce_torque_lateral = toggles["EnforceTorqueLateral"]; auto custom_torque_lateral = toggles["CustomTorqueLateral"]; @@ -464,10 +464,10 @@ void SunnypilotPanel::updateToggles() { // NNLC/NNFF QString nnff_available_desc = tr("NNLC is currently not available on this platform."); - QString nnff_fuzzy_desc = tr("Match: \"Exact\" is ideal, but \"Fuzzy\" is fine too. Reach out to the sunnypilot team in the #tuning-nnlc channel at the sunnypilot Discord server if there are any issues."); - QString nnff_status_init = tr("⚠️ Start the car to check car compatibility"); - QString nnff_not_loaded = tr("⚠️ NNLC Not Loaded"); - QString nnff_loaded = tr("✅ NNLC Loaded"); + QString nnff_fuzzy_desc = tr("Match: \"Exact\" is ideal, but \"Fuzzy\" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: ") + "#tuning-nnlc"; + QString nnff_status_init = "⚠️ " + tr("Start the car to check car compatibility") + ""; + QString nnff_not_loaded = "⚠️ " + tr("NNLC Not Loaded") + ""; + QString nnff_loaded = "✅ " + tr("NNLC Loaded") + ""; auto _car_model = QString::fromStdString(params.get("NNFFCarModel")); auto cp_bytes = params.get("CarParamsPersistent"); @@ -488,11 +488,11 @@ void SunnypilotPanel::updateToggles() { } else if (nnff_toggle->isToggled()) { if (CP.getLateralTuning().which() == cereal::CarParams::LateralTuning::TORQUE) { QString nn_model_name = QString::fromStdString(CP.getLateralTuning().getTorque().getNnModelName()); - QString nn_fuzzy = QString::fromUtf8(CP.getLateralTuning().getTorque().getNnModelFuzzyMatch() ? "Fuzzy" : "Exact"); + QString nn_fuzzy = CP.getLateralTuning().getTorque().getNnModelFuzzyMatch() ? tr("Fuzzy") : tr("Exact"); nnff_toggle->setDescription(nnffDescriptionBuilder((nn_model_name == "") ? nnff_status_init : - (nn_model_name == "mock") ? (nnff_not_loaded + "
Reach out to the sunnypilot team in the #tuning-nnlc channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car.") : - (nnff_loaded + " | Match = " + nn_fuzzy + " | " + _car_model + "

" + nnff_fuzzy_desc))); + (nn_model_name == "mock") ? (nnff_not_loaded + "
" + tr("Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: ") + "#tuning-nnlc") : + (nnff_loaded + " | " + tr("Match") + " = " + nn_fuzzy + " | " + _car_model + "

" + nnff_fuzzy_desc))); enforce_torque_lateral->setEnabled(false); } else { nnff_toggle->setDescription(nnffDescriptionBuilder(nnff_status_init)); @@ -587,7 +587,7 @@ TorqueFriction::TorqueFriction() : SPOptionControl ( void TorqueFriction::refresh() { float torqueFrictionVal = QString::fromStdString(params.get("TorqueFriction")).toInt() * 0.01; - setTitle(params.getBool("TorquedOverride") ? "FRICTION - Live && Offline" : "FRICTION - Offline Only"); + setTitle("FRICTION - " + (params.getBool("TorquedOverride") ? tr("Real-time and Offline") : tr("Offline Only"))); setLabel(QString::number(torqueFrictionVal)); } @@ -604,6 +604,6 @@ TorqueMaxLatAccel::TorqueMaxLatAccel() : SPOptionControl ( void TorqueMaxLatAccel::refresh() { float torqueMaxLatAccelVal = QString::fromStdString(params.get("TorqueMaxLatAccel")).toInt() * 0.01; QString unit = "m/s²"; - setTitle(params.getBool("TorquedOverride") ? "LAT_ACCEL_FACTOR - Live && Offline" : "LAT_ACCEL_FACTOR - Offline Only"); + setTitle("LAT_ACCEL_FACTOR - " + (params.getBool("TorquedOverride") ? tr("Real-time and Offline") : tr("Offline Only"))); setLabel(QString::number(torqueMaxLatAccelVal) + " " + unit); } diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.h index 31e67bf96a..8026cf7f1b 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnypilot_settings.h @@ -69,10 +69,10 @@ private: ScrollView *scrollView = nullptr; - const QString nnff_description = QString("%1
" + const QString nnff_description = QString("%1

" "%2") .arg(tr("Formerly known as \"NNFF\", this replaces the lateral \"torque\" controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy.")) - .arg(tr("Reach out to the sunnypilot team in the #tuning-nnlc channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported.")); + .arg(tr("Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: ") + "#tuning-nnlc"); QString nnffDescriptionBuilder(const QString &custom_description) { QString description = "" + custom_description + "

" + nnff_description; diff --git a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc index f5d94e062e..a0bea9d52b 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.cc @@ -7,13 +7,13 @@ VehiclePanel::VehiclePanel(QWidget *parent) : QWidget(parent) { fcr_layout->setContentsMargins(0, 20, 0, 20); set = QString::fromStdString(params.get("CarModelText")); - setCarBtn = new QPushButton(((set == "=== Not Selected ===") || (set.length() == 0)) ? "Select your car" : set); + setCarBtn = new QPushButton(((set == "=== Not Selected ===") || (set.length() == 0)) ? prompt_select : set); setCarBtn->setObjectName("setCarBtn"); setCarBtn->setStyleSheet("margin-right: 30px;"); connect(setCarBtn, &QPushButton::clicked, [=]() { QMap cars = getCarNames(); QString currentCar = QString::fromStdString(params.get("CarModel")); - QString selection = MultiOptionDialog::getSelection("Select your car", cars.keys(), cars.key(currentCar), this); + QString selection = MultiOptionDialog::getSelection(prompt_select, cars.keys(), cars.key(currentCar), this); if (!selection.isEmpty()) { params.put("CarModel", cars[selection].toStdString()); params.put("CarModelText", selection.toStdString()); @@ -64,7 +64,7 @@ void VehiclePanel::updateToggles() { } set = QString::fromStdString(params.get("CarModelText")); - setCarBtn->setText(((set == "=== Not Selected ===") || (set.length() == 0)) ? "Select your car" : set); + setCarBtn->setText(((set == "=== Not Selected ===") || (set.length() == 0)) ? prompt_select : set); } SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidget(parent, false) { @@ -74,8 +74,8 @@ SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidge addItem(new LabelControl(tr("Hyundai/Kia/Genesis"))); auto hkgSmoothStop = new ParamControl( "HkgSmoothStop", - "HKG CAN: Smoother Stopping Performance (Beta)", - "Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control.", + tr("HKG CAN: Smoother Stopping Performance (Beta)"), + tr("Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control."), "../assets/offroad/icon_blank.png" ); hkgSmoothStop->setConfirmation(true, false); @@ -96,8 +96,8 @@ SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidge addItem(new LabelControl(tr("Toyota/Lexus"))); stockLongToyota = new ParamControl( "StockLongToyota", - "Enable Stock Toyota Longitudinal Control", - "sunnypilot will not take over control of gas and brakes. Stock Toyota longitudinal control will be used.", + tr("Enable Stock Toyota Longitudinal Control"), + tr("sunnypilot will not take over control of gas and brakes. Stock Toyota longitudinal control will be used."), "../assets/offroad/icon_blank.png" ); stockLongToyota->setConfirmation(true, false); @@ -117,8 +117,8 @@ SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidge auto toyotaTss2LongTune = new ParamControl( "ToyotaTSS2Long", - "TSS2 Longitudinal: Custom Tuning", - "Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation.", + tr("Toyota TSS2 Longitudinal: Custom Tuning"), + tr("Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation."), "../assets/offroad/icon_blank.png" ); toyotaTss2LongTune->setConfirmation(true, false); @@ -126,8 +126,8 @@ SPVehiclesTogglesPanel::SPVehiclesTogglesPanel(VehiclePanel *parent) : ListWidge auto toyotaSngHack = new ParamControl( "ToyotaSnG", - "Enable Stop and Go Hack", - "sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk.", + tr("Enable Toyota Stop and Go Hack"), + tr("sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk."), "../assets/offroad/icon_blank.png" ); toyotaSngHack->setConfirmation(true, false); diff --git a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h index 06bb9f8fde..26a7eba4f5 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h +++ b/selfdrive/ui/qt/offroad/sunnypilot/vehicle_settings.h @@ -28,6 +28,7 @@ private: QString set; QWidget* home_widget; + QString prompt_select = tr("Select your car"); }; class SPVehiclesTogglesPanel : public ListWidget { diff --git a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc index 2747602e3b..6d2b1ebff6 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/visuals_settings.cc @@ -74,7 +74,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { // Visuals: Developer UI Info (Dev UI) std::vector dev_ui_settings_texts{tr("Off"), tr("5 Metrics"), tr("10 Metrics")}; dev_ui_settings = new ButtonParamControl( - "DevUIInfo", "Developer UI", "Display real-time parameters and metrics from various sources.", + "DevUIInfo", tr("Developer UI"), tr("Display real-time parameters and metrics from various sources."), "../assets/offroad/icon_blank.png", dev_ui_settings_texts, 380 @@ -84,7 +84,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { // Visuals: Display Metrics above Chevron std::vector chevron_info_settings_texts{tr("Off"), tr("Distance"), tr("Speed"), tr("Distance\nSpeed")}; chevron_info_settings = new ButtonParamControl( - "ChevronInfo", "Display Metrics Below Chevron", "Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control).", + "ChevronInfo", tr("Display Metrics Below Chevron"), tr("Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control)."), "../assets/offroad/icon_blank.png", chevron_info_settings_texts, 340 @@ -108,7 +108,7 @@ VisualsPanel::VisualsPanel(QWidget *parent) : ListWidget(parent) { std::vector sidebar_temp_texts{tr("Off"), tr("RAM"), tr("CPU"), tr("GPU"), tr("Max")}; sidebar_temp_setting = new ButtonParamControl( - "SidebarTemperatureOptions", "Display Temperature on Sidebar", "", + "SidebarTemperatureOptions", tr("Display Temperature on Sidebar"), "", "../assets/offroad/icon_blank.png", sidebar_temp_texts, 255 diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index eb6a580c01..74e61489a6 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -86,6 +86,14 @@ for "%1" من أجل "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + +
AnnotatedCameraWidget @@ -110,6 +118,87 @@ LIMIT + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ إلغاء + + CustomOffsetsSettings + + Back + السابق + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - مراجعة الأدوار والميزات والقيود في openpilot + مراجعة الأدوار والميزات والقيود في openpilot Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - يحتاج openpilot أن يتم ضبط الجهاز ضمن حدود 4 درجات يميناً أو يساراً و5 درجات نحو الأعلى أو 9 نحو الأسفل. يقوم openpilot بالمعايرة باستمرار، ونادراً ما يحتاج إلى عملية إعادة الضبط. + يحتاج openpilot أن يتم ضبط الجهاز ضمن حدود 4 درجات يميناً أو يساراً و5 درجات نحو الأعلى أو 9 نحو الأسفل. يقوم openpilot بالمعايرة باستمرار، ونادراً ما يحتاج إلى عملية إعادة الضبط. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review مراجعة + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -337,6 +543,79 @@ جارٍ التثبيت... + + LaneChangeSettings + + Back + السابق + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -378,6 +657,48 @@ بانتظار الطريق + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + م + + + hr + س + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -464,6 +785,12 @@ openpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield. لقد اكتشف openpilot تغييراً في موقع تركيب الجهاز. تأكد من تثبيت الجهاز بشكل كامل في موقعه وتثبيته بإحكام على الزجاج الأمامي. + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -480,6 +807,186 @@ تنبيه + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + د + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + التحقق + + + Country + + + + SELECT + اختيار + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + تحديث + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -510,6 +1017,21 @@ إلغاء + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -564,7 +1086,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -615,6 +1137,10 @@ ft قدم + + sunnypilot + + Reset @@ -657,6 +1183,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -679,6 +1284,38 @@ This may take up to a minute. Software البرنامج + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -861,6 +1498,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -935,6 +1623,233 @@ This may take up to a minute. up to date, last checked %1 أحدث نسخة، آخر تحقق %1 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + اختيار + + + Select a Driving Model + + + + Reset Calibration + إعادة ضبط المعايرة + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + متابعة + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + كم/س + + + mph + ميل/س + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + كم/س + + + mph + ميل/س + + + N/A + غير متاح + SshControl @@ -982,6 +1897,351 @@ This may take up to a minute. تمكين SSH + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + غير متاح + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -1005,11 +2265,11 @@ This may take up to a minute. TogglesPanel Enable 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. - استخدم نظام openpilot من أجل الضبط التكيفي للسرعة والحفاظ على مساعدة السائق للبقاء في المسار. انتباهك مطلوب في جميع الأوقات مع استخدام هذه الميزة. يعمل هذا التغيير في الإعدادات عند إيقاف تشغيل السيارة. + استخدم نظام openpilot من أجل الضبط التكيفي للسرعة والحفاظ على مساعدة السائق للبقاء في المسار. انتباهك مطلوب في جميع الأوقات مع استخدام هذه الميزة. يعمل هذا التغيير في الإعدادات عند إيقاف تشغيل السيارة. Enable Lane Departure Warnings @@ -1081,7 +2341,7 @@ This may take up to a minute. Standard - القياسي + القياسي Relaxed @@ -1093,7 +2353,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. - يوصى بالوضع القياسي. في الوضع الهجومي، سيتبع openpilot السيارات الرائدة بشكل أقرب، ويصبح أكثر هجومية في دواسات الوقود والمكابح. في وضعية الراحة يبقى openplot بعيداً لمسافة جيدة عن السيارة الرائدة. + يوصى بالوضع القياسي. في الوضع الهجومي، سيتبع 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: @@ -1139,6 +2399,89 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. تمكين التحكم الطولي من openpilot (ألفا) للسماح بالوضع التجريبي. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1175,6 +2518,165 @@ This may take up to a minute. فشل التحديث + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 6d814b9625..6632793bed 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -86,6 +86,14 @@ for "%1" für "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ LIMIT + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ Abbrechen + + CustomOffsetsSettings + + Back + Zurück + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - Wiederhole die Regeln, Fähigkeiten und Limitierungen von Openpilot + Wiederhole die Regeln, Fähigkeiten und Limitierungen von Openpilot Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - Damit Openpilot funktioniert, darf die Installationsposition nicht mehr als 4° nach rechts/links, 5° nach oben und 9° nach unten abweichen. Openpilot kalibriert sich durchgehend, ein Zurücksetzen ist selten notwendig. + Damit Openpilot funktioniert, darf die Installationsposition nicht mehr als 4° nach rechts/links, 5° nach oben und 9° nach unten abweichen. Openpilot kalibriert sich durchgehend, ein Zurücksetzen ist selten notwendig. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review Überprüfen + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -333,6 +539,79 @@ Installiere... + + LaneChangeSettings + + Back + Zurück + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -374,6 +653,48 @@ + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + std + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -459,6 +780,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -475,6 +802,186 @@ HINWEIS + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + min + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + ÜBERPRÜFEN + + + Country + + + + SELECT + AUSWÄHLEN + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + Aktualisieren + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -505,6 +1012,21 @@ Aktivieren + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -559,7 +1081,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -598,6 +1120,10 @@ ft fuß + + sunnypilot + + Reset @@ -639,6 +1165,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -661,6 +1266,38 @@ This may take up to a minute. Software Software + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -844,6 +1481,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -919,6 +1607,233 @@ This may take up to a minute. never + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + AUSWÄHLEN + + + Select a Driving Model + + + + Reset Calibration + Neu kalibrieren + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + Fortsetzen + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + Nicht verfügbar + SshControl @@ -966,6 +1881,351 @@ This may take up to a minute. SSH aktivieren + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + Nicht verfügbar + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -989,11 +2249,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - Openpilot aktivieren + Openpilot aktivieren 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. - Benutze das Openpilot System als adaptiven Tempomaten und Spurhalteassistenten. Deine Aufmerksamkeit ist jederzeit erforderlich, um diese Funktion zu nutzen. Diese Einstellung wird übernommen, wenn das Auto aus ist. + Benutze das Openpilot System als adaptiven Tempomaten und Spurhalteassistenten. Deine Aufmerksamkeit ist jederzeit erforderlich, um diese Funktion zu nutzen. Diese Einstellung wird übernommen, wenn das Auto aus ist. Enable Lane Departure Warnings @@ -1077,10 +2337,6 @@ This may take up to a minute. Aggressive - - Standard - - Relaxed @@ -1093,10 +2349,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 @@ -1125,6 +2377,89 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1161,6 +2496,165 @@ This may take up to a minute. Aktualisierung fehlgeschlagen + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index cd96c466e9..c2ade75df6 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -86,6 +86,14 @@ for "%1" pour "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ LIMITE + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ Annuler + + CustomOffsetsSettings + + Back + Retour + + DeclinePage @@ -215,7 +311,7 @@ Review the rules, features, and limitations of openpilot - Revoir les règles, fonctionnalités et limitations d'openpilot + Revoir les règles, fonctionnalités et limitations d'openpilot Are you sure you want to review the training guide? @@ -255,7 +351,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot nécessite que l'appareil soit monté à 4° à gauche ou à droite et à 5° vers le haut ou 9° vers le bas. openpilot se calibre en continu, la réinitialisation est rarement nécessaire. + openpilot nécessite que l'appareil soit monté à 4° à gauche ou à droite et à 5° vers le haut ou 9° vers le bas. openpilot se calibre en continu, la réinitialisation est rarement nécessaire. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Disengage to Power Off Désengager pour éteindre + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -333,6 +539,79 @@ Installation... + + LaneChangeSettings + + Back + Retour + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -374,6 +653,48 @@ En attente d'un trajet + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + h + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -460,6 +781,12 @@ openpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield. openpilot a détecté un changement dans la position de montage de l'appareil. Assurez-vous que l'appareil est totalement inséré dans le support et que le support est fermement fixé au pare-brise. + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -476,6 +803,186 @@ ALERTE + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + min + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + VÉRIFIER + + + Country + + + + SELECT + SÉLECTIONNER + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + MISE À JOUR + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -506,6 +1013,21 @@ Annuler + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -560,7 +1082,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -599,6 +1121,10 @@ ft ft + + sunnypilot + + Reset @@ -641,6 +1167,85 @@ Cela peut prendre jusqu'à une minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -663,6 +1268,38 @@ Cela peut prendre jusqu'à une minute. Software Logiciel + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -845,6 +1482,57 @@ Cela peut prendre jusqu'à une minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -919,6 +1607,233 @@ Cela peut prendre jusqu'à une minute. up to date, last checked %1 à jour, dernière vérification %1 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + SÉLECTIONNER + + + Select a Driving Model + + + + Reset Calibration + Réinitialiser la calibration + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + Continuer + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mi/h + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mi/h + + + N/A + N/A + SshControl @@ -966,6 +1881,351 @@ Cela peut prendre jusqu'à une minute. Activer SSH + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -989,11 +2249,11 @@ Cela peut prendre jusqu'à une minute. TogglesPanel Enable openpilot - Activer openpilot + Activer 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. - Utilisez le système openpilot pour le régulateur de vitesse adaptatif et l'assistance au maintien de voie. Votre attention est requise en permanence pour utiliser cette fonctionnalité. La modification de ce paramètre prend effet lorsque la voiture est éteinte. + Utilisez le système openpilot pour le régulateur de vitesse adaptatif et l'assistance au maintien de voie. Votre attention est requise en permanence pour utiliser cette fonctionnalité. La modification de ce paramètre prend effet lorsque la voiture est éteinte. openpilot Longitudinal Control (Alpha) @@ -1065,7 +2325,7 @@ Cela peut prendre jusqu'à une minute. Standard - Standard + Standard Relaxed @@ -1077,7 +2337,7 @@ 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. - 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. + 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: @@ -1123,6 +2383,89 @@ 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. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1159,6 +2502,165 @@ Cela peut prendre jusqu'à une minute. Échec de la mise à jour + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index d07c7d525a..e71735be0e 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -86,6 +86,14 @@ for "%1" ネットワーク名:%1 + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ 制限速度 + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ キャンセル + + CustomOffsetsSettings + + Back + 戻る + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - openpilot の特徴を見る + openpilot の特徴を見る Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilotの本体は、左右4°以内、上5°、下9°以内の角度で取付ける必要があります。継続してキャリブレーションを続けているので、手動でリセットを行う必要はほぼありません。 + openpilotの本体は、左右4°以内、上5°、下9°以内の角度で取付ける必要があります。継続してキャリブレーションを続けているので、手動でリセットを行う必要はほぼありません。 Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review 確認 + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ インストールしています... + + LaneChangeSettings + + Back + 戻る + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + メートル + + + hr + 時間 + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -458,6 +779,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -474,6 +801,186 @@ 警告 + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + 確認 + + + Country + + + + SELECT + 選択 + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + 更新 + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -504,6 +1011,21 @@ を有効化 + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -558,7 +1080,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -594,6 +1116,10 @@ ft フィート + + sunnypilot + + Reset @@ -635,6 +1161,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -657,6 +1262,38 @@ This may take up to a minute. Software ソフトウェア + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -839,6 +1476,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -913,6 +1601,233 @@ This may take up to a minute. never + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + 選択 + + + Select a Driving Model + + + + Reset Calibration + キャリブレーションをリセット + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + 続ける + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + N/A + SshControl @@ -960,6 +1875,351 @@ This may take up to a minute. SSH を有効化 + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -983,11 +2243,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - 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. - openpilotによるアダプティブクルーズコントロールとレーンキーピングドライバーアシストを利用します。この機能を利用する際は、常に前方への注意が必要です。この設定を変更すると、車の電源が切れた時に反映されます。 + openpilotによるアダプティブクルーズコントロールとレーンキーピングドライバーアシストを利用します。この機能を利用する際は、常に前方への注意が必要です。この設定を変更すると、車の電源が切れた時に反映されます。 Enable Lane Departure Warnings @@ -1069,10 +2329,6 @@ This may take up to a minute. Aggressive - - Standard - - Relaxed @@ -1085,10 +2341,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 @@ -1117,6 +2369,89 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1153,6 +2488,165 @@ This may take up to a minute. 更新失敗 + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index a903978329..a3d31a6b28 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -86,6 +86,14 @@ for "%1" "%1"에 접속하려면 비밀번호가 필요합니다 + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ LIMIT + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ 취소 + + CustomOffsetsSettings + + Back + 뒤로 + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - openpilot의 규칙, 기능 및 제한 다시 확인 + openpilot의 규칙, 기능 및 제한 다시 확인 Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot 장치는 좌우 4°, 위로 5°, 아래로 9° 이내 각도로 장착되어야 합니다. openpilot은 지속적으로 자동 보정되며 재설정은 거의 필요하지 않습니다. + openpilot 장치는 좌우 4°, 위로 5°, 아래로 9° 이내 각도로 장착되어야 합니다. openpilot은 지속적으로 자동 보정되며 재설정은 거의 필요하지 않습니다. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review 다시보기 + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ 설치 중... + + LaneChangeSettings + + Back + 뒤로 + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ 경로를 기다리는 중 + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + 시간 + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -459,6 +780,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 장치 온도가 너무 높습니다. 시작하기 전에 온도를 낮춰주세요. 현재 내부 부품 온도: %1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -475,6 +802,186 @@ 알림 + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + 확인 + + + Country + + + + SELECT + 선택 + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + 업데이트 + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -505,6 +1012,21 @@ 활성화 + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -559,7 +1081,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -595,6 +1117,10 @@ ft ft + + sunnypilot + + Reset @@ -637,6 +1163,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -659,6 +1264,38 @@ This may take up to a minute. Software 소프트웨어 + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -841,6 +1478,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -915,6 +1603,233 @@ This may take up to a minute. never 업데이트 안함 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + 선택 + + + Select a Driving Model + + + + Reset Calibration + 캘리브레이션 초기화 + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + 계속 + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + N/A + SshControl @@ -962,6 +1877,351 @@ This may take up to a minute. SSH 사용 + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -985,11 +2245,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - 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. - 어댑티브 크루즈 컨트롤 및 차로 유지 보조를 위해 openpilot 시스템을 사용할 수 있습니다. 이 기능을 사용할 때에는 언제나 주의를 기울여야 합니다. 설정을 변경하면 차량 시동이 꺼졌을 때 적용됩니다. + 어댑티브 크루즈 컨트롤 및 차로 유지 보조를 위해 openpilot 시스템을 사용할 수 있습니다. 이 기능을 사용할 때에는 언제나 주의를 기울여야 합니다. 설정을 변경하면 차량 시동이 꺼졌을 때 적용됩니다. Enable Lane Departure Warnings @@ -1081,7 +2341,7 @@ This may take up to a minute. Standard - 표준 + 표준 Relaxed @@ -1093,7 +2353,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. - 표준 모드를 권장합니다. 공격적 모드에서 openpilot은 앞 차량을 더 가까이 따라가며 적극적으로 가감속합니다. 편안한 모드에서 openpilot은 앞 차량을 더 멀리서 따라갑니다. + 표준 모드를 권장합니다. 공격적 모드에서 openpilot은 앞 차량을 더 가까이 따라가며 적극적으로 가감속합니다. 편안한 모드에서 openpilot은 앞 차량을 더 멀리서 따라갑니다. An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. @@ -1119,6 +2379,89 @@ 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. 주행 시각화는 저속으로 주행 시 도로를 향한 광각 카메라로 자동 전환되어 일부 곡선 경로를 더 잘 보여줍니다. 실험 모드 로고는 우측 상단에 표시됩니다. 내비게이션 목적지가 설정되고 주행 모델에 입력되면 지도의 주행 경로가 녹색으로 바뀝니다. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1155,6 +2498,165 @@ This may take up to a minute. 업데이트 실패 + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index fce5a8a8ff..03f4e053b3 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -86,6 +86,14 @@ for "%1" para "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ VELO + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ Cancelar + + CustomOffsetsSettings + + Back + Voltar + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - Revisar regras, aprimoramentos e limitações do openpilot + Revisar regras, aprimoramentos e limitações do openpilot Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - O openpilot requer que o dispositivo seja montado dentro de 4° esquerda ou direita e dentro de 5° para cima ou 9° para baixo. O openpilot está continuamente calibrando, resetar raramente é necessário. + O openpilot requer que o dispositivo seja montado dentro de 4° esquerda ou direita e dentro de 5° para cima ou 9° para baixo. O openpilot está continuamente calibrando, resetar raramente é necessário. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review Revisar + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -333,6 +539,79 @@ Instalando... + + LaneChangeSettings + + Back + Voltar + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -374,6 +653,48 @@ Aguardando rota + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + hr + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -460,6 +781,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 Temperatura do dispositivo muito alta. O sistema está sendo resfriado antes de iniciar. A temperatura atual do componente interno é: %1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -476,6 +803,186 @@ ALERTA + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + min + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + VERIFICAR + + + Country + + + + SELECT + SELECIONE + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + ATUALIZAÇÃO + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -506,6 +1013,21 @@ Ativar + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -560,7 +1082,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -599,6 +1121,10 @@ ft pés + + sunnypilot + + Reset @@ -641,6 +1167,85 @@ Isso pode levar até um minuto. Reinicialização do sistema acionada. Pressione confirmar para apagar todo o conteúdo e configurações. Pressione cancel para retomar a inicialização. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -663,6 +1268,38 @@ Isso pode levar até um minuto. Software Software + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -845,6 +1482,57 @@ Isso pode levar até um minuto. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -919,6 +1607,233 @@ Isso pode levar até um minuto. never nunca + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + SELECIONE + + + Select a Driving Model + + + + Reset Calibration + Reinicializar Calibragem + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + Continuar + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + N/A + SshControl @@ -966,6 +1881,351 @@ Isso pode levar até um minuto. Habilitar SSH + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -989,11 +2249,11 @@ Isso pode levar até um minuto. TogglesPanel Enable openpilot - Ativar openpilot + Ativar 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. - Use o sistema openpilot para controle de cruzeiro adaptativo e assistência ao motorista de manutenção de faixa. Sua atenção é necessária o tempo todo para usar esse recurso. A alteração desta configuração tem efeito quando o carro é desligado. + Use o sistema openpilot para controle de cruzeiro adaptativo e assistência ao motorista de manutenção de faixa. Sua atenção é necessária o tempo todo para usar esse recurso. A alteração desta configuração tem efeito quando o carro é desligado. Enable Lane Departure Warnings @@ -1085,7 +2345,7 @@ Isso pode levar até um minuto. Standard - Neutro + Neutro Relaxed @@ -1097,7 +2357,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. - 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. + 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. @@ -1123,6 +2383,89 @@ 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. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1159,6 +2502,165 @@ Isso pode levar até um minuto. Falha na atualização + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index f4d097b2a2..b758866a21 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -86,6 +86,14 @@ for "%1" สำหรับ "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ จำกัด + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ ยกเลิก + + CustomOffsetsSettings + + Back + ย้อนกลับ + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - ตรวจสอบกฎ คุณสมบัติ และข้อจำกัดของ openpilot + ตรวจสอบกฎ คุณสมบัติ และข้อจำกัดของ openpilot Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot กำหนดให้ติดตั้งอุปกรณ์ โดยสามารถเอียงด้านซ้ายหรือขวาไม่เกิน 4° และเอียงขึ้นด้านบนไม่เกิน 5° หรือเอียงลงด้านล่างไม่เกิน 9° openpilot ทำการคาลิเบรทอย่างต่อเนื่อง แทบจะไม่จำเป็นต้องทำการรีเซ็ตการคาลิเบรท + openpilot กำหนดให้ติดตั้งอุปกรณ์ โดยสามารถเอียงด้านซ้ายหรือขวาไม่เกิน 4° และเอียงขึ้นด้านบนไม่เกิน 5° หรือเอียงลงด้านล่างไม่เกิน 9° openpilot ทำการคาลิเบรทอย่างต่อเนื่อง แทบจะไม่จำเป็นต้องทำการรีเซ็ตการคาลิเบรท Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review ทบทวน + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ กำลังติดตั้ง... + + LaneChangeSettings + + Back + ย้อนกลับ + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ กำลังรอเส้นทาง + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + ม. + + + hr + ชม. + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -459,6 +780,12 @@ openpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield. openpilot ตรวจพบการเปลี่ยนแปลงของตำแหน่งที่ติดตั้ง กรุณาตรวจสอบว่าได้เลื่อนอุปกรณ์เข้ากับจุดติดตั้งจนสุดแล้ว และจุดติดตั้งได้ยึดติดกับกระจกหน้าอย่างแน่นหนา + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -475,6 +802,186 @@ การแจ้งเตือน + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + นาที + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + ตรวจสอบ + + + Country + + + + SELECT + เลือก + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + อัปเดต + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -505,6 +1012,21 @@ ยกเลิก + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -559,7 +1081,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -595,6 +1117,10 @@ ft ฟุต + + sunnypilot + + Reset @@ -637,6 +1163,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -659,6 +1264,38 @@ This may take up to a minute. Software ซอฟต์แวร์ + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -841,6 +1478,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -915,6 +1603,233 @@ This may take up to a minute. up to date, last checked %1 ล่าสุดแล้ว ตรวจสอบครั้งสุดท้ายเมื่อ %1 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + เลือก + + + Select a Driving Model + + + + Reset Calibration + รีเซ็ตการคาลิเบรท + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + ดำเนินการต่อ + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + กม./ชม. + + + mph + ไมล์/ชม. + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + กม./ชม. + + + mph + ไมล์/ชม. + + + N/A + ไม่มี + SshControl @@ -962,6 +1877,351 @@ This may take up to a minute. เปิดใช้งาน SSH + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + ไม่มี + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -985,11 +2245,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - เปิดใช้งาน 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. - ใช้ระบบ openpilot สำหรับระบบควบคุมความเร็วอัตโนมัติ และระบบช่วยควบคุมรถให้อยู่ในเลน คุณจำเป็นต้องให้ความสนใจตลอดเวลาที่ใช้คุณสมบัตินี้ การเปลี่ยนการตั้งค่านี้จะมีผลเมื่อคุณดับเครื่องยนต์ + ใช้ระบบ openpilot สำหรับระบบควบคุมความเร็วอัตโนมัติ และระบบช่วยควบคุมรถให้อยู่ในเลน คุณจำเป็นต้องให้ความสนใจตลอดเวลาที่ใช้คุณสมบัตินี้ การเปลี่ยนการตั้งค่านี้จะมีผลเมื่อคุณดับเครื่องยนต์ Enable Lane Departure Warnings @@ -1081,7 +2341,7 @@ This may take up to a minute. Standard - มาตรฐาน + มาตรฐาน Relaxed @@ -1093,7 +2353,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. - แนะนำให้ใช้แบบมาตรฐาน ในโหมดดุดัน openpilot จะตามรถคันหน้าใกล้ขึ้นและเร่งและเบรคแบบดุดันมากขึ้น ในโหมดผ่อนคลาย openpilot จะอยู่ห่างจากรถคันหน้ามากขึ้น + แนะนำให้ใช้แบบมาตรฐาน ในโหมดดุดัน openpilot จะตามรถคันหน้าใกล้ขึ้นและเร่งและเบรคแบบดุดันมากขึ้น ในโหมดผ่อนคลาย openpilot จะอยู่ห่างจากรถคันหน้ามากขึ้น An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. @@ -1119,6 +2379,89 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. เปิดระบบควบคุมการเร่ง/เบรคโดย openpilot (alpha) เพื่อเปิดใช้งานโหมดทดลอง + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1155,6 +2498,165 @@ This may take up to a minute. การอัปเดตล้มเหลว + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index ec6f71f5b0..d69c1413a0 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -86,6 +86,14 @@ for "%1" için "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ LİMİT + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ Vazgeç + + CustomOffsetsSettings + + Back + + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - openpilot sisteminin kurallarını ve sınırlamalarını gözden geçirin. + openpilot sisteminin kurallarını ve sınırlamalarını gözden geçirin. Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot, cihazın 4° sola veya 5° yukarı yada 9° aşağı bakıcak şekilde monte edilmesi gerekmektedir. openpilot sürekli kendisini kalibre edilmektedir ve nadiren sıfırlama gerebilir. + openpilot, cihazın 4° sola veya 5° yukarı yada 9° aşağı bakıcak şekilde monte edilmesi gerekmektedir. openpilot sürekli kendisini kalibre edilmektedir ve nadiren sıfırlama gerebilir. Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ Yükleniyor... + + LaneChangeSettings + + Back + + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + saat + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -458,6 +779,12 @@ openpilot detected a change in the device's mounting position. Ensure the device is fully seated in the mount and the mount is firmly secured to the windshield. + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -474,6 +801,186 @@ UYARI + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + dk + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + KONTROL ET + + + Country + + + + SELECT + + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + GÜNCELLE + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -504,6 +1011,21 @@ + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -558,7 +1080,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -594,6 +1116,10 @@ ft ft + + sunnypilot + + Reset @@ -635,6 +1161,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -657,6 +1262,38 @@ This may take up to a minute. Software Yazılım + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -839,6 +1476,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -913,6 +1601,233 @@ This may take up to a minute. up to date, last checked %1 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + + + + Select a Driving Model + + + + Reset Calibration + Kalibrasyonu sıfırla + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + Devam et + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + N/A + SshControl @@ -960,6 +1875,351 @@ This may take up to a minute. SSH aç + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -983,11 +2243,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - openpilot'u aktifleştir + openpilot'u aktifleştir 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. - Ayarlanabilir hız sabitleyici ve şeritte kalma yardımı için openpilot sistemini kullanın. Bu özelliği kullanırken her zaman dikkatli olmanız gerekiyor. Bu ayarın değiştirilmesi için araç kapatılıp açılması gerekiyor. + Ayarlanabilir hız sabitleyici ve şeritte kalma yardımı için openpilot sistemini kullanın. Bu özelliği kullanırken her zaman dikkatli olmanız gerekiyor. Bu ayarın değiştirilmesi için araç kapatılıp açılması gerekiyor. Enable Lane Departure Warnings @@ -1053,10 +2313,6 @@ This may take up to a minute. Aggressive - - Standard - - Relaxed @@ -1069,10 +2325,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: @@ -1117,6 +2369,89 @@ This may take up to a minute. Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode. + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1153,6 +2488,165 @@ This may take up to a minute. Güncelleme başarız oldu + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 91f55c6e94..8f27321681 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -86,6 +86,14 @@ for "%1" 网络名称:"%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ LIMIT + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ 取消 + + CustomOffsetsSettings + + Back + 返回 + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - 查看 openpilot 的使用规则,以及其功能和限制 + 查看 openpilot 的使用规则,以及其功能和限制 Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot要求设备安装的偏航角在左4°和右4°之间,俯仰角在上5°和下9°之间。一般来说,openpilot会持续更新校准,很少需要重置。 + openpilot要求设备安装的偏航角在左4°和右4°之间,俯仰角在上5°和下9°之间。一般来说,openpilot会持续更新校准,很少需要重置。 Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review 预览 + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ 正在安装…… + + LaneChangeSettings + + Back + 返回 + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ 等待路线 + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + 小时 + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -459,6 +780,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 设备温度过高。系统正在冷却中,等冷却完毕后才会启动。目前内部组件温度:%1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -475,6 +802,186 @@ 警报 + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + 分钟 + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + 查看 + + + Country + + + + SELECT + 选择 + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + 更新 + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -505,6 +1012,21 @@ 启用 + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -559,7 +1081,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -595,6 +1117,10 @@ ft ft + + sunnypilot + + Reset @@ -637,6 +1163,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -659,6 +1264,38 @@ This may take up to a minute. Software 软件 + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -841,6 +1478,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -915,6 +1603,233 @@ This may take up to a minute. never 从未更新 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + 选择 + + + Select a Driving Model + + + + Reset Calibration + 重置设备校准 + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + 继续 + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + N/A + SshControl @@ -962,6 +1877,351 @@ This may take up to a minute. 启用SSH + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + N/A + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -985,11 +2245,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - 启用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. - 使用openpilot进行自适应巡航和车道保持辅助。使用此功能时您必须时刻保持注意力。该设置的更改在熄火时生效。 + 使用openpilot进行自适应巡航和车道保持辅助。使用此功能时您必须时刻保持注意力。该设置的更改在熄火时生效。 Enable Lane Departure Warnings @@ -1081,7 +2341,7 @@ This may take up to a minute. Standard - 标准 + 标准 Relaxed @@ -1093,7 +2353,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. - 推荐使用标准模式。在积极模式中,openpilot 会更靠近前车并在加速和刹车方面更积极。在舒适模式中,openpilot 会与前车保持较远的距离。 + 推荐使用标准模式。在积极模式中,openpilot 会更靠近前车并在加速和刹车方面更积极。在舒适模式中,openpilot 会与前车保持较远的距离。 An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. @@ -1119,6 +2379,89 @@ 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. 行驶画面将在低速时切换到道路朝向的广角摄像头,以更好地显示一些转弯。实验模式标志也将显示在右上角。当设置了导航目的地并且驾驶模型正在使用它作为输入时,地图上的驾驶路径将变为绿色。 + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1155,6 +2498,165 @@ This may take up to a minute. 更新失败 + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index e8c8854d0e..742eff88b0 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -86,6 +86,14 @@ for "%1" 給 "%1" + + Retain hotspot/tethering state + + + + Enabling this toggle will retain the hotspot/tethering toggle state across reboots. + + AnnotatedCameraWidget @@ -110,6 +118,87 @@ 速限 + + AutoLaneChangeTimer + + Auto Lane Change Timer + + + + Set a timer to delay the auto lane change operation when the blinker is used. No nudge on the steering wheel is required to auto lane change if a timer is set. +Please use caution when using this feature. Only use the blinker when traffic and road conditions permit. + + + + s + + + + Nudge + + + + Nudgeless + + + + + BackupSettings + + Settings updated successfully, but no additional data was returned by the server. + + + + OOPS! We made a booboo. + + + + Please try again later. + + + + Settings restored. Confirm to restart the interface. + + + + No settings found to restore. + + + + Settings backed up for sunnylink Device ID: + + + + + BrightnessControl + + Brightness + + + + Manually adjusts the global brightness of the screen. + + + + Auto + + + + + CameraOffset + + Camera Offset - Laneful Only + + + + Hack to trick vehicle to be left or right biased in its lane. Decreasing the value will make the car keep more left, increasing will make it keep more right. Changes take effect immediately. Default: +4 cm + + + + cm + + + ConfirmationDialog @@ -121,6 +210,13 @@ 取消 + + CustomOffsetsSettings + + Back + 回上頁 + + DeclinePage @@ -211,7 +307,7 @@ Review the rules, features, and limitations of openpilot - 觀看 openpilot 的使用規則、功能和限制 + 觀看 openpilot 的使用規則、功能和限制 Are you sure you want to review the training guide? @@ -247,7 +343,7 @@ openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. openpilot is continuously calibrating, resetting is rarely required. - openpilot 需要將設備固定在左右偏差 4° 以內,朝上偏差 5° 以內或朝下偏差 9° 以內。鏡頭在後台會持續自動校準,很少有需要重設的情況。 + openpilot 需要將設備固定在左右偏差 4° 以內,朝上偏差 5° 以內或朝下偏差 9° 以內。鏡頭在後台會持續自動校準,很少有需要重設的情況。 Your device is pointed %1° %2 and %3° %4. @@ -293,6 +389,116 @@ Review 回顧 + + TOGGLE + + + + Enable or disable PIN requirement for Fleet Manager access. + + + + Are you sure you want to turn off PIN requirement? + + + + Turn Off + + + + Error Troubleshoot + + + + Display error from the tmux session when an error has occurred from a system process. + + + + Reset Mapbox Access Token + + + + Are you sure you want to reset the Mapbox access token? + + + + Reset sunnypilot Settings + + + + Are you sure you want to reset all sunnypilot settings? + + + + Review the rules, features, and limitations of sunnypilot + + + + sunnypilot requires the device to be mounted within 4° left or right and within 5° up or 9° down. sunnypilot is continuously calibrating, resetting is rarely required. + + + + OFF + + + + Fleet Manager PIN: + + + + + DisplayPanel + + Driving Screen Off: Non-Critical Events + + + + When <b>Driving Screen Off Timer</b> is not set to <b>"Always On"</b>: + + + + Enabled: Wake the brightness of the screen to display all events. + + + + Disabled: Wake the brightness of the screen to display critical events. + + + + Enable Screen Recorder + + + + Enable this will display a button on the onroad screen to toggle on or off real-time screen recording with UI elements. + + + + + DriveStats + + Drives + + + + Hours + + + + ALL TIME + + + + PAST WEEK + + + + KM + + + + Miles + + DriverViewWindow @@ -332,6 +538,79 @@ 安裝中… + + LaneChangeSettings + + Back + 回上頁 + + + Pause Lateral Below Speed w/ Blinker + + + + Enable this toggle to pause lateral actuation with blinker when traveling below 20 MPH or 32 km/h. + + + + Auto Lane Change: Delay with Blind Spot + + + + Toggle to enable a delay timer for seamless lane changes when blind spot monitoring (BSM) detects a obstructing vehicle, ensuring safe maneuvering. + + + + Block Lane Change: Road Edge Detection + + + + Enable this toggle to block lane change when road edge is detected on the stalk actuated side. + + + + + MadsSettings + + Enable ACC+MADS with RES+/SET- + + + + Engage both M.A.D.S. and ACC with a single press of RES+ or SET- button. + + + + Note: Once M.A.D.S. is engaged via this mode, it will remain engaged until it is manually disabled via the M.A.D.S. button or car shut off. + + + + Toggle M.A.D.S. with Cruise Main + + + + Allows M.A.D.S. engagement/disengagement with "Cruise Main" cruise control button from the steering wheel. + + + + Remain Active + + + + Pause Steering + + + + Steering Mode After Braking + + + + Choose how Automatic Lane Centering (ALC) behaves after the brake pedal is manually pressed in sunnypilot. + +Remain Active: ALC will remain active even after the brake pedal is pressed. +Pause Steering: ALC will be paused after the brake pedal is manually pressed. + + + MapETA @@ -373,6 +652,48 @@ 等待路線 + + MaxTimeOffroad + + Max Time Offroad + + + + Device is automatically turned off after a set time when the engine is turned off (off-road) after driving (on-road). + + + + s + + + + m + m + + + hr + 小時 + + + Always On + + + + Immediate + + + + + MonitoringPanel + + Enable Hands on Wheel Monitoring + + + + Monitor and alert when driver is not keeping the hands on the steering wheel. + + + MultiOptionDialog @@ -459,6 +780,12 @@ Device temperature too high. System cooling down before starting. Current internal component temperature: %1 設備溫度過高。系統正在冷卻中,等冷卻完畢後才會啟動。目前內部組件溫度:%1 + + OpenStreetMap database is out of date. New maps must be downloaded if you wish to continue using OpenStreetMap data for Enhanced Speed Control and road name display. + +%1 + + OffroadHome @@ -475,6 +802,186 @@ 提醒 + + OnroadScreenOff + + Driving Screen Off Timer + + + + Turn off the device screen or reduce brightness to protect the screen after driving starts. It automatically brightens or turns on when a touch or event occurs. + + + + s + + + + min + 分鐘 + + + Always On + + + + + OnroadScreenOffBrightness + + Driving Screen Off Brightness (%) + + + + When using the Driving Screen Off feature, the brightness is reduced according to the automatic brightness ratio. + + + + Dark + + + + + OnroadSettings + + ONROAD OPTIONS + + + + <b>ONROAD SETTINGS | SUNNYPILOT</b> + + + + + OsmPanel + + Mapd Version + + + + Offline Maps ETA + + + + Time Elapsed + + + + Downloaded Maps + + + + DELETE + + + + This will delete ALL downloaded maps + +Are you sure you want to delete all the maps? + + + + Yes, delete all the maps. + + + + Database Update + + + + CHECK + 檢查 + + + Country + + + + SELECT + 選取 + + + Fetching Country list... + + + + State + + + + Fetching State list... + + + + All + + + + REFRESH + + + + UPDATE + 更新 + + + Download starting... + + + + Error: Invalid download. Retry. + + + + Download complete! + + + + + +Warning: You are on a metered connection! + + + + This will start the download process and it might take a while to complete. + + + + Continue on Metered + + + + Start Download + + + + m + + + + s + + + + Calculating... + + + + Downloaded + + + + Calculating ETA... + + + + Ready + + + + Time remaining: + + + PairingPopup @@ -505,6 +1012,21 @@ 啟用 + + PathOffset + + Path Offset + + + + Hack to trick the model path to be left or right biased of the lane. Decreasing the value will shift the model more left, increasing will shift the model more right. Changes take effect immediately. + + + + cm + + + PrimeAdWidget @@ -559,7 +1081,7 @@ openpilot - openpilot + openpilot %n minute(s) ago @@ -595,6 +1117,10 @@ ft ft + + sunnypilot + + Reset @@ -637,6 +1163,85 @@ This may take up to a minute. + + SPVehiclesTogglesPanel + + Hyundai/Kia/Genesis + + + + Subaru + + + + Manual Parking Brake: Stop and Go (Beta) + + + + Experimental feature to enable stop and go for Subaru Global models with manual handbrake. Models with electric parking brake should keep this disabled. Thanks to martinl for this implementation! + + + + Toyota/Lexus + + + + Allow M.A.D.S. toggling w/ LKAS Button (Beta) + + + + Allows M.A.D.S. engagement/disengagement with "LKAS" button from the steering wheel. + + + + Note: Enabling this toggle may have unexpected behavior with steering control. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Volkswagen + + + + Enable CC Only support + + + + sunnypilot supports Volkswagen MQB CC only platforms with this toggle enabled. Only enable this toggle if your car does not have ACC from the factory. + + + + HKG CAN: Smoother Stopping Performance (Beta) + + + + Smoother stopping behind a stopped car or desired stopping event. This is only applicable to HKG CAN platforms using openpilot longitudinal control. + + + + Enable Stock Toyota Longitudinal Control + + + + sunnypilot will <b>not</b> take over control of gas and brakes. Stock Toyota longitudinal control will be used. + + + + Toyota TSS2 Longitudinal: Custom Tuning + + + + Smoother longitudinal performance for Toyota/Lexus TSS2/LSS2 cars. Big thanks to dragonpilot-community for this implementation. + + + + Enable Toyota Stop and Go Hack + + + + sunnypilot will allow some Toyota/Lexus cars to auto resume during stop and go traffic. This feature is only applicable to certain models. Use at your own risk. + + + SettingsWindow @@ -659,6 +1264,38 @@ This may take up to a minute. Software 軟體 + + sunnylink + + + + sunnypilot + + + + OSM + + + + Monitoring + + + + Visuals + + + + Display + + + + Trips + + + + Vehicle + + Setup @@ -841,6 +1478,57 @@ This may take up to a minute. 5G + + SlcSettings + + Auto + + + + User Confirm + + + + Engage Mode + + + + Default + + + + Fixed + + + + Percentage + + + + Limit Offset + + + + Set speed limit slightly higher than actual speed limit for a more natural drive. + + + + Select the desired mode to set the cruising speed to the speed limit: + + + + Auto: Automatic speed adjustment on motorways based on speed limit data. + + + + User Confirm: Inform the driver to change set speed of Adaptive Cruise Control to help the driver stay within the speed limit. + + + + This platform defaults to <b>Auto</b> mode. <b>User Confirm</b> mode is not supported on this platform. + + + SoftwarePanel @@ -915,6 +1603,233 @@ This may take up to a minute. never 從未更新 + + Driving Model + + + + + SoftwarePanelSP + + Driving Model + + + + SELECT + 選取 + + + Select a Driving Model + + + + Reset Calibration + 重設校準 + + + Warning: You are on a metered connection! + + + + Downloading Driving model + + + + Driving model + + + + downloaded + + + + (CACHED) + + + + Downloading Navigation model + + + + Navigation model + + + + Downloading Metadata model + + + + Metadata model + + + + Downloads have failed, please try swapping the model! + + + + Failed: + + + + Fetching models... + + + + We STRONGLY suggest you to reset calibration. Would you like to do that now? + + + + Continue + 繼續 + + + on Metered + + + + Download has started in the background. + + + + + SpeedLimitPolicySettings + + Speed Limit Source Policy + + + + Select the precedence order of sources. Utilized by Speed Limit Control and Speed Limit Warning + + + + Nav Only: Data from Mapbox active navigation only. + + + + Map Only: Data from OpenStreetMap only. + + + + Car Only: Data from the car's built-in sources (if available). + + + + Nav First: Nav -> Map -> Car + + + + Map First: Map -> Nav -> Car + + + + Car First: Car -> Nav -> Map + + + + Nav + + + + Only + + + + Map + + + + Car + + + + First + + + + + SpeedLimitValueOffset + + km/h + km/h + + + mph + mph + + + + SpeedLimitWarningSettings + + Off + + + + Display + + + + Chime + + + + Speed Limit Warning + + + + Warning with speed limit flash + + + + When Speed Limit Warning is enabled, the speed limit sign will alert the driver when the cruising speed is faster than then speed limit plus the offset. + + + + Default + + + + Fixed + + + + Percentage + + + + Warning Offset + + + + Select the desired offset to warn the driver when the vehicle is driving faster than the speed limit. + + + + Off: When the cruising speed is faster than the speed limit plus the offset, there will be no warning. + + + + Display: The speed on the speed limit sign turns red to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + Chime: The speed on the speed limit sign turns red and chimes to alert the driver when the cruising speed is faster than the speed limit plus the offset. + + + + + SpeedLimitWarningValueOffset + + km/h + km/h + + + mph + mph + + + N/A + 無法使用 + SshControl @@ -962,6 +1877,351 @@ This may take up to a minute. 啟用 SSH 服務 + + SunnylinkPanel + + sunnylink Dongle ID + + + + N/A + 無法使用 + + + Sponsor Status + + + + SPONSOR + + + + Become a sponsor of sunnypilot to get early access to sunnylink features. + + + + Manage Settings + + + + Backup Settings + + + + Are you sure you want to backup sunnypilot settings? + + + + Early alpha access only. Become a sponsor to get early access to sunnylink features. + + + + Become a Sponsor + + + + Restore Settings + + + + Are you sure you want to restore the last backed up sunnypilot settings? + + + + Restore + + + + THANKS + + + + Sponsor + + + + Not Sponsor + + + + Backing up... + + + + Restoring... + + + + Back Up + + + + + SunnylinkSponsorPopup + + Early Access: Become a sunnypilot Sponsor + + + + Scan the QR code to visit sunnyhaibin's GitHub Sponsors page + + + + Choose your sponsorship tier and confirm your support + + + + Join our community on Discord at https://discord.gg/sunnypilot and reach out to a moderator to confirm your sponsor status + + + + + SunnypilotPanel + + Enable M.A.D.S. + + + + Enable the beloved M.A.D.S. feature. Disable toggle to revert back to stock openpilot engagement/disengagement. + + + + Laneless for Curves in "Auto" Mode + + + + While in Auto Lane, switch to Laneless for current/future curves. + + + + Speed Limit Control (SLC) + + + + When you engage ACC, you will be prompted to set the cruising speed to the speed limit of the road adjusted by the Offset and Source Policy specified, or the current driving speed. The maximum cruising speed will always be the MAX set speed. + + + + Enable Vision-based Turn Speed Control (V-TSC) + + + + Use vision path predictions to estimate the appropriate speed to drive through turns ahead. + + + + Enable Map Data Turn Speed Control (M-TSC) (Beta) + + + + Use curvature information from map data to define speed limits to take turns ahead. + + + + ACC +/-: Long Press Reverse + + + + Change the ACC +/- buttons behavior with cruise speed change in sunnypilot. + + + + Disabled (Stock): Short=1, Long = 5 (imperial) / 10 (metric) + + + + Enabled: Short = 5 (imperial) / 10 (metric), Long=1 + + + + Custom Offsets + + + + Neural Network Lateral Control (NNLC) + + + + Enforce Torque Lateral Control + + + + Enable this to enforce sunnypilot to steer with Torque lateral control. + + + + Enable Self-Tune + + + + Enables self-tune for Torque lateral control for platforms that do not use Torque lateral control by default. + + + + Less Restrict Settings for Self-Tune (Beta) + + + + Less strict settings when using Self-Tune. This allows torqued to be more forgiving when learning values. + + + + Enable Custom Tuning + + + + Enables custom tuning for Torque lateral control. Modifying FRICTION and LAT_ACCEL_FACTOR below will override the offline values indicated in the YAML files within "selfdrive/torque_data". The values will also be used live when "Override Self-Tune" toggle is enabled. + + + + Manual Real-Time Tuning + + + + Enforces the torque lateral controller to use the fixed values instead of the learned values from Self-Tune. Enabling this toggle overrides Self-Tune values. + + + + Quiet Drive 🤫 + + + + sunnypilot will display alerts but only play the most important warning sounds. This feature can be toggled while the car is on. + + + + Green Traffic Light Chime (Beta) + + + + A chime will play when the traffic light you are waiting for turns green and you have no vehicle in front of you. If you are waiting behind another vehicle, the chime will play once the vehicle advances unless ACC is engaged. + + + + Note: This chime is only designed as a notification. It is the driver's responsibility to observe their environment and make decisions accordingly. + + + + Lead Vehicle Departure Alert + + + + Enable this will notify when the leading vehicle drives away. + + + + Customize M.A.D.S. + + + + Customize Lane Change + + + + Customize Offsets + + + + Customize Speed Limit Control + + + + Customize Warning + + + + Customize Source + + + + Laneful + + + + Laneless + + + + Auto + + + + Speed Limit Assist + + + + NNLC is currently not available on this platform. + + + + Add custom offsets to Camera and Path in sunnypilot. + + + + Default is Laneless. In Auto mode, sunnnypilot dynamically chooses between Laneline or Laneless model based on lane recognition confidence level on road and certain conditions. + + + + Dynamic Lane Profile + + + + Offline Only + + + + Real-time and Offline + + + + Dynamic Lane Profile is not available with the current Driving Model + + + + Custom Offsets is not available with the current Driving Model + + + + Match: "Exact" is ideal, but "Fuzzy" is fine too. Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server if there are any issues: + + + + Start the car to check car compatibility + + + + NNLC Not Loaded + + + + NNLC Loaded + + + + Fuzzy + + + + Exact + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server and donate logs to get NNLC loaded for your car: + + + + Match + + + + Reach out to the sunnypilot team in the following channel at the sunnypilot Discord server with feedback, or to provide log data for your car if your car is currently unsupported: + + + + Formerly known as <b>"NNFF"</b>, this replaces the lateral <b>"torque"</b> controller with one using a neural network trained on each car's (actually, each separate EPS firmware) driving data for increased controls accuracy. + + + TermsPage @@ -985,11 +2245,11 @@ This may take up to a minute. TogglesPanel Enable openpilot - 啟用 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. - 使用 openpilot 的主動式巡航和車道保持功能,開啟後您需要持續集中注意力,設定變更在重新啟動車輛後生效。 + 使用 openpilot 的主動式巡航和車道保持功能,開啟後您需要持續集中注意力,設定變更在重新啟動車輛後生效。 Enable Lane Departure Warnings @@ -1081,7 +2341,7 @@ This may take up to a minute. Standard - 標準 + 標準 Relaxed @@ -1093,7 +2353,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. - 推薦使用標準模式。在積極模式中,openpilot 會更靠近前車並在加速和剎車方面更積極。在舒適模式中,openpilot 會與前車保持較遠的距離。 + 推薦使用標準模式。在積極模式中,openpilot 會更靠近前車並在加速和剎車方面更積極。在舒適模式中,openpilot 會與前車保持較遠的距離。 An alpha version of openpilot longitudinal control can be tested, along with Experimental mode, on non-release branches. @@ -1119,6 +2379,89 @@ 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. 行駛畫面將在低速時切換至道路朝向的廣角鏡頭,以更好地顯示一些轉彎。實驗模式圖示也將顯示在右上角。當設定了導航目的地並且行駛模型正在將其作為輸入時,地圖上的行駛路徑將變為綠色。 + + Enable sunnypilot + + + + Use the sunnypilot 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. + + + + Custom Stock Longitudinal Control + + + + When enabled, sunnypilot will attempt to control stock longitudinal control with ACC button presses. +This feature must be used along with SLC, and/or V-TSC, and/or M-TSC. + + + + Enable Dynamic Experimental Control + + + + Enable toggle to allow the model to determine when to use openpilot ACC or openpilot End to End Longitudinal. + + + + Disable Onroad Uploads + + + + Disable uploads completely when onroad. Necessary to avoid high data usage when connected to Wi-Fi hotspot. Turn on this feature if you are looking to utilize map-based features, such as Speed Limit Control (SLC) and Map-based Turn Speed Control (MTSC). + + + + Maniac + + + + Stock + + + + Stock is recommended. In aggressive/maniac 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. + + + + + TorqueFriction + + FRICTION + + + + Adjust Friction for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + + + + TorqueMaxLatAccel + + LAT_ACCEL_FACTOR + + + + Adjust Max Lateral Acceleration for the Torque Lateral Controller. <b>Live</b>: Override self-tune values; <b>Offline</b>: Override self-tune offline values at car restart. + + + + Real-time and Offline + + + + Offline Only + + Updater @@ -1155,6 +2498,165 @@ This may take up to a minute. 更新失敗 + + VehiclePanel + + Updating this setting takes effect when the car is powered off. + + + + Select your car + + + + + VisualsPanel + + Display Braking Status + + + + Enable this will turn the current speed value to red while the brake is used. + + + + Display Stand Still Timer + + + + Enable this will display time spent at a stop (i.e., at a stop lights, stop signs, traffic congestions). + + + + Display DM Camera in Reverse Gear + + + + Show Driver Monitoring camera while the car is in reverse gear. + + + + OSM: Show debug UI elements + + + + OSM: Show UI elements that aid debugging. + + + + Display Feature Status + + + + Display the statuses of certain features on the driving screen. + + + + Enable Onroad Settings + + + + Display the Onroad Settings button on the driving screen to adjust feature options on the driving screen, without navigating into the settings menu. + + + + Speedometer: Display True Speed + + + + Display the true vehicle current speed from wheel speed sensors. + + + + Speedometer: Hide from Onroad Screen + + + + Display End-to-end Longitudinal Status (Beta) + + + + Enable this will display an icon that appears when the End-to-end model decides to start or stop. + + + + Navigation: Display in Full Screen + + + + Enable this will display the built-in navigation in full screen.<br>To switch back to driving view, <font color='yellow'>tap on the border edge</font>. + + + + Map: Display 3D Buildings + + + + Parse and display 3D buildings on map. Thanks to jakethesnake420 for this implementation. + + + + Off + + + + 5 Metrics + + + + 10 Metrics + + + + Distance + + + + Speed + + + + Distance +Speed + + + + RAM + + + + CPU + + + + GPU + + + + Max + + + + Developer UI + + + + Display real-time parameters and metrics from various sources. + + + + Display Metrics Below Chevron + + + + Display useful metrics below the chevron that tracks the lead car (only applicable to cars with openpilot longitudinal control). + + + + Display Temperature on Sidebar + + + WiFiPromptWidget 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 516/923] 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 517/923] 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 cab71cc388403e8d750e523c22ca828983a585c2 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Thu, 14 Mar 2024 16:23:52 +0000 Subject: [PATCH 518/923] sunnylink: Remov unicode header during HTTP requests --- common/api/base.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/common/api/base.py b/common/api/base.py index a61566c3ba..0901ccacc9 100644 --- a/common/api/base.py +++ b/common/api/base.py @@ -1,5 +1,6 @@ import jwt import requests +import unicodedata from datetime import datetime, timedelta from openpilot.system.hardware.hw import Paths from openpilot.system.version import get_version @@ -39,11 +40,17 @@ class BaseApi: def get_token(self, expiry_hours=1): return self._get_token(expiry_hours) + def remove_non_ascii_chars(self, text): + normalized_text = unicodedata.normalize('NFD', text) + ascii_encoded_text = normalized_text.encode('ascii', 'ignore') + return ascii_encoded_text.decode() + def api_get(self, endpoint, method='GET', timeout=None, access_token=None, **params): headers = {} if access_token is not None: headers['Authorization'] = "JWT " + access_token - headers['User-Agent'] = self.user_agent + get_version() + version = self.remove_non_ascii_chars(get_version()) + headers['User-Agent'] = self.user_agent + version return requests.request(method, self.api_host + "/" + endpoint, timeout=timeout, headers=headers, params=params) From 39d432e3cda37ecceb63e04967896a2981054d04 Mon Sep 17 00:00:00 2001 From: ShaydeNZ Date: Fri, 15 Mar 2024 10:26:21 +1300 Subject: [PATCH 519/923] 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 520/923] 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 521/923] 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 522/923] 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 523/923] 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 524/923] 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 525/923] 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 526/923] 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 527/923] 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 528/923] 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 529/923] 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 530/923] 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 531/923] 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 532/923] 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 533/923] 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 534/923] 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 535/923] 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 536/923] 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 537/923] 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 538/923] 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 539/923] 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 540/923] 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 541/923] [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 542/923] 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 543/923] [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 544/923] 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 545/923] 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 546/923] 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 547/923] 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 548/923] 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 549/923] 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 550/923] 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 551/923] [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 | 2769 ++++++++++++++++++++------------------- 2 files changed, 1395 insertions(+), 1376 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"}, + {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.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" +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.1" -pyobjc-framework-Cocoa = ">=10.1" +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.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 552/923] [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 553/923] 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 554/923] 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 555/923] 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 556/923] 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 557/923] 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 558/923] [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 559/923] 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 560/923] 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 561/923] 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 562/923] 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 563/923] 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 | 30 +++++++++++++++-------------- selfdrive/car/mock/carcontroller.py | 5 +++++ selfdrive/car/mock/carstate.py | 4 ++++ 4 files changed, 27 insertions(+), 26 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.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.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) + 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 564/923] 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 565/923] 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 566/923] 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 567/923] 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 568/923] 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 569/923] 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 570/923] 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 571/923] 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 572/923] 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 573/923] 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 574/923] 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 575/923] 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 576/923] 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 577/923] 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 578/923] 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 579/923] 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 580/923] 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 581/923] 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 582/923] 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 583/923] 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 584/923] 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 585/923] 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 586/923] 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 587/923] 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 588/923] 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 589/923] 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 590/923] 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 591/923] 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 592/923] 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 593/923] 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 594/923] 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 595/923] 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 596/923] 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 597/923] 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 598/923] 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 599/923] 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): + def _run_test(self, timeout=30) -> float: + st = time.monotonic() + sm = messaging.SubMaster(['pandaStates']) + managed_processes['pandad'].start() - - sm = messaging.SubMaster(['peripheralState']) - for _ in range(timeout*10): + 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 600/923] 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 601/923] 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 602/923] 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 603/923] 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 604/923] 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 605/923] 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 606/923] 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 607/923] 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 608/923] 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 609/923] 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 610/923] 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 611/923] =?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 612/923] 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 613/923] [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 614/923] [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 615/923] 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 616/923] 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 746d2b750ce93f7fd4fbe4943f9bb0eb21cd024f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 25 Mar 2024 18:28:22 +0000 Subject: [PATCH 617/923] ui: Developer UI cleanup --- selfdrive/ui/qt/onroad.cc | 442 ++++++++++++++++++-------------------- selfdrive/ui/qt/onroad.h | 29 ++- 2 files changed, 241 insertions(+), 230 deletions(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index ba20466ee4..dc091422df 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -1104,170 +1104,236 @@ void AnnotatedCameraWidget::drawCenteredLeftText(QPainter &p, int x, int y, cons p.drawText(real_rect3, Qt::AlignLeft | Qt::AlignVCenter, text3); } -int AnnotatedCameraWidget::drawDevUiElementRight(QPainter &p, int x, int y, const char* value, const char* label, const char* units, QColor &color) { +int AnnotatedCameraWidget::drawDevUiElementRight(QPainter &p, int x, int y, const QString &value, const QString &label, const QString &units, QColor &color) { p.setFont(InterFont(30 * 2, QFont::Bold)); - drawColoredText(p, x + 92, y + 80, QString(value), color); + drawColoredText(p, x + 92, y + 80, value, color); p.setFont(InterFont(28, QFont::Bold)); - drawText(p, x + 92, y + 80 + 42, QString(label), 255); + drawText(p, x + 92, y + 80 + 42, label, 255); - if (strlen(units) > 0) { + if (units.length() > 0) { p.save(); p.translate(x + 54 + 30 - 3 + 92 + 30, y + 37 + 25); p.rotate(-90); - drawText(p, 0, 0, QString(units), 255); + drawText(p, 0, 0, units, 255); p.restore(); } return 110; } +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getDRel() { + QString value = lead_status ? QString::number(lead_d_rel, 'f', 0) : "-"; + QColor color = QColor(255, 255, 255, 255); + + if (lead_status) { + // Orange if close, Red if very close + if (lead_d_rel < 5) { + color = QColor(255, 0, 0, 255); + } else if (lead_d_rel < 15) { + color = QColor(255, 188, 0, 255); + } + } + + return UiElement(value, "REL DIST", "m", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getVRel() { + QString value = lead_status ? QString::number(lead_v_rel * (is_metric ? MS_TO_KPH : MS_TO_MPH), 'f', 0) : "-"; + QColor color = QColor(255, 255, 255, 255); + + if (lead_status) { + // Red if approaching faster than 10mph + // Orange if approaching (negative) + if (lead_v_rel < -4.4704) { + color = QColor(255, 0, 0, 255); + } else if (lead_v_rel < 0) { + color = QColor(255, 188, 0, 255); + } + } + + return UiElement(value, "REL SPEED", speedUnit, color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getSteeringAngleDeg() { + QString value = QString("%1%2%3").arg(QString::number(angleSteers, 'f', 1)).arg("°").arg(""); + QColor color = (madsEnabled && latActive) ? QColor(0, 255, 0, 255) : QColor(255, 255, 255, 255); + + // Red if large steering angle + // Orange if moderate steering angle + if (std::fabs(angleSteers) > 180) { + color = QColor(255, 0, 0, 255); + } else if (std::fabs(angleSteers) > 90) { + color = QColor(255, 188, 0, 255); + } + + return UiElement(value, "REAL STEER", "", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getActualLateralAccel() { + float actualLateralAccel = (curvature * pow(vEgo, 2)) - (roll * 9.81); + + QString value = QString::number(actualLateralAccel, 'f', 2); + QColor color = (madsEnabled && latActive) ? QColor(0, 255, 0, 255) : QColor(255, 255, 255, 255); + + return UiElement(value, "ACTUAL LAT", "m/s²", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getSteeringAngleDesiredDeg() { + QString value = (madsEnabled && latActive) ? QString("%1%2%3").arg(QString::number(steerAngleDesired, 'f', 1)).arg("°").arg("") : "-"; + QColor color = QColor(255, 255, 255, 255); + + if (madsEnabled && latActive) { + // Red if large steering angle + // Orange if moderate steering angle + if (std::fabs(angleSteers) > 180) { + color = QColor(255, 0, 0, 255); + } else if (std::fabs(angleSteers) > 90) { + color = QColor(255, 188, 0, 255); + } + } + + return UiElement(value, "DESIR STEER", "", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getMemoryUsagePercent() { + QString value = QString("%1%2").arg(QString::number(memoryUsagePercent, 'd', 0)).arg("%"); + QColor color = (memoryUsagePercent > 85) ? QColor(255, 188, 0, 255) : QColor(255, 255, 255, 255); + + return UiElement(value, "RAM", "", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getAEgo() { + QString value = QString::number(aEgo, 'f', 1); + QColor color = QColor(255, 255, 255, 255); + + return UiElement(value, "ACC.", "m/s²", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getVEgoLead() { + QString value = lead_status ? QString::number((lead_v_rel + vEgo) * (is_metric ? MS_TO_KPH : MS_TO_MPH), 'f', 0) : "-"; + QColor color = QColor(255, 255, 255, 255); + + if (lead_status) { + // Red if approaching faster than 10mph + // Orange if approaching (negative) + if (lead_v_rel < -4.4704) { + color = QColor(255, 0, 0, 255); + } else if (lead_v_rel < 0) { + color = QColor(255, 188, 0, 255); + } + } + + return UiElement(value, "L.S.", speedUnit, color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getFrictionCoefficientFiltered() { + QString value = QString::number(frictionCoefficientFiltered, 'f', 3); + QColor color = liveValid ? QColor(0, 255, 0, 255) : QColor(255, 255, 255, 255); + + return UiElement(value, "FRIC.", "", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getLatAccelFactorFiltered() { + QString value = QString::number(latAccelFactorFiltered, 'f', 3); + QColor color = liveValid ? QColor(0, 255, 0, 255) : QColor(255, 255, 255, 255); + + return UiElement(value, "L.A.", "m/s²", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getSteeringTorqueEps() { + QString value = QString::number(std::fabs(steeringTorqueEps), 'f', 1); + QColor color = QColor(255, 255, 255, 255); + + return UiElement(value, "E.T.", "N·dm", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getBearingDeg() { + QString value = (bearingAccuracyDeg != 180.00) ? QString("%1%2%3").arg(QString::number(bearingDeg, 'd', 0)).arg("°").arg("") : "-"; + QColor color = QColor(255, 255, 255, 255); + QString dir_value; + + if (bearingAccuracyDeg != 180.00) { + if (((bearingDeg >= 337.5) && (bearingDeg <= 360)) || ((bearingDeg >= 0) && (bearingDeg <= 22.5))) { + dir_value = "N"; + } else if ((bearingDeg > 22.5) && (bearingDeg < 67.5)) { + dir_value = "NE"; + } else if ((bearingDeg >= 67.5) && (bearingDeg <= 112.5)) { + dir_value = "E"; + } else if ((bearingDeg > 112.5) && (bearingDeg < 157.5)) { + dir_value = "SE"; + } else if ((bearingDeg >= 157.5) && (bearingDeg <= 202.5)) { + dir_value = "S"; + } else if ((bearingDeg > 202.5) && (bearingDeg < 247.5)) { + dir_value = "SW"; + } else if ((bearingDeg >= 247.5) && (bearingDeg <= 292.5)) { + dir_value = "W"; + } else if ((bearingDeg > 292.5) && (bearingDeg < 337.5)) { + dir_value = "NW"; + } + } else { + dir_value = "OFF"; + } + + return UiElement("B.D.", QString("%1 | %2").arg(dir_value).arg(value), "", color); +} + +AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getAltitude() { + QString value = (gpsAccuracy != 0.00) ? QString::number(altitude, 'f', 1) : "-"; + QColor color = QColor(255, 255, 255, 255); + + return UiElement(value, "ALT.", "m", color); +} + void AnnotatedCameraWidget::drawRightDevUi(QPainter &p, int x, int y) { int rh = 5; int ry = y; // Add Relative Distance to Primary Lead Car // Unit: Meters - if (true) { - char val_str[16]; - char units_str[8]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (lead_status) { - // Orange if close, Red if very close - if (lead_d_rel < 5) { - valueColor = QColor(255, 0, 0, 255); - } else if (lead_d_rel < 15) { - valueColor = QColor(255, 188, 0, 255); - } - snprintf(val_str, sizeof(val_str), "%d", (int)lead_d_rel); - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - snprintf(units_str, sizeof(units_str), "m"); - - rh += drawDevUiElementRight(p, x, ry, val_str, "REL DIST", units_str, valueColor); - ry = y + rh; - } + UiElement dRelElement = getDRel(); + rh += drawDevUiElementRight(p, x, ry, dRelElement.value, dRelElement.label, dRelElement.units, dRelElement.color); + ry = y + rh; // Add Relative Velocity vs Primary Lead Car // Unit: kph if metric, else mph - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (lead_status) { - // Red if approaching faster than 10mph - // Orange if approaching (negative) - if (lead_v_rel < -4.4704) { - valueColor = QColor(255, 0, 0, 255); - } else if (lead_v_rel < 0) { - valueColor = QColor(255, 188, 0, 255); - } - - if (speedUnit == "mph") { - snprintf(val_str, sizeof(val_str), "%d", (int)(lead_v_rel * 2.236936)); //mph - } else { - snprintf(val_str, sizeof(val_str), "%d", (int)(lead_v_rel * 3.6)); //kph - } - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - rh += drawDevUiElementRight(p, x, ry, val_str, "REL SPEED", speedUnit.toStdString().c_str(), valueColor); - ry = y + rh; - } + UiElement vRelElement = getVRel(); + rh += drawDevUiElementRight(p, x, ry, vRelElement.value, vRelElement.label, vRelElement.units, vRelElement.color); + ry = y + rh; // Add Real Steering Angle // Unit: Degrees - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - if (madsEnabled && latActive) { - valueColor = QColor(0, 255, 0, 255); - } else { - valueColor = QColor(255, 255, 255, 255); - } + UiElement steeringAngleDegElement = getSteeringAngleDeg(); + rh += drawDevUiElementRight(p, x, ry, steeringAngleDegElement.value, steeringAngleDegElement.label, steeringAngleDegElement.units, steeringAngleDegElement.color); + ry = y + rh; - // Red if large steering angle - // Orange if moderate steering angle - if (std::fabs(angleSteers) > 180) { - valueColor = QColor(255, 0, 0, 255); - } else if (std::fabs(angleSteers) > 90) { - valueColor = QColor(255, 188, 0, 255); - } - - snprintf(val_str, sizeof(val_str), "%.1f%s%s", angleSteers , "°", ""); - - rh += drawDevUiElementRight(p, x, ry, val_str, "REAL STEER", "", valueColor); - ry = y + rh; - } - - // Add Actual Lateral Acceleration (roll compensated) when using Torque - // Unit: m/s² - // Add Desired Steering Angle when using PID - // Unit: Degrees if (lateralState == "torque") { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - float actualLateralAccel = (curvature * pow(vEgo, 2)) - (roll * 9.81); - - if (madsEnabled && latActive) { - snprintf(val_str, sizeof(val_str), "%.2f", actualLateralAccel); - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - rh += drawDevUiElementRight(p, x, ry, val_str, "ACTUAL LAT", "m/s²", valueColor); - ry = y + rh; + // Add Actual Lateral Acceleration (roll compensated) when using Torque + // Unit: m/s² + UiElement actualLateralAccelElement = getActualLateralAccel(); + rh += drawDevUiElementRight(p, x, ry, actualLateralAccelElement.value, actualLateralAccelElement.label, actualLateralAccelElement.units, actualLateralAccelElement.color); } else { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (madsEnabled && latActive) { - // Red if large steering angle - // Orange if moderate steering angle - if (std::fabs(angleSteers) > 180) { - valueColor = QColor(255, 0, 0, 255); - } else if (std::fabs(angleSteers) > 90) { - valueColor = QColor(255, 188, 0, 255); - } - - snprintf(val_str, sizeof(val_str), "%.1f%s%s", steerAngleDesired, "°", ""); - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - rh += drawDevUiElementRight(p, x, ry, val_str, "DESIR STEER", "", valueColor); - ry = y + rh; + // Add Desired Steering Angle when using PID + // Unit: Degrees + UiElement steeringAngleDesiredDegElement = getSteeringAngleDesiredDeg(); + rh += drawDevUiElementRight(p, x, ry, steeringAngleDesiredDegElement.value, steeringAngleDesiredDegElement.label, steeringAngleDesiredDegElement.units, steeringAngleDesiredDegElement.color); } + ry = y + rh; // Add Device Memory (RAM) Usage // Unit: Percent - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (memoryUsagePercent > 85) { - valueColor = QColor(255, 188, 0, 255); - } - - snprintf(val_str, sizeof(val_str), "%d%s", (int)memoryUsagePercent, "%"); - - rh += drawDevUiElementRight(p, x, ry, val_str, "RAM", "", valueColor); - ry = y + rh; - } + UiElement memoryUsagePercentElement = getMemoryUsagePercent(); + rh += drawDevUiElementRight(p, x, ry, memoryUsagePercentElement.value, memoryUsagePercentElement.label, memoryUsagePercentElement.units, memoryUsagePercentElement.color); + ry = y + rh; rh += 25; p.setBrush(QColor(0, 0, 0, 0)); QRect ldu(x, y, 184, rh); } -int AnnotatedCameraWidget::drawNewDevUiElement(QPainter &p, int x, int y, const char* value, const char* label, const char* units, QColor &color) { +int AnnotatedCameraWidget::drawNewDevUiElement(QPainter &p, int x, int y, const QString &value, const QString &label, const QString &units, QColor &color) { p.setFont(InterFont(38, QFont::Bold)); - drawCenteredLeftText(p, x, y, QString(label), whiteColor(), QString(value), QString(units), color); + drawCenteredLeftText(p, x, y, label, whiteColor(), value, units, color); return 430; } @@ -1277,120 +1343,40 @@ void AnnotatedCameraWidget::drawNewDevUi2(QPainter &p, int x, int y) { // Add Acceleration from Car // Unit: Meters per Second Squared - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - snprintf(val_str, sizeof(val_str), "%.1f", aEgo); - - rw += drawNewDevUiElement(p, rw, y, val_str, "ACC.", "m/s²", valueColor); - } + UiElement aEgoElement = getAEgo(); + rw += drawNewDevUiElement(p, rw, y, aEgoElement.value, aEgoElement.label, aEgoElement.units, aEgoElement.color); // Add Velocity of Primary Lead Car // Unit: kph if metric, else mph - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); + UiElement vEgoLeadElement = getVEgoLead(); + rw += drawNewDevUiElement(p, rw, y, vEgoLeadElement.value, vEgoLeadElement.label, vEgoLeadElement.units, vEgoLeadElement.color); - if (lead_status) { - if (speedUnit == "mph") { - snprintf(val_str, sizeof(val_str), "%d", (int)((lead_v_rel + vEgo) * 2.236936)); //mph - } else { - snprintf(val_str, sizeof(val_str), "%d", (int)((lead_v_rel + vEgo) * 3.6)); //kph - } - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - rw += drawNewDevUiElement(p, rw, y, val_str, "L.S.", speedUnit.toStdString().c_str(), valueColor); - } - - // Add Friction Coefficient Raw from torqued - // Unit: None if (torquedUseParams) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); + // Add Friction Coefficient Raw from torqued + // Unit: None + UiElement frictionCoefficientFilteredElement = getFrictionCoefficientFiltered(); + rw += drawNewDevUiElement(p, rw, y, frictionCoefficientFilteredElement.value, frictionCoefficientFilteredElement.label, frictionCoefficientFilteredElement.units, frictionCoefficientFilteredElement.color); - if (liveValid) valueColor = QColor(0, 255, 0, 255); - snprintf(val_str, sizeof(val_str), "%.3f", frictionCoefficientFiltered); + // Add Lateral Acceleration Factor Raw from torqued + // Unit: m/s² + UiElement latAccelFactorFilteredElement = getLatAccelFactorFiltered(); + rw += drawNewDevUiElement(p, rw, y, latAccelFactorFilteredElement.value, latAccelFactorFilteredElement.label, latAccelFactorFilteredElement.units, latAccelFactorFilteredElement.color); + } else { + // Add Steering Torque from Car EPS + // Unit: Newton Meters + UiElement steeringTorqueEpsElement = getSteeringTorqueEps(); + rw += drawNewDevUiElement(p, rw, y, steeringTorqueEpsElement.value, steeringTorqueEpsElement.label, steeringTorqueEpsElement.units, steeringTorqueEpsElement.color); - rw += drawNewDevUiElement(p, rw, y, val_str, "FRIC.", "", valueColor); - } - - // Add Steering Torque from Car EPS - // Unit: Newton Meters - else { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - snprintf(val_str, sizeof(val_str), "%.1f", std::fabs(steeringTorqueEps)); - - rw += drawNewDevUiElement(p, rw, y, val_str, "E.T.", "N·dm", valueColor); - } - - // Add Lateral Acceleration Factor Raw from torqued - // Unit: m/s² - if (torquedUseParams) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (liveValid) valueColor = QColor(0, 255, 0, 255); - snprintf(val_str, sizeof(val_str), "%.3f", latAccelFactorFiltered); - - rw += drawNewDevUiElement(p, rw, y, val_str, "L.A.", "m/s²", valueColor); - } - - // Add Bearing Degree and Direction from Car (Compass) - // Unit: Meters - else { - char val_str[16]; - char dir_str[8]; - char data_string[30]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (bearingAccuracyDeg != 180.00) { - snprintf(val_str, sizeof(val_str), "%.0d%s%s", (int)bearingDeg, "°", ""); - if (((bearingDeg >= 337.5) && (bearingDeg <= 360)) || ((bearingDeg >= 0) && (bearingDeg <= 22.5))) { - snprintf(dir_str, sizeof(dir_str), "N"); - } else if ((bearingDeg > 22.5) && (bearingDeg < 67.5)) { - snprintf(dir_str, sizeof(dir_str), "NE"); - } else if ((bearingDeg >= 67.5) && (bearingDeg <= 112.5)) { - snprintf(dir_str, sizeof(dir_str), "E"); - } else if ((bearingDeg > 112.5) && (bearingDeg < 157.5)) { - snprintf(dir_str, sizeof(dir_str), "SE"); - } else if ((bearingDeg >= 157.5) && (bearingDeg <= 202.5)) { - snprintf(dir_str, sizeof(dir_str), "S"); - } else if ((bearingDeg > 202.5) && (bearingDeg < 247.5)) { - snprintf(dir_str, sizeof(dir_str), "SW"); - } else if ((bearingDeg >= 247.5) && (bearingDeg <= 292.5)) { - snprintf(dir_str, sizeof(dir_str), "W"); - } else if ((bearingDeg > 292.5) && (bearingDeg < 337.5)) { - snprintf(dir_str, sizeof(dir_str), "NW"); - } - } else { - snprintf(dir_str, sizeof(dir_str), "OFF"); - snprintf(val_str, sizeof(val_str), "-"); - } - - snprintf(data_string, sizeof(data_string), "%s | %s", dir_str, val_str); - - rw += drawNewDevUiElement(p, rw, y, "B.D.", data_string, "", valueColor); + // Add Bearing Degree and Direction from Car (Compass) + // Unit: Meters + UiElement bearingDegElement = getBearingDeg(); + rw += drawNewDevUiElement(p, rw, y, bearingDegElement.value, bearingDegElement.label, bearingDegElement.units, bearingDegElement.color); } // Add Altitude of Current Location // Unit: Meters - if (true) { - char val_str[16]; - QColor valueColor = QColor(255, 255, 255, 255); - - if (gpsAccuracy != 0.00) { - snprintf(val_str, sizeof(val_str), "%.1f", altitude); - } else { - snprintf(val_str, sizeof(val_str), "-"); - } - - rw += drawNewDevUiElement(p, rw, y, val_str, "ALT.", "m", valueColor); - } + UiElement altitudeElement = getAltitude(); + rw += drawNewDevUiElement(p, rw, y, altitudeElement.value, altitudeElement.label, altitudeElement.units, altitudeElement.color); } // ############################## DEV UI END ############################## diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index aaadd8df01..fe74cf55a9 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -110,10 +110,35 @@ private: // ############################## DEV UI START ############################## void drawRightDevUi(QPainter &p, int x, int y); - int drawDevUiElementRight(QPainter &p, int x, int y, const char* value, const char* label, const char* units, QColor &color); - int drawNewDevUiElement(QPainter &p, int x, int y, const char* value, const char* label, const char* units, QColor &color); + int drawDevUiElementRight(QPainter &p, int x, int y, const QString &value, const QString &label, const QString &units, QColor &color); + int drawNewDevUiElement(QPainter &p, int x, int y, const QString &value, const QString &label, const QString &units, QColor &color); void drawNewDevUi2(QPainter &p, int x, int y); void drawCenteredLeftText(QPainter &p, int x, int y, const QString &text1, QColor color1, const QString &text2, const QString &text3, QColor color2); + struct UiElement { + QString value; + QString label; + QString units; + QColor color; + + UiElement(const QString &value, const QString &label, const QString &units, const QColor &color = QColor(255, 255, 255, 255)) + : value(value), label(label), units(units), color(color) {} + }; + + UiElement getDRel(); + UiElement getVRel(); + UiElement getSteeringAngleDeg(); + UiElement getActualLateralAccel(); + UiElement getSteeringAngleDesiredDeg(); + UiElement getMemoryUsagePercent(); + + UiElement getAEgo(); + UiElement getVEgoLead(); + UiElement getFrictionCoefficientFiltered(); + UiElement getLatAccelFactorFiltered(); + UiElement getSteeringTorqueEps(); + UiElement getBearingDeg(); + UiElement getAltitude(); + // ############################## DEV UI END ############################## void drawE2eStatus(QPainter &p, int x, int y, int w, int h, int e2e_long_status); From 484f50725e2794211a0c76702abcc8ed5e8e4022 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 25 Mar 2024 14:11:26 -0700 Subject: [PATCH 618/923] [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 619/923] [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 620/923] 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 621/923] 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 622/923] 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 623/923] 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 624/923] 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 625/923] 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 626/923] 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 627/923] 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 628/923] 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 629/923] 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 630/923] 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 631/923] 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 632/923] 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 633/923] 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 634/923] 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 635/923] ui: move struct Alert into OnroadAlerts (#32024) * move Alert into OnroadAlerts * multi-lang --- selfdrive/ui/qt/onroad.cc | 53 ++++++++++++++++++--- selfdrive/ui/qt/onroad.h | 25 ++++++++-- 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, 299 insertions(+), 69 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: - void paintEvent(QPaintEvent*) override; + 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 636/923] 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 637/923] 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 638/923] 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 639/923] 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 640/923] [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 641/923] 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 642/923] 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 643/923] 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 644/923] 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 645/923] 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 646/923] 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 647/923] 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 648/923] 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 649/923] [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 650/923] 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 651/923] 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 652/923] 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 653/923] [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 654/923] 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 655/923] 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 8acd104c6537f0d4aae2b29c15abdb322bcb8ebc Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Mon, 1 Apr 2024 18:14:42 +0200 Subject: [PATCH 656/923] specify base image --- .gitlab-ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 02fbd9c892..77e0f81a75 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -145,6 +145,7 @@ build: when: always check no source code sent: + image: alpine stage: sanity variables: FORBIDDEN_FILE_EXTENSIONS: "*.a,*.o,*.os,*.pyc,moc_*,*.cc,Jenkinsfile,supercombo.onnx,.sconsign.dblite" @@ -166,6 +167,7 @@ check no source code sent: - when: never .publish_base: &publish_base + image: alpine variables: GIT_SUBMODULE_STRATEGY: normal stage: publish @@ -214,6 +216,7 @@ publish to public github prebuilt: - when: never .notify_discord: ¬ify_discord + image: alpine stage: notify needs: ["build"] variables: From fc9f50c90d166ce8bef7a711b2e391071fb0fe02 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Mon, 1 Apr 2024 13:01:50 -0400 Subject: [PATCH 657/923] 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 658/923] [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 659/923] [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 | 583 +++++++++++++++++++++------------------- 2 files changed, 314 insertions(+), 271 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.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 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"}, + {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"}, + {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 = "*" +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 660/923] [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 661/923] 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 662/923] 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 663/923] 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 664/923] 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 665/923] 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 666/923] 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 667/923] 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 668/923] 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 669/923] [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 670/923] 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 671/923] [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 672/923] 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 673/923] 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 674/923] 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 675/923] 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 676/923] 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 677/923] 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 678/923] 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 679/923] 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 680/923] 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 681/923] [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 682/923] 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 919f3d1c745885c915d81f4601549dd91da64005 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sat, 6 Apr 2024 11:35:44 +0000 Subject: [PATCH 683/923] Lots of stabilization improvments for the model fetcher --- .../qt/offroad/sunnypilot/models_fetcher.cc | 26 +++++- .../sunnypilot/software_settings_sp.cc | 79 ++++++++++--------- 2 files changed, 64 insertions(+), 41 deletions(-) diff --git a/selfdrive/ui/qt/offroad/sunnypilot/models_fetcher.cc b/selfdrive/ui/qt/offroad/sunnypilot/models_fetcher.cc index 4f2aaf724f..f45aa55e5c 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/models_fetcher.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/models_fetcher.cc @@ -1,4 +1,5 @@ #include "selfdrive/ui/qt/offroad/sunnypilot/models_fetcher.h" +#include ModelsFetcher::ModelsFetcher(QObject* parent) : QObject(parent) { manager = new QNetworkAccessManager(this); @@ -83,9 +84,30 @@ void ModelsFetcher::onFinished(QNetworkReply* reply, const QString& destinationP QString finalPath = QDir(destinationPath).filePath(finalFilename); // Save the downloaded file + + QFile file(finalPath); - if (!file.open(QIODevice::WriteOnly)) { - return; // Consider emitting a signal or logging an error here as well + //ensure if the path exists and if not create it + if(!QDir().mkpath(destinationPath)) + { + LOGE("Unable to create directory: %s", destinationPath.toStdString().c_str()); + emit downloadFailed(filename); + return; // Stop further processing + } + + //Retry the file open and write 3 times with a little delay between each retry + for (int i = 0; i < 3; i++) { + if (file.isOpen()) break; + + file.open(QIODevice::WriteOnly); + if (!file.isOpen()) QThread::msleep(100); + } + + // If the file is still not open, log an error and emit a failure signal + if (!file.isOpen()) { + LOGE("Unable to open file for writing: %s", finalPath.toStdString().c_str()); + emit downloadFailed(filename); + return; // Stop further processing } file.write(data); diff --git a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc index f288170054..9727bcc2f3 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc @@ -18,19 +18,41 @@ SoftwarePanelSP::SoftwarePanelSP(QWidget *parent) : SoftwarePanel(parent) { handleDownloadProgress(progress, "metadata"); }); - connect(&models_fetcher, &ModelsFetcher::downloadComplete, this, [this](const QByteArray&data, bool fromCache = false) { + connect(&models_fetcher, &ModelsFetcher::downloadComplete, this, [this](const QByteArray& data, bool fromCache) { modelFromCache = fromCache; - updateLabels(); + if (!isDownloadingModel() && modelDownloadProgress.has_value()) { + params.put("DrivingModelText", selectedModelToDownload->fullName.toStdString()); + params.put("DrivingModelName", selectedModelToDownload->displayName.toStdString()); + selectedModelToDownload.reset(); + modelDownloadProgress.reset(); + params.putBool("CustomDrivingModel", !model_download_failed); + } + nav_models_fetcher.download(selectedNavModelToDownload->downloadUriNav, selectedNavModelToDownload->fileNameNav); + HandleModelDownloadProgressReport(); }); connect(&nav_models_fetcher, &ModelsFetcher::downloadComplete, this, [this](const QByteArray&data, bool fromCache = false) { navModelFromCache = fromCache; - updateLabels(); + if (!isDownloadingNavModel() && navModelDownloadProgress.has_value()) { + params.put("DrivingModelGeneration", selectedNavModelToDownload->generation.toStdString()); + params.put("NavModelText", selectedNavModelToDownload->fullNameNav.toStdString()); + selectedNavModelToDownload.reset(); + navModelDownloadProgress.reset(); + } + metadata_fetcher.download(selectedMetadataToDownload->downloadUriMetadata, selectedMetadataToDownload->fileNameMetadata); + HandleModelDownloadProgressReport(); + // updateLabels(); }); connect(&metadata_fetcher, &ModelsFetcher::downloadComplete, this, [this](const QByteArray&data, bool fromCache = false) { metadataFromCache = fromCache; - updateLabels(); + if (!isDownloadingMetadata() && metadataDownloadProgress.has_value()) { + params.put("DrivingModelMetadataText", selectedMetadataToDownload->fullNameMetadata.toStdString()); + selectedMetadataToDownload.reset(); + metadataDownloadProgress.reset(); + } + HandleModelDownloadProgressReport(); + // updateLabels(); }); connect(&models_fetcher, &ModelsFetcher::downloadFailed, this, &SoftwarePanelSP::handleDownloadFailed); @@ -151,37 +173,6 @@ void SoftwarePanelSP::HandleModelDownloadProgressReport() { currentModelLblBtn->showDescription(); currentModelLblBtn->setEnabled( !(is_onroad || (isDownloadingModel() || isDownloadingMetadata() || isDownloadingNavModel()))); - - // If not downloading and there is a selected model, update parameters - if (!isDownloadingModel() && modelDownloadProgress.has_value()) { - params.put("DrivingModelText", selectedModelToDownload->fullName.toStdString()); - params.put("DrivingModelName", selectedModelToDownload->displayName.toStdString()); - //params.put("DrivingModelUrl", selectedModelToDownload->downloadUri.toStdString()); // TODO: Placeholder for future implementation - LOGD("Resetting selectedModelToDownload"); - selectedModelToDownload.reset(); - modelDownloadProgress.reset(); - modelFromCache = false; - params.putBool("CustomDrivingModel", !model_download_failed); - } - - // If not downloading and there is a selected model, update parameters - if (!isDownloadingNavModel() && navModelDownloadProgress.has_value()) { - params.put("DrivingModelGeneration", selectedNavModelToDownload->generation.toStdString()); - params.put("NavModelText", selectedNavModelToDownload->fullNameNav.toStdString()); - LOGD("Resetting selectedNavModelToDownload"); - selectedNavModelToDownload.reset(); - navModelDownloadProgress.reset(); - navModelFromCache = false; - } - - if (!isDownloadingMetadata() && metadataDownloadProgress.has_value()) { - params.put("DrivingModelMetadataText", selectedMetadataToDownload->fullNameMetadata.toStdString()); - LOGD("Resetting selectedMetadataToDownload"); - selectedMetadataToDownload.reset(); - metadataDownloadProgress.reset(); - metadataFromCache = false; - } - } void SoftwarePanelSP::handleCurrentModelLblBtnClicked() { @@ -240,14 +231,24 @@ void SoftwarePanelSP::handleCurrentModelLblBtnClicked() { model_download_failed = false; currentModelLblBtn->setValue(selectedModelToDownload->displayName); currentModelLblBtn->setDescription(selectedModelToDownload->displayName); + + // So we reset the cache status + modelFromCache = false; + navModelFromCache = false; + metadataFromCache = false; + + // So we can signal them as pending + navModelDownloadProgress = 0.01; + modelDownloadProgress = 0.01; + metadataDownloadProgress = 0.01; + + //Start the download, we download the other models on emit of downloadComplete + if(params.get("DrivingModelGeneration") != selectedModelToDownload->generation.toStdString()) + showResetParamsDialog(); models_fetcher.download(selectedModelToDownload->downloadUri, selectedModelToDownload->fileName); - nav_models_fetcher.download(selectedNavModelToDownload->downloadUriNav, selectedNavModelToDownload->fileNameNav); - metadata_fetcher.download(selectedMetadataToDownload->downloadUriMetadata, - selectedMetadataToDownload->fileNameMetadata); // Disable select button until download completes currentModelLblBtn->setEnabled(false); - showResetParamsDialog(); } updateLabels(); } From 2d73059d79d48b935ae120803045d78360c681e0 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 6 Apr 2024 13:23:34 +0000 Subject: [PATCH 684/923] sunnylink: Set User Agent to sunnypilot --- selfdrive/ui/qt/api.cc | 2 +- selfdrive/ui/qt/util.cc | 4 ++-- selfdrive/ui/qt/util.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/selfdrive/ui/qt/api.cc b/selfdrive/ui/qt/api.cc index bcde113215..80049fca05 100644 --- a/selfdrive/ui/qt/api.cc +++ b/selfdrive/ui/qt/api.cc @@ -216,7 +216,7 @@ void HttpRequest::sendRequest(const QString &requestURL, const HttpRequest::Meth QNetworkRequest request; request.setUrl(QUrl(requestURL)); - request.setRawHeader("User-Agent", getUserAgent().toUtf8()); + request.setRawHeader("User-Agent", getUserAgent(sunnylink).toUtf8()); if (!payload.isEmpty()) { request.setRawHeader("Content-Type", "application/json"); } diff --git a/selfdrive/ui/qt/util.cc b/selfdrive/ui/qt/util.cc index 9f567a68d8..3e1c26c65f 100644 --- a/selfdrive/ui/qt/util.cc +++ b/selfdrive/ui/qt/util.cc @@ -29,8 +29,8 @@ QString getBrand() { return QObject::tr("sunnypilot"); } -QString getUserAgent() { - return "openpilot-" + getVersion(); +QString getUserAgent(bool sunnylink) { + return (sunnylink ? "sunnypilot-" : "openpilot-") + getVersion(); } std::optional getDongleId() { diff --git a/selfdrive/ui/qt/util.h b/selfdrive/ui/qt/util.h index 21507bfb1f..438b9677e7 100644 --- a/selfdrive/ui/qt/util.h +++ b/selfdrive/ui/qt/util.h @@ -15,7 +15,7 @@ QString getVersion(); QString getBrand(); -QString getUserAgent(); +QString getUserAgent(bool sunnylink = false); std::optional getDongleId(); std::optional getSunnylinkDongleId(); QMap getSupportedLanguages(); From 6a8f434627235d22a1b66d4fbbb78795cf91447a Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 6 Apr 2024 09:25:36 -0400 Subject: [PATCH 685/923] Map: Add back `enabled` for navigation path color change --- selfdrive/ui/qt/maps/map.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc index 3d6e35f383..c00e38bc78 100644 --- a/selfdrive/ui/qt/maps/map.cc +++ b/selfdrive/ui/qt/maps/map.cc @@ -165,7 +165,7 @@ void MapWindow::updateState(const UIState &s) { // set path color on change, and show map on rising edge of navigate on openpilot auto car_control = sm["carControl"].getCarControl(); bool nav_enabled = sm["modelV2"].getModelV2().getNavEnabled() && - (car_control.getLatActive() || car_control.getLongActive()); + (sm["controlsState"].getControlsState().getEnabled() || car_control.getLatActive() || car_control.getLongActive()); if (nav_enabled != uiState()->scene.navigate_on_openpilot) { if (loaded_once) { m_map->setPaintProperty("navLayer", "line-color", getNavPathColor(nav_enabled)); From 7e3f8091c232717f5268a329e5356376dd55b000 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sat, 6 Apr 2024 16:17:21 +0000 Subject: [PATCH 686/923] ui: Network refresh button --- selfdrive/ui/qt/network/networking.cc | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/selfdrive/ui/qt/network/networking.cc b/selfdrive/ui/qt/network/networking.cc index 1924cbf0fe..e86d0c6a89 100644 --- a/selfdrive/ui/qt/network/networking.cc +++ b/selfdrive/ui/qt/network/networking.cc @@ -26,17 +26,29 @@ Networking::Networking(QWidget* parent, bool show_advanced) : QFrame(parent) { wifiScreen = new QWidget(this); QVBoxLayout* vlayout = new QVBoxLayout(wifiScreen); vlayout->setContentsMargins(20, 20, 20, 20); + QHBoxLayout* hlayout = new QHBoxLayout(); + QPushButton* scanButton = new QPushButton(tr("Scan")); + scanButton->setObjectName("scan_btn"); + scanButton->setFixedSize(400, 100); + connect(wifi, &WifiManager::refreshSignal, this, [=]() { scanButton->setText(tr("Scan")); scanButton->setEnabled(true); }); + connect(scanButton, &QPushButton::clicked, [=]() { scanButton->setText(tr("Scanning...")); scanButton->setEnabled(false); wifi->requestScan(); }); + + hlayout->addWidget(scanButton); + hlayout->addStretch(1); // Pushes the button all the way to the left + if (show_advanced) { + hlayout->setSpacing(10); + QPushButton* advancedSettings = new QPushButton(tr("Advanced")); advancedSettings->setObjectName("advanced_btn"); - advancedSettings->setStyleSheet("margin-right: 30px;"); advancedSettings->setFixedSize(400, 100); connect(advancedSettings, &QPushButton::clicked, [=]() { main_layout->setCurrentWidget(an); }); - vlayout->addSpacing(10); - vlayout->addWidget(advancedSettings, 0, Qt::AlignRight); - vlayout->addSpacing(10); + hlayout->addWidget(advancedSettings); } + vlayout->addLayout(hlayout); + vlayout->addSpacing(10); + wifiWidget = new WifiUI(this, wifi); wifiWidget->setObjectName("wifiWidget"); connect(wifiWidget, &WifiUI::connectToNetwork, this, &Networking::connectToNetwork); @@ -57,7 +69,7 @@ Networking::Networking(QWidget* parent, bool show_advanced) : QFrame(parent) { setPalette(pal); setStyleSheet(R"( - #wifiWidget > QPushButton, #back_btn, #advanced_btn { + #wifiWidget > QPushButton, #back_btn, #advanced_btn, #scan_btn{ font-size: 50px; margin: 0px; padding: 15px; @@ -66,7 +78,7 @@ Networking::Networking(QWidget* parent, bool show_advanced) : QFrame(parent) { color: #dddddd; background-color: #393939; } - #back_btn:pressed, #advanced_btn:pressed { + #back_btn:pressed, #advanced_btn:pressed, #scan_btn:pressed { background-color: #4a4a4a; } )"); From 913f32a15c5b5f74bfa13dc238ee2bfd574b9cee Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sat, 6 Apr 2024 16:18:29 +0000 Subject: [PATCH 687/923] ui: Driving Model Selector description fixes --- .../offroad/sunnypilot/software_settings_sp.cc | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc index 9727bcc2f3..ec72e71a78 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/software_settings_sp.cc @@ -129,38 +129,32 @@ void SoftwarePanelSP::HandleModelDownloadProgressReport() { // Driving model status if (isDownloadingModel()) { description += QString(tr("Downloading Driving model") + " [%1]... (%2%)") - .arg(drivingModelName) - .arg(QString::number(modelDownloadProgress.value_or(0.0), 'f', 2)); + .arg(drivingModelName, QString::number(modelDownloadProgress.value_or(0.0), 'f', 2)); } else { if (modelFromCache) drivingModelName += QString(" " + tr("(CACHED)")); - description += QString(tr("Driving model") + " [%1] " + tr("downloaded") - .arg(drivingModelName)); + description += QString(tr("Driving model") + " [%1] " + tr("downloaded")).arg(drivingModelName); } // Navigation model status if (isDownloadingNavModel()) { if (!description.isEmpty()) description += "\n"; // Add newline if driving model status is already appended description += QString(tr("Downloading Navigation model") + " [%1]... (%2%)") - .arg(navModelName) - .arg(QString::number(navModelDownloadProgress.value_or(0.0), 'f', 2)); + .arg(navModelName, QString::number(navModelDownloadProgress.value_or(0.0), 'f', 2)); } else { if (navModelFromCache) navModelName += QString(" " + tr("(CACHED)")); if (!description.isEmpty()) description += "\n"; // Ensure newline separation - description += QString(tr("Navigation model") + " [%1] " + tr("downloaded") - .arg(navModelName)); + description += QString(tr("Navigation model") + " [%1] " + tr("downloaded")).arg(navModelName); } // Metadata status if (isDownloadingMetadata()) { if (!description.isEmpty()) description += "\n"; description += QString(tr("Downloading Metadata model") + " [%1]... (%2%)") - .arg(metadataName) - .arg(QString::number(metadataDownloadProgress.value_or(0.0), 'f', 2)); + .arg(metadataName, QString::number(metadataDownloadProgress.value_or(0.0), 'f', 2)); } else { if (metadataFromCache) metadataName += QString(" " + tr("(CACHED)")); if (!description.isEmpty()) description += "\n"; - description += QString(tr("Metadata model") + " [%1] " + tr("downloaded") - .arg(metadataName)); + description += QString(tr("Metadata model") + " [%1] " + tr("downloaded")).arg(metadataName); } if (model_download_failed) { From b8fdb3e01ded282659de68bc436304cb770d0bb0 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 8 Apr 2024 10:01:58 -0700 Subject: [PATCH 688/923] [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 271968e76339f53aea5cc510809e365e575e7a47 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 8 Apr 2024 14:15:16 -0400 Subject: [PATCH 689/923] ui: Only build installers on comma devices --- selfdrive/ui/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index fe1831f505..4c4d3e2dab 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -102,7 +102,7 @@ if GetOption('extras'): qt_env.Program('tests/ui_snapshot', [asset_obj, "tests/ui_snapshot.cc"] + qt_src, LIBS=qt_libs) -if GetOption('extras') and arch != "Darwin": +if GetOption('extras') and arch in ['larch64']: # setup and factory resetter qt_env.Program("qt/setup/reset", ["qt/setup/reset.cc"], LIBS=qt_libs) qt_env.Program("qt/setup/setup", ["qt/setup/setup.cc", asset_obj], From e1c4ab01a96ce973ddcdcce8036fc4d64dc35b2d Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 8 Apr 2024 14:18:57 -0400 Subject: [PATCH 690/923] Clion: Some updates --- .idea/tools/External Tools.xml | 14 ++++++++++++++ .run/Build Debug.run.xml | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.idea/tools/External Tools.xml b/.idea/tools/External Tools.xml index 75b33a6fd7..92f206447d 100644 --- a/.idea/tools/External Tools.xml +++ b/.idea/tools/External Tools.xml @@ -20,4 +20,18 @@ 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)开关以允许实验模式。 @@ -1158,18 +1154,14 @@ This may take up to a minute. End-to-End Longitudinal Control 端到端纵向控制 - - 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. + + 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-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)切換以允許實驗模式。 @@ -1158,18 +1154,14 @@ This may take up to a minute. End-to-End Longitudinal Control 端到端縱向控制 - - 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. + + 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/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 708/923] 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 709/923] 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 710/923] 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 711/923] 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 712/923] 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 713/923] 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 714/923] 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 715/923] 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 716/923] 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 717/923] 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 718/923] 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 719/923] [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 720/923] 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 721/923] 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 957071fd4283c2a31c5170f4091e3bb47be83dca Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 11 Apr 2024 05:05:37 +0000 Subject: [PATCH 722/923] Ngrok: Add toggle to start/stop service manually --- selfdrive/ui/qt/network/networking.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/selfdrive/ui/qt/network/networking.cc b/selfdrive/ui/qt/network/networking.cc index e86d0c6a89..7934fa10da 100644 --- a/selfdrive/ui/qt/network/networking.cc +++ b/selfdrive/ui/qt/network/networking.cc @@ -226,6 +226,19 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid }); list->addItem(hiddenNetworkButton); + // Ngrok + QProcess process; + process.start("sudo service ngrok status | grep running"); + process.waitForFinished(); + QString output = QString(process.readAllStandardOutput()); + bool ngrokRunning = !output.isEmpty(); + ToggleControl *ngrokToggle = new ToggleControl(tr("Ngrok Service"), "", "", ngrokRunning); + connect(ngrokToggle, &ToggleControl::toggleFlipped, [=](bool state) { + if (state) std::system("sudo ngrok service start"); + else std::system("sudo ngrok service stop"); + }); + list->addItem(ngrokToggle); + // Set initial config wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn")), metered); From 70b8e277d023196d79f33f9b93090efcbdac6fee Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 10 Apr 2024 23:39:45 -0700 Subject: [PATCH 723/923] 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 f1dbb9a1ce722aded0156fd75b3e8a94972b8658 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Thu, 11 Apr 2024 15:41:59 +0000 Subject: [PATCH 724/923] LFS: Move to sunnypilot's public GitLab --- .gitattributes | 4 ++-- .lfsconfig | 4 ++-- .lfsconfig-comma | 4 ++++ docs/sunnyhaibin0850_qrcode_paypal.me.png | Bin 13021 -> 130 bytes selfdrive/assets/img_hands_on_wheel.png | Bin 21194 -> 130 bytes selfdrive/assets/img_minus_arrow_down.png | Bin 26627 -> 130 bytes selfdrive/assets/img_plus_arrow_up.png | Bin 29220 -> 130 bytes selfdrive/assets/img_turn_left_icon.png | Bin 1152 -> 129 bytes selfdrive/assets/img_turn_right_icon.png | Bin 1091 -> 129 bytes selfdrive/assets/img_world_icon.png | Bin 3654 -> 129 bytes selfdrive/assets/offroad/icon_acc_change.png | Bin 12267 -> 130 bytes selfdrive/assets/offroad/icon_blank.png | Bin 15538 -> 130 bytes selfdrive/assets/offroad/icon_display.png | Bin 1762 -> 129 bytes selfdrive/assets/offroad/icon_dynamic_gac.png | Bin 27685 -> 130 bytes selfdrive/assets/offroad/icon_mute.png | Bin 12576 -> 130 bytes selfdrive/assets/offroad/icon_software.png | Bin 4785 -> 129 bytes selfdrive/assets/offroad/icon_toggle.png | Bin 4073 -> 129 bytes selfdrive/assets/offroad/icon_trips.png | Bin 5354 -> 129 bytes selfdrive/assets/offroad/icon_vehicle.png | Bin 11365 -> 130 bytes selfdrive/assets/offroad/icon_visuals.png | Bin 13022 -> 130 bytes .../assets/sounds/prompt_single_high.wav | Bin 34638 -> 130 bytes selfdrive/assets/sounds/prompt_single_low.wav | Bin 44416 -> 130 bytes system/fleetmanager/static/fleet_pin.png | Bin 115172 -> 131 bytes 23 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 .lfsconfig-comma diff --git a/.gitattributes b/.gitattributes index 912d2b3866..8781a7371f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,10 +5,10 @@ *.dlc filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text *.svg filter=lfs diff=lfs merge=lfs -text -#*.png filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text *.gif filter=lfs diff=lfs merge=lfs -text *.ttf filter=lfs diff=lfs merge=lfs -text -#*.wav filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text selfdrive/car/tests/test_models_segs.txt filter=lfs diff=lfs merge=lfs -text system/hardware/tici/updater filter=lfs diff=lfs merge=lfs -text diff --git a/.lfsconfig b/.lfsconfig index 42dfa2d944..5b63415cd8 100644 --- a/.lfsconfig +++ b/.lfsconfig @@ -1,4 +1,4 @@ [lfs] - url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs - pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git + url = https://gitlab.com/sunnypilot/public/sunnypilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/sunnypilot/public/sunnypilot-lfs.git locksverify = false diff --git a/.lfsconfig-comma b/.lfsconfig-comma new file mode 100644 index 0000000000..42dfa2d944 --- /dev/null +++ b/.lfsconfig-comma @@ -0,0 +1,4 @@ +[lfs] + url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git + locksverify = false diff --git a/docs/sunnyhaibin0850_qrcode_paypal.me.png b/docs/sunnyhaibin0850_qrcode_paypal.me.png index e187bb2ea2c32fd3bb3d44d04adb5343b9be2e10..57d6024e010cb5477977c6f6a202353aaa5ead2a 100644 GIT binary patch literal 130 zcmWN?OA^8$3;@u5Pr(H&git=c4Wx-MqtX%V!qe;9yo=wX^_Qx1o@3Yg-sbHgWBp%0 zWu^Yq<7CnoEWI6S)ND7uy95x8vzUsD*##(M$*@os7V*SVP>@sc5M%Kn5*}d-A(~{+ NIb25jvH~;~mLKWyCp-WE literal 13021 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 F{2yrVu8{x$ diff --git a/selfdrive/assets/img_hands_on_wheel.png b/selfdrive/assets/img_hands_on_wheel.png index 0b06b4c6207fb0842c30bdbe37a988ea0d7775e3..2c7c50d17ce8b202798860b33ff672e613596beb 100644 GIT binary patch literal 130 zcmWN?K@!3s3;@78uiyiggaFe1rUVdXR5}KG@bz{tdzO#%@z!n5LpEa`ecql`mh1LS z3y+tPqp&$qjh?l%-TJU`1O%5|A;g%VU;;qLv@=+@2DV7SlTWthYiHM(YbFRa6ry`% MCH+^lMO>Zw1F>}`RsaA1 literal 21194 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 Pz~2EQbHk#&&e8t?17Enp diff --git a/selfdrive/assets/img_turn_left_icon.png b/selfdrive/assets/img_turn_left_icon.png index 1a5ef61d7bdff8409a4e42f6dd7efcee2e31e344..3f5f3b7de1ea73b6669f9969edf8b23ef1609628 100644 GIT binary patch literal 129 zcmWN?%MrpL5CG6SRnUMzmVdfoVG(9jGA_x%>h)dTMIRpXE&Eyr?@B$!x;-0j|NDts znJ>i$6?JJbN0r<&IKLBw7)o`BRI%k|e6Bf>%N7IHr0>pSY-F@WAf!Y#xo8SB@RWin Lg2$Jn)(*rE5fdnl literal 1152 zcmV-`1b_R9P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91Gynhq0K2cEod5s>>PbXFRA>e5naN94Q5?r@&XS}F z8__I-2100I3!7F!uA)T|Jfb3kHnoaeMEwD6idsY)BM2KHY85t7BB4=6P+37*DWnx; z^K755c%abeeea2gYL6dC3toSenJm? zhMka=T7_5jAV=MtwZ&<6b_1weErongM>Z=ZM;E{~=yWWUgAd^`l)z*#8rn&3v($*=;VS%)p-zjoa(x9p zfNCWloOfKtR$5mSLkm2R7jCCMa^D1xU?ym2*NQ9d(v&MdE`ZkFo+{z#Nl@%(!+_R> zA4?#qg>~;ps}^;3g}COk2@vPjRzJQ6&F+xqK1te@G{SXID5x(eW00MRqD0e#=6e&A zFKJrgKB#2(MRjUF(gdD>&9D&0fr;8kd=pG7OZ`vBNu>~W_IODdE5Ns8Y$coqokH{& zaE7!x3)ARtf-1TS>OfIu^3DEfm477|Yc@HmL8G~jVEPyAbze)mFsdN4PC2~FHhGpv z*N0OXsDbPjJOd48MW9woC(VK9(k007u7mf*unhcmL$4wmf;g;#RI5+nE-2Ks}cR^bn7{gD#zywe@{f&YK+O-6s73s0-aEC}c2Iz{g6V3{3X&YF+)e)cqIitFGaL SpwN8)0000$nzX#FGWoX6Oddbas^m9gB` zGc2*c)i`ogmlnMxIqDARw!}eGK*Ai6A{rM~aB(*lbqbI(mE!N>EpTy`7z}%_fyfyH Nkx`8H%Tlkb#UHLzCNuy5 literal 1091 zcmV-J1ibr+P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91Gynhq0K2cEod5s>tw}^dRA>e5np=oXQ5eT(+^@N2 zOfDUTluP8ni%_0i@O+`g=)Pq#^!xz{B`d-qi!QE$Qg`cn! zQc$uwg)^DW#BEwt{%vQsie)Zf%cl&dx3SeyV2NJ#+>@-3H|;ahjZ)$wlY;y zoQuZOcpFTD9qA+A|duXIsQ+}ZKt z;4`3Cy3S5Gj`M33wi~J;M|!O60zK2>I9XEq(30~oWJzOvEol5FCDFL@PyzLX$pAyluHn8Rn_~T zr;CQMX5{~BHZ6XE85%xE#h-@-py8x-vkRJ7PJ+w1-_ZU9%mk;6gO!da%9qqb`iQ!P zT5Fkys`>yn!zgf)hV(F}h}^~+j_060_fN6^@}3?qgYMNjXaOh5@Mx!q+{U_hbsu%4 zWK4_t)36U7ftO@>g;!)cNEOyfq@(nSjx~g}GkF%Y)bo}M5B82u2Uey(dVkW~kSR@s zuiz3K1P$fLlHsK2DT(NDrq^8ECfa({y{cE7dxL+FES_CGNvb;>JQS(to-v zha2ExSbIxHVIFw@ix9CzmF_>G&GV^H1-81G{jKVp$Jn)gw0V1$vHq_o zt+~JSI3(-KF1@iD_3i@hkpoL&Hbr8wh!h}sh#59yjzks=rD7bB!{{M9;{+u5&0-Q4 MWEt%%%42}#2h5}=6aWAK literal 3654 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 Y1y;8b)`85whyVZp07*qoM6N<$g84km?*IS* diff --git a/selfdrive/assets/offroad/icon_acc_change.png b/selfdrive/assets/offroad/icon_acc_change.png index e1e80cd17219707a784cce913921599ded38665d..19144942c926572f95b60caf476a0148fd25a837 100644 GIT binary patch literal 130 zcmWN?OA^8$3;@tQr{DsX5XxtI8$v*sQRx`$!qe;9ysN%t%$M$KopKm+AM5sLviC^#k$)CwKq= literal 12267 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 MgP8rx(g3(9eiIic0ssI2 literal 15538 zcmeIYWmufcwl3PZ1q~jgY24l2B{+?1(=_fh4#C|mSkT}SGzo6Oli&`)odie-8VHAE z&b8KDXYaeuUC+Je-|T*x=c}rBykpc`W7O9lT``*KirARsm;e9(TUkj?8vsBg{PjUc zedv+#d%XhyFl73H4dB`kZ=kEYi?y923<&pig#lqccGduZ&r(QD)n z@7&i(Klq__-rnGZ&gj@zs5iYTQ7#F^zqE9f414F&b{2F$?s-2DL<>G~x9dza62IR` zQG9Vbaktlf{S!x`yIb;pSmIgdP15|QBy%}4l>m(b^Y1t3y(jbC5~o|CX$7MiB!@>w zBp2i6@weAhKR8KlR^}KJlq65;uoCL9O0TZvuiAQURo~A~E|2TfpI!evzaHl~9XhC6 zxflMt_VbfLr)i5u?AMZHv7jMBNhGD4$0j+qnpdJ_MS|b>uiu(soYZbK0fUSf@24wP z>e|0;m7iwL2Q8+9CF?}ZuJ$bFsMqeV{Fu5setJq@KEEm#EkEBHyZ7mwCk@IQyDaec z_P)#?|7`t=&F(H|<`TTB(J^W8?Yo5Dwf!yg?aJ!>dbMb=cf-yyr%OOBmyDIM^Drce z%vtE<2WA}2u8-xGe|%iRl!N$dp-q+520=sfjlt&%OO;J7abMIr$b;hPJANd3w-bp7 zu7-FI_6&qxEOlbvn_t}=MI7r6N3H)zdTnXq(n}WUr5<#~AwaisBE;en(%t>+PUA<; zLhrZdt-QSlUpz2aH(1{gDjqn&HxnXG3QVw^f=q+yH&-Ki!~1cr$h9%}uZW>oA)cQ< zk8jI}mr*3JqnGx7WP++!HVTU$t_GAvT&@~y?!ma?5|}E>2Iu1W7ONlC<4dx8TiT{t zwx(-8W$ldTaj0s2Zsbsn*uALzzP5SE=*X#gQD?mK`;zg=t0W0U3Jh1amx%&5q)>Hd zk=Ae9(`kYq>?TuTta`PEZy_G|60CKNhxXO&{BtXA<=E<<+m?_0Kl}F4q^nEp%uK6G zZhd%K@dB|oSX;O&T>~e1 z9!qWa3BUe!e_lEHaS>&@Y?-^0<}X^pH&c8gck?xJ+UB!P$;JH1o(b2%&7@uzBL^B= zDw!{DrE5(DF-peAP4<|vr`wdvlj`Q3 zkrJ2q#AQ9U{+1*L8Oe3dlu4_*FC733Ql?{&iD`8m$6ZQ|b+wUO*n8*Pp-mowy$kr9 ztU=F$y$cjlt4v%a;n+{MQ9HPcVo0*78qbHKtTuOT0BcAn4PgeN2j zHD>r{l@8T%8&=sQWM%5&TkUTfkRuE_c zaT+=5v1u~bgA0nOf9_n)k+P&=N+Gn{TR+j0)LUT~V(af@=Yeso8chXW(1`UdM!>o~ ztOvMxTFjH_8e8L+H1vwiXKL~`!mU0pheQw4VdcJmX(6CYg^t0q{OV)ZD}32(RTUWZ zTwEpXVYCLVp?4dH_r|d!tY5n~9+6RwAR<~J$#tH+5byT<3oVW20wo|!mHhSNk0je) z9*483Ea7K4I@#v8Ikat~k%Em8H5ir%!aGC~UZ zr&O!9Fh7l_{ zIj_j_cw3g)Xg@o*e0{zB@chx3 zp2L=ZO9;Pj8gmbaFnOT|L_81*APKfzL?C)?hn7~_>KH1T$(2Q>xj;tqJ{~KapqE|y zV~0{iNUi{^AvtfD9?#?}DSKIRDABH;(|Ldx8Gp;xvozEM11bZtG5&Y!Pze&IxYy=c z)IeyT1Eup9?~51Y(y|>M-GoI#)&Q%=>KUG!e&MtBTcP`{4FzmLw1o^QI^#8ql=Z;3 zNMNMteuMz(DcM}#A-dw%BZ^re5+7^$gI(uFPJ=j4^&>v&94@m<@k#OSguWi8^4eyt zBk`(Boo9>ZW53x>2Qe!e`Ad{FGf?g9IJ?xN^EpQeHb%)%5Br9OL-NxZC)WIT25qBp zk`P|5{*3lLwmFr3jBbZd!L{W4=8?oCh)^5q&_K^gIxtyGWF1El{do=h6H(-7+vyJz z1NCna1|fcnfS`?NVWZWap*CP9TJT|PuBQ{%o@Q3hh6)i{@GAM??wijPJR$WbQ7gk) zmCv4Y!jy)4gpNl15UDV8Z`}}q!1SCunbJ|xobm=pQ%RrJAq}Jo;A)X4uaO6D{K?V^aNyO zG*NJ$f<--#^!r4j8sA=bpxNX(W~drRw{v6AfIX&1asM9wHIv}EuGBVyVmh8?d&IDX zQ?j$n0WiT!hAn;+EcI5~1W}PdP6sTaJ$kn%8aG|aG!aar&rO8U8=zVS3{GvJS3u4W zH5wD_BTfs|qq}cmZ3HaT>Qjqs4Vvi0`dYFU>IWciBpSXC7H|xWJ}Cr}J&G%2Cl_Q3 z{U)`9C)1nUu)m|OO(Wov_~o68q6j5l$d`s8=zL6NitO<5Po;Xb(8Y?=nTX1Xo=7^_ zIlC;C;E4LhWO~T8Yyz#N%)-m~jlQ_}k(#EBhMVX0sYj#8)I8QF5(a&W2ukTp#IUgN zPs5YnM;X)T!p%Mqbwq6X75F`cEe08W4f^rv?gDED5i^{QhAU;*c0a5H5%o|B8MUJz z8-djVGo9eE)ks%squ(_hwpNl0Q)7Cer;RXR@UapmobT8HgSdAC%q7NXQy76P?+N@? zEv)TA(_PG&@PKDCnO5R>F+L^NaPpL}r~|F_K61xR2aRBy6D?P^r_op8y*MV(qDo>f zeQB67l3NyFs|$Itxf`(tNwT+|-7Hj*Lc-WWA3xVcx|MJNf|Y5=5Tvd`#c}*FTgL<(E>k?oXf1|Utxq|paE1seZ@g&h z`B4IXs$HLISz<|Z=*7X;>jSoDdN)1q;3pX*}b8#03YC{g{+y&D)Qh zq6=m1D^6YCM(^@h?$Tb)%yGlgtwjoEU8|9OK>1#YW#o<@FIb9JSLt#XKSU0d-G8^vIFJi zfNw{jDa&wrL^mrlMSx82oQ4u+cCN$V4E4sP4Ea43rFvO{fh9{8aZ-2B$focJg8@Ez z+?CWfYEO*UMGAEk;!6p`GgG}u$rN5QMdVK^@pNlwA1Nq4lQ^r#4aT>(X3L1Fj{l;o zhS(IxsvBUjD zMq+1Fu|A_;Y15q`E_Eu2lKRYDzm*jpENib+&tP$h7hI9`0*&s)H_MCsT)Zv(g3xV@ z;vc-t(CYUF#Zp=Dr&bBjMH}mVDbv6~lze0jrP+%^xm)NNjai5oXhc191uvJ0?Orw> z5$_V_=y#xUQ`n6sc}k@-;Neuf^zw>7vD&yRRA0xhLxpawk+Nn#czX^ZM9j5~+Z>w) z{joGY+Sxnm2;8TOTUa#Loiiik&FDW7iVBJV^O^w$K^e=OQj85~Lp}8945YM|c*-j^ zwif<#)eIDJjVgGgq6|GxCbn>Rqsj*I=?aD{7Nw3=(5*`vX*p;cy2kqEXNy+Km0KU8ChJkA_s=3>Ib%PW2-JvFD>|oA?vDhPIVx z+M5qn%7)ELSy7*uA4ZOsLt}h`UXnA3RdW5X zLg^#G7X)MS5#n}q&E~7R?u0wI&m}zvz0Oe>*y{z|ND8e`)vz03(r7t?O>cnKVEM#t z*|Bk#p^+J{a5E|gC#lcbmA+7?;N$X^YLx-lXf#$ht9%v+sT-{yr4db6qEFnJ z5~onovKksUN2{dcY%i;pscK7SIHW5mx2z-j*5V%4Ac!{Qt!oKJewx5&NkXf}P&A$t z8}MA6buuqB!h$AULd2BM7-kKxGwCgfyXi7%D_5Tvsm6v=rst(6sCy!U>>96K=^G21 zHulNWF?&f)z$n(%edXAZ>H!@-xOo^bAm3aEdn=PzrmF)t09# zfChFm5PF4h$7k^*Bz>axYX9q~Xu&l1#k=mFLFIn^3&jiyd1B&VeB(jbk?~d>Wu^V)jjT}%D>m?To>ND#NPWZ%&ho(fK2YZ}G zRH=Jc_+1`9dp?BBG30}Kgl4wS05I?}W$3<9rVz@3 zAGvNT?I(;V>qFZD(2lXc+}B7#aw5M6IC-PK9Myt?Q|2s=o|m;tGe zh&oz%uIuR8rrG)khf`0ZiE3%C@Jq`BR%Ll4Xp~Qvm5gZwl7wxEk28@u$q?{*(ZY1Y z4xx*3Qv5JuDq0QOF7NigFFJpY(uNQ%acn(c6 zS_4LgoEkz16tnjwRUVt^a61hJx%u2(OK7b-mhrTsye6jE)%nOOT+`PB2BAqR*7-Rg zil5KiJZ-Q+ZK^_i46 ziB@3ChFKb_1cx_@W~t=SmgvQbuvqz)^jUcL<_;)q=m20uNuH?76cf?wSR$LOKh9tD zmh7=?ELOZte!AE3!Nk*yp5iK<$cH;pNQMm}y9Mk^Tx(#K=64)t8CJxl(e-&`r+qWPz{=G_;iD@ci8c6Jwy1j3=*mG zK+N_mq;MsAB@2|iroh)rJ17)KZ&uHH9{xN|YkEUckfHtzxoPpDR0sXs z2_M;2l6PF@))qw>)AisP`=Jngfsr>EwsF1wuY*vO$;jb>riMYpo%9!S{Gsr*Jq=Kkte%e|tSTC%`t#DGI!`ICr@1s~8*2lEz zQ3GGa`el+Rlde@xPtec@<6=~?y5wa%o*dy&!RH+!Z*Vxp6!AG{#O+s>w!yX;QO~Nf zGN_ks)JK^G6WL@V$7qv(dBl#lh|i5r-?c_F{xNGY!}A$3v8n=}=cA1g-x(C0Cen_v z`L=$*G1Cc7hbwPzEt0h9&S8nHkFrUttk>J&R38lcj1+>~aD|GB6e^P8P%zCI&onAR z=wl+2_!*U}6Ypfx;G`lAX(<6Zj&GvxB}6>vo=+K;jNlJhNr}k4;g)l|S1846uuqu^ z{}C65fe!DfGokdmoLDqf9aLjMRB^)3vu5*O*l(GAG3KKd9vn`(l)RVxWnV^%%ZEEu zfkH#s3tps-jKe{)U{F^e-+sKvKk3n*ZdSH5qc5OHZ$1=-Uq0%_M%E?INTZ9v5T76$ zLH(Ug6up&Hpt><83m@*5`C-N`Q_m_02|KJmelAq#Or%hZiEz7I9W^vi9Tk&hk%)`* ztaG9@xoOD43KUPzporz{|F+{RRB&d%yP1Vr6Tu!*fx&-dINSeX<=NLT;Y47&{p&JT z)TBqDiICX^i(rnZ5cRj+WWD_}gQ|zQBDcv;CAEh0KZLSOI!evtWw9<(HMG_o(=bdj z+G-(}BYX34 zTmO)K6#+FIR|#c@SHAveA06q`YL=rJO6C@xxJi$hE5iZ0S*Td1QA zJ@h6P(%n3w^*rHe%GmwHsC%+Jkf9M3lmhmeIetF-3Ae^YudM6g7lf$~$Zd6jjJ$It z?qjIR@J%!{n^%|wNi}BgZ*ayJMNyIy<*U0CQSe?SGkuVt?s<9#kRMp_EabX;EQs?+ zK_O+`m35_8m-P^J6+x`UB1jqONMQ!h)PI-ZlROK7H7G_O{tgy+Ko!Bw~#o0G!p$2eZ$&%Lqtgmfp0KI1MQE|)A`LlQW8TFsZZED0aw&~ zj!8Si;Hp*9?~mg$ry1gD$RK$kLKp)rSvWFXtdf}CG5D)~gE zInbnKPG=9}IJbA&tjhIG=^=k>s#19jwRFXq@8%)xRhEZdxej9s-dFu{+q7lsy=<8y zMv`Z!QqD+9BQ#u>kH zzorTK@Xfy}ogyOveTf(xF#Co?j@hN314v9Ph+#iLql;5jDmq0Ke4*rUjzVeD7K%jq z@QpixvqGsld}-|okp~*aTR@Xm^4j`zgc zy$qRdpMbbAj9fibtS^{lM!m1m4rKD2La&pKj?!(eG%X|h>_t`Xmx^7d#*~cw!!^B+ z1)l^mTx$=liqfW4C|?&U-)^)WIS5iZ_Rnppti9W&GAzo1uac(>byQYCbA^VAsZoGJ zg}lp!O9pz-h#RchXpP>V!67~Lgz`jsFTNz(TK_=VxGV}&ch){XTxUS_>>F?%CkEGb z8TOQ;aj!EF%ua!~vfBEO9GX3q?^JylLcbA>E#28$B=1unwTD0~#;kwvadphO7Clip z&mpH5VRoNA(Rw04e4=$to?4U8j`!X~tMnyKO+inWOLxMB$3vkRw1ozYc*_XFVnQmPBYYFGQG7MJ>_nq+}>V9W<{j-JK30LU|nx z?6y+zRJ==j;K3Mj?MokAoJFBTTSCLcs%g|seK*7yu{l}kL#(mGQ(X|X_zsHy{`F9_ z&Y^UYd!@}t0}1-hE9>pGDzEA0={(a3t-RPu{Xm441C%@p%IAeU?Rw2^qp44&X?@-v zkdgHiRlU}`6KD*y)o}ZSxmO|d?V#-Fpb1>}6>B$tb)$45##1sVs*M&Gpqa-j)2S?q zZ|>Q`mcejEQyI-GL0O~m(INVcn_?Bm{LT6cB{_a*K>oKqCr-jHL+y~E(Px{-COjKD zlbW@iZS$d$FPW4)QKl!~iyE=9e8HhVN_m@8M?-s{6&boepi~^(&%0M~YW_)79jl*t zx$eS2`~bNFPc#}usa-d(D$U`5)sqgfwXhQTI}7u5X`(Czr6)sT2?L|yR!AoOO(>oo zHRAyumOaYM8NNLm8~*JmEDEA!x=1?5Xo(axq; zQK>oI9Ekfjr%SkwyM?Z>tEI_bdHhg=@K)DEfqxV? z`C!kUIjFMr4aacd^ ziIj8f%tW;gujSnkl8o;go06H_s>e?dt*am#gst6c0R4XP0yE}K1;`dDHhT&x* z3!s~p@BS#>^%sl7;a=#NHs7fW{6d0pn=hynn%JHai4^K+j4~D>Ll&9FEQ`zdh=)~D z*$|wtwq2(ZYnf8~ZlmNKm{3IOvLsiykxT!4iPUfHC|uo1lbJpvA#%tLs489h<7WD2 zVP5oD?GTARPKAL0PgOPGg@kP2*(DQud;X%-IdO~@-^$!s&?8k8yA1Z((a^yb?yR^e zVI7-YJoYC8+EpQixn&DovZk=I`Or+ko;Oup${yvZ;=}%vI zPStJZs(gT+ebl~S^)TR45#cdvI=Z@YDKF(5$-%5~jJsUA2@!YCI{494N4TC)?TSq% zs9;}Q95qf=FY4szXIB}{6aJtRmrLqdNYsF=U`|fyllF=xCj)uUJMaCyawH|{>WX*j zwIAt&cG!x2#rOL9WakdQr+n0YTdTqV(u}uOLd2)Y`5_kBVAUm&1R0(}Em_*;!3tYG zy5B1K%wI0})^iecxJFmirql3VL#vX^hMN(apbP2wF52@pzp#`1byA7rW^+S zJ(AZ?)dsXvScaYZ$np|At-J8!;*Dk+N;8Ql(ps?Xjrl4_ZnNiMTzHy+;m@E4agcgZ&{TQQ7dd-tk9(xx-=sS z@Dw0_c9k!|Df40$S=;J)*6Mvh^RnyZcdw+JzN5`ii#6qUY_j*YbP%;|R|ytEXi~Ul7_lQHkphZF2R^6K;j*74}vm>DwgV z`-YzI(**t0z_>d@U!&IOpE+n%N$Zo@(v2hAcK7k%=aBOh-5C#qvNqL915n1-`Phj& zNC<3R9-@72!>7F2b*ruS=X0bPJi#MUX$GD4)8c<8Eymp4tVM$?lFxGvP7qn0q7|>nRB1h2M+%l1Te`kGEiKBUY2T$#lTRe646od;2{a$W+M0iC=^hvLB?`SFQgE z$DTw>baPMGa)7w~jRY=%&CJO&N3%8I=Tl;xQDke6N98rL`>&}qal+hY#*s!3rsEP8 zT~CyEzAmK`>qt}?Sbrz-l_F+nv^g|DXs-a}P?6k$?bjZ1U10*k623Xp6pL{y2Fr5= zo!mZ-GnSZI0=@(=RWpk|5;vus8N=@;ua2XtNl$?%bGad^kx4{|AHza46l1CCBgu7_ z8LqOMPfY1AB=EGRFzk~p&{Jaaj!WW5=%6gIA!@UnpvSHJxM%Q^LIw?* zZK5MXkVEn~Oimm~G-H3MZiI7HX@khB#N1T7*Lwaz55%90YL(6B`(n&o9D{44s8=Qc zlTdHFT_yuZerdMUCjFd_p|U8E`J2=JhpN4MVEzw(52?1x+3_7v%Ld``e^#nc((vI4-aj43c-CQp;5n&>q?UMC6)IHAgJ>LxCu(3 z$^Tx7ep7~_oh951zaP(!D*+Odee;5eVMDm>=VK4*Jb2@^JmDn-c{54S_p|gACL(fwC^{Fd!cX z9|sq^ypNq14@d$NDCTZuEut-_@F&GXOB`eihr5b!a(a7vb9nP|xVYPJatjL!b8_); z^6;=fAlN;8o#7B4c4rUTUlf0E$iY0I?sl$lI~Ql*FHVT1izi$h1bP?;{z?8Y3YGVH z=={^cul8?x54aVl@T>tFu?xp^(wxnNve?0mx3mh8e-`~vLULfrh^mQX$@gopnxRLagCaELP$_KWI) zoWt&chesI7D*&JvuLjMBk!Q4F_ zviuh*Hx~yF&+ic{sEEP?CFCL7?3^GrFiuxzo8JS!)iBySO`OxNBJ2!=Uj0ndiR)|C34kVYBmqyZb8tA13v`;l%#P zSEUDA7kA&k_}78C{n7ekM{>0LEfo;>dlwLaK>v{61L6g<`n?1XI{q;PwS_p_z#g{S zKWptD{dWId9zSHQHIz??otGEN&(0@kCHzndFe`RJekfGP($b1oi0_YF`6s)Fi#6OE z;trFxdB}l>b$+O=-|Gxy`Xl|A|2-IQTiCDMdZ-I_F8+rt5X{3P!p|?l&Bw|mB*Mi7 z`eVs~Vw}Hr*?&w~?AJb|rY7=NQN(`jQzFX0vQfv=)z#4s=Kk+u{Udq)A8>!M|1(kl zPv(Dx{b4QZ;_CZQ$+mC}Z|DEf{eJ`egF)2}3Ul^w`JY1nE94JZ{&F*Vi20Achnw8P zJ(KgFH_bm&pxQ9KLY=qU4P5? g3jD3W|2GBJQI&N72=>_O62Ewq<<;e0$ykK`FCm)=SpWb4 diff --git a/selfdrive/assets/offroad/icon_display.png b/selfdrive/assets/offroad/icon_display.png index 809f1daa09a1ea8c057dd8aa18670a6a50a6f40e..58cbc39820c8c4ddae9a236c4cabc11dc387d2ce 100644 GIT binary patch literal 129 zcmWN?K@!3s3;@7;U%>|~O&~DzH=z(=Mx|r02Vbvy*{i;_kC$n4p1NCm@ALK$UH`XF zUXSs#de*~Uu#8@eHbx42tjQN81$-pOO literal 1762 zcmchXeN@s{7{^IXDPK^xX*tZ7$~KqG`BE^af-=;K%(P50u!&f)KqTKL$>43cj{XK**d)k!fXv2$Ke+4l~%#?VSDBzq{u=_kQm8`QH0H=l*d|@7NyW zxYA=K2n2GBi$(7QR`F7RZGpLY55FE*Z0J#ONnl_wz{Fx;zl^>!CJMyA3w^ni%tT>P zAW%!0{o?-RzP0@u_eT0&q4h`Y-+Wgl@BR> z3ip9)NWu=^SfsNJN`JcgyGyQhT&$v$0dQwuT*)m#Gu? z?Vu1Rhr50(2seskg*7P0)#3{^RALX;bW5+-+YN1B_1nnEi2Pf;JXN|Fl4vD79Bs3+ zXE3T|OU z_|Jkn(p$aNop{bO48m;u&fL%7O+EmSy{%wjd18JD{R(XGhwQGdk7&*+pBY>?Hxw~9 zEn^Rz4*W?J^!bB~PQO8OJwjZo7*@R9b1q$VHX8co5<2@PY#1=k45U~WHWyhE1-+^C zx@q37*&D(gc_Y1sBjo3yadW+G@O0#S21W6jxn+)HZ=g4tL*pCRnkNGb@wtFP(5j5A zJn08v$22nY! zm?wO~jYl0?JgjD zPq^B#L#C0ZaQCOuYL&LWPIm%_khlByklc&mt45owTEO9WuNa3z3OYXK}10^T==3;+)MIRZ!#0LP%)T#Mn=B_q}@cJ!b_ zz?Bq?JsK(-A-ccZ@Sm{_x!YZz;&u~WExlIeo$&?tnurny-FDDGE_b5^-lPDB!!<$9 zw0k8wptbOq{s7iemQd>pV54NoP#XfENCK$zz&M}~3tUnDc;EAOKHv-v0o!=kSUFm;Y+1oGA07SOP-r+Z}b$IA1sdOP6O3-kuqXrjQ%@9@tto6ga~X#thrKYb!A(BaX*3#wa`6k}b`mcSwm(MYX%M)1 z4dc30A1hKysHDWAgOpyb3kRwQ&(2pGHz2$;~9*eo!Tjh>K+8liVi M$@o?c*Mw310L4)zLI3~& literal 27685 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 P?e#)NLQ%Xz%rM}8iGQe{ diff --git a/selfdrive/assets/offroad/icon_mute.png b/selfdrive/assets/offroad/icon_mute.png index 3e31a137877bd88839f0c9e13019eaf2c659cd9e..1639f236835a6fbe764d1a6892c2f8ad1296c204 100644 GIT binary patch literal 130 zcmWN?K@!3s3;@78uiyg~3L#1R8wx>~QRxWw;OliSd&zsW{?c{MbL__4+q^x>SpL_~ zv84VqA?gF=cKNXT0##afIB88IRQJ8Pqd Mpho+OUR@wmKi)$o!~g&Q literal 12576 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%0Abh^luo_o00~AA)E^GchZE+t-*^JtOYwC{oit?w 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 ATmS$7 diff --git a/selfdrive/assets/offroad/icon_software.png b/selfdrive/assets/offroad/icon_software.png index c098c7999c99c3510995d7fc56a1594b313b0763..70915e290630eacd1e5900ddb850a03bdc06a29d 100644 GIT binary patch literal 129 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 XOVCPUzeazU9gKqmpDpmq`xsm2yA5{< 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 literal 5354 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 diff --git a/selfdrive/assets/offroad/icon_vehicle.png b/selfdrive/assets/offroad/icon_vehicle.png index 68ef2d0c0bd5f0703290262b1c9b00d7e7a793ca..4c036d9602bc465f95ffd82bbc3ba36cb0da9bfc 100644 GIT binary patch literal 130 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 AaR2}S diff --git a/selfdrive/assets/offroad/icon_visuals.png b/selfdrive/assets/offroad/icon_visuals.png index 8d066c90ba9773ba9c74f6c8f6faaff8cf5fcc63..26530af357598527eea61901010c9980fe06c168 100644 GIT binary patch literal 130 zcmWN?OA^8$3;@u5Pr(H&5I#eC8z4cLQRx`$!qe;9yo=v5=1cXpPC2x`k9B)A+5h)X z+3S32Il1b~ZgY^5o*~2obM)YCb6728GL;wuB?J>)M4xST(3lKHTRbC$;#}|%TQZ3= N@h0QT$~ptE{Q%VUCo}*6 literal 13022 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 diff --git a/selfdrive/assets/sounds/prompt_single_high.wav b/selfdrive/assets/sounds/prompt_single_high.wav index 83fe791b543142d9451baaa8d87ba1d863894b6c..202483d17fa64eab40dbeb36cf33400344f43bb8 100644 GIT binary patch literal 130 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 Klil(3^#20`+@gK} diff --git a/selfdrive/assets/sounds/prompt_single_low.wav b/selfdrive/assets/sounds/prompt_single_low.wav index 1fb94ec455d1c986037e0d859d4b7dbf62ed271e..925401ea27f7012dfb138a0c965f4e2a412663bd 100644 GIT binary patch literal 130 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 M6tjO>0ysb;eg+sPQ2+n{ literal 115172 zcmeFacT|+;_6CX?)MG(WnleBHMWiDrAOb37EEExGBB1nMq<4%_se_0VK|n!3DUzXx zNL3j|nl!0WbP%MI5u}&9-)}JIB$|8wzH9wl>nsh-eBWDkefG2W2|BNa-@aw<7CJh* z?PpFaUZA7f>_|uVi`3?g@Dm%0A{_j+&iMlV6y39TxMBE@Uo1|lo}{BAhHqWEN)P}2 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ʴFVgqq3(9u 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 From a4806c4c2a40c40af8e3120ad34e16a750e5336e Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Thu, 11 Apr 2024 16:12:04 +0000 Subject: [PATCH 725/923] sunnylink: Update backup attributes for GitHub and SSH keys --- common/params.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/params.cc b/common/params.cc index e323eb826e..9f9a053041 100644 --- a/common/params.cc +++ b/common/params.cc @@ -127,8 +127,8 @@ std::unordered_map keys = { {"GitCommit", PERSISTENT}, {"GitCommitDate", PERSISTENT}, {"GitDiff", PERSISTENT}, - {"GithubSshKeys", PERSISTENT}, - {"GithubUsername", PERSISTENT}, + {"GithubSshKeys", PERSISTENT | BACKUP}, + {"GithubUsername", PERSISTENT | BACKUP}, {"GitRemote", PERSISTENT}, {"GsmApn", PERSISTENT | BACKUP}, {"GsmMetered", PERSISTENT | BACKUP}, @@ -191,7 +191,7 @@ std::unordered_map keys = { {"RecordFrontLock", PERSISTENT}, // for the internal fleet {"ReplayControlsState", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"SnoozeUpdate", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, - {"SshEnabled", PERSISTENT}, + {"SshEnabled", PERSISTENT | BACKUP}, {"TermsVersion", PERSISTENT}, {"Timezone", PERSISTENT}, {"TrainingVersion", PERSISTENT}, From ecb648a68ab86e053faff450f5bf0d2bfc221333 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Thu, 11 Apr 2024 09:46:27 -0700 Subject: [PATCH 726/923] 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 727/923] no cross references between updaters (#32168) * no references * but keep this --- selfdrive/updated/tests/test_base.py | 11 +++++++---- selfdrive/updated/updated.py | 2 +- 2 files changed, 8 insertions(+), 5 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.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 +from openpilot.selfdrive.manager.process import ManagerProcess +from openpilot.selfdrive.test.helpers import processes_context + + +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 728/923] 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 729/923] 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 730/923] [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)](##)|

|| |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 731/923] 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 732/923] 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 733/923] 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 397bcf03a5e886e3a2bd44fbc6ab4dfef784d2b9 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Fri, 12 Apr 2024 04:07:07 +0000 Subject: [PATCH 734/923] ui: Reset Access Tokens for all Map Services --- CHANGELOGS.md | 2 ++ selfdrive/ui/qt/offroad/settings.cc | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 72790751ae..83d7da1c71 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -19,6 +19,8 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) * RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms * openpilot Longitudianl Control available cars * Custom Stock Longitudinal Control available cars +* UPDATED: Reset Mapbox Access Token -> Reset Access Tokens for Map Services + * Reset self-service access tokens for Mapbox, Amap, and Google Maps * UI Updates * Display Metrics Below Chevron * NEW❗: Metrics is now being displayed below the chevron instead of above diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 1e2535195c..d401102c5d 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -321,11 +321,19 @@ DevicePanel::DevicePanel(SettingsWindow *parent) : ListWidget(parent) { }); addItem(resetCalibBtn); - auto resetMapboxTokenBtn = new ButtonControl(tr("Reset Mapbox Access Token"), tr("RESET"), ""); + auto resetMapboxTokenBtn = new ButtonControl(tr("Reset Access Tokens for Map Services"), tr("RESET"), tr("Reset self-service access tokens for Mapbox, Amap, and Google Maps.")); connect(resetMapboxTokenBtn, &ButtonControl::clicked, [=]() { - if (ConfirmationDialog::confirm(tr("Are you sure you want to reset the Mapbox access token?"), tr("Reset"), this)) { - params.remove("CustomMapboxTokenPk"); - params.remove("CustomMapboxTokenSk"); + if (ConfirmationDialog::confirm(tr("Are you sure you want to reset access tokens for all map services?"), tr("Reset"), this)) { + std::vector tokens = { + "CustomMapboxTokenPk", + "CustomMapboxTokenSk", + "AmapKey1", + "AmapKey2", + "GmapKey" + }; + for (const auto& token : tokens) { + params.remove(token); + } } }); addItem(resetMapboxTokenBtn); From 1c491513b6a2dafd470a90186e7bb327ada503aa Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Sat, 13 Apr 2024 01:32:11 +0800 Subject: [PATCH 735/923] 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 736/923] 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 737/923] 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"
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
@@ -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 738/923] [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 739/923] 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 740/923] 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 741/923] 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 742/923] 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 743/923] 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 744/923] 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 900e312687cf48db91a263da6767f17eaf4a7e6b Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sat, 13 Apr 2024 17:21:07 +0000 Subject: [PATCH 745/923] Add request_queued method to SunnylinkApi --- CHANGELOGS.md | 16 ++++++++-------- common/api/sunnylink.py | 4 ++++ selfdrive/athena/sunnylinkd.py | 17 ++++++++++++----- 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 83d7da1c71..18c0a9df45 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -5,17 +5,17 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) ************************ * UPDATED: Synced with commaai's openpilot * master commit 56e343b (February 27, 2024) -* NEW❗: Config Backup (Alpha early access) - * Remotely back up and restore sunnypilot settings easily - * Device registration with sunnylink ensures a secure, integrated experience across services - * AES encryption derived from the device's RSA private key is used for utmost security - * Settings are encrypted on-device, transmitted securely via HTTPS, and stored encrypted on sunnylink - * Prevents loss of settings after device resets, offering peace of mind through end-to-end encryption - * Early alpha access to all current and previous GitHub Sponsors and Patreon supporters +* NEW❗: sunnylink (Alpha early access) + * NEW❗: Config Backup + * Remotely back up and restore sunnypilot settings easily + * Device registration with sunnylink ensures a secure, integrated experience across services + * AES encryption derived from the device's RSA private key is used for utmost security + * Settings are encrypted on-device, transmitted securely via HTTPS, and stored encrypted on sunnylink + * Prevents loss of settings after device resets, offering peace of mind through end-to-end encryption + * Early alpha access to all current and previous GitHub Sponsors and Patreon supporters * GitHub account pairing from device settings scanning QR code * Pairing your account will allow you to access features via our API (still WIP but accessible if you dig a little on our code 😉) * Allow inheritance of your sponsorship status, allowing you to get extra features and early access whenever applicable - * Immediate sponsor recognition works only for new sponsors. If you're an earlier sponsor, we've got you — just reach out to a moderator on Discord (https://discord.gg/sunnypilot) to get sorted! * RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms * openpilot Longitudianl Control available cars * Custom Stock Longitudinal Control available cars diff --git a/common/api/sunnylink.py b/common/api/sunnylink.py index c2ac89d6dd..46f5715c88 100644 --- a/common/api/sunnylink.py +++ b/common/api/sunnylink.py @@ -28,6 +28,10 @@ class SunnylinkApi(BaseApi): return super().api_get(endpoint, method, timeout, **kwargs) + def resume_queued(self, timeout=10, **kwargs): + sunnylinkId, commaId = self._resolve_dongle_ids() + return self.api_get(f"ws/{sunnylinkId}/resume_queued", "POST", timeout, access_token=self.get_token(), **kwargs) + def get_token(self, expiry_hours=1): # Add your additional data here additional_data = {} diff --git a/selfdrive/athena/sunnylinkd.py b/selfdrive/athena/sunnylinkd.py index f08cf2797b..479b9fb311 100755 --- a/selfdrive/athena/sunnylinkd.py +++ b/selfdrive/athena/sunnylinkd.py @@ -21,7 +21,8 @@ SUNNYLINK_ATHENA_HOST = os.getenv('SUNNYLINK_ATHENA_HOST', 'wss://ws.stg.api.sun HANDLER_THREADS = int(os.getenv('HANDLER_THREADS', "4")) LOCAL_PORT_WHITELIST = {8022} - +params = Params() +sunnylink_api = SunnylinkApi(params.get("SunnylinkDongleId", encoding='utf-8')) def handle_long_poll(ws: WebSocket, exit_event: threading.Event | None) -> None: end_event = threading.Event() @@ -55,7 +56,16 @@ def handle_long_poll(ws: WebSocket, exit_event: threading.Event | None) -> None: def ws_recv(ws: WebSocket, end_event: threading.Event) -> None: last_ping = int(time.monotonic() * 1e9) + resume_requested = False while not end_event.is_set(): + try: + if(not resume_requested): + sunnylink_api.resume_queued() + resume_requested = True + except Exception: + cloudlog.exception("sunnylinkd.resume_queued.exception") + resume_requested = False + try: opcode, data = ws.recv_data(control_frame=True) if opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY): @@ -92,12 +102,9 @@ def main(exit_event: threading.Event = None): except Exception: cloudlog.exception("failed to set core affinity") - params = Params() - dongle_id = params.get("SunnylinkDongleId", encoding='utf-8') UploadQueueCache.initialize(upload_queue) ws_uri = SUNNYLINK_ATHENA_HOST - api = SunnylinkApi(dongle_id) conn_start = None conn_retries = 0 while exit_event is None or not exit_event.is_set(): @@ -107,7 +114,7 @@ def main(exit_event: threading.Event = None): cloudlog.event("sunnylinkd.main.connecting_ws", ws_uri=ws_uri, retries=conn_retries) ws = create_connection(ws_uri, - cookie="jwt=" + api.get_token(), + cookie="jwt=" + sunnylink_api.get_token(), enable_multithread=True, timeout=30.0) cloudlog.event("sunnylinkd.main.connected_ws", ws_uri=ws_uri, retries=conn_retries, From 0e237f459c420fec14e50beb639c30bfc9ebdd26 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 13 Apr 2024 17:22:33 +0000 Subject: [PATCH 746/923] sunnylink: Sync Settings --- common/params_pyx.pyx | 5 +++++ selfdrive/athena/sunnylinkd.py | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/common/params_pyx.pyx b/common/params_pyx.pyx index 535514e521..29fe354ca1 100644 --- a/common/params_pyx.pyx +++ b/common/params_pyx.pyx @@ -3,6 +3,7 @@ from libcpp cimport bool from libcpp.string cimport string from libcpp.vector cimport vector +from libcpp.map cimport map cdef extern from "common/params.h": cpdef enum ParamKeyType: @@ -26,6 +27,7 @@ cdef extern from "common/params.h": string getParamPath(string) nogil void clearAll(ParamKeyType) vector[string] allKeys() + map[string, string] readAll() def ensure_bytes(v): @@ -116,3 +118,6 @@ cdef class Params: def all_keys(self): return self.p.allKeys() + + def read_all(self): + return self.p.readAll() diff --git a/selfdrive/athena/sunnylinkd.py b/selfdrive/athena/sunnylinkd.py index 479b9fb311..bb9ae2ecae 100755 --- a/selfdrive/athena/sunnylinkd.py +++ b/selfdrive/athena/sunnylinkd.py @@ -3,12 +3,16 @@ from __future__ import annotations +import base64 +import gzip +import json import os import threading import time from openpilot.selfdrive.athena.athenad import ws_send, jsonrpc_handler, \ recv_queue, RECONNECT_TIMEOUT_S, UploadQueueCache, upload_queue, cur_upload_items, backoff, ws_manage +from jsonrpc import dispatcher from websocket import (ABNF, WebSocket, WebSocketException, WebSocketTimeoutException, create_connection) @@ -96,6 +100,43 @@ def ws_ping(ws: WebSocket, end_event: threading.Event) -> None: time.sleep(RECONNECT_TIMEOUT_S * 0.8) # Sleep about 80% before a timeout +@dispatcher.add_method +def getParamsAllKeys() -> list[str]: + keys: list[str] = [k.decode('utf-8') for k in Params().all_keys()] + return keys + + +@dispatcher.add_method +def getParams(params_keys: list[str], compression: bool = False) -> str | dict[str, str]: + try: + params = Params() + params_dict: dict[str, bytes] = {key: params.get(key) or b'' for key in params_keys} + + # Compress the values before encoding to base64 as output from params.get is bytes and same for compression + if compression: + params_dict = {key: gzip.compress(value) for key, value in params_dict.items()} + + # Last step is to encode the values to base64 and decode to utf-8 for JSON serialization + return {key: base64.b64encode(value).decode('utf-8') for key, value in params_dict.items()} + + except Exception as e: + return cloudlog.exception("sunnylinkd.getParams.exception", e) + +@dispatcher.add_method +def saveParams(params_to_update: dict[str, str], compression: bool = False) -> None: + params = Params() + try: + params_dict = {key: base64.b64decode(value) for key, value in params_to_update.items()} + + if compression: + params_dict = {key: gzip.decompress(value) for key, value in params_dict.items()} + + for key, value in params_dict.items(): + params.put(key, value) + except Exception as e: + return cloudlog.exception("sunnylinkd.saveParams.exception", e) + + def main(exit_event: threading.Event = None): try: set_core_affinity([0, 1, 2, 3]) From 53f50e53ef2805b4ad8d4e4874d7fbde7b075dc2 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sat, 13 Apr 2024 17:40:17 +0000 Subject: [PATCH 747/923] Add easter egg for specific Sunnylink device ID --- selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc index 935ed3fc56..e765792b4d 100644 --- a/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc +++ b/selfdrive/ui/qt/offroad/sunnypilot/sunnylink_settings.cc @@ -200,6 +200,11 @@ void SunnylinkPanel::updateLabels() { bool is_paired = uiState()->isSunnylinkPaired(); auto paired_users = uiState()->sunnylinkDeviceUsers(); + //little easter egg for Panda :D + if(sunnylinkDongleId == "d689627422cefcbc") { + role_name = "Panda 🐼"; + } + sunnylinkEnabledBtn->setEnabled(!is_onroad); sunnylinkEnabledBtn->setValue(tr("Device ID ")+ sunnylinkDongleId); 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 748/923] 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 749/923] 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 750/923] 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 751/923] [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 fe023d946f8708eca85ce828641412d7ed01e1d3 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Sun, 14 Apr 2024 10:11:08 +0000 Subject: [PATCH 752/923] Add new thread for handling sunnylink queue --- selfdrive/athena/sunnylinkd.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/selfdrive/athena/sunnylinkd.py b/selfdrive/athena/sunnylinkd.py index bb9ae2ecae..ca924abeb0 100755 --- a/selfdrive/athena/sunnylinkd.py +++ b/selfdrive/athena/sunnylinkd.py @@ -35,6 +35,7 @@ def handle_long_poll(ws: WebSocket, exit_event: threading.Event | None) -> None: threading.Thread(target=ws_recv, args=(ws, end_event), name='ws_recv'), threading.Thread(target=ws_send, args=(ws, end_event), name='ws_send'), threading.Thread(target=ws_ping, args=(ws, end_event), name='ws_ping'), + threading.Thread(target=ws_queue, args=(end_event,), name='ws_queue'), # threading.Thread(target=upload_handler, args=(end_event,), name='upload_handler'), # threading.Thread(target=log_handler, args=(end_event,), name='log_handler'), # threading.Thread(target=stat_handler, args=(end_event,), name='stat_handler'), @@ -60,16 +61,7 @@ def handle_long_poll(ws: WebSocket, exit_event: threading.Event | None) -> None: def ws_recv(ws: WebSocket, end_event: threading.Event) -> None: last_ping = int(time.monotonic() * 1e9) - resume_requested = False while not end_event.is_set(): - try: - if(not resume_requested): - sunnylink_api.resume_queued() - resume_requested = True - except Exception: - cloudlog.exception("sunnylinkd.resume_queued.exception") - resume_requested = False - try: opcode, data = ws.recv_data(control_frame=True) if opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY): @@ -99,6 +91,22 @@ def ws_ping(ws: WebSocket, end_event: threading.Event) -> None: end_event.set() time.sleep(RECONNECT_TIMEOUT_S * 0.8) # Sleep about 80% before a timeout +def ws_queue(end_event: threading.Event) -> None: + resume_requested = False + backoff_time = 1 # Start with a delay of 1 second + max_backoff_time = 60 # Maximum delay of 60 seconds + + while not end_event.is_set(): + try: + if not resume_requested: + sunnylink_api.resume_queued(timeout=29) + resume_requested = True + backoff_time = 1 # Reset backoff time after a successful request + except Exception: + cloudlog.exception("sunnylinkd.ws_queue.resume_queued.exception") + resume_requested = False + time.sleep(backoff_time) # Wait for the backoff time before the next attempt + backoff_time = min(backoff_time * 2, max_backoff_time) # Double the backoff time for the next attempt, up to a maximum @dispatcher.add_method def getParamsAllKeys() -> list[str]: From 40b061cd51078c3ca3a0f58ccfce6a9078fb08ef Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 15 Apr 2024 08:52:20 +0800 Subject: [PATCH 753/923] 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 754/923] 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 755/923] 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 756/923] 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 757/923] 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 758/923] [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 759/923] 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 39bcc41f9f0fe9a32e7b3a820a00a79b9894c8ea Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Mon, 15 Apr 2024 19:24:40 +0000 Subject: [PATCH 760/923] [sunnylink] Integrate debug logging and revise retry mechanism in sunnylinkd.py --- selfdrive/athena/sunnylinkd.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/selfdrive/athena/sunnylinkd.py b/selfdrive/athena/sunnylinkd.py index ca924abeb0..9c26dd42a1 100755 --- a/selfdrive/athena/sunnylinkd.py +++ b/selfdrive/athena/sunnylinkd.py @@ -68,7 +68,9 @@ def ws_recv(ws: WebSocket, end_event: threading.Event) -> None: if opcode == ABNF.OPCODE_TEXT: data = data.decode("utf-8") recv_queue.put_nowait(data) + cloudlog.debug(f"sunnylinkd.ws_recv.recv {data}") elif opcode in (ABNF.OPCODE_PING, ABNF.OPCODE_PONG): + cloudlog.debug(f"sunnylinkd.ws_recv.pong {opcode}") last_ping = int(time.monotonic() * 1e9) Params().put("LastSunnylinkPingTime", str(last_ping)) except WebSocketTimeoutException: @@ -86,6 +88,7 @@ def ws_ping(ws: WebSocket, end_event: threading.Event) -> None: while not end_event.is_set(): try: ws.ping() + cloudlog.debug(f"sunnylinkd.ws_recv.ws_ping: Pinging") except Exception: cloudlog.exception("sunnylinkd.ws_ping.exception") end_event.set() @@ -93,20 +96,22 @@ def ws_ping(ws: WebSocket, end_event: threading.Event) -> None: def ws_queue(end_event: threading.Event) -> None: resume_requested = False - backoff_time = 1 # Start with a delay of 1 second - max_backoff_time = 60 # Maximum delay of 60 seconds + tries = 0 - while not end_event.is_set(): + while not end_event.is_set() and not resume_requested: try: if not resume_requested: + cloudlog.debug(f"sunnylinkd.ws_queue.resume_queued") sunnylink_api.resume_queued(timeout=29) resume_requested = True - backoff_time = 1 # Reset backoff time after a successful request + tries = 0 except Exception: cloudlog.exception("sunnylinkd.ws_queue.resume_queued.exception") resume_requested = False - time.sleep(backoff_time) # Wait for the backoff time before the next attempt - backoff_time = min(backoff_time * 2, max_backoff_time) # Double the backoff time for the next attempt, up to a maximum + tries += 1 + time.sleep(backoff(tries)) # Wait for the backoff time before the next attempt + cloudlog.debug("Resume requested or end_event is set, exiting ws_queue thread") + @dispatcher.add_method def getParamsAllKeys() -> list[str]: From ed1d12974fdf37f8acc295b25ec21da308296160 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 15 Apr 2024 14:41:03 -0700 Subject: [PATCH 761/923] 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 762/923] 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 763/923] 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 764/923] [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 765/923] [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 766/923] 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 767/923] 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 768/923] [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 769/923] 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 770/923] jenkins: nightly casync build off of master (#32218) release node --- Jenkinsfile | 211 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 132 insertions(+), 79 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 771/923] 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 772/923] 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 773/923] 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 774/923] 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 775/923] 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 776/923] [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 777/923] 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 778/923] [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 779/923] 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 780/923] 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 781/923] 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 782/923] 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 783/923] 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 784/923] 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 785/923] 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 786/923] 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 787/923] 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,25 +12,9 @@ #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; -} - enum AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) { enum AVPixelFormat *hw_pix_fmt = reinterpret_cast(ctx->opaque); for (const enum AVPixelFormat *p = pix_fmts; *p != -1; p++) { @@ -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 788/923] 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 789/923] 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 790/923] [$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 791/923] 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 792/923] 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 793/923] 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 794/923] 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} | 24 ++-- release/package_casync_build.py | 108 ++++++++++++++++++ release/upload_casync_release.py | 25 ---- 12 files changed, 188 insertions(+), 220 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 +## build -`create_casync_build.sh` - creates a casync openpilot build, ready to upload to `openpilot-releases` +`release/build_release.sh ` - creates an openpilot build into `build_dir`, ready for distribution -```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 -``` - -`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) - - working_dir = pathlib.Path(args.working_dir) - working_dir.mkdir(parents=True, exist_ok=True) - manifest_file = pathlib.Path(args.manifest) - with tempfile.NamedTemporaryFile(dir=str(working_dir)) as entry_file: - entry_path = pathlib.Path(entry_file.name) + 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) @@ -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 ba0cc91318a6b9cefd2196ac80ae9cf8eacb7fcf Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 17 Apr 2024 23:28:32 -0400 Subject: [PATCH 795/923] ui: Chevron: Round distance to whole number --- selfdrive/ui/qt/onroad.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index dc091422df..eb743c16d9 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -1888,7 +1888,7 @@ void AnnotatedCameraWidget::drawLead(QPainter &painter, const cereal::RadarState if (num == 0) { // Display metrics to the 0th lead car QStringList chevron_text[2]; if (chevron_data == 1 || chevron_data == 3) { - chevron_text[0].append(QString::number(radar_d_rel,'f', 1) + " " + "m"); + chevron_text[0].append(QString::number(radar_d_rel,'f', 0) + " " + "m"); } if (chevron_data == 2 || chevron_data == 3) { chevron_text[chevron_data - 2].append(QString::number((radar_v_rel + v_ego) * (isMetric ? MS_TO_KPH : MS_TO_MPH),'f', 0) + " " + (isMetric ? "km/h" : "mph")); From 3c6e0c300deaf5ad8db5d796e33710e56706c14f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 17 Apr 2024 23:47:51 -0400 Subject: [PATCH 796/923] ui: Dev UI: Desired Steering Angle changes --- selfdrive/ui/qt/onroad.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index eb743c16d9..215b0c3fe8 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -1190,10 +1190,12 @@ AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getSteeringAngleDesiredD color = QColor(255, 0, 0, 255); } else if (std::fabs(angleSteers) > 90) { color = QColor(255, 188, 0, 255); + } else { + color = QColor(0, 255, 0, 255); } } - return UiElement(value, "DESIR STEER", "", color); + return UiElement(value, "DESIRED STEER", "", color); } AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getMemoryUsagePercent() { From 1940ef74800a7080f59cf8d8bf0605b5c60abe55 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 17 Apr 2024 23:52:00 -0400 Subject: [PATCH 797/923] ui: Dev UI: Bearing Angle fixes --- selfdrive/ui/qt/onroad.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 215b0c3fe8..c225a1c050 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -1277,7 +1277,7 @@ AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getBearingDeg() { dir_value = "OFF"; } - return UiElement("B.D.", QString("%1 | %2").arg(dir_value).arg(value), "", color); + return UiElement(QString("%1 | %2").arg(dir_value).arg(value), "B.D.", "", color); } AnnotatedCameraWidget::UiElement AnnotatedCameraWidget::getAltitude() { From f2ee3f055e0ecc2e93c0a0659d9ed6100c9a4ef1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 17 Apr 2024 23:25:37 -0700 Subject: [PATCH 798/923] 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 799/923] 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 800/923] 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 801/923] 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 802/923] [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 803/923] 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 804/923] 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 805/923] 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 806/923] 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 807/923] [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 808/923] 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 809/923] 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 810/923] 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 811/923] 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 812/923] 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 813/923] 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 814/923] 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 815/923] 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 816/923] [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 817/923] [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 818/923] 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 819/923] [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 820/923] 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 | 307 +++++++++++++++------------ 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, 253 insertions(+), 300 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); + bool operator<(const Event &other) const { + return mono_time < other.mono_time || (mono_time == other.mono_time && which < other.which); } - void operator delete(void *ptr) { - // No-op. memory used by EventMemoryPool increases monotonically until the logReader is destroyed. - } -#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 - } - } - } - 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); - }); + // 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); + 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(); + auto it = publishEvents(first, events_.cend()); - 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); - } - - 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 821/923] 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 822/923] [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 | 788 +++++++++++++++++++++------------------- 2 files changed, 424 insertions(+), 370 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"}, + {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,<2", markers = "python_version == \"3.11\""} +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"}, + {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,<2" +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 823/923] [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 824/923] 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 825/923] [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 826/923] 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 827/923] 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 828/923] 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 829/923] 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 830/923] 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 831/923] 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 832/923] 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 833/923] 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 834/923] 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 835/923] 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; + 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; } - 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)); - } - 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 836/923] 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 837/923] 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 838/923] replay: shared decoder context (#32255) share decoder context cleanup includes --- tools/replay/framereader.cc | 162 ++++++++++++++++++++++-------------- tools/replay/framereader.h | 43 ++++++---- tools/replay/route.cc | 2 +- 3 files changed, 125 insertions(+), 82 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,27 +80,12 @@ 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); - if (!decoder) return false; - - decoder_ctx = avcodec_alloc_context3(decoder); - 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 && !initHardwareDecoder(HW_DEVICE_TYPE)) { - rWarning("No device with hardware decoder found. fallback to CPU decoding."); - } - - if (avcodec_open2(decoder_ctx, decoder, nullptr) < 0) { - rError("Failed to open codec"); + 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 @@ -85,29 +93,70 @@ bool FrameReader::loadFromFile(const std::string &file, bool no_hw_decoder, std: 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::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 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, codecpar) != 0) { + rError("Failed to allocate or initialize codec context"); + return false; + } + width = (decoder_ctx->width + 3) & ~3; + height = decoder_ctx->height; + + if (hw_decoder && !initHardwareDecoder(HW_DEVICE_TYPE)) { + rWarning("No device with hardware decoder found. fallback to CPU decoding."); + } + + if (avcodec_open2(decoder_ctx, decoder, nullptr) < 0) { + rError("Failed to open codec"); + return false; + } + return true; +} + +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 839/923] 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 840/923] 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 841/923] 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 842/923] 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 843/923] 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 844/923] 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 845/923] 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 846/923] 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 847/923] [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 848/923] 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 849/923] 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 850/923] 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 851/923] 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 852/923] 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 853/923] 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 854/923] [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 855/923] 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 856/923] [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 857/923] 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 858/923] 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 c7ade243a9c6df04d82b4ff3743a3767ad36189a Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Tue, 30 Apr 2024 20:33:01 +0000 Subject: [PATCH 859/923] Subaru: Increase RPM Limit (#32299) --- panda | 2 +- selfdrive/car/subaru/values.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/panda b/panda index 3b7e3d5885..af4e7088a6 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 3b7e3d5885347acdaa92a5d16cce2e324acc13c4 +Subproject commit af4e7088a68f690c70dec17b48991ef98de426b5 diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index 0d761747b9..f4d5cf17b4 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -41,7 +41,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 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 860/923] 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 861/923] 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 862/923] 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 32c59e829c0aa2baeb06b16bb88af1cdb2ad82ff Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 1 May 2024 22:12:26 -0400 Subject: [PATCH 863/923] LFS: Move to sunnypilot's public GitLab --- .lfsconfig | 4 ++-- .lfsconfig-comma | 4 ++++ docs/sunnyhaibin0850_qrcode_paypal.me.png | Bin 13021 -> 130 bytes selfdrive/assets/img_hands_on_wheel.png | Bin 21194 -> 130 bytes selfdrive/assets/img_turn_left_icon.png | Bin 1152 -> 129 bytes selfdrive/assets/img_turn_right_icon.png | Bin 1091 -> 129 bytes selfdrive/assets/img_world_icon.png | Bin 3654 -> 129 bytes system/fleetmanager/static/fleet_pin.png | Bin 115172 -> 131 bytes 8 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 .lfsconfig-comma diff --git a/.lfsconfig b/.lfsconfig index 42dfa2d944..5b63415cd8 100644 --- a/.lfsconfig +++ b/.lfsconfig @@ -1,4 +1,4 @@ [lfs] - url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs - pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git + url = https://gitlab.com/sunnypilot/public/sunnypilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/sunnypilot/public/sunnypilot-lfs.git locksverify = false diff --git a/.lfsconfig-comma b/.lfsconfig-comma new file mode 100644 index 0000000000..42dfa2d944 --- /dev/null +++ b/.lfsconfig-comma @@ -0,0 +1,4 @@ +[lfs] + url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git + locksverify = false diff --git a/docs/sunnyhaibin0850_qrcode_paypal.me.png b/docs/sunnyhaibin0850_qrcode_paypal.me.png index e187bb2ea2c32fd3bb3d44d04adb5343b9be2e10..57d6024e010cb5477977c6f6a202353aaa5ead2a 100644 GIT binary patch literal 130 zcmWN?OA^8$3;@u5Pr(H&git=c4Wx-MqtX%V!qe;9yo=wX^_Qx1o@3Yg-sbHgWBp%0 zWu^Yq<7CnoEWI6S)ND7uy95x8vzUsD*##(M$*@os7V*SVP>@sc5M%Kn5*}d-A(~{+ NIb25jvH~;~mLKWyCp-WE literal 13021 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 F{2yrVu8{x$ diff --git a/selfdrive/assets/img_hands_on_wheel.png b/selfdrive/assets/img_hands_on_wheel.png index 0b06b4c6207fb0842c30bdbe37a988ea0d7775e3..2c7c50d17ce8b202798860b33ff672e613596beb 100644 GIT binary patch literal 130 zcmWN?K@!3s3;@78uiyiggaFe1rUVdXR5}KG@bz{tdzO#%@z!n5LpEa`ecql`mh1LS z3y+tPqp&$qjh?l%-TJU`1O%5|A;g%VU;;qLv@=+@2DV7SlTWthYiHM(YbFRa6ry`% MCH+^lMO>Zw1F>}`RsaA1 literal 21194 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 Lg2$Jn)(*rE5fdnl literal 1152 zcmV-`1b_R9P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91Gynhq0K2cEod5s>>PbXFRA>e5naN94Q5?r@&XS}F z8__I-2100I3!7F!uA)T|Jfb3kHnoaeMEwD6idsY)BM2KHY85t7BB4=6P+37*DWnx; z^K755c%abeeea2gYL6dC3toSenJm? zhMka=T7_5jAV=MtwZ&<6b_1weErongM>Z=ZM;E{~=yWWUgAd^`l)z*#8rn&3v($*=;VS%)p-zjoa(x9p zfNCWloOfKtR$5mSLkm2R7jCCMa^D1xU?ym2*NQ9d(v&MdE`ZkFo+{z#Nl@%(!+_R> zA4?#qg>~;ps}^;3g}COk2@vPjRzJQ6&F+xqK1te@G{SXID5x(eW00MRqD0e#=6e&A zFKJrgKB#2(MRjUF(gdD>&9D&0fr;8kd=pG7OZ`vBNu>~W_IODdE5Ns8Y$coqokH{& zaE7!x3)ARtf-1TS>OfIu^3DEfm477|Yc@HmL8G~jVEPyAbze)mFsdN4PC2~FHhGpv z*N0OXsDbPjJOd48MW9woC(VK9(k007u7mf*unhcmL$4wmf;g;#RI5+nE-2Ks}cR^bn7{gD#zywe@{f&YK+O-6s73s0-aEC}c2Iz{g6V3{3X&YF+)e)cqIitFGaL SpwN8)0000$nzX#FGWoX6Oddbas^m9gB` zGc2*c)i`ogmlnMxIqDARw!}eGK*Ai6A{rM~aB(*lbqbI(mE!N>EpTy`7z}%_fyfyH Nkx`8H%Tlkb#UHLzCNuy5 literal 1091 zcmV-J1ibr+P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91JfH&r1ONa40RR91Gynhq0K2cEod5s>tw}^dRA>e5np=oXQ5eT(+^@N2 zOfDUTluP8ni%_0i@O+`g=)Pq#^!xz{B`d-qi!QE$Qg`cn! zQc$uwg)^DW#BEwt{%vQsie)Zf%cl&dx3SeyV2NJ#+>@-3H|;ahjZ)$wlY;y zoQuZOcpFTD9qA+A|duXIsQ+}ZKt z;4`3Cy3S5Gj`M33wi~J;M|!O60zK2>I9XEq(30~oWJzOvEol5FCDFL@PyzLX$pAyluHn8Rn_~T zr;CQMX5{~BHZ6XE85%xE#h-@-py8x-vkRJ7PJ+w1-_ZU9%mk;6gO!da%9qqb`iQ!P zT5Fkys`>yn!zgf)hV(F}h}^~+j_060_fN6^@}3?qgYMNjXaOh5@Mx!q+{U_hbsu%4 zWK4_t)36U7ftO@>g;!)cNEOyfq@(nSjx~g}GkF%Y)bo}M5B82u2Uey(dVkW~kSR@s zuiz3K1P$fLlHsK2DT(NDrq^8ECfa({y{cE7dxL+FES_CGNvb;>JQS(to-v zha2ExSbIxHVIFw@ix9CzmF_>G&GV^H1-81G{jKVp$Jn)gw0V1$vHq_o zt+~JSI3(-KF1@iD_3i@hkpoL&Hbr8wh!h}sh#59yjzks=rD7bB!{{M9;{+u5&0-Q4 MWEt%%%42}#2h5}=6aWAK literal 3654 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 Y1y;8b)`85whyVZp07*qoM6N<$g84km?*IS* diff --git a/system/fleetmanager/static/fleet_pin.png b/system/fleetmanager/static/fleet_pin.png index cda7eee8e85e6303b812a7321b739a73880f0dfd..d16a851240543e6a92ee552a9204cdb85558bea7 100644 GIT binary patch literal 131 zcmWN?!4bkB5CFhGRnUNegTO($f#VQnR5F5jSiSCNFMiKHUb3xq&O@ntU$;k{+yC~- z8;z%$CzHBBj9%ny$vA%y>Z&akS9i!plQ*P2f@KCGT?`Wh4as6;B%31D>`mA!SO^JS M6tjO>0ysb;eg+sPQ2+n{ literal 115172 zcmeFacT|+;_6CX?)MG(WnleBHMWiDrAOb37EEExGBB1nMq<4%_se_0VK|n!3DUzXx zNL3j|nl!0WbP%MI5u}&9-)}JIB$|8wzH9wl>nsh-eBWDkefG2W2|BNa-@aw<7CJh* z?PpFaUZA7f>_|uVi`3?g@Dm%0A{_j+&iMlV6y39TxMBE@Uo1|lo}{BAhHqWEN)P}2 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ʴFVgqq3(9u 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 From b98ea81bdb744c73a42bb491a70909490994907b Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 1 May 2024 20:54:32 -0700 Subject: [PATCH 864/923] 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 865/923] 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 866/923] 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 def7873e7e6a1387d4d97517274e3987ce9398a5 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 2 May 2024 15:35:27 -0400 Subject: [PATCH 867/923] Revert LFS changes for now --- .lfsconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.lfsconfig b/.lfsconfig index 5b63415cd8..42dfa2d944 100644 --- a/.lfsconfig +++ b/.lfsconfig @@ -1,4 +1,4 @@ [lfs] - url = https://gitlab.com/sunnypilot/public/sunnypilot-lfs.git/info/lfs - pushurl = ssh://git@gitlab.com/sunnypilot/public/sunnypilot-lfs.git + url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git locksverify = false From 09aeab3f77727a1e2ba25e1cf14a56882b4e5e29 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 2 May 2024 20:30:19 -0700 Subject: [PATCH 868/923] 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 869/923] 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 870/923] 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 871/923] 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 872/923] [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 873/923] [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 874/923] [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 875/923] 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 dc37a6f9b27c4753fef1fadecd300ce800e0d127 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 4 May 2024 23:51:35 -0400 Subject: [PATCH 876/923] Revert "simulator: Remove comma pedal sensor (#32030)" This reverts commit 1637265ad3953cc2307b6f7422aeb5c64d9d9635. --- tools/sim/lib/simulated_car.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tools/sim/lib/simulated_car.py b/tools/sim/lib/simulated_car.py index 8c15195dcb..16f46d31c2 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -46,6 +46,13 @@ 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 a48a909997ee5e6a3c0eb29d0ad95c6f1a61691f Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 4 May 2024 23:51:38 -0400 Subject: [PATCH 877/923] Revert "cleanup pedal crc" This reverts commit 23e8ad73979735479131dfb303e249b861829468. --- selfdrive/car/__init__.py | 14 ++++++++++++++ tools/sim/lib/simulated_car.py | 3 +++ 2 files changed, 17 insertions(+) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index eee0b54204..86352b9719 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -165,6 +165,20 @@ 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 16f46d31c2..e82100b520 100644 --- a/tools/sim/lib/simulated_car.py +++ b/tools/sim/lib/simulated_car.py @@ -4,6 +4,7 @@ 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 from panda.python import Panda @@ -51,6 +52,8 @@ 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 415acad40ce9166cbdd834b793a25356d9088974 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 4 May 2024 23:54:13 -0400 Subject: [PATCH 878/923] Revert "remove pedal (#31903)" This reverts commit fa12a672 --- 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 | 11 +++++++- selfdrive/car/toyota/interface.py | 10 +++++--- selfdrive/controls/lib/longcontrol.py | 2 ++ selfdrive/test/process_replay/migration.py | 2 +- 11 files changed, 110 insertions(+), 15 deletions(-) diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index 86352b9719..885be94588 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -179,6 +179,27 @@ 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 6fe8c27585..481dd2314e 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -4,6 +4,7 @@ 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 @@ -182,7 +183,7 @@ class CarController(CarControllerBase): 0.5] # The Honda ODYSSEY seems to have different PCM_ACCEL # msgs, is it other cars too? - if not CC.longActive: + if self.CP.enableGasInterceptorDEPRECATED or not CC.longActive: pcm_speed = 0.0 pcm_accel = int(0.0) elif self.CP.carFingerprint in HONDA_NIDEC_ALT_PCM_ACCEL: @@ -234,6 +235,19 @@ class CarController(CarControllerBase): self.apply_brake_last = apply_brake self.brake = apply_brake / self.params.NIDEC_BRAKE_MAX + if self.CP.enableGasInterceptorDEPRECATED: + # 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, @@ -242,7 +256,9 @@ class CarController(CarControllerBase): if self.CP.openpilotLongitudinalControl and self.CP.carFingerprint not in HONDA_BOSCH: self.speed = pcm_speed - self.gas = pcm_accel / self.params.NIDEC_GAS_MAX + + if not self.CP.enableGasInterceptorDEPRECATED: + 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 6374c4245a..17f3b5f1dc 100644 --- a/selfdrive/car/honda/carstate.py +++ b/selfdrive/car/honda/carstate.py @@ -72,6 +72,10 @@ def get_can_messages(CP, gearbox_msg): else: messages.append(("DOORS_STATUS", 3)) + # add gas interceptor reading if we are using it + if CP.enableGasInterceptorDEPRECATED: + messages.append(("GAS_SENSOR", 50)) + if CP.carFingerprint in HONDA_BOSCH_RADARLESS: messages.append(("CRUISE_FAULT_STATUS", 50)) elif CP.carFingerprint == CAR.CLARITY: @@ -191,8 +195,13 @@ class CarState(CarStateBase): gear = int(cp.vl[self.gearbox_msg]["GEAR_SHIFTER"]) ret.gearShifter = self.parse_gear_shifter(self.shifter_values.get(gear, None)) - ret.gas = cp.vl["POWERTRAIN_DATA"]["PEDAL_GAS"] - ret.gasPressed = ret.gas > 1e-5 + if self.CP.enableGasInterceptorDEPRECATED: + # 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.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 1deffdd8d2..8902b9744a 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -24,6 +24,8 @@ 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.enableGasInterceptorDEPRECATED: + 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 @@ -49,9 +51,10 @@ class CarInterface(CarInterfaceBase): ret.customStockLongAvailable = True else: ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.hondaNidec)] + ret.enableGasInterceptorDEPRECATED = 0x201 in fingerprint[CAN.pt] ret.openpilotLongitudinalControl = True - ret.pcmCruise = True + ret.pcmCruise = not ret.enableGasInterceptorDEPRECATED if candidate == CAR.HONDA_CRV_5G: ret.enableBsm = 0x12f8bfa7 in fingerprint[CAN.radar] @@ -237,13 +240,16 @@ class CarInterface(CarInterfaceBase): if ret.openpilotLongitudinalControl and candidate in HONDA_BOSCH: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_HONDA_BOSCH_LONG + if ret.enableGasInterceptorDEPRECATED 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.HONDA_CIVIC, CAR.HONDA_CLARITY}) + ret.autoResumeSng = candidate in (HONDA_BOSCH | {CAR.HONDA_CIVIC, CAR.HONDA_CLARITY}) or ret.enableGasInterceptorDEPRECATED 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 dd3a8f633d..3ab4047c77 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -295,6 +295,8 @@ routes = [ CarTestRoute("66c1699b7697267d/2024-03-03--13-09-53", TESLA.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.HONDA_CRV_HYBRID, segment=22), ] diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index 72c1e27ab9..ce5b186388 100755 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -74,6 +74,10 @@ 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.enableGasInterceptorDEPRECATED: + 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 c6bc24963c..8d5629992a 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -1,11 +1,12 @@ from cereal import car -from openpilot.common.numpy_fast import clip +from openpilot.common.numpy_fast import clip, interp from openpilot.common.params import Params -from openpilot.selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, make_can_msg +from openpilot.selfdrive.car import apply_meas_steer_torque_limits, apply_std_steer_angle_limits, common_fault_avoidance, \ + create_gas_interceptor_command, 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, \ - CarControllerParams, ToyotaFlags, \ + MIN_ACC_SPEED, PEDAL_TRANSITION, CarControllerParams, ToyotaFlags, \ UNSUPPORTED_DSU_CAR from opendbc.can.packer import CANPacker @@ -104,6 +105,21 @@ class CarController(CarControllerBase): lta_active, self.frame // 2, torque_wind_down)) # *** gas and brake *** + if self.CP.enableGasInterceptorDEPRECATED 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 @@ -112,7 +128,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): + if CS.out.standstill and not self.last_standstill and (self.CP.carFingerprint not in NO_STOP_TIMER_CAR or self.CP.enableGasInterceptorDEPRECATED): self.standstill_req = True if CS.pcm_acc_status != 8: # pcm entered standstill or it's disabled @@ -147,6 +163,12 @@ 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, reverse_acc)) + if self.frame % 2 == 0 and self.CP.enableGasInterceptorDEPRECATED 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.TOYOTA_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 abc0e686ff..c82701e0ef 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -69,7 +69,12 @@ class CarState(CarStateBase): ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1 ret.brakeLightsDEPRECATED = bool(cp.vl["ESP_CONTROL"]["BRAKE_LIGHTS_ACC"]) - ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 + if self.CP.enableGasInterceptorDEPRECATED: + 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.wheelSpeeds = self.get_wheel_speeds( cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FL"], @@ -298,6 +303,10 @@ class CarState(CarStateBase): else: messages.append(("PCM_CRUISE_2", 33)) + # add gas interceptor reading if we are using it + if CP.enableGasInterceptorDEPRECATED: + 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 cda790b324..03fede6ff3 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -134,20 +134,24 @@ 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.enableGasInterceptorDEPRECATED = 0x201 in fingerprint[0] and ret.openpilotLongitudinalControl if not ret.openpilotLongitudinalControl: ret.safetyConfigs[0].safetyParam |= Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL + if ret.enableGasInterceptorDEPRECATED: + 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 else MIN_ACC_SPEED + ret.minEnableSpeed = -1. if (stop_and_go or ret.enableGasInterceptorDEPRECATED) else MIN_ACC_SPEED sp_tss2_long_tune = Params().get_bool("ToyotaTSS2Long") tune = ret.longitudinalTuning tune.deadzoneBP = [0., 9.] tune.deadzoneV = [.0, .15] - if candidate in TSS2_CAR: + if candidate in TSS2_CAR or ret.enableGasInterceptorDEPRECATED: tune.kpBP = [0., 5., 20., 30.] if sp_tss2_long_tune else [0., 5., 20.] tune.kpV = [1.3, 1.0, 0.7, 0.1] if sp_tss2_long_tune else [1.3, 1.0, 0.7] tune.kiBP = [0., 1., 2., 3., 4., 5., 12., 20., 27., 40.] if sp_tss2_long_tune else [0., 5., 12., 20., 27.] @@ -188,7 +192,7 @@ class CarInterface(CarInterfaceBase): events.add(EventName.vehicleSensorsInvalid) if self.CP.openpilotLongitudinalControl: - if ret.cruiseState.standstill and not ret.brakePressed: + if ret.cruiseState.standstill and not ret.brakePressed and not self.CP.enableGasInterceptorDEPRECATED: 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 2dd3390bb0..dfacb2df92 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -10,6 +10,8 @@ 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.enableGasInterceptorDEPRECATED 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 152f281948..377897448d 100644 --- a/selfdrive/test/process_replay/migration.py +++ b/selfdrive/test/process_replay/migration.py @@ -74,7 +74,7 @@ def migrate_pandaStates(lr): # TODO: safety param migration should be handled automatically safety_param_migration = { "TOYOTA_PRIUS": EPS_SCALE["TOYOTA_PRIUS"] | Panda.FLAG_TOYOTA_STOCK_LONGITUDINAL, - "TOYOTA_RAV4": EPS_SCALE["TOYOTA_RAV4"] | Panda.FLAG_TOYOTA_ALT_BRAKE, + "TOYOTA_RAV4": EPS_SCALE["TOYOTA_RAV4"] | Panda.FLAG_TOYOTA_ALT_BRAKE | Panda.FLAG_TOYOTA_GAS_INTERCEPTOR, "KIA_EV6": Panda.FLAG_HYUNDAI_EV_GAS | Panda.FLAG_HYUNDAI_CANFD_HDA2, } 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 879/923] 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 880/923] [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 881/923] [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 882/923] 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 883/923] 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 884/923] revert changes to release/ (#32364) * revert changes to release/ * put those back * revert Jenkinsfile --- Jenkinsfile | 217 ++++++++++++-------------------- 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, 146 insertions(+), 457 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') { + properties([ + disableConcurrentBuilds(abortPrevious: true) + ]) } - if (env.BRANCH_NAME != "master") { - props.add(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"], - ]) - }, - ) - } + 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"], + ]) + }, - if (env.BRANCH_NAME == nightlyBranch && isJobStartedByTimer()) { - stage('build release') { - build_stage() - } + ) } } 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 885/923] 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 886/923] 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 +} From f93b1390983c3761a8dbf98d5d07949024ff2eef Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 6 May 2024 20:01:15 -0700 Subject: [PATCH 887/923] remove tools/zookeeper/ --- tools/zookeeper/__init__.py | 78 ---------------------------- tools/zookeeper/check_consumption.py | 27 ---------- tools/zookeeper/disable.py | 8 --- tools/zookeeper/enable_and_wait.py | 31 ----------- tools/zookeeper/ignition.py | 10 ---- tools/zookeeper/power_monitor.py | 40 -------------- tools/zookeeper/test_zookeeper.py | 25 --------- 7 files changed, 219 deletions(-) delete mode 100644 tools/zookeeper/__init__.py delete mode 100755 tools/zookeeper/check_consumption.py delete mode 100755 tools/zookeeper/disable.py delete mode 100755 tools/zookeeper/enable_and_wait.py delete mode 100755 tools/zookeeper/ignition.py delete mode 100755 tools/zookeeper/power_monitor.py delete mode 100755 tools/zookeeper/test_zookeeper.py diff --git a/tools/zookeeper/__init__.py b/tools/zookeeper/__init__.py deleted file mode 100644 index 598e0a0587..0000000000 --- a/tools/zookeeper/__init__.py +++ /dev/null @@ -1,78 +0,0 @@ -import ft4222 -import ft4222.I2CMaster - -DEBUG = False - -INA231_ADDR = 0x40 -INA231_REG_CONFIG = 0x00 -INA231_REG_SHUNT_VOLTAGE = 0x01 -INA231_REG_BUS_VOLTAGE = 0x02 -INA231_REG_POWER = 0x03 -INA231_REG_CURRENT = 0x04 -INA231_REG_CALIBRATION = 0x05 - -INA231_BUS_LSB = 1.25e-3 -INA231_SHUNT_LSB = 2.5e-6 -SHUNT_RESISTOR = 30e-3 -CURRENT_LSB = 1e-5 - -class Zookeeper: - def __init__(self): - if ft4222.createDeviceInfoList() < 2: - raise Exception("No connected zookeeper found!") - self.dev_a = ft4222.openByDescription("FT4222 A") - self.dev_b = ft4222.openByDescription("FT4222 B") - - if DEBUG: - for i in range(ft4222.createDeviceInfoList()): - print(f"Device {i}: {ft4222.getDeviceInfoDetail(i, False)}") - - # Setup GPIO - self.dev_b.gpio_Init(gpio2=ft4222.Dir.OUTPUT, gpio3=ft4222.Dir.OUTPUT) - self.dev_b.setSuspendOut(False) - self.dev_b.setWakeUpInterrut(False) - - # Setup I2C - self.dev_a.i2cMaster_Init(kbps=400) - self._initialize_ina() - - # Helper functions - def _read_ina_register(self, register, length): - self.dev_a.i2cMaster_WriteEx(INA231_ADDR, data=register, flag=ft4222.I2CMaster.Flag.REPEATED_START) - return self.dev_a.i2cMaster_Read(INA231_ADDR, bytesToRead=length) - - def _write_ina_register(self, register, data): - msg = register.to_bytes(1, byteorder="big") + data.to_bytes(2, byteorder="big") - self.dev_a.i2cMaster_Write(INA231_ADDR, data=msg) - - def _initialize_ina(self): - # Config - self._write_ina_register(INA231_REG_CONFIG, 0x4127) - - # Calibration - CAL_VALUE = int(0.00512 / (CURRENT_LSB * SHUNT_RESISTOR)) - if DEBUG: - print(f"Calibration value: {hex(CAL_VALUE)}") - self._write_ina_register(INA231_REG_CALIBRATION, CAL_VALUE) - - def _set_gpio(self, number, enabled): - self.dev_b.gpio_Write(portNum=number, value=enabled) - - # Public API functions - def set_device_power(self, enabled): - self._set_gpio(2, enabled) - - def set_device_ignition(self, enabled): - self._set_gpio(3, enabled) - - def read_current(self): - # Returns in A - return int.from_bytes(self._read_ina_register(INA231_REG_CURRENT, 2), byteorder="big") * CURRENT_LSB - - def read_power(self): - # Returns in W - return int.from_bytes(self._read_ina_register(INA231_REG_POWER, 2), byteorder="big") * CURRENT_LSB * 25 - - def read_voltage(self): - # Returns in V - return int.from_bytes(self._read_ina_register(INA231_REG_BUS_VOLTAGE, 2), byteorder="big") * INA231_BUS_LSB diff --git a/tools/zookeeper/check_consumption.py b/tools/zookeeper/check_consumption.py deleted file mode 100755 index dab948318f..0000000000 --- a/tools/zookeeper/check_consumption.py +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import time -from openpilot.tools.zookeeper import Zookeeper - -# Usage: check_consumption.py -# Exit code: 0 -> passed -# 1 -> failed - -if __name__ == "__main__": - z = Zookeeper() - - averaging_time_s = int(sys.argv[1]) - max_average_power = float(sys.argv[2]) - - start_time = time.time() - measurements = [] - while time.time() - start_time < averaging_time_s: - measurements.append(z.read_power()) - time.sleep(0.1) - - average_power = sum(measurements)/len(measurements) - print(f"Average power: {round(average_power, 4)}W") - - if average_power > max_average_power: - exit(1) diff --git a/tools/zookeeper/disable.py b/tools/zookeeper/disable.py deleted file mode 100755 index 4bea3e7ed0..0000000000 --- a/tools/zookeeper/disable.py +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env python3 - -from openpilot.tools.zookeeper import Zookeeper - -if __name__ == "__main__": - z = Zookeeper() - z.set_device_power(False) - diff --git a/tools/zookeeper/enable_and_wait.py b/tools/zookeeper/enable_and_wait.py deleted file mode 100755 index 51b8dc0a5c..0000000000 --- a/tools/zookeeper/enable_and_wait.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys -import time -from socket import gethostbyname, gaierror -from openpilot.tools.zookeeper import Zookeeper - -def is_online(ip): - try: - addr = gethostbyname(ip) - return (os.system(f"ping -c 1 {addr} > /dev/null") == 0) - except gaierror: - return False - -if __name__ == "__main__": - z = Zookeeper() - z.set_device_power(True) - - - ip = str(sys.argv[1]) - timeout = int(sys.argv[2]) - start_time = time.time() - while not is_online(ip): - print(f"{ip} not online yet!") - - if time.time() - start_time > timeout: - print("Timed out!") - raise TimeoutError() - - time.sleep(1) - diff --git a/tools/zookeeper/ignition.py b/tools/zookeeper/ignition.py deleted file mode 100755 index d5f01c362f..0000000000 --- a/tools/zookeeper/ignition.py +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env python3 - -import sys -from openpilot.tools.zookeeper import Zookeeper - - -if __name__ == "__main__": - z = Zookeeper() - z.set_device_ignition(1 if int(sys.argv[1]) > 0 else 0) - diff --git a/tools/zookeeper/power_monitor.py b/tools/zookeeper/power_monitor.py deleted file mode 100755 index a081baa72a..0000000000 --- a/tools/zookeeper/power_monitor.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python3 -import sys -import time -import datetime - -from openpilot.common.realtime import Ratekeeper -from openpilot.common.filter_simple import FirstOrderFilter -from openpilot.tools.zookeeper import Zookeeper - -if __name__ == "__main__": - z = Zookeeper() - z.set_device_power(True) - z.set_device_ignition(False) - - duration = None - if len(sys.argv) > 1: - duration = int(sys.argv[1]) - - rate = 123 - rk = Ratekeeper(rate, print_delay_threshold=None) - fltr = FirstOrderFilter(0, 5, 1. / rate, initialized=False) - - measurements = [] - start_time = time.monotonic() - - try: - while duration is None or time.monotonic() - start_time < duration: - fltr.update(z.read_power()) - if rk.frame % rate == 0: - measurements.append(fltr.x) - t = datetime.timedelta(seconds=time.monotonic() - start_time) - avg = sum(measurements) / len(measurements) - print(f"Now: {fltr.x:.2f} W, Avg: {avg:.2f} W over {t}") - rk.keep_time() - except KeyboardInterrupt: - pass - - t = datetime.timedelta(seconds=time.monotonic() - start_time) - avg = sum(measurements) / len(measurements) - print(f"\nAverage power: {avg:.2f}W over {t}") diff --git a/tools/zookeeper/test_zookeeper.py b/tools/zookeeper/test_zookeeper.py deleted file mode 100755 index 89f7f28975..0000000000 --- a/tools/zookeeper/test_zookeeper.py +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env python3 - -import time -from openpilot.tools.zookeeper import Zookeeper - - -if __name__ == "__main__": - z = Zookeeper() - z.set_device_power(True) - - i = 0 - ign = False - while 1: - voltage = round(z.read_voltage(), 2) - current = round(z.read_current(), 3) - power = round(z.read_power(), 2) - z.set_device_ignition(ign) - print(f"Voltage: {voltage}V, Current: {current}A, Power: {power}W, Ignition: {ign}") - - if i > 200: - ign = not ign - i = 0 - - i += 1 - time.sleep(0.1) From e1c9d59951e69150d7d7bd6be6c790ced9011288 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 7 May 2024 02:38:55 -0400 Subject: [PATCH 888/923] Revert "Revert LFS changes for now" This reverts commit def7873e7e6a1387d4d97517274e3987ce9398a5. --- .lfsconfig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.lfsconfig b/.lfsconfig index 42dfa2d944..5b63415cd8 100644 --- a/.lfsconfig +++ b/.lfsconfig @@ -1,4 +1,4 @@ [lfs] - url = https://gitlab.com/commaai/openpilot-lfs.git/info/lfs - pushurl = ssh://git@gitlab.com/commaai/openpilot-lfs.git + url = https://gitlab.com/sunnypilot/public/sunnypilot-lfs.git/info/lfs + pushurl = ssh://git@gitlab.com/sunnypilot/public/sunnypilot-lfs.git locksverify = false From eff510223509e03db662cf0c02e657ef4dfd29d4 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 7 May 2024 02:40:03 -0400 Subject: [PATCH 889/923] Bump submodules --- cereal | 2 +- opendbc | 2 +- panda | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index 5783d53f3f..78aca3ea81 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 5783d53f3fb4c7f1a6cf3abed934e95f5b17720f +Subproject commit 78aca3ea81fb131da51776315fbdd546d2b6987e diff --git a/opendbc b/opendbc index 304e9f35ca..b5271a35df 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 304e9f35ca6e1dc060284f8a572207a469a48478 +Subproject commit b5271a35dfe262aeeecd36c402b2f1c2aad6920d diff --git a/panda b/panda index a0e4c6ed55..6683e77bcc 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit a0e4c6ed55230c87f4e600f2110b78d00522969f +Subproject commit 6683e77bcccda0c55aa53859ffcd9eeb782db164 From 11351823ef41ce6d1156c46c591f87c816327550 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 7 May 2024 04:05:11 -0400 Subject: [PATCH 890/923] GAC: Remove from sunnypilot --- selfdrive/car/chrysler/interface.py | 2 +- selfdrive/car/ford/carcontroller.py | 2 +- selfdrive/car/ford/fordcan.py | 4 +- selfdrive/car/ford/interface.py | 4 +- selfdrive/car/gm/carcontroller.py | 2 +- selfdrive/car/gm/carstate.py | 1 - selfdrive/car/gm/gmcan.py | 4 +- selfdrive/car/gm/interface.py | 6 +-- selfdrive/car/honda/carcontroller.py | 2 +- selfdrive/car/honda/hondacan.py | 4 +- selfdrive/car/honda/interface.py | 7 ++-- selfdrive/car/hyundai/carcontroller.py | 2 +- selfdrive/car/hyundai/hyundaican.py | 2 +- selfdrive/car/hyundai/hyundaicanfd.py | 4 +- selfdrive/car/hyundai/interface.py | 6 +-- selfdrive/car/interfaces.py | 46 +---------------------- selfdrive/car/mazda/interface.py | 2 +- selfdrive/car/nissan/interface.py | 2 +- selfdrive/car/subaru/interface.py | 2 +- selfdrive/car/toyota/carcontroller.py | 4 +- selfdrive/car/toyota/carstate.py | 10 ----- selfdrive/car/toyota/interface.py | 39 ++----------------- selfdrive/car/toyota/toyotacan.py | 4 +- selfdrive/car/volkswagen/carcontroller.py | 2 +- selfdrive/car/volkswagen/carstate.py | 2 - selfdrive/car/volkswagen/interface.py | 6 +-- selfdrive/car/volkswagen/mqbcan.py | 4 +- selfdrive/car/volkswagen/pqcan.py | 2 +- 28 files changed, 45 insertions(+), 132 deletions(-) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 9c6f0f71a8..fd760c2322 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -91,7 +91,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] diff --git a/selfdrive/car/ford/carcontroller.py b/selfdrive/car/ford/carcontroller.py index 261119c485..45516d6035 100644 --- a/selfdrive/car/ford/carcontroller.py +++ b/selfdrive/car/ford/carcontroller.py @@ -101,7 +101,7 @@ class CarController: 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, CS.gac_tr_cluster)) + CS.acc_tja_status_stock_values)) self.main_on_last = main_on self.lkas_enabled_last = CC.latActive diff --git a/selfdrive/car/ford/fordcan.py b/selfdrive/car/ford/fordcan.py index ef9a558c02..7320c0a3e6 100644 --- a/selfdrive/car/ford/fordcan.py +++ b/selfdrive/car/ford/fordcan.py @@ -144,7 +144,7 @@ def create_acc_msg(packer, CAN: CanBus, long_active: bool, gas: float, accel: fl def create_acc_ui_msg(packer, CAN: CanBus, CP, main_on: bool, enabled: bool, fcw_alert: bool, standstill: bool, - hud_control, stock_values: dict, gac_tr_cluster): + hud_control, stock_values: dict): """ Creates a CAN message for the Ford IPC adaptive cruise, forward collision warning and traffic jam assist status. @@ -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": gac_tr_cluster, # Fixed time gap in UI + "AccTGap_D_Dsply": 4, # Fixed time gap in UI }) # Forwards FCW alert from IPMA diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index 844d600b73..d60c6c8e2a 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -66,7 +66,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] @@ -89,7 +89,6 @@ class CarInterface(CarInterfaceBase): if not self.CS.prev_lkas_enabled and self.CS.lkas_enabled: self.CS.madsEnabled = not self.CS.madsEnabled self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - ret, self.CS = self.toggle_gac(ret, self.CS, self.CS.buttonStates["gapAdjustCruise"], 1, 3, 4, "-") else: self.CS.madsEnabled = False @@ -105,6 +104,7 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled + # TODO: SP: add CS.distance_button to gap_button from upstream ret, self.CS = self.get_sp_common_state(ret, self.CS) if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/gm/carcontroller.py b/selfdrive/car/gm/carcontroller.py index 7ea84f3fb7..5e6583b62a 100644 --- a/selfdrive/car/gm/carcontroller.py +++ b/selfdrive/car/gm/carcontroller.py @@ -117,7 +117,7 @@ class CarController: # 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 and CS.out.cruiseState.enabled, - hud_v_cruise * CV.MS_TO_KPH, hud_control.leadVisible, send_fcw, CS.gac_tr_cluster)) + hud_v_cruise * CV.MS_TO_KPH, hud_control.leadVisible, send_fcw)) # Radar needs to know current speed and yaw rate (50hz), # and that ADAS is alive (10hz) diff --git a/selfdrive/car/gm/carstate.py b/selfdrive/car/gm/carstate.py index da24fd2c6b..03530e870a 100644 --- a/selfdrive/car/gm/carstate.py +++ b/selfdrive/car/gm/carstate.py @@ -35,7 +35,6 @@ class CarState(CarStateBase): self.prev_cruise_buttons = self.cruise_buttons self.cruise_buttons = pt_cp.vl["ASCMSteeringButton"]["ACCButtons"] self.buttons_counter = pt_cp.vl["ASCMSteeringButton"]["RollingCounter"] - self.gap_dist_button = pt_cp.vl["ASCMSteeringButton"]["DistanceButton"] self.pscm_status = copy.copy(pt_cp.vl["PSCMStatus"]) # This is to avoid a fault where you engage while still moving backwards after shifting to D. # An Equinox has been seen with an unsupported status (3), so only check if either wheel is in reverse (2) diff --git a/selfdrive/car/gm/gmcan.py b/selfdrive/car/gm/gmcan.py index f626e9a0f2..bd1e29ce3b 100644 --- a/selfdrive/car/gm/gmcan.py +++ b/selfdrive/car/gm/gmcan.py @@ -102,14 +102,14 @@ 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, gac_tr_cluster): +def create_acc_dashboard_command(packer, bus, enabled, target_speed_kph, lead_car_in_sight, fcw): target_speed = min(target_speed_kph, 255) values = { "ACCAlwaysOne": 1, "ACCResumeButton": 0, "ACCSpeedSetpoint": target_speed, - "ACCGapLevel": gac_tr_cluster * enabled, # 3 "far", 0 "inactive" + "ACCGapLevel": 3 * enabled, # 3 "far", 0 "inactive" "ACCCmdActive": enabled, "ACCAlwaysOne2": 1, "ACCLeadCar": lead_car_in_sight, diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 701a0a8f81..9a482a28c4 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -212,7 +212,7 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam, self.cp_loopback) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] @@ -236,7 +236,6 @@ class CarInterface(CarInterfaceBase): if self.CS.prev_lkas_enabled != 1 and self.CS.lkas_enabled == 1: self.CS.madsEnabled = not self.CS.madsEnabled self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - ret, self.CS = self.toggle_gac(ret, self.CS, bool(self.CS.gap_dist_button), 1, 3, 3, "-") else: self.CS.madsEnabled = False @@ -252,7 +251,8 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.gap_dist_button)) + # TODO: SP: add CS.distance_button to gap_button from upstream + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/honda/carcontroller.py b/selfdrive/car/honda/carcontroller.py index 6d78fb3ebf..25d6372b47 100644 --- a/selfdrive/car/honda/carcontroller.py +++ b/selfdrive/car/honda/carcontroller.py @@ -323,7 +323,7 @@ class CarController: 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, CS.madsEnabled and not CC.latActive) - can_sends.extend(hondacan.create_ui_commands(self.packer, self.CP, CC.enabled and CS.out.cruiseState.enabled, pcm_speed, hud, CS.is_metric, CS.acc_hud, CS.lkas_hud, CC.latActive, CS.gac_tr_cluster)) + can_sends.extend(hondacan.create_ui_commands(self.packer, self.CP, CC.enabled and CS.out.cruiseState.enabled, pcm_speed, hud, CS.is_metric, CS.acc_hud, CS.lkas_hud, CC.latActive)) if self.CP.openpilotLongitudinalControl and self.CP.carFingerprint not in HONDA_BOSCH: self.speed = pcm_speed diff --git a/selfdrive/car/honda/hondacan.py b/selfdrive/car/honda/hondacan.py index 1a31902d28..8c9a78a548 100644 --- a/selfdrive/car/honda/hondacan.py +++ b/selfdrive/car/honda/hondacan.py @@ -122,7 +122,7 @@ def create_bosch_supplemental_1(packer, car_fingerprint): return packer.make_can_msg("BOSCH_SUPPLEMENTAL_1", bus, values) -def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud, lat_active, gac_tr_cluster): +def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, lkas_hud, lat_active): commands = [] bus_pt = get_pt_bus(CP.carFingerprint) radar_disabled = CP.carFingerprint in (HONDA_BOSCH - HONDA_BOSCH_RADARLESS) and CP.openpilotLongitudinalControl @@ -132,7 +132,7 @@ def create_ui_commands(packer, CP, enabled, pcm_speed, hud, is_metric, acc_hud, acc_hud_values = { 'CRUISE_SPEED': hud.v_cruise, 'ENABLE_MINI_CAR': 1 if enabled else 0, - 'HUD_DISTANCE': gac_tr_cluster, # max distance setting on display + 'HUD_DISTANCE': 0, # max distance setting on display '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, diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index c9d1096333..781f3bf38b 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -352,7 +352,7 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam, self.cp_body) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [ *create_button_events(self.CS.cruise_buttons, self.CS.prev_cruise_buttons, BUTTONS_DICT), @@ -371,7 +371,6 @@ class CarInterface(CarInterfaceBase): if self.CS.prev_cruise_setting != 1 and self.CS.cruise_setting == 1: self.CS.madsEnabled = not self.CS.madsEnabled self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - ret, self.CS = self.toggle_gac(ret, self.CS, (self.CS.cruise_setting == 3), 1, 3, 0, "-") else: self.CS.madsEnabled = False @@ -387,9 +386,9 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = self.CS.pcm_cruise_enabled + # TODO: SP: add CS.distance_button to gap_button from upstream ret, self.CS = self.get_sp_common_state(ret, self.CS, - min_enable_speed_pcm=(self.CP.pcmCruise and self.CP.minEnableSpeed > 0 and self.CP.pcmCruiseSpeed), - gap_button=(self.CS.cruise_setting == 3)) + min_enable_speed_pcm=(self.CP.pcmCruise and self.CP.minEnableSpeed > 0 and self.CP.pcmCruiseSpeed)) ret.buttonEvents = buttonEvents diff --git a/selfdrive/car/hyundai/carcontroller.py b/selfdrive/car/hyundai/carcontroller.py index ed47aaa3bb..d585a145dc 100644 --- a/selfdrive/car/hyundai/carcontroller.py +++ b/selfdrive/car/hyundai/carcontroller.py @@ -235,7 +235,7 @@ class CarController: 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 and CS.out.cruiseState.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override, - set_speed_in_units, CS.gac_tr_cluster)) + set_speed_in_units)) self.accel_last = accel else: # button presses diff --git a/selfdrive/car/hyundai/hyundaican.py b/selfdrive/car/hyundai/hyundaican.py index 2a624d6099..40241819da 100644 --- a/selfdrive/car/hyundai/hyundaican.py +++ b/selfdrive/car/hyundai/hyundaican.py @@ -135,7 +135,7 @@ def create_acc_commands(packer, enabled, accel, upper_jerk, idx, lead_distance, scc11_values = { "MainMode_ACC": 1 if main_enabled else 0, - "TauGapSet": CS.gac_tr_cluster, + "TauGapSet": 4, "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 2489790085..5501cd962d 100644 --- a/selfdrive/car/hyundai/hyundaicanfd.py +++ b/selfdrive/car/hyundai/hyundaicanfd.py @@ -121,7 +121,7 @@ def create_lfahda_cluster(packer, CAN, enabled, lat_active, lateral_paused, blin 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, gac_tr_cluster): +def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed): 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": gac_tr_cluster, + "DISTANCE_SETTING": 4, } return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values) diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index d899ac878a..5cd62fb5ac 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -396,7 +396,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = create_button_events(self.CS.cruise_buttons[-1], self.CS.prev_cruise_buttons, BUTTONS_DICT) @@ -419,7 +419,6 @@ class CarInterface(CarInterfaceBase): if self.CS.prev_lfa_enabled != 1 and self.CS.lfa_enabled == 1: self.CS.madsEnabled = not self.CS.madsEnabled self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - ret, self.CS = self.toggle_gac(ret, self.CS, (self.CS.cruise_buttons[-1] == 3), 1, 3, 4, "-") else: self.CS.madsEnabled = False @@ -434,7 +433,8 @@ class CarInterface(CarInterfaceBase): self.CS.madsEnabled, self.CS.accEnabled = self.get_sp_cancel_cruise_state(self.CS.madsEnabled) ret.cruiseState.enabled = False if self.CP.pcmCruise else self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=(self.CS.cruise_buttons[-1] == 3)) + # TODO: SP: add CS.distance_button to gap_button from upstream + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 0ef758cafe..d488244a93 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -1,5 +1,4 @@ import json -import operator import os import numpy as np import time @@ -41,7 +40,6 @@ TORQUE_NN_MODEL_PATH = os.path.join(BASEDIR, 'selfdrive/car/torque_data/lat_mode # dict used to rename activation functions whose names aren't valid python identifiers ACTIVATION_FUNCTION_NAMES = {'σ': 'sigmoid'} -GAC_DICT = {1: 1, 2: 2, 3: 3} FORWARD_GEARS = [GearShifter.drive, GearShifter.low, GearShifter.eco, GearShifter.sport, GearShifter.manumatic, GearShifter.brake] @@ -234,9 +232,6 @@ class CarInterfaceBase(ABC): self.experimental_mode_hold = False self.experimental_mode = self.param_s.get_bool("ExperimentalMode") self._frame = 0 - self.op_lookup = {"+": operator.add, "-": operator.sub} - self.prev_gac_button = False - self.gac_button_counter = 0 self.reverse_dm_cam = self.param_s.get_bool("ReverseDmCam") self.mads_main_toggle = self.param_s.get_bool("MadsCruiseMain") self.lkas_toggle = self.param_s.get_bool("LkasToggle") @@ -602,6 +597,7 @@ class CarInterfaceBase(ABC): else: return CS.madsEnabled + # TODO: SP: add CS.distance_button to gap_button from upstream for supported platforms def get_sp_common_state(self, cs_out, CS, min_enable_speed_pcm=False, gear_allowed=True, gap_button=False): cs_out.cruiseState.enabled = CS.accEnabled if not self.CP.pcmCruise or not self.CP.pcmCruiseSpeed or min_enable_speed_pcm else \ cs_out.cruiseState.enabled @@ -653,39 +649,6 @@ class CarInterfaceBase(ABC): self.gap_button_counter = 0 self.experimental_mode_hold = False - def get_sp_gac_state(self, gac_tr, gac_min, gac_max, inc_dec): - op = self.op_lookup.get(inc_dec) - gac_tr = op(gac_tr, 1) - if inc_dec == "+": - gac_tr = gac_min if gac_tr > gac_max else gac_tr - else: - gac_tr = gac_max if gac_tr < gac_min else gac_tr - return int(gac_tr) - - def get_sp_distance(self, gac_tr, gac_max, gac_dict=None): - if gac_dict is None: - gac_dict = GAC_DICT - return next((key for key, value in gac_dict.items() if value == gac_tr), gac_max) - - def toggle_gac(self, cs_out, CS, gac_button, gac_min, gac_max, gac_default, inc_dec): - if not self.CP.openpilotLongitudinalControl: - CS.gac_tr_cluster = gac_default - if CS.gac_tr != 2: - CS.gac_tr = 2 - self.param_s.put_nonblocking("LongitudinalPersonality", "2") - return cs_out, CS - if gac_button: - self.gac_button_counter += 1 - elif self.prev_gac_button and not gac_button and self.gac_button_counter < 50: - self.gac_button_counter = 0 - CS.gac_tr = self.get_sp_gac_state(CS.gac_tr, 0, 2, inc_dec) - self.param_s.put_nonblocking("LongitudinalPersonality", str(CS.gac_tr)) - else: - self.gac_button_counter = 0 - CS.gac_tr_cluster = clip(CS.gac_tr + 1, gac_min, gac_max) # always 1 higher - self.prev_gac_button = gac_button - return cs_out, CS - def create_sp_events(self, CS, cs_out, events, main_enabled=False, allow_enable=True, enable_pressed=False, enable_from_brake=False, enable_pressed_long=False, enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): @@ -747,14 +710,12 @@ class CarInterfaceBase(ABC): return events, cs_out - def sp_update_params(self, CS): + def sp_update_params(self): self.experimental_mode = self.param_s.get_bool("ExperimentalMode") - CS.gac_tr = int(self.param_s.get("LongitudinalPersonality")) self._frame += 1 if self._frame % 300 == 0: self._frame = 0 self.reverse_dm_cam = self.param_s.get_bool("ReverseDmCam") - return CS class RadarInterfaceBase(ABC): def __init__(self, CP): @@ -795,9 +756,6 @@ class CarStateBase(ABC): self.prev_mads_enabled = False self.control_initialized = False self.pcm_cruise_enabled = False - self.gap_dist_button = 0 - self.gac_tr = int(self.param_s.get("LongitudinalPersonality")) - self.gac_tr_cluster = clip(int(self.param_s.get("LongitudinalPersonality")), 1, 3) Q = [[0.0, 0.0], [0.0, 100.0]] R = 0.3 diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 4bc1d1491e..0acd96e834 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -56,7 +56,7 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 09d4614248..0ff8de0ad2 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -32,7 +32,7 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_adas, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] #be = car.CarState.ButtonEvent.new_message() diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index e6a1094753..079290fdd5 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -121,7 +121,7 @@ class CarInterface(CarInterfaceBase): def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam, self.cp_body) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] diff --git a/selfdrive/car/toyota/carcontroller.py b/selfdrive/car/toyota/carcontroller.py index b7ec9f3d8c..80fbedc9b2 100644 --- a/selfdrive/car/toyota/carcontroller.py +++ b/selfdrive/car/toyota/carcontroller.py @@ -152,10 +152,10 @@ class CarController: if pcm_cancel_cmd and self.CP.carFingerprint in UNSUPPORTED_DSU_CAR: can_sends.append(toyotacan.create_acc_cancel_command(self.packer)) elif self.CP.openpilotLongitudinalControl: - can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert, reverse_acc, CS.gac_send)) + can_sends.append(toyotacan.create_accel_command(self.packer, pcm_accel_cmd, pcm_cancel_cmd, self.standstill_req, lead, CS.acc_type, fcw_alert, reverse_acc)) self.accel = pcm_accel_cmd else: - can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, reverse_acc, CS.gac_send)) + can_sends.append(toyotacan.create_accel_command(self.packer, 0, pcm_cancel_cmd, False, lead, CS.acc_type, False, reverse_acc)) 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. diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 52113c2fb3..010cc31f1f 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -57,9 +57,6 @@ class CarState(CarStateBase): self.lta_status = False self.prev_lta_status = False self.lta_status_active = False - self.gac_send = False - self.gac_send_counter = 0 - self.follow_distance = 0 if CP.spFlags & ToyotaFlagsSP.SP_ZSS: self.zss_compute = False @@ -73,7 +70,6 @@ class CarState(CarStateBase): self.prev_mads_enabled = self.mads_enabled self.prev_lkas_enabled = self.lkas_enabled self.prev_lta_status = self.lta_status - self.prev_gap_dist_button = self.gap_dist_button ret.doorOpen = any([cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_FR"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RL"], cp.vl["BODY_CONTROL_STATE"]["DOOR_OPEN_RR"]]) @@ -202,13 +198,7 @@ class CarState(CarStateBase): self.acc_type = cp_acc.vl["ACC_CONTROL"]["ACC_TYPE"] ret.stockFcw = bool(cp_acc.vl["PCS_HUD"]["FCW"]) - if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): - self.gap_dist_button = cp_cam.vl["ACC_CONTROL"]["DISTANCE"] - if self.CP.flags & ToyotaFlags.SMART_DSU: - self.gap_dist_button = cp.vl["SDSU"]["FD_BUTTON"] - fd_src = "PCM_CRUISE_ALT" if self.CP.carFingerprint in UNSUPPORTED_DSU_CAR else "PCM_CRUISE_2" - self.follow_distance = cp.vl[fd_src]["PCM_FOLLOW_DISTANCE"] # some TSS2 cars have low speed lockout permanently set, so ignore on those cars # these cars are identified by an ACC_TYPE value of 2. diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index ba5bcb6585..95f51fae64 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -15,10 +15,6 @@ EventName = car.CarEvent.EventName SteerControlType = car.CarParams.SteerControlType GearShifter = car.CarState.GearShifter -GAC_DICT = {3: 1, 2: 2, 1: 3} -GAC_MIN = 1 -GAC_MAX = 3 - class CarInterface(CarInterfaceBase): @staticmethod def get_pid_accel_limits(CP, current_speed, cruise_speed): @@ -310,9 +306,9 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() - buttonEvents = create_button_events(self.CS.gap_dist_button, self.CS.prev_gap_dist_button, {1: ButtonType.gapAdjustCruise}) + buttonEvents = [] self.CS.mads_enabled = self.get_sp_cruise_main_state(ret, self.CS) @@ -330,34 +326,6 @@ class CarInterface(CarInterfaceBase): (self.CS.prev_lkas_enabled == 1 and not self.CS.lkas_enabled): self.CS.madsEnabled = not self.CS.madsEnabled self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - if not self.CP.openpilotLongitudinalControl: - self.CS.gac_tr_cluster = 3 - if self.CS.gac_tr != 2: - self.CS.gac_tr = 2 - self.param_s.put_nonblocking("LongitudinalPersonality", "2") - else: - gap_dist_button = bool(self.CS.gap_dist_button) - if gap_dist_button: - self.gac_button_counter += 1 - elif self.prev_gac_button and not gap_dist_button and self.gac_button_counter < 50: - self.gac_button_counter = 0 - pre_calculated_distance = 3 if self.CS.gac_tr == 3 else self.CS.follow_distance - follow_distance_converted = self.get_sp_gac_state(pre_calculated_distance, GAC_MIN, GAC_MAX, "+") - gac_tr = self.get_sp_distance(follow_distance_converted, GAC_MAX, gac_dict=GAC_DICT) - 1 # always 1 lower - if gac_tr != self.CS.gac_tr: - self.param_s.put_nonblocking("LongitudinalPersonality", str(gac_tr)) - self.CS.gac_tr = gac_tr - else: - self.gac_button_counter = 0 - self.prev_gac_button = gap_dist_button - self.CS.gac_tr_cluster = clip(self.CS.gac_tr + 1, GAC_MIN, GAC_MAX) # always 1 higher - gap_distance = self.get_sp_distance(self.CS.gac_tr_cluster, GAC_MAX, gac_dict=GAC_DICT) - if self.CS.gac_send_counter < 10 and gap_distance != self.CS.follow_distance: - self.CS.gac_send_counter += 1 - self.CS.gac_send = 1 - else: - self.CS.gac_send_counter = 0 - self.CS.gac_send = 0 else: self.CS.madsEnabled = False @@ -366,7 +334,8 @@ class CarInterface(CarInterfaceBase): if not self.CP.pcmCruise: ret.cruiseState.enabled = self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.gap_dist_button)) + # TODO: SP: add CS.distance_button to gap_button from upstream + ret, self.CS = self.get_sp_common_state(ret, self.CS) # CANCEL if self.CS.out.cruiseState.enabled and not ret.cruiseState.enabled: diff --git a/selfdrive/car/toyota/toyotacan.py b/selfdrive/car/toyota/toyotacan.py index cd7746f8ad..0542b001f2 100644 --- a/selfdrive/car/toyota/toyotacan.py +++ b/selfdrive/car/toyota/toyotacan.py @@ -33,12 +33,12 @@ def create_lta_steer_command(packer, steer_control_type, steer_angle, steer_req, return packer.make_can_msg("STEERING_LTA", 0, values) -def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_type, fcw_alert, reverse_acc, gac_send): +def create_accel_command(packer, accel, pcm_cancel, standstill_req, lead, acc_type, fcw_alert, reverse_acc): # TODO: find the exact canceling bit that does not create a chime values = { "ACCEL_CMD": 0 if pcm_cancel else accel, "ACC_TYPE": acc_type, - "DISTANCE": gac_send, + "DISTANCE": 0, "MINI_CAR": lead, "PERMIT_BRAKING": 1, "RELEASE_STANDSTILL": not standstill_req, diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index 45686060a3..190f02f086 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -170,7 +170,7 @@ class CarController: # 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, CS.gac_tr_cluster)) + lead_distance)) # **** Stock ACC Button Controls **************************************** # diff --git a/selfdrive/car/volkswagen/carstate.py b/selfdrive/car/volkswagen/carstate.py index 2de49d1147..b9ba097f41 100644 --- a/selfdrive/car/volkswagen/carstate.py +++ b/selfdrive/car/volkswagen/carstate.py @@ -162,7 +162,6 @@ class CarState(CarStateBase): ret.rightBlinker = ret.rightBlinkerOn = bool(pt_cp.vl["Blinkmodi_02"]["Comfort_Signal_Right"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) self.gra_stock_values = pt_cp.vl["GRA_ACC_01"] - self.gap_dist_button = pt_cp.vl["GRA_ACC_01"]["GRA_Verstellung_Zeitluecke"] # Additional safety checks performed in CarInterface. ret.espDisabled = pt_cp.vl["ESP_21"]["ESP_Tastung_passiv"] != 0 @@ -281,7 +280,6 @@ class CarState(CarStateBase): pt_cp.vl["Gate_Komf_1"]["GK1_Blinker_re"]) ret.buttonEvents = self.create_button_events(pt_cp, self.CCP.BUTTONS) self.gra_stock_values = pt_cp.vl["GRA_Neu"] - self.gap_dist_button = pt_cp.vl["GRA_Neu"]["GRA_Zeitluecke"] # Additional safety checks performed in CarInterface. ret.espDisabled = bool(pt_cp.vl["Bremse_1"]["ESP_Passiv_getastet"]) diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index f43539ab55..36b766e538 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -122,7 +122,7 @@ class CarInterface(CarInterfaceBase): # returns a car.CarState def _update(self, c): ret = self.CS.update(self.cp, self.cp_cam, self.cp_ext, self.CP.transmissionType) - self.CS = self.sp_update_params(self.CS) + self.CS = self.sp_update_params() buttonEvents = [] @@ -146,7 +146,6 @@ class CarInterface(CarInterfaceBase): if not self.CS.prev_mads_enabled and self.CS.mads_enabled: self.CS.madsEnabled = True self.CS.madsEnabled = self.get_acc_mads(ret.cruiseState.enabled, self.CS.accEnabled, self.CS.madsEnabled) - ret, self.CS = self.toggle_gac(ret, self.CS, bool(self.CS.gap_dist_button), 1, 3, 3, "-") else: self.CS.madsEnabled = False self.CS.madsEnabled = self.get_sp_started_mads(ret, self.CS) @@ -163,7 +162,8 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=(self.CS.gap_dist_button == 3)) + # TODO: SP: add CS.distance_button to gap_button from upstream + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/volkswagen/mqbcan.py b/selfdrive/car/volkswagen/mqbcan.py index 35542f9f6b..1c2e14e649 100644 --- a/selfdrive/car/volkswagen/mqbcan.py +++ b/selfdrive/car/volkswagen/mqbcan.py @@ -133,11 +133,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, gac_tr_cluster): +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): values = { "ACC_Status_Anzeige": acc_hud_status, "ACC_Wunschgeschw_02": set_speed if set_speed < 250 else 327.36, - "ACC_Gesetzte_Zeitluecke": gac_tr_cluster, + "ACC_Gesetzte_Zeitluecke": 3, "ACC_Display_Prio": 3, "ACC_Abstandsindex": lead_distance, } diff --git a/selfdrive/car/volkswagen/pqcan.py b/selfdrive/car/volkswagen/pqcan.py index b5be66e957..a45e7fad17 100644 --- a/selfdrive/car/volkswagen/pqcan.py +++ b/selfdrive/car/volkswagen/pqcan.py @@ -99,7 +99,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, gac_tr_cluster): +def create_acc_hud_control(packer, bus, acc_hud_status, set_speed, lead_distance): values = { "ACA_StaACC": acc_hud_status, "ACA_Zeitluecke": 2, From 3adbebd701d302e0a38fbb42d0e776012719cfd3 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Tue, 7 May 2024 00:38:04 -0800 Subject: [PATCH 891/923] Bump submodules (#326) --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index 6683e77bcc..19302c53d0 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 6683e77bcccda0c55aa53859ffcd9eeb782db164 +Subproject commit 19302c53d00756e5e8c946441877a5528c0e36c3 From f597d63bf6f2b8c8cf9a48934a059ef25ec69cd7 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 7 May 2024 15:00:02 -0700 Subject: [PATCH 892/923] PlatformConfig: clean up and print all flags (#32369) * script to print flags * don't need * SAL * back * fix --- selfdrive/car/__init__.py | 18 +----------------- selfdrive/car/hyundai/values.py | 3 --- selfdrive/car/subaru/values.py | 3 --- selfdrive/debug/print_flags.py | 18 ++++++++++++++++++ .../examples/subaru_fuzzy_fingerprint.ipynb | 2 +- 5 files changed, 20 insertions(+), 24 deletions(-) create mode 100755 selfdrive/debug/print_flags.py diff --git a/selfdrive/car/__init__.py b/selfdrive/car/__init__.py index bbdae4f3d4..4a1df550d0 100644 --- a/selfdrive/car/__init__.py +++ b/selfdrive/car/__init__.py @@ -1,5 +1,5 @@ # functions common among cars -from collections import defaultdict, namedtuple +from collections import namedtuple from dataclasses import dataclass from enum import IntFlag, ReprEnum, EnumType from dataclasses import replace @@ -276,19 +276,3 @@ class Platforms(str, ReprEnum, metaclass=PlatformsType): @classmethod def with_flags(cls, flags: IntFlag) -> set['Platforms']: return {p for p in cls if p.config.flags & flags} - - @classmethod - def without_flags(cls, flags: IntFlag) -> set['Platforms']: - return {p for p in cls if not (p.config.flags & flags)} - - @classmethod - def print_debug(cls, flags): - platforms_with_flag = defaultdict(list) - for flag in flags: - for platform in cls: - if platform.config.flags & flag: - assert flag.name is not None - platforms_with_flag[flag.name].append(platform) - - for flag, platforms in platforms_with_flag.items(): - print(f"{flag:32s}: {', '.join(p.name for p in platforms)}") diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 2456e4aa6e..2518d3807b 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -746,6 +746,3 @@ LEGACY_SAFETY_MODE_CAR = CAR.with_flags(HyundaiFlags.LEGACY) UNSUPPORTED_LONGITUDINAL_CAR = CAR.with_flags(HyundaiFlags.LEGACY) | CAR.with_flags(HyundaiFlags.UNSUPPORTED_LONGITUDINAL) DBC = CAR.create_dbc_map() - -if __name__ == "__main__": - CAR.print_debug(HyundaiFlags) diff --git a/selfdrive/car/subaru/values.py b/selfdrive/car/subaru/values.py index e8ced2b9af..dcbea1979f 100644 --- a/selfdrive/car/subaru/values.py +++ b/selfdrive/car/subaru/values.py @@ -273,6 +273,3 @@ FW_QUERY_CONFIG = FwQueryConfig( ) DBC = CAR.create_dbc_map() - -if __name__ == "__main__": - CAR.print_debug(SubaruFlags) diff --git a/selfdrive/debug/print_flags.py b/selfdrive/debug/print_flags.py new file mode 100755 index 0000000000..28e18f6f7e --- /dev/null +++ b/selfdrive/debug/print_flags.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python3 +from openpilot.selfdrive.car.values import BRANDS + +for brand in BRANDS: + all_flags = set() + for platform in brand: + if platform.config.flags != 0: + all_flags |= set(platform.config.flags) + + if len(all_flags): + print(brand.__module__.split('.')[-2].upper() + ':') + for flag in sorted(all_flags): + print(f' {flag.name:<24}: ', end='') + for platform in brand: + if platform.config.flags & flag: + print(platform.name, end=', ') + print() + print() diff --git a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb index 99efc45aca..1048011c05 100644 --- a/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb +++ b/tools/car_porting/examples/subaru_fuzzy_fingerprint.ipynb @@ -18,7 +18,7 @@ "from openpilot.selfdrive.car.subaru.values import CAR, SubaruFlags\n", "from openpilot.selfdrive.car.subaru.fingerprints import FW_VERSIONS\n", "\n", - "TEST_PLATFORMS = CAR.without_flags(SubaruFlags.PREGLOBAL)\n", + "TEST_PLATFORMS = set(CAR) - CAR.with_flags(SubaruFlags.PREGLOBAL)\n", "\n", "Ecu = car.CarParams.Ecu\n", "\n", From 888b38c3db44a53b059565b4f863503dd5bcf6c1 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 7 May 2024 15:06:23 -0700 Subject: [PATCH 893/923] print_flags.py: clean up always ensure current impl of something is the best! --- selfdrive/debug/print_flags.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/selfdrive/debug/print_flags.py b/selfdrive/debug/print_flags.py index 28e18f6f7e..c69765550e 100755 --- a/selfdrive/debug/print_flags.py +++ b/selfdrive/debug/print_flags.py @@ -10,9 +10,5 @@ for brand in BRANDS: if len(all_flags): print(brand.__module__.split('.')[-2].upper() + ':') for flag in sorted(all_flags): - print(f' {flag.name:<24}: ', end='') - for platform in brand: - if platform.config.flags & flag: - print(platform.name, end=', ') - print() + print(f' {flag.name:<24}:', {platform.name for platform in brand.with_flags(flag)}) print() From 1fc3d9224e820e150dc382de1adcfd49fa972b42 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 7 May 2024 15:58:29 -0700 Subject: [PATCH 894/923] remove Offroad_InvalidTime alert --- common/params.cc | 1 - selfdrive/controls/lib/alerts_offroad.json | 4 ---- 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 ---- 12 files changed, 45 deletions(-) diff --git a/common/params.cc b/common/params.cc index a00401d20a..2330160173 100644 --- a/common/params.cc +++ b/common/params.cc @@ -172,7 +172,6 @@ std::unordered_map keys = { {"Offroad_CarUnrecognized", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"Offroad_ConnectivityNeeded", CLEAR_ON_MANAGER_START}, {"Offroad_ConnectivityNeededPrompt", CLEAR_ON_MANAGER_START}, - {"Offroad_InvalidTime", CLEAR_ON_MANAGER_START}, {"Offroad_IsTakingSnapshot", CLEAR_ON_MANAGER_START}, {"Offroad_NeosUpdate", CLEAR_ON_MANAGER_START}, {"Offroad_NoFirmware", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, diff --git a/selfdrive/controls/lib/alerts_offroad.json b/selfdrive/controls/lib/alerts_offroad.json index 35446ca22b..4ef6d9d191 100644 --- a/selfdrive/controls/lib/alerts_offroad.json +++ b/selfdrive/controls/lib/alerts_offroad.json @@ -17,10 +17,6 @@ "severity": 1, "_comment": "Set extra field to the failed reason." }, - "Offroad_InvalidTime": { - "text": "Invalid date and time settings, system won't start. Connect to internet to set time.", - "severity": 1 - }, "Offroad_IsTakingSnapshot": { "text": "Taking camera snapshots. System won't start until finished.", "severity": 0 diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index f00905b75b..d8146723a4 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -440,10 +440,6 @@ غير قادر على تحميل التحديثات %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - إعدادات التاريخ والتوقيت غير صحيحة، لن يبدأ النظام. اتصل بالإنترنت من أجل ضبط الوقت. - Taking camera snapshots. System won't start until finished. التقاط لقطات كاميرا. لن يبدأ النظام حتى تنتهي هذه العملية. diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 71d95244cb..010aa4d304 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -431,10 +431,6 @@ %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - - Taking camera snapshots. System won't start until finished. diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index 5da51d8b47..dde6adadd3 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -436,10 +436,6 @@ Impossible de télécharger les mises à jour %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - Paramètres de date et d'heure invalides, le système ne démarrera pas. Connectez l'appareil à Internet pour régler l'heure. - Taking camera snapshots. System won't start until finished. Capture de clichés photo. Le système ne démarrera pas tant qu'il n'est pas terminé. diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index 7a27f46ea3..e0fb60620b 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -430,10 +430,6 @@ %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - - Taking camera snapshots. System won't start until finished. diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 518bb4b58f..b2d07b770b 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -431,10 +431,6 @@ 업데이트를 다운로드할 수 없습니다 %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - 날짜 및 시간 설정이 잘못되어 시스템이 시작되지 않습니다. 날짜와 시간을 동기화하려면 인터넷에 연결하세요. - Taking camera snapshots. System won't start until finished. 카메라 스냅샷 찍기가 완료될 때까지 시스템이 시작되지 않습니다. diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index 6210e35f2a..feaa6e86a1 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -432,10 +432,6 @@ Não é possível baixar atualizações %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - Configurações de data e hora inválidas, o sistema não será iniciado. Conecte-se à internet para definir o horário. - Taking camera snapshots. System won't start until finished. Tirando fotos da câmera. O sistema não será iniciado até terminar. diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index c8bf0d3ade..e594a6975f 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -435,10 +435,6 @@ ไม่สามารถดาวน์โหลดอัพเดทได้ %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - วันที่และเวลาไม่ถูกต้อง ระบบจะไม่เริ่มทำงาน เชื่อต่ออินเตอร์เน็ตเพื่อตั้งเวลา - Taking camera snapshots. System won't start until finished. กล้องกำลังถ่ายภาพ ระบบจะไม่เริ่มทำงานจนกว่าจะเสร็จ diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 000fc1a2ec..48615f1699 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -434,10 +434,6 @@ %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - - Taking camera snapshots. System won't start until finished. diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 3d9cf1c001..306678363a 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -431,10 +431,6 @@ 无法下载更新 %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - 日期和时间设置无效,系统无法启动。请连接至互联网以设置时间。 - Taking camera snapshots. System won't start until finished. 正在使用相机拍摄中。在完成之前,系统将无法启动。 diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index d9030b82ff..8d0df30f94 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -431,10 +431,6 @@ 無法下載更新 %1 - - Invalid date and time settings, system won't start. Connect to internet to set time. - 日期和時間設定無效,系統無法啟動。請連接至網際網路以設定時間。 - Taking camera snapshots. System won't start until finished. 正在使用相機拍攝中。在完成之前,系統將無法啟動。 From cdf2e75cc314af694514077b659e5ba1d3782e8a Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 7 May 2024 15:58:59 -0700 Subject: [PATCH 895/923] reduce severity of offroad temperature alert --- selfdrive/controls/lib/alerts_offroad.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/controls/lib/alerts_offroad.json b/selfdrive/controls/lib/alerts_offroad.json index 4ef6d9d191..6fb6c569b0 100644 --- a/selfdrive/controls/lib/alerts_offroad.json +++ b/selfdrive/controls/lib/alerts_offroad.json @@ -1,7 +1,7 @@ { "Offroad_TemperatureTooHigh": { "text": "Device temperature too high. System cooling down before starting. Current internal component temperature: %1", - "severity": 1 + "severity": 0 }, "Offroad_ConnectivityNeededPrompt": { "text": "Immediately connect to the internet to check for updates. If you do not connect to the internet, openpilot won't engage in %1", From b551e7c1a2d913b18752a45857c4675191eb4419 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 8 May 2024 10:59:30 +0800 Subject: [PATCH 896/923] cabana: Implement Remote Route Browsing Feature (#32332) browse remote routes --- tools/cabana/SConscript | 2 +- tools/cabana/streams/replaystream.cc | 20 +++-- tools/cabana/streams/routes.cc | 123 +++++++++++++++++++++++++++ tools/cabana/streams/routes.h | 26 ++++++ tools/cabana/streamselector.cc | 16 +--- 5 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 tools/cabana/streams/routes.cc create mode 100644 tools/cabana/streams/routes.h diff --git a/tools/cabana/SConscript b/tools/cabana/SConscript index 6af4ca08f5..2574e3368b 100644 --- a/tools/cabana/SConscript +++ b/tools/cabana/SConscript @@ -26,7 +26,7 @@ cabana_env.Command(assets, assets_src, f"rcc $SOURCES -o $TARGET") cabana_env.Depends(assets, Glob('/assets/*', exclude=[assets, assets_src, "assets/assets.o"])) cabana_lib = cabana_env.Library("cabana_lib", ['mainwin.cc', 'streams/socketcanstream.cc', 'streams/pandastream.cc', 'streams/devicestream.cc', 'streams/livestream.cc', 'streams/abstractstream.cc', 'streams/replaystream.cc', 'binaryview.cc', 'historylog.cc', 'videowidget.cc', 'signalview.cc', - 'dbc/dbc.cc', 'dbc/dbcfile.cc', 'dbc/dbcmanager.cc', + 'streams/routes.cc', 'dbc/dbc.cc', 'dbc/dbcfile.cc', 'dbc/dbcmanager.cc', 'utils/export.cc', 'utils/util.cc', 'chart/chartswidget.cc', 'chart/chart.cc', 'chart/signalselector.cc', 'chart/tiplabel.cc', 'chart/sparkline.cc', 'commands.cc', 'messageswidget.cc', 'streamselector.cc', 'settings.cc', 'detailwidget.cc', 'tools/findsimilarbits.cc', 'tools/findsignal.cc'], LIBS=cabana_libs, FRAMEWORKS=base_frameworks) diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index c75a128a15..3c3e431ce7 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -7,6 +7,7 @@ #include #include "common/timing.h" +#include "tools/cabana/streams/routes.h" ReplayStream::ReplayStream(QObject *parent) : AbstractStream(parent) { unsetenv("ZMQ"); @@ -107,29 +108,36 @@ AbstractOpenStreamWidget *ReplayStream::widget(AbstractStream **stream) { // OpenReplayWidget OpenReplayWidget::OpenReplayWidget(AbstractStream **stream) : AbstractOpenStreamWidget(stream) { - // TODO: get route list from api.comma.ai QGridLayout *grid_layout = new QGridLayout(this); grid_layout->addWidget(new QLabel(tr("Route")), 0, 0); grid_layout->addWidget(route_edit = new QLineEdit(this), 0, 1); - route_edit->setPlaceholderText(tr("Enter remote route name or click browse to select a local route")); - auto file_btn = new QPushButton(tr("Browse..."), this); - grid_layout->addWidget(file_btn, 0, 2); + route_edit->setPlaceholderText(tr("Enter route name or browse for local/remote route")); + auto browse_remote_btn = new QPushButton(tr("Remote route..."), this); + grid_layout->addWidget(browse_remote_btn, 0, 2); + auto browse_local_btn = new QPushButton(tr("Local route..."), this); + grid_layout->addWidget(browse_local_btn, 0, 3); - grid_layout->addWidget(new QLabel(tr("Camera")), 1, 0); QHBoxLayout *camera_layout = new QHBoxLayout(); for (auto c : {tr("Road camera"), tr("Driver camera"), tr("Wide road camera")}) camera_layout->addWidget(cameras.emplace_back(new QCheckBox(c, this))); + cameras[0]->setChecked(true); camera_layout->addStretch(1); grid_layout->addItem(camera_layout, 1, 1); setMinimumWidth(550); - QObject::connect(file_btn, &QPushButton::clicked, [=]() { + QObject::connect(browse_local_btn, &QPushButton::clicked, [=]() { QString dir = QFileDialog::getExistingDirectory(this, tr("Open Local Route"), settings.last_route_dir); if (!dir.isEmpty()) { route_edit->setText(dir); settings.last_route_dir = QFileInfo(dir).absolutePath(); } }); + QObject::connect(browse_remote_btn, &QPushButton::clicked, [this]() { + RoutesDialog route_dlg(this); + if (route_dlg.exec()) { + route_edit->setText(route_dlg.route()); + } + }); } bool OpenReplayWidget::open() { diff --git a/tools/cabana/streams/routes.cc b/tools/cabana/streams/routes.cc new file mode 100644 index 0000000000..c805e7d60d --- /dev/null +++ b/tools/cabana/streams/routes.cc @@ -0,0 +1,123 @@ +#include "tools/cabana/streams/routes.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "system/hardware/hw.h" + +// The RouteListWidget class extends QListWidget to display a custom message when empty +class RouteListWidget : public QListWidget { +public: + RouteListWidget(QWidget *parent = nullptr) : QListWidget(parent) {} + void setEmptyText(const QString &text) { + empty_text_ = text; + viewport()->update(); + } + void paintEvent(QPaintEvent *event) override { + QListWidget::paintEvent(event); + if (count() == 0) { + QPainter painter(viewport()); + painter.drawText(viewport()->rect(), Qt::AlignCenter, empty_text_); + } + } + QString empty_text_ = tr("No items"); +}; + +RoutesDialog::RoutesDialog(QWidget *parent) : QDialog(parent) { + setWindowTitle(tr("Remote routes")); + + QFormLayout *layout = new QFormLayout(this); + layout->addRow(tr("Device"), device_list_ = new QComboBox(this)); + layout->addRow(tr("Duration"), period_selector_ = new QComboBox(this)); + layout->addRow(route_list_ = new RouteListWidget(this)); + auto button_box = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + layout->addRow(button_box); + + device_list_->addItem(tr("Loading...")); + // Populate period selector with predefined durations + period_selector_->addItem(tr("Last week"), 7); + period_selector_->addItem(tr("Last 2 weeks"), 14); + period_selector_->addItem(tr("Last month"), 30); + period_selector_->addItem(tr("Last 6 months"), 180); + + // Connect signals and slots + connect(device_list_, QOverload::of(&QComboBox::currentIndexChanged), this, &RoutesDialog::fetchRoutes); + connect(period_selector_, QOverload::of(&QComboBox::currentIndexChanged), this, &RoutesDialog::fetchRoutes); + connect(route_list_, &QListWidget::itemDoubleClicked, this, &QDialog::accept); + QObject::connect(button_box, &QDialogButtonBox::accepted, this, &QDialog::accept); + QObject::connect(button_box, &QDialogButtonBox::rejected, this, &QDialog::reject); + + // Send request to fetch devices + HttpRequest *http = new HttpRequest(this, !Hardware::PC()); + QObject::connect(http, &HttpRequest::requestDone, this, &RoutesDialog::parseDeviceList); + http->sendRequest(CommaApi::BASE_URL + "/v1/me/devices/"); +} + +void RoutesDialog::parseDeviceList(const QString &json, bool success, QNetworkReply::NetworkError err) { + if (success) { + device_list_->clear(); + auto devices = QJsonDocument::fromJson(json.toUtf8()).array(); + for (const QJsonValue &device : devices) { + QString dongle_id = device["dongle_id"].toString(); + device_list_->addItem(dongle_id, dongle_id); + } + } else { + bool unauthorized = (err == QNetworkReply::ContentAccessDenied || err == QNetworkReply::AuthenticationRequiredError); + QMessageBox::warning(this, tr("Error"), unauthorized ? tr("Unauthorized, Authenticate with tools/lib/auth.py") : tr("Network error")); + reject(); + } + sender()->deleteLater(); +} + +void RoutesDialog::fetchRoutes() { + if (device_list_->currentIndex() == -1 || device_list_->currentData().isNull()) + return; + + route_list_->clear(); + route_list_->setEmptyText(tr("Loading...")); + + HttpRequest *http = new HttpRequest(this, !Hardware::PC()); + QObject::connect(http, &HttpRequest::requestDone, this, &RoutesDialog::parseRouteList); + + // Construct URL with selected device and date range + auto dongle_id = device_list_->currentData().toString(); + QDateTime current = QDateTime::currentDateTime(); + QString url = QString("%1/v1/devices/%2/routes_segments?start=%3&end=%4") + .arg(CommaApi::BASE_URL).arg(dongle_id) + .arg(current.addDays(-(period_selector_->currentData().toInt())).toMSecsSinceEpoch()) + .arg(current.toMSecsSinceEpoch()); + http->sendRequest(url); +} + +void RoutesDialog::parseRouteList(const QString &json, bool success, QNetworkReply::NetworkError err) { + if (success) { + for (const QJsonValue &route : QJsonDocument::fromJson(json.toUtf8()).array()) { + uint64_t start_time = route["start_time_utc_millis"].toDouble(); + uint64_t end_time = route["end_time_utc_millis"].toDouble(); + auto datetime = QDateTime::fromMSecsSinceEpoch(start_time); + auto item = new QListWidgetItem(QString("%1 %2min").arg(datetime.toString()).arg((end_time - start_time) / (1000 * 60))); + item->setData(Qt::UserRole, route["fullname"].toString()); + route_list_->addItem(item); + } + // Select first route if available + if (route_list_->count() > 0) route_list_->setCurrentRow(0); + } else { + QMessageBox::warning(this, tr("Error"), tr("Failed to fetch routes. Check your network connection.")); + reject(); + } + route_list_->setEmptyText(tr("No items")); + sender()->deleteLater(); +} + +void RoutesDialog::accept() { + if (auto current_item = route_list_->currentItem()) { + route_ = current_item->data(Qt::UserRole).toString(); + } + QDialog::accept(); +} diff --git a/tools/cabana/streams/routes.h b/tools/cabana/streams/routes.h new file mode 100644 index 0000000000..31e42fb075 --- /dev/null +++ b/tools/cabana/streams/routes.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "selfdrive/ui/qt/api.h" + +class RouteListWidget; + +class RoutesDialog : public QDialog { + Q_OBJECT +public: + RoutesDialog(QWidget *parent); + QString route() const { return route_; } + +protected: + void accept() override; + void parseDeviceList(const QString &json, bool success, QNetworkReply::NetworkError err); + void parseRouteList(const QString &json, bool success, QNetworkReply::NetworkError err); + void fetchRoutes(); + + QComboBox *device_list_; + QComboBox *period_selector_; + RouteListWidget *route_list_; + QString route_; +}; diff --git a/tools/cabana/streamselector.cc b/tools/cabana/streamselector.cc index 07755c0fe0..d12f1a5df7 100644 --- a/tools/cabana/streamselector.cc +++ b/tools/cabana/streamselector.cc @@ -13,12 +13,8 @@ StreamSelector::StreamSelector(AbstractStream **stream, QWidget *parent) : QDialog(parent) { setWindowTitle(tr("Open stream")); - QVBoxLayout *main_layout = new QVBoxLayout(this); - - QWidget *w = new QWidget(this); - QVBoxLayout *layout = new QVBoxLayout(w); + QVBoxLayout *layout = new QVBoxLayout(this); tab = new QTabWidget(this); - tab->setTabBarAutoHide(true); layout->addWidget(tab); QHBoxLayout *dbc_layout = new QHBoxLayout(); @@ -35,9 +31,8 @@ StreamSelector::StreamSelector(AbstractStream **stream, QWidget *parent) : QDial line->setFrameStyle(QFrame::HLine | QFrame::Sunken); layout->addWidget(line); - main_layout->addWidget(w); auto btn_box = new QDialogButtonBox(QDialogButtonBox::Open | QDialogButtonBox::Cancel); - main_layout->addWidget(btn_box); + layout->addWidget(btn_box); addStreamWidget(ReplayStream::widget(stream)); addStreamWidget(PandaStream::widget(stream)); @@ -48,14 +43,11 @@ StreamSelector::StreamSelector(AbstractStream **stream, QWidget *parent) : QDial QObject::connect(btn_box, &QDialogButtonBox::rejected, this, &QDialog::reject); QObject::connect(btn_box, &QDialogButtonBox::accepted, [=]() { - btn_box->button(QDialogButtonBox::Open)->setEnabled(false); - w->setEnabled(false); + setEnabled(false); if (((AbstractOpenStreamWidget *)tab->currentWidget())->open()) { accept(); - } else { - btn_box->button(QDialogButtonBox::Open)->setEnabled(true); - w->setEnabled(true); } + setEnabled(true); }); QObject::connect(file_btn, &QPushButton::clicked, [this]() { QString fn = QFileDialog::getOpenFileName(this, tr("Open File"), settings.last_dir, "DBC (*.dbc)"); From d0e5f42b684171854edc0ab8d4eef8c38aadbc78 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 7 May 2024 20:05:38 -0700 Subject: [PATCH 897/923] agnos 10.1 (#32348) --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index bfc2e6ac6a..81578aff01 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="10" + export AGNOS_VERSION="10.1" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index cc3f6bb830..46611505c4 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -1,10 +1,10 @@ [ { "name": "boot", - "url": "https://commadist.azureedge.net/agnosupdate/boot-543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1.img.xz", - "hash": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", - "hash_raw": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", - "size": 15636480, + "url": "https://commadist.azureedge.net/agnosupdate/boot-5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f.img.xz", + "hash": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", + "hash_raw": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", + "size": 16029696, "sparse": false, "full_check": true, "has_ab": true @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", - "hash": "dc2f960631f02446d912885786922c27be4eb1ec6c202cacce6699d5a74021ba", - "hash_raw": "bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a", + "url": "https://commadist.azureedge.net/agnosupdate/system-327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be.img.xz", + "hash": "9cc5c01c3455fb24d0a2651acf94a66e3f3de9edf45175621db854cb57ddaa29", + "hash_raw": "327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "283e5e754593c6e1bb5e9d63b54624cda5475b88bc1b130fe6ab13acdbd966e2", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", - "size": 4548070712 + "hash": "782850019153a72451874ee3d7655ded15606f63ca08a786b81b7d78938fcc55", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be.img.xz", + "size": 4548040748 } } ] \ No newline at end of file From 85c9fea5d8e3f5ee673317e15df958a7168a899d Mon Sep 17 00:00:00 2001 From: Cameron Clough Date: Wed, 8 May 2024 04:28:59 +0100 Subject: [PATCH 898/923] Ford: use platform codes to fuzzy fingerprint (#31124) * Ford: use platform codes to fuzzy fingerprint TODO: write scripts/tests (print platform codes and version ranges etc.) May close #31052 * get_platform_codes: fix return type * add print_platform_codes.py script * print_platform_codes: sort versions * match_fw_to_car_fuzzy: use set comprehension, and fix typo * Ford: add missing Mach-E fw From the route 83a4e056c7072678/2023-11-13--16-51-33 (which is already in selfdrive/car/tests/routes.py, added in #30691). * add ford_fuzzy_fingerprint.ipynb notebook * get_platform_codes: use regex to parse firmware * test_ford: test_platform_codes_fuzzy_fw * test_ford: use get_platform_codes in test_fw_versions * match_fw_to_car_fuzzy: improve comments * test_ford: add test_platform_codes_spot_check * test_ford: add test_match_fw_fuzzy * remove comment from notebook * TestFordFW: remove engine ECU FW * update print_platform_codes.py * remove part number (unecessary) * platform codes can just use platform hint and model year - software revision not useful * fuzzy FP on the platform hint and model year hint range * fix platform codes test * update notebook * add notebook * explain model year hint better * test part numbers again * cleanup notebooks * remove notebook * cleanup match_fw_to_car_fuzzy and add comments * update comment * . * Revert "remove notebook" This reverts commit 5d4ca202f2a23601d5c829204119f36a58f2b451. * add notebook back * remove PSCM from PLATFORM_CODE_ECUS ABS and IPMA are the best for uniquely matching, and the radar is always required * Revert "remove PSCM from PLATFORM_CODE_ECUS" This reverts commit b7baeac19c18b5aa0c31da52f12054f4bae6e1ff. * fix from merge * more fixes revert * FW_RE -> FW_PATTERN * this can actually be set * conventions * just add * convention * refactor matcher, this brings it more in line with Hyundai. IMPORTANT NOTE: NOTE THAT WE remove the separation for the different platform code model year hint ranges, I don't see that being a problem * better/smaller test * add test to catch overlapping platform codes * remove nb * not now --------- Co-authored-by: Shane Smiskol --- .../car/ford/tests/print_platform_codes.py | 30 +++++ selfdrive/car/ford/tests/test_ford.py | 111 ++++++++++++++---- selfdrive/car/ford/values.py | 75 +++++++++++- 3 files changed, 193 insertions(+), 23 deletions(-) create mode 100755 selfdrive/car/ford/tests/print_platform_codes.py diff --git a/selfdrive/car/ford/tests/print_platform_codes.py b/selfdrive/car/ford/tests/print_platform_codes.py new file mode 100755 index 0000000000..670199980a --- /dev/null +++ b/selfdrive/car/ford/tests/print_platform_codes.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python3 +from collections import defaultdict + +from cereal import car +from openpilot.selfdrive.car.ford.values import get_platform_codes +from openpilot.selfdrive.car.ford.fingerprints import FW_VERSIONS + +Ecu = car.CarParams.Ecu +ECU_NAME = {v: k for k, v in Ecu.schema.enumerants.items()} + + +if __name__ == "__main__": + cars_for_code: defaultdict = defaultdict(lambda: defaultdict(set)) + + for car_model, ecus in FW_VERSIONS.items(): + print(car_model) + for ecu in sorted(ecus, key=lambda x: int(x[0])): + platform_codes = get_platform_codes(ecus[ecu]) + for code in platform_codes: + cars_for_code[ecu][code].add(car_model) + + print(f' (Ecu.{ECU_NAME[ecu[0]]}, {hex(ecu[1])}, {ecu[2]}):') + print(f' Codes: {sorted(platform_codes)}') + print() + + print('\nCar models vs. platform codes:') + for ecu, codes in cars_for_code.items(): + print(f' (Ecu.{ECU_NAME[ecu[0]]}, {hex(ecu[1])}, {ecu[2]}):') + for code, cars in codes.items(): + print(f' {code!r}: {sorted(map(str, cars))}') diff --git a/selfdrive/car/ford/tests/test_ford.py b/selfdrive/car/ford/tests/test_ford.py index 2ad3f5db1b..5d7b2c3332 100755 --- a/selfdrive/car/ford/tests/test_ford.py +++ b/selfdrive/car/ford/tests/test_ford.py @@ -1,12 +1,15 @@ #!/usr/bin/env python3 +import random import unittest -from parameterized import parameterized from collections.abc import Iterable import capnp +from hypothesis import settings, given, strategies as st +from parameterized import parameterized from cereal import car -from openpilot.selfdrive.car.ford.values import FW_QUERY_CONFIG +from openpilot.selfdrive.car.fw_versions import build_fw_dict +from openpilot.selfdrive.car.ford.values import CAR, FW_QUERY_CONFIG, FW_PATTERN, get_platform_codes from openpilot.selfdrive.car.ford.fingerprints import FW_VERSIONS Ecu = car.CarParams.Ecu @@ -23,7 +26,7 @@ ECU_ADDRESSES = { } -ECU_FW_CORE = { +ECU_PART_NUMBER = { Ecu.eps: [ b"14D003", ], @@ -37,9 +40,6 @@ ECU_FW_CORE = { b"14F397", # Ford Q3 b"14H102", # Ford Q4 ], - Ecu.engine: [ - b"14C204", - ], } @@ -53,29 +53,96 @@ class TestFordFW(unittest.TestCase): @parameterized.expand(FW_VERSIONS.items()) def test_fw_versions(self, car_model: str, fw_versions: dict[tuple[capnp.lib.capnp._EnumModule, int, int | None], Iterable[bytes]]): for (ecu, addr, subaddr), fws in fw_versions.items(): - self.assertIn(ecu, ECU_FW_CORE, "Unexpected ECU") + self.assertIn(ecu, ECU_PART_NUMBER, "Unexpected ECU") self.assertEqual(addr, ECU_ADDRESSES[ecu], "ECU address mismatch") self.assertIsNone(subaddr, "Unexpected ECU subaddress") - # Software part number takes the form: PREFIX-CORE-SUFFIX - # Prefix changes based on the family of part. It includes the model year - # and likely the platform. - # Core identifies the type of the item (e.g. 14D003 = PSCM, 14C204 = PCM). - # Suffix specifies the version of the part. -AA would be followed by -AB. - # Small increments in the suffix are usually compatible. - # Details: https://forscan.org/forum/viewtopic.php?p=70008#p70008 for fw in fws: self.assertEqual(len(fw), 24, "Expected ECU response to be 24 bytes") - # TODO: parse with regex, don't need detailed error message - fw_parts = fw.rstrip(b'\x00').split(b'-') - self.assertEqual(len(fw_parts), 3, "Expected FW to be in format: prefix-core-suffix") + match = FW_PATTERN.match(fw) + self.assertIsNotNone(match, f"Unable to parse FW: {fw!r}") + if match: + part_number = match.group("part_number") + self.assertIn(part_number, ECU_PART_NUMBER[ecu], f"Unexpected part number for {fw!r}") - prefix, core, suffix = fw_parts - self.assertEqual(len(prefix), 4, "Expected FW prefix to be 4 characters") - self.assertIn(len(core), (5, 6), "Expected FW core to be 5-6 characters") - self.assertIn(core, ECU_FW_CORE[ecu], f"Unexpected FW core for {ecu}") - self.assertIn(len(suffix), (2, 3), "Expected FW suffix to be 2-3 characters") + codes = get_platform_codes([fw]) + self.assertEqual(1, len(codes), f"Unable to parse FW: {fw!r}") + + @settings(max_examples=100) + @given(data=st.data()) + def test_platform_codes_fuzzy_fw(self, data): + """Ensure function doesn't raise an exception""" + fw_strategy = st.lists(st.binary()) + fws = data.draw(fw_strategy) + get_platform_codes(fws) + + def test_platform_codes_spot_check(self): + # Asserts basic platform code parsing behavior for a few cases + results = get_platform_codes([ + b"JX6A-14C204-BPL\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"NZ6T-14F397-AC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"PJ6T-14H102-ABJ\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"LB5A-14C204-EAC\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ]) + self.assertEqual(results, {(b"X6A", b"J"), (b"Z6T", b"N"), (b"J6T", b"P"), (b"B5A", b"L")}) + + def test_fuzzy_match(self): + for platform, fw_by_addr in FW_VERSIONS.items(): + # Ensure there's no overlaps in platform codes + for _ in range(20): + car_fw = [] + for ecu, fw_versions in fw_by_addr.items(): + ecu_name, addr, sub_addr = ecu + fw = random.choice(fw_versions) + car_fw.append({"ecu": ecu_name, "fwVersion": fw, "address": addr, + "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), CP.carVin, FW_VERSIONS) + self.assertEqual(matches, {platform}) + + def test_match_fw_fuzzy(self): + offline_fw = { + (Ecu.eps, 0x730, None): [ + b"L1MC-14D003-AJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"L1MC-14D003-AL\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + (Ecu.abs, 0x760, None): [ + b"L1MC-2D053-BA\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + (Ecu.fwdRadar, 0x764, None): [ + b"LB5T-14D049-AB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"LB5T-14D049-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + # We consider all model year hints for ECU, even with different platform codes + (Ecu.fwdCamera, 0x706, None): [ + b"LB5T-14F397-AD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + b"NC5T-14F397-AF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + ], + } + expected_fingerprint = CAR.FORD_EXPLORER_MK6 + + # ensure that we fuzzy match on all non-exact FW with changed revisions + live_fw = { + (0x730, None): {b"L1MC-14D003-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x760, None): {b"L1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x764, None): {b"LB5T-14D049-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + (0x706, None): {b"LB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"}, + } + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw}) + self.assertEqual(candidates, {expected_fingerprint}) + + # model year hint in between the range should match + live_fw[(0x706, None)] = {b"MB5T-14F397-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"} + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw,}) + self.assertEqual(candidates, {expected_fingerprint}) + + # unseen model year hint should not match + live_fw[(0x760, None)] = {b"M1MC-2D053-XX\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"} + candidates = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fw, '', {expected_fingerprint: offline_fw}) + self.assertEqual(len(candidates), 0, "Should not match new model year hint") if __name__ == "__main__": diff --git a/selfdrive/car/ford/values.py b/selfdrive/car/ford/values.py index a5494c921c..b1868bfa9b 100644 --- a/selfdrive/car/ford/values.py +++ b/selfdrive/car/ford/values.py @@ -1,4 +1,5 @@ import copy +import re from dataclasses import dataclass, field, replace from enum import Enum, IntFlag @@ -7,7 +8,7 @@ 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, CarDocs, CarParts, Column, \ Device -from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, StdQueries, p16 +from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, LiveFwVersions, OfflineFwVersions, Request, StdQueries, p16 Ecu = car.CarParams.Ecu @@ -143,6 +144,76 @@ class CAR(Platforms): ) +# FW response contains a combined software and part number +# A-Z except no I, O or W +# e.g. NZ6A-14C204-AAA +# 1222-333333-444 +# 1 = Model year hint (approximates model year/generation) +# 2 = Platform hint +# 3 = Part number +# 4 = Software version +FW_ALPHABET = b'A-HJ-NP-VX-Z' +FW_PATTERN = re.compile(b'^(?P[' + FW_ALPHABET + b'])' + + b'(?P[0-9' + FW_ALPHABET + b']{3})-' + + b'(?P[0-9' + FW_ALPHABET + b']{5,6})-' + + b'(?P[' + FW_ALPHABET + b']{2,})\x00*$') + + +def get_platform_codes(fw_versions: list[bytes] | set[bytes]) -> set[tuple[bytes, bytes]]: + codes = set() + for fw in fw_versions: + match = FW_PATTERN.match(fw) + if match is not None: + codes.add((match.group('platform_hint'), match.group('model_year_hint'))) + + return codes + + +def match_fw_to_car_fuzzy(live_fw_versions: LiveFwVersions, vin: str, offline_fw_versions: OfflineFwVersions) -> set[str]: + candidates: set[str] = set() + + for candidate, fws in offline_fw_versions.items(): + # Keep track of ECUs which pass all checks (platform hint, within model year hint range) + valid_found_ecus = set() + valid_expected_ecus = {ecu[1:] for ecu in fws if ecu[0] in PLATFORM_CODE_ECUS} + for ecu, expected_versions in fws.items(): + addr = ecu[1:] + # Only check ECUs expected to have platform codes + if ecu[0] not in PLATFORM_CODE_ECUS: + continue + + # Expected platform codes & model year hints + codes = get_platform_codes(expected_versions) + expected_platform_codes = {code for code, _ in codes} + expected_model_year_hints = {model_year_hint for _, model_year_hint in codes} + + # Found platform codes & model year hints + codes = get_platform_codes(live_fw_versions.get(addr, set())) + found_platform_codes = {code for code, _ in codes} + found_model_year_hints = {model_year_hint for _, model_year_hint in codes} + + # Check platform code matches for any found versions + if not any(found_platform_code in expected_platform_codes for found_platform_code in found_platform_codes): + break + + # Check any model year hint within range in the database. Note that some models have more than one + # platform code per ECU which we don't consider as separate ranges + if not any(min(expected_model_year_hints) <= found_model_year_hint <= max(expected_model_year_hints) for + found_model_year_hint in found_model_year_hints): + break + + valid_found_ecus.add(addr) + + # If all live ECUs pass all checks for candidate, add it as a match + if valid_expected_ecus.issubset(valid_found_ecus): + candidates.add(candidate) + + return candidates + + +# All of these ECUs must be present and are expected to have platform codes we can match +PLATFORM_CODE_ECUS = (Ecu.abs, Ecu.fwdCamera, Ecu.fwdRadar, Ecu.eps) + DATA_IDENTIFIER_FORD_ASBUILT = 0xDE00 ASBUILT_BLOCKS: list[tuple[int, list]] = [ @@ -201,6 +272,8 @@ FW_QUERY_CONFIG = FwQueryConfig( (Ecu.shiftByWire, 0x732, None), # Gear Shift Module (Ecu.debug, 0x7d0, None), # Accessory Protocol Interface Module ], + # Custom fuzzy fingerprinting function using platform and model year hints + match_fw_to_car_fuzzy=match_fw_to_car_fuzzy, ) DBC = CAR.create_dbc_map() From 71832d651a8bbb23707df8c2001883c32af22876 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 7 May 2024 20:33:09 -0700 Subject: [PATCH 899/923] Revert "agnos 10.1 (#32348)" This reverts commit d0e5f42b684171854edc0ab8d4eef8c38aadbc78. --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index 81578aff01..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="10.1" + 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 46611505c4..cc3f6bb830 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -1,10 +1,10 @@ [ { "name": "boot", - "url": "https://commadist.azureedge.net/agnosupdate/boot-5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f.img.xz", - "hash": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", - "hash_raw": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", - "size": 16029696, + "url": "https://commadist.azureedge.net/agnosupdate/boot-543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1.img.xz", + "hash": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", + "hash_raw": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", + "size": 15636480, "sparse": false, "full_check": true, "has_ab": true @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be.img.xz", - "hash": "9cc5c01c3455fb24d0a2651acf94a66e3f3de9edf45175621db854cb57ddaa29", - "hash_raw": "327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be", + "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": "782850019153a72451874ee3d7655ded15606f63ca08a786b81b7d78938fcc55", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-327fc30fd004eba86e9d6f25d8401738ee73b6001b9cee8358d578bd822192be.img.xz", - "size": 4548040748 + "hash": "283e5e754593c6e1bb5e9d63b54624cda5475b88bc1b130fe6ab13acdbd966e2", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", + "size": 4548070712 } } ] \ No newline at end of file From 2d838f95dabb0229dba01cd585d852e7ca5d47ff Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 7 May 2024 21:36:04 -0700 Subject: [PATCH 900/923] boardd: add debug flag for injecting SPI errors (#32346) * pull out ll first * errors --------- Co-authored-by: Comma Device --- selfdrive/boardd/panda_comms.h | 1 + selfdrive/boardd/spi.cc | 34 ++++++++++++++++++++++++++++---- selfdrive/debug/check_timings.py | 2 +- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/selfdrive/boardd/panda_comms.h b/selfdrive/boardd/panda_comms.h index e61d25402f..6b64768c17 100644 --- a/selfdrive/boardd/panda_comms.h +++ b/selfdrive/boardd/panda_comms.h @@ -78,5 +78,6 @@ private: int bulk_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t rx_len, unsigned int timeout); int spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len, unsigned int timeout); int spi_transfer_retry(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len, unsigned int timeout); + int lltransfer(spi_ioc_transfer &t); }; #endif diff --git a/selfdrive/boardd/spi.cc b/selfdrive/boardd/spi.cc index d11e955c49..e02252018f 100644 --- a/selfdrive/boardd/spi.cc +++ b/selfdrive/boardd/spi.cc @@ -268,7 +268,7 @@ int PandaSpiHandle::wait_for_ack(uint8_t ack, uint8_t tx, unsigned int timeout, tx_buf[0] = tx; while (true) { - int ret = util::safe_ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); + int ret = lltransfer(transfer); if (ret < 0) { LOGE("SPI: failed to send ACK request"); return ret; @@ -291,6 +291,32 @@ int PandaSpiHandle::wait_for_ack(uint8_t ack, uint8_t tx, unsigned int timeout, return 0; } +int PandaSpiHandle::lltransfer(spi_ioc_transfer &t) { + static const double err_prob = std::stod(util::getenv("SPI_ERR_PROB", "-1")); + + if (err_prob > 0) { + if ((static_cast(rand()) / RAND_MAX) < err_prob) { + printf("transfer len error\n"); + t.len = rand() % SPI_BUF_SIZE; + } + if ((static_cast(rand()) / RAND_MAX) < err_prob && t.tx_buf != (uint64_t)NULL) { + printf("corrupting TX\n"); + memset((uint8_t*)t.tx_buf, (uint8_t)(rand() % 256), rand() % (t.len+1)); + } + } + + int ret = util::safe_ioctl(spi_fd, SPI_IOC_MESSAGE(1), &t); + + if (err_prob > 0) { + if ((static_cast(rand()) / RAND_MAX) < err_prob && t.rx_buf != (uint64_t)NULL) { + printf("corrupting RX\n"); + memset((uint8_t*)t.rx_buf, (uint8_t)(rand() % 256), rand() % (t.len+1)); + } + } + + return ret; +} + int PandaSpiHandle::spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx_len, uint8_t *rx_data, uint16_t max_rx_len, unsigned int timeout) { int ret; uint16_t rx_data_len; @@ -316,7 +342,7 @@ int PandaSpiHandle::spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx memcpy(tx_buf, &header, sizeof(header)); add_checksum(tx_buf, sizeof(header)); transfer.len = sizeof(header) + 1; - ret = util::safe_ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); + ret = lltransfer(transfer); if (ret < 0) { LOGE("SPI: failed to send header"); goto transfer_fail; @@ -334,7 +360,7 @@ int PandaSpiHandle::spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx } add_checksum(tx_buf, tx_len); transfer.len = tx_len + 1; - ret = util::safe_ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); + ret = lltransfer(transfer); if (ret < 0) { LOGE("SPI: failed to send data"); goto transfer_fail; @@ -355,7 +381,7 @@ int PandaSpiHandle::spi_transfer(uint8_t endpoint, uint8_t *tx_data, uint16_t tx transfer.len = rx_data_len + 1; transfer.rx_buf = (uint64_t)(rx_buf + 2 + 1); - ret = util::safe_ioctl(spi_fd, SPI_IOC_MESSAGE(1), &transfer); + ret = lltransfer(transfer); if (ret < 0) { LOGE("SPI: failed to read rx data"); goto transfer_fail; diff --git a/selfdrive/debug/check_timings.py b/selfdrive/debug/check_timings.py index 3de6b8eb66..24c467659d 100755 --- a/selfdrive/debug/check_timings.py +++ b/selfdrive/debug/check_timings.py @@ -21,5 +21,5 @@ if __name__ == "__main__": if len(ts[s]) > 2: d = np.diff(ts[s]) - print(f"{s:25} {np.mean(d):.2f} {np.std(d):.2f} {np.max(d):.2f} {np.min(d):.2f}") + print(f"{s:25} {np.mean(d):7.2f} {np.std(d):7.2f} {np.max(d):7.2f} {np.min(d):7.2f}") time.sleep(1) From 7ab39fb92c38987517350b8a5826982c6d8520b1 Mon Sep 17 00:00:00 2001 From: andreasdamm Date: Tue, 7 May 2024 22:49:52 -0600 Subject: [PATCH 901/923] Added ECU FW version for 2021 Lincoln Aviator Black Label Grand Touring (#32361) --- selfdrive/car/ford/fingerprints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/car/ford/fingerprints.py b/selfdrive/car/ford/fingerprints.py index 4dcf2a65fd..2201072fa3 100644 --- a/selfdrive/car/ford/fingerprints.py +++ b/selfdrive/car/ford/fingerprints.py @@ -61,6 +61,7 @@ FW_VERSIONS = { b'L1MC-2D053-BB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'L1MC-2D053-BD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'L1MC-2D053-BF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', + b'L1MC-2D053-BJ\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', b'L1MC-2D053-KB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x764, None): [ From c0633953121059b80bd942b5c54311bd9fe08def Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 9 May 2024 01:18:43 +0800 Subject: [PATCH 902/923] util: remove unused functions (#32372) cleanup --- common/util.cc | 22 ---------------------- common/util.h | 6 ------ 2 files changed, 28 deletions(-) diff --git a/common/util.cc b/common/util.cc index b6097bf28f..5ffd6e4099 100644 --- a/common/util.cc +++ b/common/util.cc @@ -246,12 +246,6 @@ std::string random_string(std::string::size_type length) { return s; } -std::string dir_name(std::string const &path) { - size_t pos = path.find_last_of("/"); - if (pos == std::string::npos) return ""; - return path.substr(0, pos); -} - bool starts_with(const std::string &s1, const std::string &s2) { return strncmp(s1.c_str(), s2.c_str(), s2.size()) == 0; } @@ -277,20 +271,4 @@ std::string check_output(const std::string& command) { return result; } -struct tm get_time() { - time_t rawtime; - time(&rawtime); - - struct tm sys_time; - gmtime_r(&rawtime, &sys_time); - - return sys_time; -} - -bool time_valid(struct tm sys_time) { - int year = 1900 + sys_time.tm_year; - int month = 1 + sys_time.tm_mon; - return (year > 2023) || (year == 2023 && month >= 6); -} - } // namespace util diff --git a/common/util.h b/common/util.h index 0e8bcd56bf..186873ac21 100644 --- a/common/util.h +++ b/common/util.h @@ -8,7 +8,6 @@ #include #include #include -#include #include #include #include @@ -45,10 +44,6 @@ int set_realtime_priority(int level); int set_core_affinity(std::vector cores); int set_file_descriptor_limit(uint64_t limit); -// ***** Time helpers ***** -struct tm get_time(); -bool time_valid(struct tm sys_time); - // ***** math helpers ***** // map x from [a1, a2] to [b1, b2] @@ -75,7 +70,6 @@ int getenv(const char* key, int default_val); 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 &s, const std::string &suffix); From adf52c7355222b994e932226b43c9ed434f7e6ea Mon Sep 17 00:00:00 2001 From: young <44352170+thftgr@users.noreply.github.com> Date: Thu, 9 May 2024 05:35:32 +0900 Subject: [PATCH 903/923] Kia: add missing K8 Hybrid 2024 FW (#32259) add kia k8 hev 2024 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 77a04a7aaf..0c43b8e340 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -1133,6 +1133,7 @@ FW_VERSIONS = { CAR.KIA_K8_HEV_1ST_GEN: { (Ecu.fwdCamera, 0x7c4, None): [ b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.03 99211-L8000 210907', + b'\xf1\x00GL3HMFC AT KOR LHD 1.00 1.04 99211-L8000 230207', ], (Ecu.fwdRadar, 0x7d0, None): [ b'\xf1\x00GL3_ RDR ----- 1.00 1.02 99110-L8000 ', From 93fa207c5cafa908a15dd460025c005ee7cf1746 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Wed, 8 May 2024 17:38:08 -0400 Subject: [PATCH 904/923] VW: raise minimum steering speed to fix a fault (#31450) * VW: Steer to zero, for large values of zero * ah, the joy of floating point * comment, style * actually fix floating point issue * follow PlatformConfig refactor * this check is not useful after PlatformConfig * don't really need that * work around docs assert * little better * one comment * update refs --------- Co-authored-by: Shane Smiskol --- selfdrive/car/docs_definitions.py | 2 +- selfdrive/car/volkswagen/interface.py | 4 ++-- selfdrive/car/volkswagen/values.py | 6 ++++++ selfdrive/test/process_replay/ref_commit | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index bb1ca6bd42..b66d2a16e0 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -266,7 +266,7 @@ class CarDocs: # 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 CarDocs and CarParams" + assert CP.minSteerSpeed < 0.5, f"{CP.carFingerprint}: Minimum steer speed set in both CarDocs and CarParams" else: self.min_steer_speed = CP.minSteerSpeed diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 83a8cde9a8..91cd300e92 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -2,7 +2,7 @@ from cereal import car from panda import Panda from openpilot.selfdrive.car import get_safety_config from openpilot.selfdrive.car.interfaces import CarInterfaceBase -from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags +from openpilot.selfdrive.car.volkswagen.values import CAR, CANBUS, CarControllerParams, NetworkLocation, TransmissionType, GearShifter, VolkswagenFlags ButtonType = car.CarState.ButtonEvent.Type EventName = car.CarEvent.EventName @@ -111,7 +111,7 @@ class CarInterface(CarInterfaceBase): enable_buttons=(ButtonType.setCruise, ButtonType.resumeCruise)) # Low speed steer alert hysteresis logic - if self.CP.minSteerSpeed > 0. and ret.vEgo < (self.CP.minSteerSpeed + 1.): + if (self.CP.minSteerSpeed - 1e-3) > CarControllerParams.DEFAULT_MIN_STEER_SPEED and ret.vEgo < (self.CP.minSteerSpeed + 1.): self.low_speed_alert = True elif ret.vEgo > (self.CP.minSteerSpeed + 2.): self.low_speed_alert = False diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index a0d38d1b57..d25c52f225 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -34,6 +34,8 @@ class CarControllerParams: STEER_TIME_ALERT = STEER_TIME_MAX - 10 # If mitigation fails, time to soft disengage before EPS timer expires STEER_TIME_STUCK_TORQUE = 1.9 # EPS limits same torque to 6 seconds, reset timer 3x within that period + DEFAULT_MIN_STEER_SPEED = 0.4 # m/s, newer EPS racks fault below this speed, don't show a low speed alert + ACCEL_MAX = 2.0 # 2.0 m/s max acceleration ACCEL_MIN = -3.5 # 3.5 m/s max deceleration @@ -159,6 +161,7 @@ class VolkswagenPQPlatformConfig(VolkswagenMQBPlatformConfig): class VolkswagenCarSpecs(CarSpecs): centerToFrontRatio: float = 0.45 steerRatio: float = 15.6 + minSteerSpeed: float = CarControllerParams.DEFAULT_MIN_STEER_SPEED class Footnote(Enum): @@ -195,6 +198,9 @@ class VWCarDocs(CarDocs): if CP.carFingerprint in (CAR.VOLKSWAGEN_CRAFTER_MK2, CAR.VOLKSWAGEN_TRANSPORTER_T61): self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) + if abs(CP.minSteerSpeed - CarControllerParams.DEFAULT_MIN_STEER_SPEED) < 1e-3: + self.min_steer_speed = 0 + # 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 diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 4e24f8eb29..a0d3cc6bb2 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -692a21e4a722d91086998b532ca6759a3f85c345 +685a2bb9aacdd790e26d14aa49d3792c3ed65125 \ No newline at end of file From 451a38ddee4d54d2d9b06fe6d8cef8ef09c6b1cf Mon Sep 17 00:00:00 2001 From: YI418LT <135338253+YI418LT@users.noreply.github.com> Date: Thu, 9 May 2024 07:19:06 +0900 Subject: [PATCH 905/923] Honda: add missing FW for Civic Hatchback 2020 (Type R Japanese model) (#32305) * Update fingerprints.py * 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 55bd8b7aec..052b4b60a3 100644 --- a/selfdrive/car/honda/fingerprints.py +++ b/selfdrive/car/honda/fingerprints.py @@ -295,6 +295,7 @@ FW_VERSIONS = { b'37805-5BB-L540\x00\x00', b'37805-5BB-L630\x00\x00', b'37805-5BB-L640\x00\x00', + b'37805-5BF-J130\x00\x00', ], (Ecu.transmission, 0x18da1ef1, None): [ b'28101-5CG-A920\x00\x00', @@ -328,6 +329,7 @@ FW_VERSIONS = { b'57114-TGG-G320\x00\x00', b'57114-TGG-L320\x00\x00', b'57114-TGG-L330\x00\x00', + b'57114-TGH-L130\x00\x00', b'57114-TGK-T320\x00\x00', b'57114-TGL-G330\x00\x00', ], @@ -341,6 +343,7 @@ FW_VERSIONS = { b'39990-TGG-A020\x00\x00', b'39990-TGG-A120\x00\x00', b'39990-TGG-J510\x00\x00', + b'39990-TGH-J530\x00\x00', b'39990-TGL-E130\x00\x00', b'39990-TGN-E120\x00\x00', ], @@ -355,6 +358,7 @@ FW_VERSIONS = { b'77959-TGG-G110\x00\x00', b'77959-TGG-J320\x00\x00', b'77959-TGG-Z820\x00\x00', + b'77959-TGH-J110\x00\x00', ], (Ecu.fwdRadar, 0x18dab0f1, None): [ b'36802-TBA-A150\x00\x00', @@ -366,6 +370,7 @@ FW_VERSIONS = { b'36802-TGG-A130\x00\x00', b'36802-TGG-G040\x00\x00', b'36802-TGG-G130\x00\x00', + b'36802-TGH-A140\x00\x00', b'36802-TGK-Q120\x00\x00', b'36802-TGL-G040\x00\x00', ], @@ -380,6 +385,7 @@ FW_VERSIONS = { b'36161-TGG-G070\x00\x00', b'36161-TGG-G130\x00\x00', b'36161-TGG-G140\x00\x00', + b'36161-TGH-A140\x00\x00', b'36161-TGK-Q120\x00\x00', b'36161-TGL-G050\x00\x00', b'36161-TGL-G070\x00\x00', @@ -387,6 +393,7 @@ FW_VERSIONS = { (Ecu.gateway, 0x18daeff1, None): [ b'38897-TBA-A020\x00\x00', b'38897-TBA-A110\x00\x00', + b'38897-TGH-A010\x00\x00', ], (Ecu.electricBrakeBooster, 0x18da2bf1, None): [ b'39494-TGL-G030\x00\x00', From fe4c7f1499e3ce70eb1ec614ae8ea370415ed802 Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Wed, 8 May 2024 18:34:16 -0400 Subject: [PATCH 906/923] VW MQB: Add FW for 2022 CUPRA Ateca (#32318) * VW MQB: Add FW for 2022 SEAT Ateca * extend Ateca supported model-years * CUPRA Ateca available from 2018 * regen CARS.md * wrong model year format --- docs/CARS.md | 5 +++-- selfdrive/car/volkswagen/fingerprints.py | 5 +++++ selfdrive/car/volkswagen/values.py | 3 ++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 6cf224d135..7e5324d322 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. -# 285 Supported Cars +# 286 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -29,6 +29,7 @@ A supported vehicle is one that just works when you install a comma device. All |Chrysler|Pacifica Hybrid 2018|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 Hybrid 2019-23|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
|| |comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None|| +|CUPRA|Ateca 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
|| |Dodge|Durango 2020-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
|| |Ford|Bronco Sport 2021-23|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|Escape 2020-22|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 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -192,7 +193,7 @@ 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,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|Ateca 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
|| |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)
|| diff --git a/selfdrive/car/volkswagen/fingerprints.py b/selfdrive/car/volkswagen/fingerprints.py index def5ce6e03..e20fa4fc1c 100644 --- a/selfdrive/car/volkswagen/fingerprints.py +++ b/selfdrive/car/volkswagen/fingerprints.py @@ -891,6 +891,7 @@ FW_VERSIONS = { b'\xf1\x8704L906056CR\xf1\x892181', b'\xf1\x8704L906056CR\xf1\x892797', b'\xf1\x8705E906018AS\xf1\x899596', + b'\xf1\x8781A906259B \xf1\x890003', b'\xf1\x878V0906264H \xf1\x890005', b'\xf1\x878V0907115E \xf1\x890002', ], @@ -900,6 +901,7 @@ FW_VERSIONS = { b'\xf1\x870CW300050J \xf1\x891908', b'\xf1\x870D9300014S \xf1\x895202', b'\xf1\x870D9300042M \xf1\x895016', + b'\xf1\x870GC300014P \xf1\x892801', b'\xf1\x870GC300043A \xf1\x892304', ], (Ecu.srs, 0x715, None): [ @@ -910,6 +912,7 @@ FW_VERSIONS = { b'\xf1\x873Q0959655BH\xf1\x890703\xf1\x82\x0e1312001313001305171311052900', b'\xf1\x873Q0959655BH\xf1\x890712\xf1\x82\x0e1312001313001305171311052900', b'\xf1\x873Q0959655CM\xf1\x890720\xf1\x82\x0e1312001313001305171311052900', + b'\xf1\x875QF959655AT\xf1\x890755\xf1\x82\x1311110011110011111100110200--1113121149', ], (Ecu.eps, 0x712, None): [ b'\xf1\x873Q0909144L \xf1\x895081\xf1\x82\x0571N60511A1', @@ -918,8 +921,10 @@ FW_VERSIONS = { b'\xf1\x875Q0909144P \xf1\x891043\xf1\x82\x0511N01805A0', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N01309A1', b'\xf1\x875Q0909144T \xf1\x891072\xf1\x82\x0521N05808A1', + b'\xf1\x875WA907145M \xf1\x891051\xf1\x82\x0013N619137N', ], (Ecu.fwdRadar, 0x757, None): [ + b'\xf1\x872Q0907572AA\xf1\x890396', b'\xf1\x872Q0907572M \xf1\x890233', b'\xf1\x875Q0907572B \xf1\x890200\xf1\x82\x0101', b'\xf1\x875Q0907572H \xf1\x890620', diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index d25c52f225..2ea169d1c6 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -378,7 +378,8 @@ class CAR(Platforms): ) SEAT_ATECA_MK1 = VolkswagenMQBPlatformConfig( [ - VWCarDocs("SEAT Ateca 2018"), + VWCarDocs("CUPRA Ateca 2018-23"), + VWCarDocs("SEAT Ateca 2016-23"), VWCarDocs("SEAT Leon 2014-20"), ], VolkswagenCarSpecs(mass=1300, wheelbase=2.64), From b895095031918dd092061481a9212acda5368c8f Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 8 May 2024 15:58:27 -0700 Subject: [PATCH 907/923] Cleanup auto_fingerprints.py (#32377) * messyyy * super clean car wash * rm --- tools/car_porting/auto_fingerprint.py | 60 +++++++-------------------- 1 file changed, 15 insertions(+), 45 deletions(-) diff --git a/tools/car_porting/auto_fingerprint.py b/tools/car_porting/auto_fingerprint.py index 0a6b602a15..145f38c63f 100755 --- a/tools/car_porting/auto_fingerprint.py +++ b/tools/car_porting/auto_fingerprint.py @@ -4,67 +4,37 @@ import argparse from collections import defaultdict from openpilot.selfdrive.debug.format_fingerprints import format_brand_fw_versions -from openpilot.selfdrive.car.fw_versions import match_fw_to_car -from openpilot.selfdrive.car.interfaces import get_interface_attr +from openpilot.selfdrive.car.fingerprints import MIGRATION +from openpilot.selfdrive.car.fw_versions import MODEL_TO_BRAND, match_fw_to_car from openpilot.tools.lib.logreader import LogReader, ReadMode - -ALL_FW_VERSIONS = get_interface_attr("FW_VERSIONS") -ALL_CARS = get_interface_attr("CAR") - -PLATFORM_TO_PYTHON_CAR_NAME = {brand: {car.value: car.name for car in ALL_CARS[brand]} for brand in ALL_CARS} -BRAND_TO_PLATFORMS = {brand: [car.value for car in ALL_CARS[brand]] for brand in ALL_CARS} -PLATFORM_TO_BRAND = dict(sum([[(platform, brand) for platform in BRAND_TO_PLATFORMS[brand]] for brand in BRAND_TO_PLATFORMS], [])) - - if __name__ == "__main__": parser = argparse.ArgumentParser(description="Auto fingerprint from a route") parser.add_argument("route", help="The route name to use") - parser.add_argument("platform", help="The platform, or leave empty to auto-determine using fuzzy", default=None, nargs='?') + parser.add_argument("platform", help="The platform, or leave empty to auto-determine using fuzzy", default=None, nargs="?") args = parser.parse_args() lr = LogReader(args.route, ReadMode.QLOG) - - carFw = None - carVin = None - carPlatform = None - - platform: str | None = None - CP = lr.first("carParams") + assert CP is not None, "No carParams in route" - if CP is None: - raise Exception("No fw versions in the provided route...") + carPlatform = MIGRATION.get(CP.carFingerprint, CP.carFingerprint) - carFw = CP.carFw - carVin = CP.carVin - carPlatform = CP.carFingerprint - - if args.platform is None: # attempt to auto-determine platform with other fuzzy fingerprints - _, 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}") - - if carPlatform != "MOCK": - print("Using platform from route") - platform = carPlatform - else: - platform = None - else: - platform = list(possible_platforms)[0] - else: + if args.platform is not None: platform = args.platform + elif carPlatform != "MOCK": + platform = carPlatform + else: + _, matches = match_fw_to_car(CP.carFw, CP.carVin, log=False) + assert len(matches) == 1, f"Unable to auto-determine platform, matches: {matches}" + platform = list(matches)[0] - if platform is None: - raise Exception("unable to determine platform, try manually specifying the fingerprint.") - - print("Attempting to add fw version for: ", platform) + print("Attempting to add fw version for:", platform) fw_versions: dict[str, dict[tuple, list[bytes]]] = defaultdict(lambda: defaultdict(list)) - brand = PLATFORM_TO_BRAND[platform] + brand = MODEL_TO_BRAND[platform] - for fw in carFw: + for fw in CP.carFw: if fw.brand == brand and not fw.logging: addr = fw.address subAddr = None if fw.subAddress == 0 else fw.subAddress From 7ff66986c1a7bcfc9b459a5bb635a9f394cf2fa1 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 8 May 2024 16:51:27 -0700 Subject: [PATCH 908/923] agnos 10.1 (#32373) --- launch_env.sh | 2 +- system/hardware/tici/agnos.json | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/launch_env.sh b/launch_env.sh index bfc2e6ac6a..81578aff01 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="10" + export AGNOS_VERSION="10.1" fi export STAGING_ROOT="/data/safe_staging" diff --git a/system/hardware/tici/agnos.json b/system/hardware/tici/agnos.json index cc3f6bb830..b1862bdef9 100644 --- a/system/hardware/tici/agnos.json +++ b/system/hardware/tici/agnos.json @@ -1,10 +1,10 @@ [ { "name": "boot", - "url": "https://commadist.azureedge.net/agnosupdate/boot-543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1.img.xz", - "hash": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", - "hash_raw": "543fdc8aadf700f33a6e90740b8a227036bbd190626861d45ba1eb0d9ac422d1", - "size": 15636480, + "url": "https://commadist.azureedge.net/agnosupdate/boot-5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f.img.xz", + "hash": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", + "hash_raw": "5674ea6767e7198cf1e7def3de66a57061f001ed76d43dc4b4f84de545c53c6f", + "size": 16029696, "sparse": false, "full_check": true, "has_ab": true @@ -61,17 +61,17 @@ }, { "name": "system", - "url": "https://commadist.azureedge.net/agnosupdate/system-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", - "hash": "dc2f960631f02446d912885786922c27be4eb1ec6c202cacce6699d5a74021ba", - "hash_raw": "bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a", + "url": "https://commadist.azureedge.net/agnosupdate/system-1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a.img.xz", + "hash": "328e90c62068222dfd98f71dd3f6251fcb962f082b49c6be66ab2699f5db6f4f", + "hash_raw": "1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a", "size": 10737418240, "sparse": true, "full_check": false, "has_ab": true, "alt": { - "hash": "283e5e754593c6e1bb5e9d63b54624cda5475b88bc1b130fe6ab13acdbd966e2", - "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-bd2967074298a2686f81e2094db3867d7cb2605750d63b1a7309a923f6985b2a.img.xz", - "size": 4548070712 + "hash": "bc11d2148f29862ee1326aca2af1cf6bbf5fed831e3f8f6b8f7a0f110dfe8d26", + "url": "https://commadist.azureedge.net/agnosupdate/system-skip-chunks-1badfe72851628d6cf9200a53a6151bb4e797b49c717141409fc57138eae388a.img.xz", + "size": 4548070000 } } ] \ No newline at end of file From a83b182c552476dfda71784570916777135b3d4e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 8 May 2024 17:17:08 -0700 Subject: [PATCH 909/923] Volkswagen: improve fuzzy fingerprinting (#32378) * improve VW fuzzy FP matching * annotate * Revert "annotate" This reverts commit 09cbb150e91f5093849c22d95e31152fb8d4d1a9. * hmm --- selfdrive/car/volkswagen/tests/test_volkswagen.py | 9 +++++---- selfdrive/car/volkswagen/values.py | 15 +++++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/selfdrive/car/volkswagen/tests/test_volkswagen.py b/selfdrive/car/volkswagen/tests/test_volkswagen.py index 92569e194e..17331203bb 100755 --- a/selfdrive/car/volkswagen/tests/test_volkswagen.py +++ b/selfdrive/car/volkswagen/tests/test_volkswagen.py @@ -1,4 +1,5 @@ #!/usr/bin/env python3 +import random import re import unittest @@ -38,9 +39,9 @@ class TestVolkswagenPlatformConfigs(unittest.TestCase): 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] + all_radar_fw = list({fw for ecus in FW_VERSIONS.values() for fw in ecus[Ecu.fwdRadar, 0x757, None]}) + for platform in CAR: with self.subTest(platform=platform): for wmi in WMI: for chassis_code in platform.config.chassis_codes | {"00"}: @@ -50,9 +51,9 @@ class TestVolkswagenPlatformConfigs(unittest.TestCase): vin = "".join(vin) # Check a few FW cases - expected, unexpected - for radar_fw in expected_radar_fw + [b'\xf1\x877H9907572AA\xf1\x890396']: + for radar_fw in random.sample(all_radar_fw, 5) + [b'\xf1\x875Q0907572G \xf1\x890571', 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) + radar_fw in all_radar_fw) live_fws = {(0x757, None): [radar_fw]} matches = FW_QUERY_CONFIG.match_fw_to_car_fuzzy(live_fws, vin, FW_VERSIONS) diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 2ea169d1c6..eb537575fa 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -1,4 +1,4 @@ -from collections import namedtuple +from collections import defaultdict, namedtuple from dataclasses import dataclass, field from enum import Enum, IntFlag, StrEnum @@ -9,7 +9,7 @@ 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 -from openpilot.selfdrive.car.fw_query_definitions import FwQueryConfig, Request, p16 +from openpilot.selfdrive.car.fw_query_definitions import EcuAddrSubAddr, FwQueryConfig, Request, p16 Ecu = car.CarParams.Ecu NetworkLocation = car.CarParams.NetworkLocation @@ -434,19 +434,26 @@ class CAR(Platforms): def match_fw_to_car_fuzzy(live_fw_versions, vin, offline_fw_versions) -> set[str]: candidates = set() + # Compile all FW versions for each ECU + all_ecu_versions: dict[EcuAddrSubAddr, set[str]] = defaultdict(set) + for ecus in offline_fw_versions.values(): + for ecu, versions in ecus.items(): + all_ecu_versions[ecu] |= set(versions) + # 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(): + for ecu in offline_fw_versions[platform]: addr = ecu[1:] if ecu[0] not in CHECK_FUZZY_ECUS: continue - # Sanity check that a subset of Volkswagen FW is in the database + # Sanity check that live FW is in the superset of all FW, Volkswagen ECU part numbers are commonly shared found_versions = live_fw_versions.get(addr, []) + expected_versions = all_ecu_versions[ecu] if not any(found_version in expected_versions for found_version in found_versions): break From c53c90f7fac73a9ba7dad81bf9c349535651bf6d Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 8 May 2024 17:58:14 -0800 Subject: [PATCH 910/923] Bump submodules (#327) --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 78aca3ea81..2a2de7edc3 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 78aca3ea81fb131da51776315fbdd546d2b6987e +Subproject commit 2a2de7edc39baff6b10cb52ca7a8d97c7452dcb1 From 273a4f5ca9313673caadccf9e6910ab080f7f047 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Wed, 8 May 2024 20:05:03 -0700 Subject: [PATCH 911/923] Always-on DM: no audible alert at low speeds / block engagement if alert present (#32379) * min speed * cmments * no entry? * comment --- selfdrive/monitoring/dmonitoringd.py | 9 +++++---- selfdrive/monitoring/driver_monitor.py | 16 +++++++++++----- selfdrive/monitoring/test_monitoring.py | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/selfdrive/monitoring/dmonitoringd.py b/selfdrive/monitoring/dmonitoringd.py index 84a147bd47..c18bbf29b9 100755 --- a/selfdrive/monitoring/dmonitoringd.py +++ b/selfdrive/monitoring/dmonitoringd.py @@ -22,7 +22,7 @@ def dmonitoringd_thread(): v_cruise_last = 0 driver_engaged = False - # 10Hz <- dmonitoringmodeld + # 20Hz <- dmonitoringmodeld while True: sm.update() if not sm.updated['driverStateV2']: @@ -46,14 +46,15 @@ def dmonitoringd_thread(): if sm.all_checks() and len(sm['liveCalibration'].rpyCalib): driver_status.update_states(sm['driverStateV2'], sm['liveCalibration'].rpyCalib, sm['carState'].vEgo, sm['controlsState'].enabled) - # Block engaging after max number of distrations + # Block engaging after max number of distrations or when alert active if driver_status.terminal_alert_cnt >= driver_status.settings._MAX_TERMINAL_ALERTS or \ - driver_status.terminal_time >= driver_status.settings._MAX_TERMINAL_DURATION: + driver_status.terminal_time >= driver_status.settings._MAX_TERMINAL_DURATION or \ + driver_status.always_on and driver_status.awareness <= driver_status.threshold_prompt: events.add(car.CarEvent.EventName.tooDistracted) # Update events from driver state 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]) + sm['carState'].standstill, sm['carState'].gearShifter in [car.CarState.GearShifter.reverse, car.CarState.GearShifter.park], sm['carState'].vEgo) # build driverMonitoringState packet dat = messaging.new_message('driverMonitoringState', valid=sm.all_checks()) diff --git a/selfdrive/monitoring/driver_monitor.py b/selfdrive/monitoring/driver_monitor.py index 749931af77..7db0bd6c9f 100644 --- a/selfdrive/monitoring/driver_monitor.py +++ b/selfdrive/monitoring/driver_monitor.py @@ -55,6 +55,7 @@ class DRIVER_MONITOR_SETTINGS(): self._POSESTD_THRESHOLD = 0.3 self._HI_STD_FALLBACK_TIME = int(10 / self._DT_DMON) # fall back to wheel touch if model is uncertain for 10s self._DISTRACTED_FILTER_TS = 0.25 # 0.6Hz + self._ALWAYS_ON_ALERT_MIN_SPEED = 7 self._POSE_CALIB_MIN_SPEED = 13 # 30 mph self._POSE_OFFSET_MIN_COUNT = int(60 / self._DT_DMON) # valid data counts before calibration completes, 1min cumulative @@ -302,7 +303,7 @@ 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, wrong_gear): + def update_events(self, events, driver_engaged, ctrl_active, standstill, wrong_gear, car_speed): 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 \ @@ -327,14 +328,19 @@ class DriverStatus(): if self.awareness > self.threshold_prompt: 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 + _reaching_audible = self.awareness - self.step_change <= self.threshold_prompt + _reaching_terminal = self.awareness - self.step_change <= 0 + standstill_exemption = standstill and _reaching_audible + always_on_red_exemption = always_on_valid and not ctrl_active and _reaching_terminal + always_on_lowspeed_exemption = always_on_valid and not ctrl_active and car_speed < self.settings._ALWAYS_ON_ALERT_MIN_SPEED and _reaching_audible + 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 + # should always be counting if distracted unless at standstill (lowspeed for always-on) and reaching orange # also will not be reaching 0 if DM is active when not engaged - if not standstill_exemption and not always_on_red_exemption: + if not (standstill_exemption or always_on_red_exemption or always_on_lowspeed_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 39fef75479..50b2746e2d 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], 0) + DS.update_events(e, interaction[idx], engaged[idx], standstill[idx], 0, 0) events.append(e) assert len(events) == len(msgs), f"got {len(events)} for {len(msgs)} driverState input msgs" return events, DS From 2e6b2ef3c973549c5375684ba36f1b12372167a4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 8 May 2024 23:54:20 -0700 Subject: [PATCH 912/923] card: preparation (#32382) * card prep * also format --- selfdrive/car/card.py | 7 ++----- selfdrive/car/mock/interface.py | 1 + selfdrive/controls/controlsd.py | 4 ---- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/selfdrive/car/card.py b/selfdrive/car/card.py index 82335500d8..8d1ef70d62 100755 --- a/selfdrive/car/card.py +++ b/selfdrive/car/card.py @@ -15,7 +15,6 @@ from openpilot.selfdrive.boardd.boardd import can_list_to_can_capnp from openpilot.selfdrive.car.car_helpers import get_car, get_one_can from openpilot.selfdrive.car.interfaces import CarInterfaceBase - REPLAY = "REPLAY" in os.environ @@ -28,7 +27,7 @@ class CarD: self.sm = messaging.SubMaster(['pandaStates']) self.pm = messaging.PubMaster(['sendcan', 'carState', 'carParams', 'carOutput']) - self.can_rcv_timeout_counter = 0 # conseuctive timeout count + self.can_rcv_timeout_counter = 0 # consecutive timeout count self.can_rcv_cum_timeout_counter = 0 # cumulative timeout count self.CC_prev = car.CarControl.new_message() @@ -54,12 +53,11 @@ class CarD: if not disengage_on_accelerator: self.CP.alternativeExperience |= ALTERNATIVE_EXPERIENCE.DISABLE_DISENGAGE_ON_GAS - car_recognized = self.CP.carName != 'mock' openpilot_enabled_toggle = self.params.get_bool("OpenpilotEnabledToggle") controller_available = self.CI.CC is not None and openpilot_enabled_toggle and not self.CP.dashcamOnly - self.CP.passive = not car_recognized or not controller_available or self.CP.dashcamOnly + self.CP.passive = not controller_available or self.CP.dashcamOnly if self.CP.passive: safety_config = car.CarParams.SafetyConfig.new_message() safety_config.safetyModel = car.CarParams.SafetyModel.noOutput @@ -139,4 +137,3 @@ class CarD: self.pm.send('sendcan', can_list_to_can_capnp(can_sends, msgtype='sendcan', valid=self.CS.canValid)) self.CC_prev = CC - diff --git a/selfdrive/car/mock/interface.py b/selfdrive/car/mock/interface.py index 6100717a74..7506bab053 100755 --- a/selfdrive/car/mock/interface.py +++ b/selfdrive/car/mock/interface.py @@ -18,6 +18,7 @@ class CarInterface(CarInterfaceBase): ret.wheelbase = 2.70 ret.centerToFront = ret.wheelbase * 0.5 ret.steerRatio = 13. + ret.dashcamOnly = True return ret def _update(self, c): diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 35dad3f81a..725a433dc6 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -111,7 +111,6 @@ class Controls: if not self.CP.openpilotLongitudinalControl: self.params.remove("ExperimentalMode") - self.CC = car.CarControl.new_message() self.CS_prev = car.CarState.new_message() self.AM = AlertManager() self.events = Events() @@ -805,9 +804,6 @@ class Controls: cc_send.carControl = CC self.pm.send('carControl', cc_send) - # copy CarControl to pass to CarInterface on the next iteration - self.CC = CC - def step(self): start_time = time.monotonic() From ae6ef196e79d846aea7c943c12e4217a407e47fb Mon Sep 17 00:00:00 2001 From: devtekve Date: Thu, 9 May 2024 15:40:26 +0200 Subject: [PATCH 913/923] Add QStackedLayout to onroad_home.cc Added QStackedLayout to the includes in onroad_home.cc file. Not sure how it was compiling for others, but it wasn't working for me on m1 --- selfdrive/ui/qt/onroad/onroad_home.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/selfdrive/ui/qt/onroad/onroad_home.cc b/selfdrive/ui/qt/onroad/onroad_home.cc index 1c12a2c3a2..66eb1812e6 100644 --- a/selfdrive/ui/qt/onroad/onroad_home.cc +++ b/selfdrive/ui/qt/onroad/onroad_home.cc @@ -1,6 +1,7 @@ #include "selfdrive/ui/qt/onroad/onroad_home.h" #include +#include #ifdef ENABLE_MAPS #include "selfdrive/ui/qt/maps/map_helpers.h" From 0f8c4ed15533933f28c9560f72a5b1619b7e717e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 9 May 2024 10:39:58 -0800 Subject: [PATCH 914/923] Bump submodules (#329) --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 2a2de7edc3..09c31020f5 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 2a2de7edc39baff6b10cb52ca7a8d97c7452dcb1 +Subproject commit 09c31020f55d9cb700887e905ae2f535ad1007eb From f5171c34a93461b0eb22f53887a876f723c76eb8 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 9 May 2024 15:48:47 -0400 Subject: [PATCH 915/923] Bump panda --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index af4e7088a6..d1ea04f063 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit af4e7088a68f690c70dec17b48991ef98de426b5 +Subproject commit d1ea04f063f48c5010b15796066c487940ab25d2 From 59405443b56b31eb68c67c7525f6e6bd33aa3028 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 9 May 2024 12:09:05 -0800 Subject: [PATCH 916/923] Bump submodules (#330) --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 09c31020f5..f1978b8bb4 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 09c31020f55d9cb700887e905ae2f535ad1007eb +Subproject commit f1978b8bb4da356c9fe8007e434e6b5d98020e30 From 003d5ccf739dcc573add2e77609192a93270312d Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 9 May 2024 12:31:52 -0800 Subject: [PATCH 917/923] Bump submodules (#331) --- cereal | 2 +- opendbc | 2 +- panda | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cereal b/cereal index f1978b8bb4..60e93dd52d 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit f1978b8bb4da356c9fe8007e434e6b5d98020e30 +Subproject commit 60e93dd52d905aee47f79a7ccf703c9f1ab211b6 diff --git a/opendbc b/opendbc index b5271a35df..9876e5827d 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit b5271a35dfe262aeeecd36c402b2f1c2aad6920d +Subproject commit 9876e5827d32f5c40a236e1cc7ee0598b9bea285 diff --git a/panda b/panda index 19302c53d0..a6eb8dd7be 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 19302c53d00756e5e8c946441877a5528c0e36c3 +Subproject commit a6eb8dd7be07d066fcd72ec9ad82970fdf2db76e From d7715899cb3e91347ab6abe36cf961f11ef2c111 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sat, 11 May 2024 11:27:27 -0800 Subject: [PATCH 918/923] Bump submodules (#332) --- cereal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cereal b/cereal index 60e93dd52d..5ce28549ba 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 60e93dd52d905aee47f79a7ccf703c9f1ab211b6 +Subproject commit 5ce28549ba09cdf199f5a0edaf7dc8e9b8a53344 From e1e26c6b4f1b2ff1eaf21aed8fdc494f37d0eb94 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Mon, 13 May 2024 01:27:05 -0400 Subject: [PATCH 919/923] NNLC: Rename to new platform names and remove EPS-specific fits for now --- .../lat_models/ACURA RDX 2020 b'39990-TJB-A030x00x00'.json | 1 - .../lat_models/ACURA RDX 2020 b'39990-TJB-A040x00x00'.json | 1 - .../lat_models/ACURA RDX 2020 b'39990-TJB-A070x00x00'.json | 1 - .../lat_models/ACURA RDX 2020 b'39990-TJB-A130x00x00'.json | 1 - .../lat_models/{ACURA RDX 2020.json => ACURA_RDX_3G.json} | 0 ...RD GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566G0HA14A1'.json | 1 - ...RD GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571G0HA16A1'.json | 1 - ...RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516G00804A1'.json | 1 - ...RD GEN b'xf1x875Q0909144T xf1x891072xf1x82x0521G00807A1'.json | 1 - ...ND GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567G6000800'.json | 1 - ...ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571G60533A1'.json | 1 - .../lat_models/{AUDI A3 3RD GEN.json => AUDI_A3_MK3.json} | 0 .../lat_models/{AUDI Q3 2ND GEN.json => AUDI_Q3_MK2.json} | 0 .../lat_models/{BUICK LACROSSE 2017.json => BUICK_LACROSSE.json} | 0 .../car/torque_data/lat_models/CHEVROLET BOLT EV NO ACC.json | 1 - .../car/torque_data/lat_models/CHEVROLET EQUINOX NO ACC.json | 1 - .../torque_data/lat_models/CHEVROLET SUBURBAN PREMIER 2019.json | 1 - .../{CHEVROLET BOLT EUV 2022.json => CHEVROLET_BOLT_EUV.json} | 0 ...EVROLET SILVERADO 1500 2020.json => CHEVROLET_SILVERADO.json} | 0 ...HEVROLET TRAILBLAZER 2021.json => CHEVROLET_TRAILBLAZER.json} | 0 .../{CHEVROLET VOLT PREMIER 2017.json => CHEVROLET_VOLT.json} | 0 .../lat_models/CHRYSLER PACIFICA 2018 b'68288891AE'.json | 1 - .../lat_models/CHRYSLER PACIFICA 2018 b'68378884AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA 2020 b'68416742AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA 2020 b'68460393AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA 2020 b'68524936AB'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AC'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AD'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2018 b'68288309AD'.json | 1 - .../torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68416741AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68460392AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AA'.json | 1 - .../lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AB'.json | 1 - ...IFICA HYBRID 2017.json => CHRYSLER_PACIFICA_2017_HYBRID.json} | 0 ...LER PACIFICA 2018.json => CHRYSLER_PACIFICA_2018_HYBRID.json} | 0 ...IFICA HYBRID 2019.json => CHRYSLER_PACIFICA_2019_HYBRID.json} | 0 .../{CHRYSLER PACIFICA 2020.json => CHRYSLER_PACIFICA_2020.json} | 0 selfdrive/car/torque_data/lat_models/GENESIS (DH).json | 1 - ... 2018 b'xf1x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106'.json | 1 - selfdrive/car/torque_data/lat_models/GENESIS G80 2017.json | 1 - ...C 1ST GEN b'xf1x00JW1 MDPS R 1.00 1.03 57700-CU100 1C02'.json | 1 - .../lat_models/{GENESIS G70 2018.json => GENESIS_G70.json} | 0 ...S GV60 ELECTRIC 1ST GEN.json => GENESIS_GV60_EV_1ST_GEN.json} | 0 .../{GENESIS GV70 1ST GEN.json => GENESIS_GV70_1ST_GEN.json} | 0 .../lat_models/{GMC ACADIA DENALI 2018.json => GMC_ACADIA.json} | 0 .../lat_models/HONDA ACCORD 2018 b'39990-TVA,A150x00x00'.json | 1 - .../lat_models/HONDA ACCORD 2018 b'39990-TVA-A140x00x00'.json | 1 - .../lat_models/HONDA ACCORD 2018 b'39990-TVA-A150x00x00'.json | 1 - .../lat_models/HONDA ACCORD 2018 b'39990-TVA-A160x00x00'.json | 1 - .../lat_models/HONDA ACCORD 2018 b'39990-TVA-A340x00x00'.json | 1 - .../HONDA ACCORD HYBRID 2018 b'39990-TVA-A150x00x00'.json | 1 - .../HONDA ACCORD HYBRID 2018 b'39990-TVA-A160x00x00'.json | 1 - .../HONDA ACCORD HYBRID 2018 b'39990-TVA-A340x00x00'.json | 1 - .../car/torque_data/lat_models/HONDA ACCORD HYBRID 2018.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TBA,C120x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C020x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C120x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A020x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A120x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A020x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A120x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGG-J510x00x00'.json | 1 - .../HONDA CIVIC (BOSCH) 2019 b'39990-TGL-E130x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2016 b'39990-TBA,A030x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2016 b'39990-TBA-A030x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2016 b'39990-TBG-A030x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2016 b'39990-TEA-T020x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2016 b'39990-TEG,A010x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2022 b'39990-T39-A130x00x00'.json | 1 - .../lat_models/HONDA CIVIC 2022 b'39990-T43-J020x00x00'.json | 1 - .../lat_models/HONDA CR-V 2017 b'39990-TLA,A040x00x00'.json | 1 - .../lat_models/HONDA CR-V 2017 b'39990-TLA-A040x00x00'.json | 1 - .../lat_models/HONDA CR-V 2017 b'39990-TLA-A110x00x00'.json | 1 - .../lat_models/HONDA CR-V 2017 b'39990-TLA-A220x00x00'.json | 1 - .../HONDA CR-V HYBRID 2019 b'39990-TPA-G030x00x00'.json | 1 - .../HONDA CR-V HYBRID 2019 b'39990-TPG-A020x00x00'.json | 1 - .../lat_models/HONDA HRV 2019 b'39990-THX-A020x00x00'.json | 1 - .../lat_models/HONDA INSIGHT 2019 b'39990-TXM-A040x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019.json | 1 - .../lat_models/HONDA ODYSSEY 2018 b'39990-THR-A020x00x00'.json | 1 - .../lat_models/HONDA PILOT 2017 b'39990-TG7-A040x00x00'.json | 1 - .../lat_models/HONDA PILOT 2017 b'39990-TG7-A060x00x00'.json | 1 - .../lat_models/HONDA PILOT 2017 b'39990-TG7-A070x00x00'.json | 1 - .../lat_models/HONDA PILOT 2017 b'39990-TGS-A230x00x00'.json | 1 - .../lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A020x00x00'.json | 1 - .../lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A030x00x00'.json | 1 - .../lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A050x00x00'.json | 1 - .../lat_models/{HONDA ACCORD 2018.json => HONDA_ACCORD.json} | 0 .../lat_models/{HONDA CIVIC 2016.json => HONDA_CIVIC.json} | 0 .../lat_models/{HONDA CIVIC 2022.json => HONDA_CIVIC_2022.json} | 0 .../{HONDA CIVIC (BOSCH) 2019.json => HONDA_CIVIC_BOSCH.json} | 0 .../lat_models/{HONDA CLARITY 2018.json => HONDA_CLARITY.json} | 0 .../lat_models/{HONDA CR-V 2017.json => HONDA_CRV_5G.json} | 0 .../{HONDA CR-V HYBRID 2019.json => HONDA_CRV_HYBRID.json} | 0 .../lat_models/{HONDA HRV 2019.json => HONDA_HRV.json} | 0 .../lat_models/{HONDA ODYSSEY 2018.json => HONDA_ODYSSEY.json} | 0 .../lat_models/{HONDA PILOT 2017.json => HONDA_PILOT.json} | 0 .../{HONDA RIDGELINE 2017.json => HONDA_RIDGELINE.json} | 0 ...A 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050 4CNDC106'.json | 1 - ...021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050x00 4CNDC106'.json | 1 - ...A 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA070 4CNDC106'.json | 1 - ...021 b'xf1x00CN7 MDPS C 1.00 1.07 56310AA050x00 4CNDC107'.json | 1 - ... C 1.00 1.07 x00x00x00x00x00x00x00x00x00x00x00 4CNDC107'.json | 1 - ...D 2021 b'xf1x00CN7 MDPS C 1.00 1.02 56310BY050 4CNHC102'.json | 1 - ...D 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050 4CNHC103'.json | 1 - ...021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050x00 4CNHC103'.json | 1 - ...021 b'xf1x00CN7 MDPS C 1.00 1.04 56310BY050x00 4CNHC104'.json | 1 - ... 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI000 4NEDR106'.json | 1 - ... 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI090 4NEER106'.json | 1 - ... 2022 b'xf1x00NE MDPS R 1.00 1.07 57700GI000 4NEDR107'.json | 1 - ...D 2019 b'xf1x00AE MDPS C 1.00 1.04 56310G7301 4AEEC104'.json | 1 - ...V 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2310 4APHC101'.json | 1 - ...V 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2510 4APHC101'.json | 1 - ...019 b'xf1x00OS MDPS C 1.00 1.04 56310K4000x00 4OEDC104'.json | 1 - ...019 b'xf1x00OS MDPS C 1.00 1.04 56310K4050x00 4OEDC104'.json | 1 - ...020 b'xf1x00OS MDPS C 1.00 1.00 56310CM030x00 4OHDC100'.json | 1 - ... 2020 b'xf1x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103'.json | 1 - ... 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104'.json | 1 - ... 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104'.json | 1 - ...SADE 2020 b'xf1x00ON MDPS C 1.00 1.00 56340-S9000 8B13'.json | 1 - ...SADE 2020 b'xf1x00ON MDPS C 1.00 1.01 56340-S9000 9201'.json | 1 - ...A FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8409'.json | 1 - ...A FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8A12'.json | 1 - ...A FE 2019 b'xf1x00TM MDPS C 1.00 1.01 56340-S2000 9129'.json | 1 - ...A FE 2022 b'xf1x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19'.json | 1 - ... 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102'.json | 1 - ... 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100'.json | 1 - ... 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102'.json | 1 - ... 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0000 4DNAC101'.json | 1 - ... 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101'.json | 1 - ... 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101'.json | 1 - ... 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102'.json | 1 - ...020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0000x00 4DNAC101'.json | 1 - ...020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0010x00 4DNAC101'.json | 1 - ...020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC101'.json | 1 - ...020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC102'.json | 1 - ... 2020 b'xf1x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100'.json | 1 - ... 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102'.json | 1 - ... 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102'.json | 1 - ... 2021 b'xf1x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103'.json | 1 - ...N 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.00 56300-N9100 2228'.json | 1 - ...N 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-CW000 1A15'.json | 1 - ...N 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-N9000 0B24'.json | 1 - selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN.json | 1 - ...D 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-P0100 2228'.json | 1 - ...D 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-P0000 0B27'.json | 1 - ...D 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.05 56300-P0000 1514'.json | 1 - .../{HYUNDAI ELANTRA 2021.json => HYUNDAI_ELANTRA_2021.json} | 0 ...AI ELANTRA HYBRID 2021.json => HYUNDAI_ELANTRA_HEV_2021.json} | 0 .../{HYUNDAI GENESIS 2015-2016.json => HYUNDAI_GENESIS.json} | 0 .../{HYUNDAI IONIQ 5 2022.json => HYUNDAI_IONIQ_5.json} | 0 ...ONIQ ELECTRIC LIMITED 2019.json => HYUNDAI_IONIQ_EV_LTD.json} | 0 .../{HYUNDAI IONIQ PHEV 2020.json => HYUNDAI_IONIQ_PHEV.json} | 0 .../{HYUNDAI KONA ELECTRIC 2019.json => HYUNDAI_KONA_EV.json} | 0 ...HYUNDAI KONA ELECTRIC 2022.json => HYUNDAI_KONA_EV_2022.json} | 0 .../{HYUNDAI KONA HYBRID 2020.json => HYUNDAI_KONA_HEV.json} | 0 .../{HYUNDAI PALISADE 2020.json => HYUNDAI_PALISADE.json} | 0 .../{HYUNDAI SANTA FE 2019.json => HYUNDAI_SANTA_FE.json} | 0 .../{HYUNDAI SANTA FE 2022.json => HYUNDAI_SANTA_FE_2022.json} | 0 ... SANTA FE HYBRID 2022.json => HYUNDAI_SANTA_FE_HEV_2022.json} | 0 ... PlUG-IN HYBRID 2022.json => HYUNDAI_SANTA_FE_PHEV_2022.json} | 0 .../lat_models/{HYUNDAI SONATA 2020.json => HYUNDAI_SONATA.json} | 0 ...YUNDAI SONATA HYBRID 2021.json => HYUNDAI_SONATA_HYBRID.json} | 0 .../{HYUNDAI SONATA 2019.json => HYUNDAI_SONATA_LF.json} | 0 ...AI TUCSON HYBRID 4TH GEN.json => HYUNDAI_TUCSON_4TH_GEN.json} | 0 .../lat_models/JEEP GRAND CHEROKEE 2019 b'68417283AA'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE 2019 b'68453433AA'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE 2019 b'68499171AB'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE 2019 b'68501183AA'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AB'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AC'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321646AC'.json | 1 - .../lat_models/JEEP GRAND CHEROKEE V6 2018 b'68367342AA'.json | 1 - ...JEEP GRAND CHEROKEE V6 2018.json => JEEP_GRAND_CHEROKEE.json} | 0 ...EP GRAND CHEROKEE 2019.json => JEEP_GRAND_CHEROKEE_2019.json} | 0 ... EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.03 57700-CV000 1A19'.json | 1 - ... EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.04 57700-CV000 1B30'.json | 1 - ... EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.05 57700-CV000 2425'.json | 1 - ... EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.06 57700-CV000 2607'.json | 1 - ... 2021 b'xf1x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101'.json | 1 - ...020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4000x00 4DEEC105'.json | 1 - ...020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4100x00 4DEEC105'.json | 1 - selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2019.json | 1 - ... 2021 b'xf1x00SP2 MDPS C 1.00 1.04 56300Q5200 '.json | 1 - ...GEN b'xf1x00MQ4 MDPS C 1.00 1.04 56310R5030x00 4MQDC104'.json | 1 - ...GEN b'xf1x00MQ4 MDPS C 1.00 1.05 56310P4030x00 4MQHC105'.json | 1 - selfdrive/car/torque_data/lat_models/KIA SPORTAGE 5TH GEN.json | 1 - ... 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503'.json | 1 - ... 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503'.json | 1 - ... 2018 b'xf1x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104'.json | 1 - ... 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106'.json | 1 - ... 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106'.json | 1 - .../lat_models/{KIA CEED INTRO ED 2019.json => KIA_CEED.json} | 0 .../torque_data/lat_models/{KIA EV6 2022.json => KIA_EV6.json} | 0 .../lat_models/{KIA K5 2021.json => KIA_K5_2021.json} | 0 .../lat_models/{KIA NIRO EV 2020.json => KIA_NIRO_EV.json} | 0 .../{KIA NIRO HYBRID 2021.json => KIA_NIRO_HEV_2021.json} | 0 .../{KIA NIRO HYBRID 2ND GEN.json => KIA_NIRO_HEV_2ND_GEN.json} | 0 .../{KIA OPTIMA 4TH GEN FACELIFT.json => KIA_OPTIMA_G4_FL.json} | 0 .../lat_models/{KIA SELTOS 2021.json => KIA_SELTOS.json} | 0 .../{KIA SORENTO GT LINE 2018.json => KIA_SORENTO.json} | 0 .../{KIA SORENTO 4TH GEN.json => KIA_SORENTO_4TH_GEN.json} | 0 ... PLUG-IN HYBRID 4TH GEN.json => KIA_SORENTO_HEV_4TH_GEN.json} | 0 ...IA SPORTAGE HYBRID 5TH GEN.json => KIA_SPORTAGE_5TH_GEN.json} | 0 .../lat_models/{KIA STINGER GT2 2018.json => KIA_STINGER.json} | 0 .../lat_models/{KIA STINGER 2022.json => KIA_STINGER_2022.json} | 0 .../LEXUS ES 2019 b'8965B33252x00x00x00x00x00x00'.json | 1 - .../LEXUS ES 2019 b'8965B33690x00x00x00x00x00x00'.json | 1 - .../LEXUS ES 2019 b'8965B33721x00x00x00x00x00x00'.json | 1 - .../LEXUS ES HYBRID 2019 b'8965B33252x00x00x00x00x00x00'.json | 1 - .../LEXUS ES HYBRID 2019 b'8965B33590x00x00x00x00x00x00'.json | 1 - .../LEXUS ES HYBRID 2019 b'8965B33690x00x00x00x00x00x00'.json | 1 - .../LEXUS ES HYBRID 2019 b'8965B33721x00x00x00x00x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019.json | 1 - .../LEXUS IS 2018 b'8965B53271x00x00x00x00x00x00'.json | 1 - .../LEXUS IS 2018 b'8965B53280x00x00x00x00x00x00'.json | 1 - .../LEXUS IS 2018 b'8965B53281x00x00x00x00x00x00'.json | 1 - .../LEXUS NX 2018 b'8965B78060x00x00x00x00x00x00'.json | 1 - .../LEXUS NX 2018 b'8965B78080x00x00x00x00x00x00'.json | 1 - .../LEXUS NX 2020 b'8965B78120x00x00x00x00x00x00'.json | 1 - .../LEXUS NX HYBRID 2018 b'8965B78060x00x00x00x00x00x00'.json | 1 - .../LEXUS NX HYBRID 2018 b'8965B78080x00x00x00x00x00x00'.json | 1 - .../LEXUS NX HYBRID 2018 b'8965B78100x00x00x00x00x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018.json | 1 - .../LEXUS RX 2016 b'8965B0E011x00x00x00x00x00x00'.json | 1 - .../LEXUS RX 2016 b'8965B0E012x00x00x00x00x00x00'.json | 1 - .../LEXUS RX 2016 b'8965B48111x00x00x00x00x00x00'.json | 1 - .../LEXUS RX 2016 b'8965B48112x00x00x00x00x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/LEXUS RX 2016.json | 1 - .../LEXUS RX 2020 b'8965B48271x00x00x00x00x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/LEXUS RX 2020.json | 1 - .../LEXUS RX HYBRID 2017 b'8965B0E012x00x00x00x00x00x00'.json | 1 - .../LEXUS RX HYBRID 2017 b'8965B48102x00x00x00x00x00x00'.json | 1 - .../LEXUS RX HYBRID 2017 b'8965B48112x00x00x00x00x00x00'.json | 1 - .../LEXUS RX HYBRID 2020 b'8965B48271x00x00x00x00x00x00'.json | 1 - .../lat_models/{LEXUS ES 2019.json => LEXUS_ES_TSS2.json} | 0 .../torque_data/lat_models/{LEXUS IS 2018.json => LEXUS_IS.json} | 0 .../torque_data/lat_models/{LEXUS NX 2018.json => LEXUS_NX.json} | 0 .../lat_models/{LEXUS NX 2020.json => LEXUS_NX_TSS2.json} | 0 .../lat_models/{LEXUS RX HYBRID 2017.json => LEXUS_RX.json} | 0 .../lat_models/{LEXUS RX HYBRID 2020.json => LEXUS_RX_TSS2.json} | 0 ... CX-5 2022 b'KSD5-3210X-C-00x00x00x00x00x00x00x00x00x00'.json | 1 - ... CX-9 2021 b'TC3M-3210X-A-00x00x00x00x00x00x00x00x00x00'.json | 1 - .../lat_models/{MAZDA CX-5 2022.json => MAZDA_CX5_2022.json} | 0 .../lat_models/{MAZDA CX-9 2021.json => MAZDA_CX9 2021.json} | 0 .../torque_data/lat_models/{MAZDA CX-9.json => MAZDA_CX9.json} | 0 .../torque_data/lat_models/RAM 1500 5TH GEN b'68273275AG'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68466110AB'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68469901AA'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68469904AA'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68522583AA'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68552788AA'.json | 1 - .../torque_data/lat_models/RAM 1500 5TH GEN b'68552791AB'.json | 1 - .../lat_models/{RAM 1500 5TH GEN.json => RAM_1500_5TH_GEN.json} | 0 .../lat_models/{RAM HD 5TH GEN.json => RAM_HD_5TH_GEN.json} | 0 ...1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820527T6070405'.json | 1 - ...ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G500'.json | 1 - ...ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G600'.json | 1 - ...RD GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521T00403A1'.json | 1 - ...RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516A00604A1'.json | 1 - ...3RD GEN b'xf1x875Q0909143K xf1x892033xf1x820514UZ070203'.json | 1 - ...3RD GEN b'xf1x875Q0909143M xf1x892041xf1x820522UZ070303'.json | 1 - ...RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070600'.json | 1 - ...RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070700'.json | 1 - .../{SKODA KAROQ 1ST GEN.json => SKODA_KAROQ_MK1.json} | 0 .../{SKODA KODIAQ 1ST GEN.json => SKODA_KODIAQ_MK1.json} | 0 .../{SKODA OCTAVIA 3RD GEN.json => SKODA_OCTAVIA_MK3.json} | 0 .../{SKODA SUPERB 3RD GEN.json => SKODA_SUPERB_MK3.json} | 0 .../lat_models/SUBARU ASCENT LIMITED 2019 b'x05xc0xd0x00'.json | 1 - .../lat_models/SUBARU ASCENT LIMITED 2019 b'x85xc0xd0x00'.json | 1 - .../lat_models/SUBARU ASCENT LIMITED 2019 b'x95xc0xd0x00'.json | 1 - .../lat_models/SUBARU FORESTER 2019 b'x8dxc0x04x00'.json | 1 - .../lat_models/SUBARU IMPREZA LIMITED 2019 b'x8axc0x10x00'.json | 1 - .../lat_models/SUBARU IMPREZA LIMITED 2019 b'zxc0x04x00'.json | 1 - .../lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x00'.json | 1 - .../lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x01'.json | 1 - .../lat_models/SUBARU IMPREZA SPORT 2020 b'x9axc0x04x00'.json | 1 - .../lat_models/SUBARU OUTBACK 6TH GEN b'x9bxc0x10x00'.json | 1 - .../{SUBARU ASCENT LIMITED 2019.json => SUBARU_ASCENT.json} | 0 .../{SUBARU FORESTER 2019.json => SUBARU_FORESTER.json} | 0 .../{SUBARU IMPREZA LIMITED 2019.json => SUBARU_IMPREZA.json} | 0 .../{SUBARU IMPREZA SPORT 2020.json => SUBARU_IMPREZA_2020.json} | 0 .../{SUBARU LEGACY 7TH GEN.json => SUBARU_LEGACY.json} | 0 ...BARU LEGACY 2015 - 2018.json => SUBARU_LEGACY_PREGLOBAL.json} | 0 .../{SUBARU OUTBACK 6TH GEN.json => SUBARU_OUTBACK.json} | 0 .../TOYOTA AVALON 2016 b'8965B41051x00x00x00x00x00x00'.json | 1 - .../TOYOTA AVALON 2019 b'8965B07010x00x00x00x00x00x00'.json | 1 - .../TOYOTA AVALON 2022 b'8965B41110x00x00x00x00x00x00'.json | 1 - ...OYOTA AVALON HYBRID 2019 b'8965B41090x00x00x00x00x00x00'.json | 1 - .../car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019.json | 1 - ...OYOTA AVALON HYBRID 2022 b'8965B41110x00x00x00x00x00x00'.json | 1 - .../car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022.json | 1 - .../TOYOTA C-HR 2018 b'8965B10040x00x00x00x00x00x00'.json | 1 - .../TOYOTA C-HR HYBRID 2022 b'8965B10091x00x00x00x00x00x00'.json | 1 - .../TOYOTA C-HR HYBRID 2022 b'8965B10092x00x00x00x00x00x00'.json | 1 - .../TOYOTA CAMRY 2018 b'8965B33540x00x00x00x00x00x00'.json | 1 - .../TOYOTA CAMRY 2018 b'8965B33542x00x00x00x00x00x00'.json | 1 - .../TOYOTA CAMRY 2018 b'8965B33581x00x00x00x00x00x00'.json | 1 - .../TOYOTA CAMRY 2021 b'8965B33630x00x00x00x00x00x00'.json | 1 - ...TOYOTA CAMRY HYBRID 2018 b'8965B33540x00x00x00x00x00x00'.json | 1 - ...TOYOTA CAMRY HYBRID 2018 b'8965B33542x00x00x00x00x00x00'.json | 1 - ...TOYOTA CAMRY HYBRID 2018 b'8965B33580x00x00x00x00x00x00'.json | 1 - ...TOYOTA CAMRY HYBRID 2018 b'8965B33581x00x00x00x00x00x00'.json | 1 - .../car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018.json | 1 - ...TOYOTA CAMRY HYBRID 2021 b'8965B33630x00x00x00x00x00x00'.json | 1 - ...TOYOTA CAMRY HYBRID 2021 b'8965B33650x00x00x00x00x00x00'.json | 1 - .../car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021.json | 1 - .../TOYOTA COROLLA 2017 b'8965B02181x00x00x00x00x00x00'.json | 1 - .../TOYOTA COROLLA 2017 b'8965B02191x00x00x00x00x00x00'.json | 1 - ...COROLLA HYBRID TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json | 1 - ...COROLLA HYBRID TSS2 2019 b'8965B12451x00x00x00x00x00x00'.json | 1 - ...COROLLA HYBRID TSS2 2019 b'8965B76012x00x00x00x00x00x00'.json | 1 - ...OLLA HYBRID TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json | 1 - ...OLLA HYBRID TSS2 2019 b'x018965B12520x00x00x00x00x00x00'.json | 1 - ...OLLA HYBRID TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json | 1 - ... COROLLA HYBRID TSS2 2019 b'x018965B1254000x00x00x00x00'.json | 1 - .../torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019.json | 1 - ...TOYOTA COROLLA TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json | 1 - ...OTA COROLLA TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json | 1 - ...OTA COROLLA TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json | 1 - .../TOYOTA COROLLA TSS2 2019 b'x018965B1255000x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2017 b'8965B48140x00x00x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2017 b'8965B48150x00x00x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2020 b'8965B48241x00x00x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2020 b'8965B48310x00x00x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2020 b'8965B48320x00x00x00x00x00x00'.json | 1 - .../TOYOTA HIGHLANDER 2020 b'8965B48400x00x00x00x00x00x00'.json | 1 - ...A HIGHLANDER HYBRID 2018 b'8965B48160x00x00x00x00x00x00'.json | 1 - .../torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018.json | 1 - ...A HIGHLANDER HYBRID 2020 b'8965B48241x00x00x00x00x00x00'.json | 1 - ...A HIGHLANDER HYBRID 2020 b'8965B48310x00x00x00x00x00x00'.json | 1 - ...A HIGHLANDER HYBRID 2020 b'8965B48400x00x00x00x00x00x00'.json | 1 - .../torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020.json | 1 - .../TOYOTA PRIUS 2017 b'8965B47022x00x00x00x00x00x00'.json | 1 - .../TOYOTA PRIUS 2017 b'8965B47023x00x00x00x00x00x00'.json | 1 - .../TOYOTA PRIUS 2017 b'8965B47050x00x00x00x00x00x00'.json | 1 - .../TOYOTA PRIUS 2017 b'8965B47060x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2017 b'8965B42082x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2017 b'8965B42083x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2019 b'8965B42170x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2019 b'8965B42171x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2019 b'8965B42180x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 2019 b'8965B42181x00x00x00x00x00x00'.json | 1 - ...9 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json | 1 - ...9 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json | 1 - ...9 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json | 1 - ...2 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json | 1 - selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022.json | 1 - .../TOYOTA RAV4 HYBRID 2017 b'8965B42103x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2017 b'8965B42162x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2017 b'8965B42163x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2019 b'8965B42170x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2019 b'8965B42171x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2019 b'8965B42181x00x00x00x00x00x00'.json | 1 - ...9 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json | 1 - ...9 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json | 1 - ...9 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json | 1 - .../car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019.json | 1 - .../TOYOTA RAV4 HYBRID 2022 b'8965B42172x00x00x00x00x00x00'.json | 1 - .../TOYOTA RAV4 HYBRID 2022 b'8965B42182x00x00x00x00x00x00'.json | 1 - ...2 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json | 1 - .../TOYOTA SIENNA 2018 b'8965B45070x00x00x00x00x00x00'.json | 1 - .../TOYOTA SIENNA 2018 b'8965B45080x00x00x00x00x00x00'.json | 1 - .../TOYOTA SIENNA 2018 b'8965B45082x00x00x00x00x00x00'.json | 1 - .../lat_models/{TOYOTA AVALON 2016.json => TOYOTA_AVALON.json} | 0 .../{TOYOTA AVALON 2019.json => TOYOTA_AVALON_2019.json} | 0 .../{TOYOTA AVALON 2022.json => TOYOTA_AVALON_TSS2.json} | 0 .../lat_models/{TOYOTA CAMRY 2018.json => TOYOTA_CAMRY.json} | 0 .../{TOYOTA CAMRY 2021.json => TOYOTA_CAMRY_TSS2.json} | 0 .../lat_models/{TOYOTA C-HR 2018.json => TOYOTA_CHR.json} | 0 .../{TOYOTA C-HR HYBRID 2022.json => TOYOTA_CHR_TSS2.json} | 0 .../lat_models/{TOYOTA COROLLA 2017.json => TOYOTA_COROLLA.json} | 0 .../{TOYOTA COROLLA TSS2 2019.json => TOYOTA_COROLLA_TSS2.json} | 0 .../{TOYOTA HIGHLANDER 2017.json => TOYOTA_HIGHLANDER.json} | 0 .../{TOYOTA HIGHLANDER 2020.json => TOYOTA_HIGHLANDER_TSS2.json} | 0 .../lat_models/{TOYOTA MIRAI 2021.json => TOYOTA_MIRAI.json} | 0 .../lat_models/{TOYOTA PRIUS 2017.json => TOYOTA_PRIUS.json} | 0 .../{TOYOTA PRIUS TSS2 2021.json => TOYOTA_PRIUS_TSS2.json} | 0 .../lat_models/{TOYOTA PRIUS v 2017.json => TOYOTA_PRIUS_V.json} | 0 .../lat_models/{TOYOTA RAV4 2017.json => TOYOTA_RAV4.json} | 0 .../{TOYOTA RAV4 HYBRID 2017.json => TOYOTA_RAV4H.json} | 0 .../lat_models/{TOYOTA RAV4 2019.json => TOYOTA_RAV4_TSS2.json} | 0 .../{TOYOTA RAV4 HYBRID 2022.json => TOYOTA_RAV4_TSS2_2022.json} | 0 .../lat_models/{TOYOTA SIENNA 2018.json => TOYOTA_SIENNA.json} | 0 ...ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020800'.json | 1 - ...ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002MB4092M7N'.json | 1 - ...ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002NB4202N7N'.json | 1 - ...ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B60924A1'.json | 1 - ...ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B6G920A1'.json | 1 - ...1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6080105'.json | 1 - ...1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6090105'.json | 1 - ...TH GEN b'xf1x873Q0909144F xf1x895043xf1x82x0561A01612A0'.json | 1 - ...TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566A01613A1'.json | 1 - ...TH GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571A0J714A1'.json | 1 - ...TH GEN b'xf1x873Q0909144L xf1x895081xf1x82x0571A0JA15A1'.json | 1 - ...TH GEN b'xf1x873Q0909144M xf1x895082xf1x82x0571A0JA16A1'.json | 1 - ...TH GEN b'xf1x873QM909144 xf1x895072xf1x82x0571A01714A1'.json | 1 - ...TH GEN b'xf1x875Q0909144AAxf1x891081xf1x82x0521A00608A1'.json | 1 - ...TH GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A07B05A1'.json | 1 - ...TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A00442A1'.json | 1 - ...TH GEN b'xf1x875QN909144B xf1x895082xf1x82x0571A01A18A1'.json | 1 - ...TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A10A01A1'.json | 1 - ...TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521B00404A1'.json | 1 - ...TH GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A00642A1'.json | 1 - ...TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566B00611A1'.json | 1 - ...8TH GEN b'xf1x875Q0909143K xf1x892033xf1x820514B0060703'.json | 1 - ...8TH GEN b'xf1x875Q0909143M xf1x892041xf1x820522B0080803'.json | 1 - ...8TH GEN b'xf1x875Q0909143P xf1x892051xf1x820526B0060905'.json | 1 - ...TH GEN b'xf1x875Q0910143B xf1x892201xf1x82x0563B0000600'.json | 1 - ...TH GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020600'.json | 1 - ...ND GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A60604A1'.json | 1 - ...ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A60634A1'.json | 1 - ...ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A62A32A1'.json | 1 - ...ND GEN b'xf1x875QM907144D xf1x891063xf1x82x002SA6092SOM'.json | 1 - ...ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60604A1'.json | 1 - ...ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60804A1'.json | 1 - ...VOLKSWAGEN ARTEON 1ST GEN.json => VOLKSWAGEN_ARTEON_MK1.json} | 0 .../{VOLKSWAGEN ATLAS 1ST GEN.json => VOLKSWAGEN_ATLAS_MK1.json} | 0 .../{VOLKSWAGEN GOLF 7TH GEN.json => VOLKSWAGEN_GOLF_MK7.json} | 0 .../{VOLKSWAGEN JETTA 7TH GEN.json => VOLKSWAGEN_JETTA_MK7.json} | 0 ...VOLKSWAGEN PASSAT 8TH GEN.json => VOLKSWAGEN_PASSAT_MK8.json} | 0 .../{VOLKSWAGEN PASSAT NMS.json => VOLKSWAGEN_PASSAT_NMS.json} | 0 ...VOLKSWAGEN TIGUAN 2ND GEN.json => VOLKSWAGEN_TIGUAN_MK2.json} | 0 424 files changed, 314 deletions(-) delete mode 100755 selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A040x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A070x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A130x00x00'.json rename selfdrive/car/torque_data/lat_models/{ACURA RDX 2020.json => ACURA_RDX_3G.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566G0HA14A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571G0HA16A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516G00804A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144T xf1x891072xf1x82x0521G00807A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567G6000800'.json delete mode 100755 selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571G60533A1'.json rename selfdrive/car/torque_data/lat_models/{AUDI A3 3RD GEN.json => AUDI_A3_MK3.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{AUDI Q3 2ND GEN.json => AUDI_Q3_MK2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{BUICK LACROSSE 2017.json => BUICK_LACROSSE.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EV NO ACC.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHEVROLET EQUINOX NO ACC.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHEVROLET SUBURBAN PREMIER 2019.json rename selfdrive/car/torque_data/lat_models/{CHEVROLET BOLT EUV 2022.json => CHEVROLET_BOLT_EUV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHEVROLET SILVERADO 1500 2020.json => CHEVROLET_SILVERADO.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHEVROLET TRAILBLAZER 2021.json => CHEVROLET_TRAILBLAZER.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHEVROLET VOLT PREMIER 2017.json => CHEVROLET_VOLT.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68288891AE'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68378884AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68416742AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68460393AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68524936AB'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AC'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AD'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018 b'68288309AD'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68416741AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68460392AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AB'.json rename selfdrive/car/torque_data/lat_models/{CHRYSLER PACIFICA HYBRID 2017.json => CHRYSLER_PACIFICA_2017_HYBRID.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHRYSLER PACIFICA 2018.json => CHRYSLER_PACIFICA_2018_HYBRID.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHRYSLER PACIFICA HYBRID 2019.json => CHRYSLER_PACIFICA_2019_HYBRID.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{CHRYSLER PACIFICA 2020.json => CHRYSLER_PACIFICA_2020.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/GENESIS (DH).json delete mode 100755 selfdrive/car/torque_data/lat_models/GENESIS G70 2018 b'xf1x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/GENESIS G80 2017.json delete mode 100755 selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN b'xf1x00JW1 MDPS R 1.00 1.03 57700-CU100 1C02'.json rename selfdrive/car/torque_data/lat_models/{GENESIS G70 2018.json => GENESIS_G70.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{GENESIS GV60 ELECTRIC 1ST GEN.json => GENESIS_GV60_EV_1ST_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{GENESIS GV70 1ST GEN.json => GENESIS_GV70_1ST_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{GMC ACADIA DENALI 2018.json => GMC_ACADIA.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA,A150x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A140x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A150x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A160x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A340x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A150x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A160x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A340x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA,C120x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C120x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A120x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A120x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-J510x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGL-E130x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA,A030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA-A030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBG-A030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEA-T020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEG,A010x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T39-A130x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T43-J020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA,A040x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A040x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A110x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A220x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPA-G030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPG-A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA HRV 2019 b'39990-THX-A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019 b'39990-TXM-A040x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018 b'39990-THR-A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A040x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A060x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A070x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TGS-A230x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A020x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A030x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A050x00x00'.json rename selfdrive/car/torque_data/lat_models/{HONDA ACCORD 2018.json => HONDA_ACCORD.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA CIVIC 2016.json => HONDA_CIVIC.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA CIVIC 2022.json => HONDA_CIVIC_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA CIVIC (BOSCH) 2019.json => HONDA_CIVIC_BOSCH.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA CLARITY 2018.json => HONDA_CLARITY.json} (100%) rename selfdrive/car/torque_data/lat_models/{HONDA CR-V 2017.json => HONDA_CRV_5G.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA CR-V HYBRID 2019.json => HONDA_CRV_HYBRID.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA HRV 2019.json => HONDA_HRV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA ODYSSEY 2018.json => HONDA_ODYSSEY.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA PILOT 2017.json => HONDA_PILOT.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HONDA RIDGELINE 2017.json => HONDA_RIDGELINE.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050 4CNDC106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050x00 4CNDC106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA070 4CNDC106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 56310AA050x00 4CNDC107'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 x00x00x00x00x00x00x00x00x00x00x00 4CNDC107'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.02 56310BY050 4CNHC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050 4CNHC103'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050x00 4CNHC103'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.04 56310BY050x00 4CNHC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI000 4NEDR106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI090 4NEER106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.07 57700GI000 4NEDR107'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019 b'xf1x00AE MDPS C 1.00 1.04 56310G7301 4AEEC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2310 4APHC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2510 4APHC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4000x00 4OEDC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4050x00 4OEDC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020 b'xf1x00OS MDPS C 1.00 1.00 56310CM030x00 4OHDC100'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.00 56340-S9000 8B13'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.01 56340-S9000 9201'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8409'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8A12'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.01 56340-S2000 9129'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022 b'xf1x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0000 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0000x00 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0010x00 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.00 56300-N9100 2228'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-CW000 1A15'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-N9000 0B24'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-P0100 2228'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-P0000 0B27'.json delete mode 100755 selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.05 56300-P0000 1514'.json rename selfdrive/car/torque_data/lat_models/{HYUNDAI ELANTRA 2021.json => HYUNDAI_ELANTRA_2021.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI ELANTRA HYBRID 2021.json => HYUNDAI_ELANTRA_HEV_2021.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI GENESIS 2015-2016.json => HYUNDAI_GENESIS.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI IONIQ 5 2022.json => HYUNDAI_IONIQ_5.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI IONIQ ELECTRIC LIMITED 2019.json => HYUNDAI_IONIQ_EV_LTD.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI IONIQ PHEV 2020.json => HYUNDAI_IONIQ_PHEV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI KONA ELECTRIC 2019.json => HYUNDAI_KONA_EV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI KONA ELECTRIC 2022.json => HYUNDAI_KONA_EV_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI KONA HYBRID 2020.json => HYUNDAI_KONA_HEV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI PALISADE 2020.json => HYUNDAI_PALISADE.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SANTA FE 2019.json => HYUNDAI_SANTA_FE.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SANTA FE 2022.json => HYUNDAI_SANTA_FE_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SANTA FE HYBRID 2022.json => HYUNDAI_SANTA_FE_HEV_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SANTA FE PlUG-IN HYBRID 2022.json => HYUNDAI_SANTA_FE_PHEV_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SONATA 2020.json => HYUNDAI_SONATA.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SONATA HYBRID 2021.json => HYUNDAI_SONATA_HYBRID.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI SONATA 2019.json => HYUNDAI_SONATA_LF.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{HYUNDAI TUCSON HYBRID 4TH GEN.json => HYUNDAI_TUCSON_4TH_GEN.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68417283AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68453433AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68499171AB'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68501183AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AB'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AC'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321646AC'.json delete mode 100755 selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68367342AA'.json rename selfdrive/car/torque_data/lat_models/{JEEP GRAND CHEROKEE V6 2018.json => JEEP_GRAND_CHEROKEE.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{JEEP GRAND CHEROKEE 2019.json => JEEP_GRAND_CHEROKEE_2019.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.03 57700-CV000 1A19'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.04 57700-CV000 1B30'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.05 57700-CV000 2425'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.06 57700-CV000 2607'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA K5 2021 b'xf1x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4000x00 4DEEC105'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4100x00 4DEEC105'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA SELTOS 2021 b'xf1x00SP2 MDPS C 1.00 1.04 56300Q5200 '.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.04 56310R5030x00 4MQDC104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.05 56310P4030x00 4MQHC105'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA SPORTAGE 5TH GEN.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106'.json delete mode 100755 selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106'.json rename selfdrive/car/torque_data/lat_models/{KIA CEED INTRO ED 2019.json => KIA_CEED.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA EV6 2022.json => KIA_EV6.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA K5 2021.json => KIA_K5_2021.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA NIRO EV 2020.json => KIA_NIRO_EV.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA NIRO HYBRID 2021.json => KIA_NIRO_HEV_2021.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA NIRO HYBRID 2ND GEN.json => KIA_NIRO_HEV_2ND_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA OPTIMA 4TH GEN FACELIFT.json => KIA_OPTIMA_G4_FL.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA SELTOS 2021.json => KIA_SELTOS.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA SORENTO GT LINE 2018.json => KIA_SORENTO.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA SORENTO 4TH GEN.json => KIA_SORENTO_4TH_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA SORENTO PLUG-IN HYBRID 4TH GEN.json => KIA_SORENTO_HEV_4TH_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA SPORTAGE HYBRID 5TH GEN.json => KIA_SPORTAGE_5TH_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA STINGER GT2 2018.json => KIA_STINGER.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{KIA STINGER 2022.json => KIA_STINGER_2022.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33252x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33690x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33721x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33252x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33590x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33690x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33721x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53271x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53280x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53281x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78060x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78080x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX 2020 b'8965B78120x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78060x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78080x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78100x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E011x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E012x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48111x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48112x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2016.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2020 b'8965B48271x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX 2020.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B0E012x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48102x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48112x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020 b'8965B48271x00x00x00x00x00x00'.json rename selfdrive/car/torque_data/lat_models/{LEXUS ES 2019.json => LEXUS_ES_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{LEXUS IS 2018.json => LEXUS_IS.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{LEXUS NX 2018.json => LEXUS_NX.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{LEXUS NX 2020.json => LEXUS_NX_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{LEXUS RX HYBRID 2017.json => LEXUS_RX.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{LEXUS RX HYBRID 2020.json => LEXUS_RX_TSS2.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022 b'KSD5-3210X-C-00x00x00x00x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021 b'TC3M-3210X-A-00x00x00x00x00x00x00x00x00x00'.json rename selfdrive/car/torque_data/lat_models/{MAZDA CX-5 2022.json => MAZDA_CX5_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{MAZDA CX-9 2021.json => MAZDA_CX9 2021.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{MAZDA CX-9.json => MAZDA_CX9.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68273275AG'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68466110AB'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469901AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469904AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68522583AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552788AA'.json delete mode 100755 selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552791AB'.json rename selfdrive/car/torque_data/lat_models/{RAM 1500 5TH GEN.json => RAM_1500_5TH_GEN.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{RAM HD 5TH GEN.json => RAM_HD_5TH_GEN.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820527T6070405'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G500'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G600'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521T00403A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516A00604A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143K xf1x892033xf1x820514UZ070203'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143M xf1x892041xf1x820522UZ070303'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070600'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070700'.json rename selfdrive/car/torque_data/lat_models/{SKODA KAROQ 1ST GEN.json => SKODA_KAROQ_MK1.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SKODA KODIAQ 1ST GEN.json => SKODA_KODIAQ_MK1.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SKODA OCTAVIA 3RD GEN.json => SKODA_OCTAVIA_MK3.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SKODA SUPERB 3RD GEN.json => SKODA_SUPERB_MK3.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x05xc0xd0x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x85xc0xd0x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x95xc0xd0x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019 b'x8dxc0x04x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'x8axc0x10x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'zxc0x04x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x01'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'x9axc0x04x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN b'x9bxc0x10x00'.json rename selfdrive/car/torque_data/lat_models/{SUBARU ASCENT LIMITED 2019.json => SUBARU_ASCENT.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU FORESTER 2019.json => SUBARU_FORESTER.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU IMPREZA LIMITED 2019.json => SUBARU_IMPREZA.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU IMPREZA SPORT 2020.json => SUBARU_IMPREZA_2020.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU LEGACY 7TH GEN.json => SUBARU_LEGACY.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU LEGACY 2015 - 2018.json => SUBARU_LEGACY_PREGLOBAL.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{SUBARU OUTBACK 6TH GEN.json => SUBARU_OUTBACK.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016 b'8965B41051x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019 b'8965B07010x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022 b'8965B41110x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019 b'8965B41090x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022 b'8965B41110x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018 b'8965B10040x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10091x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10092x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33540x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33542x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33581x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021 b'8965B33630x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33540x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33542x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33580x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33581x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33630x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33650x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02181x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02191x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12451x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B76012x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12520x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B1254000x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B1255000x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48140x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48150x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48241x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48310x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48320x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48400x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018 b'8965B48160x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48241x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48310x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48400x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47022x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47023x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47050x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47060x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42082x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42083x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42170x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42171x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42180x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42181x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42103x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42162x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42163x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42170x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42171x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42181x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42172x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42182x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45070x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45080x00x00x00x00x00x00'.json delete mode 100755 selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45082x00x00x00x00x00x00'.json rename selfdrive/car/torque_data/lat_models/{TOYOTA AVALON 2016.json => TOYOTA_AVALON.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA AVALON 2019.json => TOYOTA_AVALON_2019.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA AVALON 2022.json => TOYOTA_AVALON_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA CAMRY 2018.json => TOYOTA_CAMRY.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA CAMRY 2021.json => TOYOTA_CAMRY_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA C-HR 2018.json => TOYOTA_CHR.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA C-HR HYBRID 2022.json => TOYOTA_CHR_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA COROLLA 2017.json => TOYOTA_COROLLA.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA COROLLA TSS2 2019.json => TOYOTA_COROLLA_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA HIGHLANDER 2017.json => TOYOTA_HIGHLANDER.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA HIGHLANDER 2020.json => TOYOTA_HIGHLANDER_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA MIRAI 2021.json => TOYOTA_MIRAI.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA PRIUS 2017.json => TOYOTA_PRIUS.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA PRIUS TSS2 2021.json => TOYOTA_PRIUS_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA PRIUS v 2017.json => TOYOTA_PRIUS_V.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA RAV4 2017.json => TOYOTA_RAV4.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA RAV4 HYBRID 2017.json => TOYOTA_RAV4H.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA RAV4 2019.json => TOYOTA_RAV4_TSS2.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA RAV4 HYBRID 2022.json => TOYOTA_RAV4_TSS2_2022.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{TOYOTA SIENNA 2018.json => TOYOTA_SIENNA.json} (100%) mode change 100755 => 100644 delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020800'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002MB4092M7N'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002NB4202N7N'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B60924A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B6G920A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6080105'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6090105'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144F xf1x895043xf1x82x0561A01612A0'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566A01613A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571A0J714A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144L xf1x895081xf1x82x0571A0JA15A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144M xf1x895082xf1x82x0571A0JA16A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873QM909144 xf1x895072xf1x82x0571A01714A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144AAxf1x891081xf1x82x0521A00608A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A07B05A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A00442A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QN909144B xf1x895082xf1x82x0571A01A18A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A10A01A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521B00404A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A00642A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566B00611A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143K xf1x892033xf1x820514B0060703'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143M xf1x892041xf1x820522B0080803'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143P xf1x892051xf1x820526B0060905'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143B xf1x892201xf1x82x0563B0000600'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020600'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A60604A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A60634A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A62A32A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM907144D xf1x891063xf1x82x002SA6092SOM'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60604A1'.json delete mode 100755 selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60804A1'.json rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN ARTEON 1ST GEN.json => VOLKSWAGEN_ARTEON_MK1.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN ATLAS 1ST GEN.json => VOLKSWAGEN_ATLAS_MK1.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN GOLF 7TH GEN.json => VOLKSWAGEN_GOLF_MK7.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN JETTA 7TH GEN.json => VOLKSWAGEN_JETTA_MK7.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN PASSAT 8TH GEN.json => VOLKSWAGEN_PASSAT_MK8.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN PASSAT NMS.json => VOLKSWAGEN_PASSAT_NMS.json} (100%) mode change 100755 => 100644 rename selfdrive/car/torque_data/lat_models/{VOLKSWAGEN TIGUAN 2ND GEN.json => VOLKSWAGEN_TIGUAN_MK2.json} (100%) mode change 100755 => 100644 diff --git a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A030x00x00'.json b/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A030x00x00'.json deleted file mode 100755 index 39f881e4a7..0000000000 --- a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.786729],[0.5672887],[0.28005219],[0.035554193],[0.5677058],[0.56628585],[0.56508285],[0.55352837],[0.54181147],[0.52912265],[0.5155199],[0.035507876],[0.0354848],[0.03545452],[0.03514088],[0.03492326],[0.034622278],[0.034296613]],"model_test_loss":0.019161002710461617,"input_size":18,"current_date_and_time":"2023-08-05_00-23-35","input_mean":[[27.090303],[0.047497954],[0.016577758],[0.0007272725],[0.044373695],[0.045599286],[0.046824276],[0.053295966],[0.05693411],[0.058819015],[0.0594564],[0.0004213227],[0.0004913575],[0.00056855136],[0.0008395286],[0.0009874002],[0.0010656398],[0.0010756186]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.25851473],[2.4962583],[-0.016582556],[-0.08381792],[-0.16407841],[0.7527331],[0.22097391]],"dense_1_W":[[0.23336808,-0.7667592,0.0008973085,0.34888005,0.4696916,-0.8726721,-0.052713018,-0.3410398,0.083063185,-0.21388897,0.14544983,-0.6639639,0.34076384,0.43210688,-0.18405053,0.14303815,0.1860583,-0.29693],[1.5149847,0.7346798,0.0012407255,0.12526828,-0.15258078,0.75175434,0.43043575,0.8569343,0.3044722,0.6560543,-0.6017985,0.586774,-0.2042676,-0.57615256,-0.82250106,-0.3673933,0.39087212,0.28107244],[-0.056961607,0.14175236,-0.14529344,-0.21935074,-0.4685559,-0.38604775,-0.30533233,0.08093428,-0.054244533,0.046247467,0.002660106,-1.0756555,-0.34733522,0.5118129,0.555274,0.9977485,0.5343106,0.76034987],[0.043177918,1.1426508,-0.2574032,-0.80439544,-1.0474149,0.018192194,-0.72060835,-1.5457815,0.4839822,-0.22740847,0.33749956,0.56239605,-0.18597472,-0.7004514,-0.12335018,0.9408467,1.3969381,1.9147022],[0.15510105,-0.51416093,-0.1709066,0.3122005,-0.27975515,-0.18827502,-0.018079426,-0.07361344,-0.17749901,-0.16815776,0.329771,-0.96269935,-0.41497013,-0.11298405,0.90808386,0.5985053,0.6670271,1.0441304],[0.04084261,-0.3579519,5.764384,2.1556206,-3.1756268,-2.5591285,-3.1059926,-2.1751692,1.9893773,5.344765,3.8095784,0.0068162596,-0.05961051,-0.7790495,0.25181335,0.08936475,-0.4691672,-1.5800782],[0.008442975,-0.9664588,1.254223,0.07495671,-0.9211808,-0.31230834,-1.420559,1.5870605,2.9423354,1.2097238,-1.5209136,0.53799206,-0.24978906,-0.4991973,-0.045118414,0.22720768,-0.021786746,-0.028036244]],"activation":"σ"},{"dense_2_W":[[0.08589389,0.5554316,-0.76533294,1.4370406,-0.749679,0.8190772,0.7847909],[-0.36651522,-0.23656718,-0.9679525,0.54530346,-0.44935027,-0.33107117,-0.11653592],[0.1937388,-0.51963365,-0.41821185,-0.56238693,-0.42072704,0.29349342,0.28873855],[0.18568017,-0.6255592,0.3175428,-0.1296441,0.36066276,0.090375744,0.011777949],[0.29389882,0.41541627,0.29456857,-0.06099775,0.8544443,-0.32980224,-0.018656367],[0.46638128,1.1828619,-1.0409766,1.1076639,-0.8162737,-0.1841819,0.35339093],[-3.1295595,-1.7625448,-0.9519052,2.3819635,-1.5629697,1.4751475,1.054407],[-0.26031867,-0.17098531,-0.86596596,-0.2823039,-0.09237936,-0.5557033,0.21093917],[0.17419276,-0.33989495,0.75525665,-0.23243514,0.067577615,-0.11459458,-0.12737218],[-0.5143146,-0.114794,-0.48588708,0.014262976,-0.3147008,-0.3320594,-0.050031766],[0.69564664,-0.20285861,-0.045860726,-0.24353331,-0.077484764,-0.48740336,-0.49667886],[-0.73832846,-0.056390353,-1.1750503,0.9696539,-0.14256468,-0.9768354,0.3639443],[-0.33827624,1.3389958,-0.90204453,1.2786052,-0.37693223,1.0066575,0.7839061]],"activation":"σ","dense_2_b":[[0.004400438],[-0.012242325],[-0.24042149],[-0.2775402],[0.026533086],[0.17362237],[-0.11018203],[-0.26839134],[-0.012196942],[-0.27722296],[0.061678015],[-0.030844057],[-0.1247429]]},{"dense_3_W":[[-0.004011368,0.44971785,-0.29006478,0.44446334,0.15595631,0.18539023,-0.027091525,-0.36382222,-0.47578183,0.3841759,-0.58085823,0.21311298,0.43156254],[-0.114403516,-0.58336,-0.15005592,0.4984802,0.050974183,-0.2988934,0.17598677,-0.38844588,-0.43446323,-0.46759152,0.59965366,-0.22926027,0.46112597],[-0.666863,-0.06357686,-0.37007764,0.7205996,0.7096061,-0.1758518,-0.8103027,-0.44219843,0.7200449,0.5289802,-0.16617142,-0.40598816,0.00529661]],"activation":"identity","dense_3_b":[[-0.09627088],[0.058493696],[0.09405641]]},{"dense_4_W":[[0.8841606,-0.039429788,-0.82832056]],"dense_4_b":[[-0.09594059]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A040x00x00'.json b/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A040x00x00'.json deleted file mode 100755 index 8c389b9507..0000000000 --- a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A040x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.8066874],[0.6620071],[0.29624054],[0.031885646],[0.67469865],[0.6712079],[0.6675276],[0.6426469],[0.62732595],[0.60797465],[0.5914247],[0.032055974],[0.032022122],[0.031979207],[0.031657174],[0.031374358],[0.031031318],[0.030767966]],"model_test_loss":0.016631487756967545,"input_size":18,"current_date_and_time":"2023-08-05_00-24-05","input_mean":[[27.279354],[0.07628178],[0.004740573],[0.004332477],[0.07348854],[0.07386953],[0.074113265],[0.07658985],[0.07849997],[0.08176357],[0.08127507],[0.004234957],[0.004238124],[0.004233249],[0.004148433],[0.004073079],[0.0040188804],[0.0037603448]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.5227308],[-0.9277926],[0.01344287],[-0.12681559],[1.8620169],[-0.18611176],[-0.46804744]],"dense_1_W":[[1.3088025,0.7938517,-0.07550197,0.12162848,-0.23023312,-0.53417087,0.7298755,-0.35863844,-1.232776,-0.32464856,0.69969106,-0.19938065,0.14594285,0.67643446,-0.7466748,-0.1924248,0.25988856,0.03815833],[-0.00032034,0.09513859,0.14649239,0.84448385,-0.33081084,-0.7636266,-0.43756434,0.15544043,-0.5536561,0.5097238,-0.44260737,-0.99638957,-0.6095418,0.38101298,-0.108550996,0.5993398,-0.28177363,-0.27099723],[0.017245863,-0.8860011,0.06905833,-0.23131342,-0.31428957,-0.5846859,0.11834183,0.10321145,-0.19951913,-0.13262431,0.051923424,-0.18100934,-0.4455598,0.7395236,-0.022803197,0.41319725,0.7613758,1.0495721],[0.01882326,-0.8194868,-0.009853303,0.4151132,0.38719785,-0.25005072,0.4127618,0.054583337,-0.5390043,-0.10014917,0.34088063,-1.117872,-0.08286508,0.46948376,0.35110041,0.38353947,0.25921276,-0.5767032],[1.2597413,-0.06712699,0.07406188,0.005649942,0.32073185,0.41326395,-0.71213233,0.1408067,0.5081324,0.06824581,-0.22174098,0.42761666,-0.5766476,-0.7140219,0.44048855,0.48427463,0.31352678,-0.4882206],[-0.016965292,1.2305305,0.10325935,0.24419214,2.1640618,2.4280353,2.9627275,1.0981169,-1.7519482,-3.7584212,-3.6021638,-0.63591194,-0.52256954,0.8271195,-0.3019169,-0.87059563,0.38380772,0.69980204],[-0.031441774,-1.5607485,-7.438145,1.1177127,1.5216038,0.7637881,0.8477267,-0.835395,-1.5533942,-0.35314834,1.1110218,-1.644007,-1.0006105,-0.3352244,0.20025133,0.83611494,0.31554085,0.33613914]],"activation":"σ"},{"dense_2_W":[[-0.38370743,0.32968736,-0.004957762,-0.9081518,0.15075667,-0.068389416,0.008115187],[-0.3697097,0.47690573,-0.55084234,-0.7900301,0.27233642,0.14098246,-0.3138353],[-1.0909184,-0.5307646,0.27474627,-0.8662306,-0.30040765,0.033314817,-0.3492279],[0.5701307,-0.5303288,0.031248378,0.6385814,0.010645484,-0.016549833,0.46346626],[0.1442632,-0.42781132,0.24439524,0.23937261,-0.81748235,0.064812824,0.4000337],[-0.36214906,0.19428124,0.5956358,0.9273549,-0.14404434,0.21891229,-0.5955698],[0.7355732,-0.09893048,0.07489529,0.38501185,0.9168706,0.050819628,1.2076929],[0.6842598,0.1722268,-0.2845938,0.2455436,0.97617817,0.25799465,1.0193411],[-0.08084107,-0.58205926,0.07038275,-0.30948064,0.07723996,-0.5130746,0.4102158],[0.04777135,-0.3226301,0.02726643,-0.6204659,0.7076705,-0.080048494,-0.05065219],[0.33558354,-0.32304227,0.38823822,-0.8043962,0.65630925,-0.22564156,-0.18366374],[-0.72608715,0.54069227,-0.4357295,0.016691474,0.19214477,-0.21972942,-0.7132383],[-0.2671177,-0.59838676,-0.09683501,-0.67224425,0.39455676,0.14678267,0.29082012]],"activation":"σ","dense_2_b":[[0.042974856],[0.047666013],[0.071242],[-0.067780755],[-0.13547619],[-0.022536043],[-0.1646825],[-0.09613349],[-0.062535584],[0.06297165],[0.19214764],[-0.0261287],[-0.11438154]]},{"dense_3_W":[[0.3077478,0.14613815,0.65330607,-0.18163036,-0.67502165,-0.5579221,-0.202035,0.18795493,0.12072459,-0.10777223,0.4149204,0.61287045,0.58160293],[-0.5099703,-0.19231012,-0.377239,0.59486294,0.59117395,0.51951456,0.15894152,0.528822,-0.40744722,-0.56634617,-0.6320977,-0.22041576,-0.54817945],[0.33777002,-0.54104495,-0.24469995,-0.37649524,-0.5114555,0.42566466,-0.16754289,-0.10115532,0.15072124,0.3869163,0.36524448,-0.001329152,0.4387867]],"activation":"identity","dense_3_b":[[-0.04467462],[0.033724587],[-0.113627024]]},{"dense_4_W":[[0.64887154,-1.1038072,0.022054804]],"dense_4_b":[[-0.033230864]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A070x00x00'.json b/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A070x00x00'.json deleted file mode 100755 index 05288d3d86..0000000000 --- a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A070x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.804848],[0.8000588],[0.3076164],[0.04094818],[0.8080633],[0.80525005],[0.80151165],[0.7824581],[0.7688379],[0.75354946],[0.73837227],[0.040943466],[0.040922932],[0.04089199],[0.04062815],[0.040328],[0.039892863],[0.03927387]],"model_test_loss":0.036003123968839645,"input_size":18,"current_date_and_time":"2023-08-05_00-24-34","input_mean":[[28.423885],[0.007884776],[-0.0031538303],[0.015055777],[0.006704811],[0.0065370076],[0.0068571228],[0.0054512075],[0.004117628],[0.005428144],[0.0066870335],[0.015062948],[0.015041507],[0.015016925],[0.014904091],[0.014769581],[0.014618669],[0.014560436]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.16520002],[1.9058155],[0.08453396],[-0.5702096],[-0.022235246],[2.1811569],[0.32843062]],"dense_1_W":[[0.007258376,0.5546316,0.0021156757,-0.11869205,-0.44563162,0.5686885,-0.49791276,0.32130694,0.18480486,0.20529743,-0.2983059,0.9580912,-0.30417892,-0.17480053,-0.5471751,-0.15583673,0.09669533,0.13655974],[1.1045209,0.72982305,-0.0012157066,-0.32325575,0.36619568,0.28777912,0.4200975,0.32855922,1.0964329,0.0125418985,-0.3758639,0.045545604,0.15269232,-0.3104408,0.2671959,-0.42339674,-0.24723499,-0.19590895],[-0.018215153,-0.9239081,-7.2882724,-0.043018136,0.89870304,0.26894778,0.9689756,-0.2952786,-1.5947425,-0.1945536,0.7288008,-1.1317624,-0.5719013,-0.14229906,0.4161876,-0.08783979,0.42565742,0.90669537],[1.5756099,0.74937963,-0.6682266,0.17876424,0.41060305,0.463597,-0.1566954,-0.2545488,0.60787153,0.32818866,-0.6589883,0.27973333,-0.2438422,-0.05319809,-0.15574023,-0.6602739,0.26140356,0.13322982],[0.0029903697,0.8079928,-1.8084258,0.065171555,2.247587,1.658609,1.4290156,-0.038293317,-1.8411868,-2.3568115,-1.5802773,-0.48189434,-0.3668556,0.065492555,-0.07620456,-0.24639589,0.45018005,0.522461],[0.8719188,-0.5783348,-0.004002766,0.28650954,-0.4252121,-0.44623157,0.058663256,-0.56094223,-0.55295444,-0.3040901,0.3919486,-0.46245384,-0.029172314,0.18465641,0.25736162,0.39288744,0.36129612,-0.11474042],[0.04924682,-0.42568168,0.00047019235,0.047753103,-0.6865259,-0.47911242,-0.964993,-0.102179274,-0.02535022,0.20489506,-0.38479173,0.51818967,0.28378603,-0.42722967,-0.48230556,0.024352815,0.07428285,0.62325346]],"activation":"σ"},{"dense_2_W":[[0.90986884,0.47950652,0.25053373,0.19939893,0.022542464,-0.38787457,0.35567287],[-1.0180658,-1.145854,0.6623716,-0.28077835,0.15672879,-0.85848707,-1.4568413],[1.406467,0.28726155,-0.062790155,-0.1506732,-0.9504507,0.3980746,-0.17273381],[1.1017784,-0.79252,-0.19594195,-0.58535796,-0.43267435,-1.4622566,1.099609],[-1.6988904,-1.4887654,1.0556726,0.14193814,0.567861,-0.78099054,-1.1916547],[1.3314943,-0.04540647,0.01911306,0.5834418,0.35737038,-0.3738458,-0.9131301],[-1.4514605,-1.1643327,0.3310674,-0.40083563,-0.2108704,-0.35081738,-1.25731],[1.4591875,0.51000947,0.6822781,-0.026922852,-0.20268947,-0.74282473,-0.7089955],[-1.5790056,-0.81782144,0.12857606,-0.031774927,0.009384996,-0.011062012,-0.47970626],[0.6185028,-0.44301233,0.16603012,-0.12869644,-0.550066,-0.039163988,-0.13839607],[-0.018947372,0.18183467,-0.7923736,0.45726624,-0.7995292,-0.59161717,0.1465947],[1.1080922,-0.83549255,-1.2054135,0.81522685,-0.83383155,-1.7733766,0.60040456],[-1.173769,0.9102019,0.8067946,0.12065304,0.46038142,0.988551,-0.8998902]],"activation":"σ","dense_2_b":[[-0.34571314],[-0.06508791],[-0.16475885],[-0.51652795],[0.09335283],[-0.3354126],[-0.05395547],[-0.31864733],[0.0341759],[-0.28023538],[-0.24353532],[-0.6017034],[0.3884714]]},{"dense_3_W":[[-0.14432088,-0.26102468,-0.16678491,0.27030742,0.5432606,0.36784706,0.31559888,-0.39181647,0.25105116,0.031935308,0.059210572,-0.27962592,-0.23508798],[0.10690615,-0.6226754,0.33630693,0.72590107,-0.7262614,0.36729288,-0.35301742,0.729708,-0.85739464,0.085655235,-0.09123609,0.3166798,-0.6107507],[-0.24342504,0.5378751,-0.33611593,-0.14817247,0.11123475,0.48445055,0.52930707,0.3598816,0.5077164,-0.062455237,-0.2566208,-0.5888578,-0.27487496]],"activation":"identity","dense_3_b":[[0.18145333],[-0.101992324],[0.0892087]]},{"dense_4_W":[[-0.021246718,1.246937,-0.05223701]],"dense_4_b":[[-0.08010172]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A130x00x00'.json b/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A130x00x00'.json deleted file mode 100755 index 0676cba6ca..0000000000 --- a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020 b'39990-TJB-A130x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.23255],[0.72479707],[0.2731752],[0.041931108],[0.7306734],[0.728485],[0.72535795],[0.70364136],[0.6862298],[0.6646152],[0.6451095],[0.041831795],[0.041856535],[0.04186677],[0.041598115],[0.04127907],[0.040753823],[0.040154044]],"model_test_loss":0.02374698594212532,"input_size":18,"current_date_and_time":"2023-08-05_00-25-01","input_mean":[[25.491344],[0.044132378],[0.0061853817],[-0.0029408792],[0.041254394],[0.04185997],[0.04264751],[0.044891346],[0.045578476],[0.048339594],[0.049801964],[-0.002985854],[-0.0029757507],[-0.0029692403],[-0.003035695],[-0.0031368348],[-0.0032066072],[-0.003333973]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.2589055],[-0.6300203],[-0.18905114],[0.035437174],[-0.19216189],[-0.18303323],[0.30025914]],"dense_1_W":[[-0.22914602,0.37103513,-3.0855074,-0.016385019,-0.1979585,0.269418,0.30819643,-0.057719447,-0.6764055,-0.551892,0.44502893,-0.14667127,0.09163551,0.13834381,-0.032953348,-0.1365294,0.108110294,-0.015983328],[0.78569615,-0.10759539,-2.9499667,0.063911594,0.32446858,0.47014278,-0.37796447,0.17923851,0.04087841,-0.1296694,-0.25734457,0.13309121,0.117884666,-0.24419518,0.18338855,-0.34687102,-0.28147766,0.2696666],[-0.08656571,0.008094062,3.595688,-0.26259422,-0.08986283,-0.2759453,-0.21220718,0.46498194,-0.04266637,0.19100346,-0.15709823,-0.12756641,0.08520138,-0.15009129,0.46134138,0.45091918,-0.34697345,-0.04493433],[-0.0057781595,0.89213103,-0.6567681,0.06595929,0.7855131,0.69278926,1.5298123,0.91839993,-2.0061233,-2.435459,-0.6626293,-0.74082696,0.24077982,0.32887235,0.38966477,-0.42399997,-0.13695207,0.89643025],[0.00082410604,0.5266071,0.0135379555,0.69229037,-0.6991144,0.1244281,-0.08241515,0.19330071,0.6835726,-0.17600393,-0.27664047,0.3862313,-0.16833216,0.13843256,-0.8122221,-0.7083284,-0.53014934,0.8007278],[-0.002461339,0.5366552,0.005371866,-0.20480752,-0.02694003,0.43186262,-0.022536932,-0.2710664,-0.20992674,0.055011317,0.10523869,0.7081066,-0.25829124,-0.3393486,-0.033259023,0.11424787,0.25399274,-0.21338066],[-0.83344615,0.4972349,-2.674982,-0.8011467,-0.00091532787,0.15652598,-0.1011277,0.16851202,-0.010218224,-0.3162073,-0.21929123,0.8358039,-0.3675451,0.20605241,-0.044107787,0.02273551,-0.12779047,0.16776903]],"activation":"σ"},{"dense_2_W":[[-0.19773088,-0.07987414,-0.46394402,-0.25385913,-0.51523316,-0.7734022,-0.24892572],[0.7524863,-0.83441466,-0.15295947,-0.52500844,-0.65857184,-1.0245075,-0.12141446],[0.47812417,-0.31713268,-0.4710023,0.8264185,-0.8333809,-0.7837305,-0.21949],[-0.10150827,-0.33362886,-0.570894,-0.6523667,-0.12733579,-1.03887,0.089515604],[0.2693557,0.33961922,0.5830918,-0.16009484,0.88582087,-0.18754318,0.27771476],[-0.32544395,0.44090092,0.28255528,-0.7974365,0.17504413,0.75356585,0.58148295],[-0.31234935,0.13871694,0.8212621,-0.041753158,0.7099144,0.2015646,-0.056245737],[0.2175629,0.09308608,0.80202895,-0.24198753,0.48807403,-0.22803837,0.64155793],[-0.37297815,-0.454524,-0.2041459,-0.21450296,-0.4926007,-0.6716726,-0.30035603],[0.28631696,-0.6844529,-0.3590589,0.0717205,-0.8350303,-0.9547256,0.01994262],[0.09526404,-0.37569124,-0.54859555,-0.25455466,0.08059891,-0.5854736,-0.28227013],[0.49766162,-0.4683451,-0.30763015,1.2545203,-1.0363722,-0.6756313,-0.67825943],[-0.020436687,-0.17459548,-0.8167955,0.5455366,-0.37868357,-0.6452078,-0.50482]],"activation":"σ","dense_2_b":[[0.14226258],[0.20491779],[0.21216024],[-0.09415054],[-0.10954374],[-0.15493721],[-0.081466906],[-0.0703362],[0.024982613],[-0.039309245],[-0.06658772],[0.5169116],[0.23269281]]},{"dense_3_W":[[0.032323103,-0.54836,-0.5319698,-0.29569536,0.23183687,0.6694105,0.038498178,0.63660324,-0.38424796,0.06097146,-0.4531479,-0.43248698,-0.5142001],[0.6478883,0.25922352,0.62727135,0.7343839,-0.5265464,-0.61613655,-0.18139401,0.109259166,0.08149141,0.73708165,0.20760447,-0.15330316,0.5328034],[-0.27989653,-0.7052997,-0.25653857,0.116460204,0.14982809,0.19868049,0.6558363,0.39804822,-0.17899916,0.09420844,0.19702157,-0.65146506,-0.42718345]],"activation":"identity","dense_3_b":[[0.008412994],[-0.026723087],[0.007888077]]},{"dense_4_W":[[0.60362816,-0.77239645,0.9147824]],"dense_4_b":[[0.010696713]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/ACURA RDX 2020.json b/selfdrive/car/torque_data/lat_models/ACURA_RDX_3G.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/ACURA RDX 2020.json rename to selfdrive/car/torque_data/lat_models/ACURA_RDX_3G.json diff --git a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566G0HA14A1'.json b/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566G0HA14A1'.json deleted file mode 100755 index 5a9673b63d..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566G0HA14A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.577478],[0.7438756],[0.36118278],[0.032957785],[0.73931956],[0.7406723],[0.74192834],[0.74210787],[0.7407529],[0.73199296],[0.7199361],[0.03313112],[0.03308075],[0.03302625],[0.032850783],[0.032766964],[0.032702252],[0.03262269]],"model_test_loss":0.005140421446412802,"input_size":18,"current_date_and_time":"2023-08-05_01-40-02","input_mean":[[25.733025],[-0.0530399],[-0.0037603835],[-0.010416541],[-0.052312925],[-0.051846784],[-0.05134495],[-0.054431908],[-0.05473598],[-0.057869826],[-0.06307359],[-0.0104753],[-0.010442205],[-0.010416312],[-0.010369451],[-0.010322098],[-0.010290761],[-0.010380604]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.3245497],[-1.4683536],[-1.0290579],[-1.1341333],[-2.1062934],[0.3018172],[-0.23615684]],"dense_1_W":[[-0.7003263,0.49873114,0.0898631,-0.124622256,-0.074973226,0.9586173,-0.38187122,-0.2140207,-0.17437121,-0.08466658,0.18243429,0.332077,0.091170385,-0.31530052,-0.40582517,-0.18025973,0.01580242,0.16465585],[0.65071887,0.098929696,0.081038885,-0.43317255,0.09570322,0.6772797,0.09694697,-0.2210818,-0.36565584,0.14244506,0.1442449,-0.060965866,0.69212425,-0.22231308,-0.38532606,0.025514778,-0.33013564,0.31779227],[-0.45925462,-0.7011064,-0.117601246,-0.29964444,0.5295153,-1.7198939,1.0653187,-0.25740883,-0.017742164,-0.3926751,0.14859986,0.093567744,-0.0036377048,0.6028897,-0.024838587,-0.72965765,0.22210832,0.17412421],[-0.41014504,0.7981556,0.12894426,-0.15330562,-0.46003667,0.80571204,-0.28026396,0.07452426,0.46427798,0.08275176,-0.15462086,-0.22026892,0.2446177,-0.11201427,0.13369443,0.085089125,0.04192831,-0.079959705],[-1.4503621,0.59118265,0.22731866,-0.0001668829,-0.1303347,0.73156023,-0.5737055,0.043029774,0.20244285,-0.0695449,0.08930824,0.064521626,0.068293415,-0.44724983,0.15501118,0.5946885,0.51368195,0.7538089],[0.004021074,-0.6826504,-3.3770466,-0.7409217,1.6001521,0.0391899,-0.124299094,-1.0929167,-1.0039091,0.09728141,1.62364,0.04166459,-0.9421838,-0.19240098,1.0952632,0.8884146,0.37573487,-0.81200004],[-0.018716704,0.2596357,0.085221626,-0.33597907,-0.328589,0.86857575,-0.25697392,-0.06518752,0.058769446,-0.46493977,0.26284,0.32883435,0.3965106,-0.51409185,-0.35840464,0.25830442,0.17984946,-0.09297429]],"activation":"σ"},{"dense_2_W":[[-0.5632885,-0.53817147,0.64087266,-0.6966918,0.19645694,0.20904736,-0.6993455],[-0.16920735,-1.1400033,0.759447,-0.8198524,-0.19880797,0.8225933,-0.57966435],[-1.5840745,0.2576235,-1.4874045,-0.97268665,0.10756933,-1.5350775,0.09277853],[-0.746399,-0.69672894,0.029895214,-0.47871673,-0.044179466,-0.40327352,0.16566314],[-0.038666934,0.08509904,0.038226664,0.19170763,-0.115979545,-0.61926454,-0.34254095],[0.4221073,0.9338458,0.43968564,0.060404833,-0.27444592,0.18882848,0.04802321],[0.11849655,0.6292092,-1.1421567,0.91632056,0.12051813,-0.47201702,0.47282815],[0.65729594,0.95542836,0.29725003,-0.13384224,0.040036652,-0.3340561,0.91600364],[-0.50302577,0.20259018,-0.82741207,-0.78905314,-0.99308705,0.37110266,-0.2015438],[-0.6504161,-0.95296395,1.3312038,-0.82766765,-0.015905075,0.6261558,-0.30300564],[-0.5737891,0.27416453,-0.13240442,-1.0399845,-0.13625641,-1.1091161,-0.10313148],[-0.88772994,-1.1795825,1.4089849,-0.89326316,-0.2216985,1.2031909,-1.0210301],[-0.45486033,-0.6124461,0.7889247,-0.48303822,-0.066258006,0.67935133,-0.68396086]],"activation":"σ","dense_2_b":[[0.1795089],[0.1396347],[0.28086272],[0.088517],[-0.40390638],[0.033958796],[-0.24937943],[-0.11856169],[-0.36012134],[0.3268745],[-0.16133401],[0.5044416],[-0.036166213]]},{"dense_3_W":[[0.21906924,-0.43080992,-0.26896283,-0.5586104,0.46261472,-0.18390699,0.68614185,0.44715905,0.5650668,-0.5596256,0.0845164,-0.1399013,-0.0069408407],[-0.6725418,-0.5217038,-0.41263464,-0.14729826,-0.3349171,0.45824003,0.45669848,0.41630223,-0.1198797,-0.37809664,-0.58279663,-0.39970228,-0.46720004],[-0.0911098,-0.2839844,0.74057204,0.28854206,-0.602245,-0.027574118,-0.23919757,-0.57538325,-0.20772439,0.4040517,-0.1298003,0.9268099,-0.33000454]],"activation":"identity","dense_3_b":[[0.09233651],[0.16433457],[-0.078944445]]},{"dense_4_W":[[0.3148156,0.70836514,-0.25909597]],"dense_4_b":[[0.12378432]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571G0HA16A1'.json b/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571G0HA16A1'.json deleted file mode 100755 index fe26c2fbaa..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571G0HA16A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.444296],[0.925862],[0.3873827],[0.037189186],[0.91709805],[0.9205691],[0.92302024],[0.92303276],[0.92241675],[0.9182511],[0.9138257],[0.0370443],[0.03708567],[0.03713202],[0.037330262],[0.03739135],[0.037358396],[0.037249684]],"model_test_loss":0.005741582717746496,"input_size":18,"current_date_and_time":"2023-08-05_02-04-31","input_mean":[[25.35733],[0.06905999],[0.003920239],[-0.0061412086],[0.06798497],[0.067765675],[0.067846335],[0.07060763],[0.07478977],[0.08159132],[0.08384652],[-0.00630684],[-0.006240933],[-0.0061786305],[-0.005954251],[-0.0058416207],[-0.005766785],[-0.0058315513]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.09965041],[-2.8333573],[0.1400968],[0.009966896],[-0.54726493],[0.0015999223],[-3.2500806]],"dense_1_W":[[0.008949206,-0.7134963,-0.039546415,0.32233778,0.046066836,-1.0873427,0.9605672,0.20299414,0.19314864,0.08948046,-0.20269577,-0.3755727,-0.37828064,0.14123754,0.4638058,0.26318562,-0.13823359,-0.23261546],[-1.1191226,1.24295,0.5152675,-0.08874825,0.0025459442,0.80788636,-0.104676746,0.4805844,-0.02262418,-0.03299286,-0.034461044,0.1827796,0.026162459,-0.3095013,0.17938249,0.18499815,-0.08783259,-0.045922197],[0.00032858906,1.4926245,0.046637077,-0.32630235,-0.5585684,0.4034735,0.034369424,0.32580245,0.6714615,0.1760409,-0.24315467,0.4334825,0.4505814,-0.71569765,-0.20759046,0.37798336,0.05509028,-0.05075517],[-0.0020555735,1.4031184,4.5700407,0.20270438,0.024622126,0.36119592,0.061005134,0.40066856,0.019982928,-1.0741708,-0.95529234,0.091578454,0.10358388,-0.14398912,-0.42586878,0.46220022,-0.20536982,0.016865704],[-0.002008851,-0.69844705,0.08216384,0.44206062,-0.69932556,-0.9771249,1.0371966,0.47466856,0.09576244,-0.109484494,-0.39007372,-0.006908211,0.0011474143,0.66040933,1.1697054,0.06390619,0.45119238,0.11735442],[0.008935762,0.91445494,0.028773237,-0.52121264,-0.174554,0.9050357,-1.0716133,0.12847908,0.044074073,-0.09941267,-0.028681703,0.0962431,0.08194988,0.08453359,0.29791412,-0.14331576,0.10533343,-0.020068252],[-1.1533717,-1.6527721,-0.52385485,-0.4202616,0.2607004,-1.0356239,0.27048177,-0.3373225,-0.09205943,0.3441015,-0.11975457,-0.055931754,0.18685083,0.20495965,0.187628,-0.1650148,-0.1626427,0.17851348]],"activation":"σ"},{"dense_2_W":[[-0.16502862,0.6035214,-0.4797608,-0.26366422,0.1172479,0.65635234,-0.32176182],[0.82605934,-0.22745298,-0.5525386,-0.36830527,0.23893076,-0.3919843,0.49190587],[-0.2966492,0.09588704,-0.45871517,-0.11154242,0.35666984,0.039538093,-0.1328796],[0.034723956,-0.46226948,-0.48428744,0.31498548,-0.24748813,-0.13231282,0.09660036],[-0.1478363,-0.19293658,-0.2720306,-0.45817015,-0.37688,-0.50546414,-0.28803188],[0.8061317,-0.35915154,0.11437668,-0.25236553,0.11779728,-0.5324483,0.11850576],[0.022361243,-0.26832423,-0.62965536,0.22057025,0.24124865,-0.34575233,-0.38505265],[0.2575399,0.05998816,0.061493885,0.018274274,-0.5433316,-0.29543966,-0.61841214],[-0.16821893,-0.15542041,0.30067912,0.050528307,0.18159576,0.247534,-0.4873542],[-0.5824741,0.4054871,0.64855784,0.20722958,-0.41800383,0.43538094,-0.7275382],[0.31753623,0.07011032,0.57152003,0.090241544,0.20502838,0.20511343,-0.107010804],[0.44585994,-0.39532375,-0.526214,-0.23581168,0.26709425,-0.246547,0.028189523],[-0.5761572,-0.07350907,0.4795847,-0.2759125,-0.26325545,0.70039105,0.071710885]],"activation":"σ","dense_2_b":[[-0.027677696],[0.045070633],[-0.02658284],[-0.22184646],[-0.017363569],[0.015014292],[-0.24714506],[-0.25203505],[-0.008711522],[-0.065313436],[-0.03065247],[0.060002126],[0.012620704]]},{"dense_3_W":[[0.20473917,-0.651288,-0.23288384,-0.59891415,-0.1475974,-0.23222987,-0.32410318,0.11691736,0.6000578,0.51066893,0.20957007,-0.028224448,-0.19108637],[-0.31180796,-0.4837876,-0.252939,-0.34604937,0.15680352,-0.285469,0.56567293,-0.51167464,-0.016737705,0.21543846,0.13277481,-0.622958,0.62488127],[-0.6404472,0.4868364,0.45634153,-0.29710093,0.09397441,0.103426725,0.52781576,-0.28619406,-0.16805595,-0.5277735,-0.58615893,0.44762912,-0.23755693]],"activation":"identity","dense_3_b":[[-0.00061371934],[0.0008866203],[0.0041582286]]},{"dense_4_W":[[0.2813102,0.8880676,-1.0474501]],"dense_4_b":[[-0.0030482505]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516G00804A1'.json b/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516G00804A1'.json deleted file mode 100755 index 623cfc6fd6..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516G00804A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.647897],[0.77807677],[0.3786303],[0.027181908],[0.76505655],[0.7691365],[0.7753112],[0.75485826],[0.7388133],[0.7235482],[0.7017126],[0.027084801],[0.027107615],[0.02713881],[0.02727208],[0.027347732],[0.027291704],[0.02712333]],"model_test_loss":0.005975625012069941,"input_size":18,"current_date_and_time":"2023-08-05_02-53-24","input_mean":[[22.687336],[0.041830763],[0.0013497239],[0.0025117223],[0.04265397],[0.041225184],[0.040064774],[0.041646685],[0.041738126],[0.039837133],[0.037775867],[0.0025273785],[0.0024943845],[0.0024706146],[0.002355649],[0.0022401763],[0.00213939],[0.0020558846]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.1844455],[-1.1541857],[-0.015318193],[-0.6885228],[0.031907413],[-0.4154868],[-1.2283381]],"dense_1_W":[[0.9976641,0.21748708,0.007614968,0.21005726,-0.24952233,-1.1167002,0.40800944,0.65574366,0.16467258,-0.026125554,-0.32524306,0.22688352,0.1259429,-0.41789296,0.24079186,-0.22830102,0.100322604,0.023678515],[-0.29762468,0.88740426,0.112175226,-0.2225173,-0.3093645,0.6364987,-0.8023527,0.6150709,-0.10853348,-0.07048834,-0.07352686,0.06482338,0.32714766,-0.2653219,0.07407067,-0.046005152,0.16475457,-0.06553305],[0.00032146444,1.5183012,0.071805686,0.15944685,-0.55036193,0.6881477,-0.78218305,0.17549933,0.40891948,0.07851986,-0.28071985,-0.39318854,0.309669,0.0018471086,-0.49772733,-0.035861548,0.156975,-0.014822093],[-0.18374057,-0.45571524,-0.09747847,0.07835499,0.71659774,-0.95522517,0.26217383,-0.50928473,0.20344277,0.040699393,0.03725089,-0.14224511,-0.37767497,0.40781656,0.231836,-0.3131839,0.16274065,-0.08154563],[-0.0026246961,0.9705764,3.6681292,-0.3000036,-0.44400433,0.16176015,-0.41099662,-0.02601824,0.6407803,0.42456567,-1.0577953,0.48476946,0.20323749,-0.25966495,0.19856524,-0.14002256,-0.3655814,0.23497105],[0.010234776,-1.908564,-0.07929717,0.75593996,0.50410277,-1.43933,-0.60249954,-1.4044362,-2.1078866,-1.8422328,-0.08159568,-0.5587607,-0.7469554,0.5997705,-0.32854697,0.038176045,0.069803216,-0.09369286],[0.9902383,-0.13063963,-0.006834419,-0.00481643,0.19603567,1.0950303,-0.60231364,-0.26128826,-0.18049927,-0.24451904,0.4080662,0.18761696,-0.05200454,-0.23603702,-0.033294257,-0.26397884,0.005336438,0.10861761]],"activation":"σ"},{"dense_2_W":[[-0.12819418,-0.04965034,-0.019238193,0.548027,-0.31324998,-0.24846186,-0.71080023],[0.48580822,-0.4452061,-0.3211533,0.52164257,-0.2934621,-0.21353783,-0.5648211],[-0.046689708,-0.15082699,-0.101832494,0.57533866,-0.3347912,0.2058913,-0.032502484],[-0.4508244,0.53148896,0.68331164,-1.0367274,0.18762335,0.049984977,0.4796921],[-0.10827881,0.098909445,0.20143649,0.0621116,-0.09980022,-0.70837736,-0.24850541],[-0.23459274,0.3976682,0.74400216,0.07945248,-0.0918161,-0.36116856,0.36160964],[-0.3334947,-0.7710084,-0.63277185,0.45722532,-0.16698726,0.29963008,-0.40333414],[0.11296678,-0.55500394,-0.5733111,0.19517982,-0.14325383,-0.23166345,-0.026499728],[0.50150007,-0.38261527,-0.6961804,-0.25895122,0.30894667,-0.5299628,0.123440936],[0.7214627,-0.086619996,-0.38500652,0.52342546,-0.49543855,0.60024095,-0.007926223],[-0.12577087,-0.13799962,-0.6489934,-0.43941757,-0.5788901,-0.08122388,-0.21836436],[-1.039173,0.054396313,0.21242972,-0.7820335,0.25794864,-0.04855301,0.87666434],[0.5399379,-0.034065444,-0.23672304,0.35554442,-0.06592034,0.20189549,-0.34307384]],"activation":"σ","dense_2_b":[[-0.13632841],[0.048632354],[-0.15356292],[-0.122767694],[-0.10747351],[0.089311264],[-0.14307816],[-0.14580268],[-0.17635764],[-0.0041631833],[-0.09472099],[-0.12868434],[-0.12293586]]},{"dense_3_W":[[-0.23443374,-0.43379006,0.38643113,0.7170689,-0.31815973,0.7005203,-0.0989276,0.3470744,-0.09264834,-0.51163256,-0.15258677,-0.2910665,0.27302915],[0.28812635,0.20398347,0.22110644,-0.7146041,-0.27986667,-0.2958926,0.4361534,-0.012043313,0.31531844,0.467926,0.4048369,-0.29521784,0.3930137],[0.25268626,0.5656607,0.34994185,0.061901323,0.4205215,-0.66544545,-0.048824873,0.40229976,0.3616486,0.054331604,-0.57134205,-0.731286,0.493206]],"activation":"identity","dense_3_b":[[0.13606566],[-0.14437976],[-0.14025378]]},{"dense_4_W":[[0.3672289,-1.1880862,-0.3997548]],"dense_4_b":[[0.14610623]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144T xf1x891072xf1x82x0521G00807A1'.json b/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144T xf1x891072xf1x82x0521G00807A1'.json deleted file mode 100755 index 7a36f606d2..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN b'xf1x875Q0909144T xf1x891072xf1x82x0521G00807A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.406553],[1.1444793],[0.48023388],[0.04517182],[1.1198108],[1.1292706],[1.1378976],[1.1248115],[1.1107553],[1.0959218],[1.0747414],[0.04489478],[0.04499193],[0.04508163],[0.045316804],[0.045437645],[0.045486297],[0.045448944]],"model_test_loss":0.010464400053024292,"input_size":18,"current_date_and_time":"2023-08-05_03-20-24","input_mean":[[21.85032],[-0.06325212],[0.01593448],[-0.0067214244],[-0.0617676],[-0.062218133],[-0.062741525],[-0.052988674],[-0.046424996],[-0.036852293],[-0.026416903],[-0.006868046],[-0.006833722],[-0.0067935614],[-0.006550063],[-0.006349941],[-0.00603803],[-0.0058110217]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.1758758],[-0.02333589],[-0.9422901],[-1.8183272],[-2.0369716],[-0.0022337937],[1.0386317]],"dense_1_W":[[-0.016577989,0.8713441,5.688127,-0.3929182,-0.04865473,0.6506077,-0.28903118,0.36254203,-0.011359748,-0.80350965,-0.7413686,0.2852788,-0.180391,0.030887136,-0.24853921,-0.10783466,0.50824666,-0.06847572],[-0.0092391325,-0.21448685,0.03441581,0.110536866,-0.0051872088,-0.92594856,0.75064564,0.028740149,0.03222661,0.006082844,-0.101520896,-0.4111015,0.1091794,0.39225927,-0.2532579,-0.039659202,0.11658903,-0.053364333],[-1.3687131,-0.16632304,0.15804188,0.0037932456,-0.12444754,1.1138352,-1.0514365,-0.041139685,-0.25043303,0.26688784,-0.07053993,-0.37225965,0.32112512,-0.027879953,-0.051089693,0.14374797,-0.18620768,0.005694514],[-0.6469966,-1.5555854,-0.20889208,-0.5880108,0.4715537,-1.2139171,0.75022185,-0.16585363,-0.2956166,-0.15876539,0.14122242,0.035947774,-0.33897576,0.19888888,0.6707361,0.18586846,0.10368669,-0.28106293],[-0.657111,1.6010174,0.21602994,0.4263732,-0.06848571,0.5598709,-0.49075437,0.25268188,0.11085831,0.2158561,-0.10458329,0.24656911,-0.39565903,0.37622258,-0.67023623,-0.14563817,-0.02180011,0.20525338],[-0.026721686,-1.4577084,-0.026119402,0.5333309,0.38764423,-0.9197922,0.69576514,-0.31642672,-0.1339865,0.10481822,0.14266707,-0.6337337,0.012707174,0.26578203,0.16265541,0.17228846,-0.1989113,-0.10555704],[1.4377016,0.06603403,0.16708663,-0.15933846,0.11354903,0.99252284,-1.1596392,-0.35168508,-0.15729623,0.031751093,0.12479976,0.37379214,-0.23274498,-0.43550903,0.18850462,0.39560428,-0.2743065,-0.03711172]],"activation":"σ"},{"dense_2_W":[[0.13976535,-0.567236,0.72977924,-0.37755272,0.8387794,-0.6176494,-0.1588559],[-0.46564472,0.4264771,-0.77863467,0.6377271,-0.32651326,1.3463035,-0.59549373],[0.28558275,0.28753272,-0.4952516,0.7528485,-0.7717421,0.5046622,-0.77360827],[-0.96945935,-0.0453178,-0.6731784,0.21861276,0.0004108777,-0.5904792,0.046018012],[-1.2385854,0.6857041,0.36958358,0.8480664,-0.43229854,-0.010444919,-1.322231],[0.036224924,0.3547489,-0.8043728,-0.053537022,0.016718367,0.6929881,-0.30040604],[0.06862226,-0.259559,0.5140289,-0.7720217,-0.041946124,-0.51667583,-0.06930547],[0.9849274,0.889979,0.15711601,-0.24940383,0.5364856,0.5195277,-0.788271],[-0.02180253,-0.22045894,0.29244867,-0.09937624,0.62102586,-0.9813616,0.22756088],[1.0398556,-0.8574942,0.72217983,-1.5679595,0.9945934,-1.205857,0.5450476],[0.5572645,-0.56064814,0.49424344,-0.6622529,0.9019719,-0.7570887,-0.12037264],[-0.0053947666,-0.6394732,0.45090503,-0.25865456,0.5792981,-0.59776926,0.17400868],[-0.01624432,-0.8273978,0.76286685,-0.8753738,0.50364363,-0.188468,0.7102324]],"activation":"σ","dense_2_b":[[-0.094213076],[-0.007611653],[-0.09876658],[-0.20891039],[-0.34281158],[-0.024532793],[-0.36961433],[0.07229608],[-0.094220944],[-0.19420828],[-0.24400096],[-0.022362027],[-0.14466679]]},{"dense_3_W":[[0.35009202,-0.54889274,-0.6271456,0.3699252,-0.7306264,-0.040469803,-0.1333791,-0.34627312,0.48485342,-0.027413882,0.41518027,-0.20679481,0.6512874],[0.52266765,-0.75062644,-0.04478057,0.18780099,-0.42413864,-0.6919877,0.13284668,-0.4328708,0.10996859,0.4937182,0.5085866,0.6378642,0.523424],[-0.18289043,-0.62926316,-0.77449095,-0.5117072,0.27590525,0.27471027,0.27253544,0.13643086,-0.122853294,0.6343227,0.06519875,0.55697745,0.34692377]],"activation":"identity","dense_3_b":[[-0.00441717],[-0.0539032],[0.024021728]]},{"dense_4_W":[[0.27877802,0.706807,0.113575056]],"dense_4_b":[[-0.045484345]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567G6000800'.json b/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567G6000800'.json deleted file mode 100755 index a8aa9f68ea..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567G6000800'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.7607994],[0.9292432],[0.46292055],[0.044395123],[0.9189823],[0.92225415],[0.9265908],[0.9041406],[0.89363676],[0.8758474],[0.8587412],[0.044199012],[0.04426089],[0.044309698],[0.044270102],[0.044164237],[0.043878913],[0.043546345]],"model_test_loss":0.012919353321194649,"input_size":18,"current_date_and_time":"2023-08-05_04-11-04","input_mean":[[23.187113],[0.0015932432],[0.011463172],[-0.037785653],[0.0014130658],[0.002005605],[0.0032030009],[0.008243341],[0.012254494],[0.015819417],[0.020851867],[-0.037866723],[-0.03782731],[-0.037789218],[-0.037560076],[-0.037380483],[-0.037283257],[-0.037284937]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.3650206],[0.3503434],[0.049026404],[0.48147553],[-0.2179137],[-1.1410009],[0.35613173]],"dense_1_W":[[-0.0044370415,-0.088976935,0.09736069,0.13261136,-0.5935368,0.10521503,-0.8068187,-0.09207722,-0.15163152,-0.2225436,-0.56512666,0.64190215,0.6911761,-0.20394018,0.26521412,0.14738402,0.2390292,0.669949],[1.9099827,-0.20041782,0.06653255,0.04290131,1.081289,-0.07771372,0.5794198,0.055194955,0.3341548,0.12740795,0.00016614748,-0.01401175,-0.253479,0.3490117,-0.38425395,0.33906642,0.35481378,-0.3718989],[0.05287488,0.7134841,4.096453,-0.08065371,0.21688524,0.47354707,-0.46061245,0.13619322,0.7494003,-1.0308193,-0.90699166,-0.027265368,-0.0905294,0.0786151,-0.066612154,-0.21861951,0.6264546,-0.2477698],[0.49850515,-0.52765816,-0.02077531,-0.22489151,-0.06462903,-0.47247145,0.5355608,0.028485456,-0.11019967,0.13962062,-0.107459456,0.038771443,-0.23801842,0.5196211,0.15457287,-0.32410073,-0.018090906,0.15865909],[0.046214443,-0.64695966,-0.0069883303,0.25497442,0.20284595,-0.9400158,0.75683576,-0.27035123,-0.1531759,-0.27745956,0.27680025,-0.41793835,0.021180544,-0.06378223,0.15259326,0.23614758,0.19549917,-0.32855147],[-0.4081381,-0.5767889,-0.02048695,0.4837626,0.07757592,-0.59393334,0.50364584,-0.10654109,0.20280221,0.018726189,-0.1135464,-0.4784118,-0.17838266,0.2907484,0.2355112,-0.19352722,-0.16305554,0.076068975],[1.9215813,0.28210905,-0.07538363,0.33930507,-0.7474612,0.30265597,-1.1443635,-0.11762971,-0.41968435,-0.16676956,0.13010335,0.02262152,0.14194168,-0.5343928,-0.14601786,0.24347968,-0.24895756,0.15329723]],"activation":"σ"},{"dense_2_W":[[-0.97410744,0.3293568,-0.51517206,-0.3463321,-1.3647133,-0.86492306,0.36742914],[-0.38897687,0.48228312,0.33890837,0.44431418,1.3277258,0.16005625,-0.45875192],[0.02537137,-1.8192227,-2.2544084,-0.079543754,0.45377818,1.312974,-1.4039407],[0.19882208,-0.9093105,0.20501111,-0.87385803,-0.422892,-1.2277902,0.26516685],[-0.5868707,-0.1976348,-0.052873705,0.8127852,1.433916,0.6659879,-0.36126196],[-0.34342724,-0.59553665,0.40787566,-0.7651616,-0.49521706,-0.50139594,-0.44844094],[0.0324562,-0.030006122,-0.81495327,-0.08844059,-0.73199207,-0.9749751,0.193641],[-0.50183594,-0.53056437,-0.015531296,0.18623666,-0.09462893,-0.7861786,0.3987878],[0.38298038,0.19052242,0.19199069,0.044229858,-1.4711231,-1.2591913,0.59195024],[0.43198085,0.019489845,-0.22293438,0.16365366,0.32915708,0.86797434,-0.5055899],[-0.8588905,0.09965971,-0.15875271,-0.10829414,-0.3715543,-0.28131244,0.4689924],[0.4073162,-0.31107745,0.34453806,-1.0047082,-1.3331152,-0.3225261,-0.28392723],[-0.24590243,-0.5074513,0.45170495,-1.0937929,-0.29165098,-0.9534984,-0.44262615]],"activation":"σ","dense_2_b":[[-0.20421302],[-0.071595274],[-0.49483255],[0.08749108],[-0.27975222],[-0.030872881],[-0.04815583],[0.030535745],[0.12027835],[-0.10508093],[-0.19207817],[0.09736322],[0.057723336]]},{"dense_3_W":[[0.23816557,0.46098536,-0.6313008,0.7918219,-0.5916585,0.48531923,-0.27558136,-0.31984928,0.4619099,0.14357577,0.11340685,0.10802043,0.23884438],[0.3486614,-0.639459,-0.26902324,0.48187697,-0.6724132,0.48073167,0.26574108,0.25904334,0.53890723,-0.5283542,0.16785589,0.6735239,0.8907758],[-0.34013325,0.23225747,-0.83007133,0.5564732,-0.3356769,0.4536341,0.2693847,0.08861304,0.22285238,0.06831062,0.16584419,0.2606426,0.047501706]],"activation":"identity","dense_3_b":[[-0.010792147],[0.008722057],[-0.2345991]]},{"dense_4_W":[[0.14804278,1.4997839,0.04654937]],"dense_4_b":[[0.0038731655]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571G60533A1'.json b/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571G60533A1'.json deleted file mode 100755 index e409b82438..0000000000 --- a/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571G60533A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.9746957],[0.74846905],[0.3776189],[0.03050829],[0.73187035],[0.7361276],[0.7414741],[0.73505235],[0.7348843],[0.72738355],[0.71373457],[0.03035072],[0.030408371],[0.030481495],[0.03054445],[0.030590964],[0.030465184],[0.030331135]],"model_test_loss":0.010437331162393093,"input_size":18,"current_date_and_time":"2023-08-05_04-35-32","input_mean":[[21.84806],[0.037775595],[-0.00015706694],[-0.021587897],[0.040338658],[0.039734323],[0.039004818],[0.040646035],[0.039115567],[0.03719198],[0.038230542],[-0.021592842],[-0.021576356],[-0.021578403],[-0.021549474],[-0.021593899],[-0.021818507],[-0.022061665]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0914413],[0.0015551149],[0.22065881],[-0.1891756],[-0.0135917235],[-0.038417384],[-0.022252519]],"dense_1_W":[[0.011237223,0.097167924,0.01444804,0.2124649,1.3246,0.31190768,0.7195392,0.8302937,0.22576901,0.45450732,-0.10925574,0.03514202,0.5961049,0.3985722,0.61802393,0.080905825,0.32926518,-0.25256667],[-0.02162882,2.0190244,5.799918,-0.14539114,-1.9311626,0.66446453,-0.11302035,0.1226316,0.6734189,0.16489778,-1.2370133,0.56925017,-0.12738787,-0.374375,-0.18332094,0.38210422,-0.45544025,0.283806],[-0.005536447,0.6118752,0.005302229,-0.35660002,-1.1228982,1.576737,-0.6586397,-0.06552918,0.1747147,0.03373086,-0.1062423,0.7913594,0.33732173,-0.76828235,-0.055734146,-0.2576106,-0.09492317,0.33747092],[0.011188102,-1.2844069,-0.0012297877,0.07251332,-0.095956035,-1.1642455,-0.28017807,-0.014453496,0.04811712,-0.47494012,-0.488219,-0.11300311,-0.44098395,0.07885455,0.16945864,0.42555395,-0.1273186,-0.15138112],[-0.007230606,-0.44893888,0.0066998103,-0.16217937,0.25698268,-0.87970287,0.6202854,-0.15496038,0.051418323,-0.038406387,-0.06764698,0.17037104,-0.27248234,0.2816981,0.18553548,-0.33725816,0.08385291,0.045085847],[0.00084464176,-0.54823476,-0.0034105896,0.26671872,-0.015223509,-0.9550469,0.6014387,0.025267186,0.13067198,-0.43440172,0.20197645,-0.44261578,-0.16689432,-0.023613267,0.7486101,-0.19077903,-0.2137139,-0.02373193],[-0.030234346,-0.13823445,-2.021196,0.2427088,-0.07732753,-1.0305628,0.04975273,-0.1942112,-0.12176859,1.0165497,1.224236,-0.5657689,0.1795685,-0.1477603,0.30288523,-0.0046483153,0.2759976,-0.32901245]],"activation":"σ"},{"dense_2_W":[[0.083859816,0.933766,1.0253052,-0.7105447,-0.9955442,-0.8595731,-0.21401848],[0.25676674,-0.2483161,-0.51074135,-0.31487563,0.7560016,0.6237004,-0.36207017],[-0.45140705,-0.555112,-0.32009697,0.2014101,-0.14508359,-0.7487613,-0.5627604],[-0.052259363,-0.27644405,-0.56982166,-0.22415726,-0.08912631,-0.3108934,-0.07020982],[-0.30388612,-0.282844,0.6231819,-0.1827591,-0.8701069,-0.1363012,-0.06061468],[0.42716765,0.14838749,-0.77454436,-0.08531688,0.5431199,-0.33343503,0.47535864],[-0.29570216,0.054118063,0.8065188,-0.5626743,-0.58843243,-0.2626986,-0.13115627],[-0.16683827,0.01042097,-0.6624693,-0.16589774,-0.064373836,0.67642355,0.30223835],[-0.3474019,0.1442944,-0.24758828,-0.12841912,0.015519108,-0.8910641,0.26689053],[0.015551913,0.25193524,-0.28172082,-0.35587707,0.7043338,0.18275745,0.33005205],[0.1932851,0.3542477,0.49002793,-0.33909148,0.05432396,-0.86836,0.086581126],[0.35653573,0.041390643,-0.34532556,0.07281016,0.62669814,-0.24314882,0.41167533],[-0.19783325,0.031141564,-0.33750173,0.097428255,-0.43643403,0.22732346,0.46779665]],"activation":"σ","dense_2_b":[[0.3251711],[0.03284726],[-0.2276918],[-0.27249786],[0.07225366],[-0.064165816],[-0.052187826],[-0.040996723],[-0.27600503],[-0.027009819],[-0.094922386],[-0.079575196],[-0.04894184]]},{"dense_3_W":[[0.5707442,0.06543564,-0.41911805,-0.4872908,0.30000013,-0.5824054,0.31254762,0.37488416,-0.03498339,-0.31771377,0.49000293,-0.547452,-0.31576237],[-0.08784592,0.36186367,-0.35686487,-0.21170178,-0.28615108,0.6641257,0.09387274,0.36688283,-0.31936723,-0.52464163,-0.24194345,0.13221104,-0.044297554],[0.6223347,-0.6184397,0.5959415,0.56463706,0.57754964,0.3649079,-0.118873656,-0.58997124,-0.048462644,-0.46443146,0.43778852,0.10792423,0.27066556]],"activation":"identity","dense_3_b":[[-0.033067573],[0.030761039],[-0.045770094]]},{"dense_4_W":[[1.1994555,-0.36797908,0.91548634]],"dense_4_b":[[-0.03687687]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN.json b/selfdrive/car/torque_data/lat_models/AUDI_A3_MK3.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/AUDI A3 3RD GEN.json rename to selfdrive/car/torque_data/lat_models/AUDI_A3_MK3.json diff --git a/selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN.json b/selfdrive/car/torque_data/lat_models/AUDI_Q3_MK2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/AUDI Q3 2ND GEN.json rename to selfdrive/car/torque_data/lat_models/AUDI_Q3_MK2.json diff --git a/selfdrive/car/torque_data/lat_models/BUICK LACROSSE 2017.json b/selfdrive/car/torque_data/lat_models/BUICK_LACROSSE.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/BUICK LACROSSE 2017.json rename to selfdrive/car/torque_data/lat_models/BUICK_LACROSSE.json diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EV NO ACC.json b/selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EV NO ACC.json deleted file mode 100755 index 0558edf3a8..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EV NO ACC.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.8204904],[1.1288383],[1.3588161],[0.03592331],[1.0998698],[1.1152987],[1.1261423],[1.0726436],[1.0445082],[1.0255826],[0.9991902],[0.035928443],[0.03594955],[0.035947755],[0.035830557],[0.035794962],[0.035545427],[0.03522763]],"model_test_loss":0.013521275483071804,"input_size":18,"current_date_and_time":"2023-08-31_20-20-29","input_mean":[[21.15819],[-0.07168204],[-0.011260089],[-0.009422209],[-0.05070435],[-0.059720647],[-0.06839208],[-0.058936212],[-0.056256358],[-0.04905059],[-0.043772068],[-0.009612985],[-0.0095514655],[-0.009495763],[-0.009358192],[-0.009470251],[-0.009541206],[-0.009760213]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.14674146],[-0.13742483],[-0.22120655],[-4.8659616],[0.37734386],[0.0043874597],[0.0011968147]],"dense_1_W":[[-0.008038606,0.36823353,0.13374972,-0.121557444,0.8109894,0.1619341,-0.27322704,-0.5143952,-0.13323402,-0.28316674,0.41146618,0.069739744,-0.05502182,-0.16582587,-0.03316632,0.15212743,0.63178277,-0.47640973],[0.00472655,5.34618,2.1071396,-0.27966323,-3.491801,-4.7198477,-0.9055106,3.4698536,0.36450383,0.52648926,-0.9086405,0.34823787,0.17502202,0.17913261,0.5389167,-0.95546067,-1.1175836,1.1106054],[-0.0044299415,0.17029423,-0.07841701,-0.13078262,-2.5494642,-1.063504,-0.3024431,1.9482937,3.7423036,1.9179893,-2.4140003,-0.19327636,-0.11139729,0.8710235,0.80850005,-0.5346497,0.122894056,-0.8393351],[-3.4416573,0.2720535,-0.036259558,-0.13027346,0.13627039,-0.30027944,0.2926907,-0.53764284,-0.08440139,-0.01651856,0.15396604,0.15355577,-0.04698026,-0.14798953,0.14998728,-0.3586781,0.75842935,-0.37555856],[-0.29392308,-4.2560554,0.054719303,0.40846434,-2.129364,-3.1015625,-3.853146,-3.1836767,-2.180161,-2.0388255,-2.4251742,0.03920686,-0.38703024,0.41823363,-0.019605622,-0.5604943,0.22793195,0.0057709315],[-0.002196624,5.8481355,-0.09095744,-0.015489594,-2.612487,-1.536748,0.06610644,2.500532,0.4939543,-0.63674825,-0.8083325,-0.26766282,-0.16603528,0.10459684,-0.6615658,-0.78105426,-0.5034555,0.9925575],[-0.013433307,-0.20619735,-0.15958488,-0.25665176,1.9273874,1.1793138,-0.34153762,0.061601996,-0.73064274,0.42999524,0.5411453,0.031738162,-0.11005042,-0.7472006,-0.14436004,0.4244081,-0.2877388,0.18756717]],"activation":"σ"},{"dense_2_W":[[-0.67943275,-0.24000154,-0.13848315,0.30882534,-0.01988677,0.0654716,-0.14717165],[-0.55921,-0.0072287056,-0.21438314,0.13855484,-0.18693337,0.091503285,-0.6234959],[0.29719043,0.34836015,0.31882486,2.2765832,-2.8485565,-0.13084944,0.18394771],[0.09499309,0.20721479,-0.22826056,-0.5555067,0.4858052,-0.297806,-0.7479107],[0.7698728,-0.12123032,-0.32042873,0.64103067,0.29181543,0.35124788,0.3626909],[-0.7722087,-0.0970277,-0.66611034,0.8990095,0.008845325,-0.2853908,0.096749336],[-0.056676403,0.10399554,0.07880596,0.15535226,-0.29964685,0.20662634,0.747629],[-0.45565298,-0.61348987,-0.3170684,0.66529834,0.20692064,0.1784706,-0.52314126],[0.07283485,-0.041357554,-0.5544705,0.029298512,-0.07259363,0.12714466,-0.4060869],[-0.6921391,-0.28740877,0.16838852,0.34705403,0.5441259,-0.56957257,-0.23424709],[0.5224591,0.08929995,-0.3917331,0.77703923,1.2387965,0.4035521,0.038004678],[-0.21601413,-0.27209452,-0.006628554,0.26490286,-0.48555186,-0.14057891,-0.23594409],[0.025565607,-0.1843107,-0.74081415,0.21653186,-0.20180094,-0.1775718,0.2597312]],"activation":"σ","dense_2_b":[[-0.11495718],[0.029644735],[-1.5003729],[0.0062865904],[0.063854754],[0.043472946],[-0.03168991],[-0.05123685],[-0.21858792],[0.11300286],[-0.04152576],[-0.09974841],[-0.10666013]]},{"dense_3_W":[[-0.46642318,0.29889506,0.0647746,0.031128142,-0.5190028,-0.2265485,-0.12124089,0.15220042,0.1487402,0.09831015,0.57098764,-0.353228,0.45436162],[0.24007116,0.43487012,-0.43202627,0.39710402,-0.47436452,0.5207094,-0.44189987,0.55030584,-0.002478384,0.49253044,-0.40208483,0.25778514,0.05400483],[0.40668672,-0.80624264,0.49121335,0.28858688,0.4708336,-1.031162,-0.12058632,-0.4919157,-0.0032738608,-1.1038178,0.59533536,0.42121547,-0.42830208]],"activation":"identity","dense_3_b":[[-0.09258446],[-0.10893599],[0.048807696]]},{"dense_4_W":[[0.013993477,-1.1382563,0.45117924]],"dense_4_b":[[0.10757936]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET EQUINOX NO ACC.json b/selfdrive/car/torque_data/lat_models/CHEVROLET EQUINOX NO ACC.json deleted file mode 100755 index 00a68d269b..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHEVROLET EQUINOX NO ACC.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[10.534294],[1.5504998],[1.4046903],[0.029573984],[1.5927145],[1.578906],[1.564156],[1.5118331],[1.493684],[1.4678634],[1.4253669],[0.02943281],[0.029483505],[0.029535847],[0.02967169],[0.029826282],[0.03000203],[0.030046586]],"model_test_loss":0.02003631368279457,"input_size":18,"current_date_and_time":"2023-08-31_20-50-28","input_mean":[[20.131113],[0.009686473],[0.06975938],[0.0023475066],[0.0038891183],[0.0060874033],[0.008401226],[0.013517541],[0.01840766],[0.0266773],[0.02453028],[0.0023093733],[0.002328295],[0.0023440488],[0.0024961669],[0.0025724813],[0.0024677413],[0.0023574075]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-4.0288644],[0.10457083],[-3.9555483],[0.1691402],[-0.012094571],[-0.0782635],[-0.2598278]],"dense_1_W":[[-2.1827135,1.6132607,-0.9255983,0.116717376,-1.8178183,-0.54029983,0.33489665,0.56080383,-0.22747517,-0.5733255,0.5044412,-0.2292483,0.043896638,0.08075467,-0.28934216,0.17338042,0.0033520209,0.10574474],[-0.03214852,1.3043286,1.787647,-0.19292493,-1.496456,-1.6432034,-1.0122085,0.6772478,0.9241051,2.137595,1.1481318,0.7382223,0.24003813,-0.26050806,-0.28489965,-0.055436503,-1.5187881,0.5395662],[-2.130688,-2.4082897,0.8946516,1.182773,1.0356439,1.0627962,0.681919,-1.07377,0.9514841,0.2902732,-0.51102746,-1.0186149,0.06007755,0.55835754,-0.8702267,-0.27547133,1.1577551,-0.79220283],[0.048019372,0.56005365,0.090563335,0.04659274,-0.3400944,0.08129445,0.079794005,1.6712024,0.37665895,0.92944545,-0.818461,1.0755452,0.03035464,-0.7417196,0.46747556,-1.7863483,0.1933551,0.6655417],[0.010540867,-2.1044421,0.123707764,0.19983652,-0.3400125,0.042333197,-0.14189881,-0.15991694,1.1688339,0.89001805,-1.0717757,-0.12767468,-0.23459645,0.55075175,0.08273279,-1.410371,-0.11742753,1.0628744],[-0.0035597957,3.3175247,-0.08206834,-0.41877395,-2.3628318,-0.3887815,0.33513132,1.0517763,1.3315583,-0.45716277,-0.83998686,0.038495045,-0.29630885,-0.5393306,0.004715303,-0.3557685,-0.0024815162,0.5117863],[-0.06787126,-1.0245934,0.846602,0.76652443,-3.6147707,-3.2961829,-3.046585,-2.334436,-2.2018268,-2.0479157,-2.1753612,-0.3235234,0.3021576,0.6696055,-0.5296955,-0.34782553,-0.6869261,0.61321783]],"activation":"σ"},{"dense_2_W":[[0.64928615,0.2816972,-0.8923362,0.39578387,-0.61536825,0.81299543,0.32944572],[-3.469548,-0.088318504,4.506985,1.7126206,-0.54613674,1.1776173,-1.3406864],[-0.16514356,-0.18710926,-0.049463313,-0.74177825,-0.89867437,-0.12767266,-0.41532612],[0.3880128,0.14577644,-0.22068585,0.47859693,-0.3810993,0.21953157,-0.28429258],[0.09226449,-0.31862667,-0.7718878,-0.3926271,0.39786428,0.24407528,0.50177044],[0.67237484,0.12668592,-0.30338138,-0.625696,0.26677904,-0.40067798,-0.32989067],[0.55108297,-0.46753818,-0.2422762,-0.32914385,1.0277789,-0.21390574,-0.51578075],[-0.6387295,0.087801814,0.4115124,0.19489816,-0.50232434,0.88593876,0.04993241],[-0.0012766474,-0.39255276,-0.43439093,0.5811583,0.04147405,0.39352056,-0.2983913],[0.5312808,-0.46965963,-0.2202195,0.022353612,0.9100419,-0.7610306,-0.045171853],[-0.4153422,0.25298238,-0.16235219,0.6847717,-0.24125478,0.12481583,0.17123348],[0.019955412,-0.049374487,-0.028301261,-0.1474805,-0.99081236,0.46832514,0.04314314],[-0.060847353,-0.4487362,0.11238633,-0.2315336,0.61632276,-0.037449174,-0.31603873]],"activation":"σ","dense_2_b":[[-0.0784909],[-0.78942764],[-0.15396598],[-0.0694357],[0.42111325],[0.13395377],[0.13471761],[-0.2390017],[-0.10127865],[0.021352982],[-0.10597191],[-0.0495153],[0.08049109]]},{"dense_3_W":[[-0.5803282,-0.4269681,-0.29210615,-0.35849357,0.6151693,0.4374335,0.33656615,-0.38959798,-0.124871194,0.80708337,-0.2547417,-0.4598867,0.28997138],[-0.024669895,1.1817242,-0.08351745,-0.24313891,-0.31439584,-0.25903952,-0.07882097,0.5553487,-0.3152985,-0.31680647,-0.116309114,0.010063961,0.2913986],[-0.43385702,-0.37067002,0.0936241,0.23112701,0.11643858,-0.15334345,-0.003450505,0.18969658,0.37703827,-0.25617403,0.11559996,-0.19988349,0.1828592]],"activation":"identity","dense_3_b":[[0.098078996],[0.0034752209],[0.008636777]]},{"dense_4_W":[[-0.73048496,0.39407238,-0.07285802]],"dense_4_b":[[-0.09288416]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET SUBURBAN PREMIER 2019.json b/selfdrive/car/torque_data/lat_models/CHEVROLET SUBURBAN PREMIER 2019.json deleted file mode 100755 index 1383fdf7f9..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHEVROLET SUBURBAN PREMIER 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.0000353],[0.91031396],[1.269469],[0.0315604],[0.9563133],[0.95031977],[0.9356424],[0.873496],[0.8912867],[0.8935701],[0.96191794],[0.031832103],[0.031727515],[0.031619374],[0.03170114],[0.03179356],[0.031944003],[0.03203715]],"model_test_loss":0.025683574378490448,"input_size":18,"current_date_and_time":"2023-08-31_22-32-43","input_mean":[[27.019146],[0.2162388],[-0.102987334],[-0.016973253],[0.2426502],[0.23661843],[0.22663806],[0.18541981],[0.17368032],[0.14804864],[0.09238692],[-0.017235657],[-0.017166195],[-0.017074104],[-0.016875083],[-0.016880676],[-0.017125089],[-0.017351476]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.23588695],[-0.5088953],[1.5173167],[0.21325926],[0.7270255],[1.0430372],[-2.1749456]],"dense_1_W":[[-0.00035987928,1.4975938,2.03412,-0.83676016,-5.5800395,-1.7383903,-0.18633558,6.249567,0.15692733,1.1870492,-1.8389847,0.8397649,0.41889027,0.19991927,-0.71028113,-0.42742363,-0.01929488,0.56470984],[0.1451778,-0.42022082,-0.08357744,0.37352008,0.13762045,-0.513736,0.19210075,-0.99654514,0.07671047,0.3092085,-0.09438795,-0.7692168,-0.05790273,-0.019019479,0.68036485,-0.3681197,0.042775016,0.113177255],[0.17934947,0.6802453,0.53991216,1.2953564,0.36064458,-2.232729,-1.3662916,9.39327,3.2034888,0.82174385,-3.8604288,-0.059266165,0.23885792,1.2206435,-0.037034295,-1.0659415,-1.2380418,-0.38709572],[-0.63551307,0.14085051,-0.058989003,-0.096907504,-0.08637354,-0.9568107,-0.203569,0.09172185,-1.7067626,0.23453063,0.40079904,-0.33019188,-0.14800894,0.4674501,-0.058009204,-0.3754687,-0.10436635,0.64636946],[0.33742648,-0.36501276,-0.034292817,-0.51860994,-1.3856511,-1.5455489,-1.0439808,-0.75624853,-1.0810176,-0.5734188,0.55518353,-0.80131483,-0.6185672,-0.28676248,-0.104135,-0.62493587,-0.8962451,-1.5516719],[0.43760708,-1.6991494,-0.03338309,-0.96213526,0.00956474,-1.2663416,-1.9227605,-3.5994406,0.26717234,1.618855,-0.69799376,-0.3365453,0.08994935,0.16855639,-2.0510433,-1.3217996,-1.0182589,-0.993361],[0.38308197,-1.8382412,-0.15014274,0.11305897,1.90282,-0.91276294,-1.8583714,-2.2861354,-1.0779126,-2.9923978,-2.1958616,-0.40794706,-0.3506177,0.21085607,0.39614698,0.46702477,-0.1904523,-0.28659886]],"activation":"σ"},{"dense_2_W":[[-0.13722074,0.17729984,-0.24335465,0.24187207,-0.14201832,-0.07732416,0.13892417],[-0.4686111,0.30702016,-0.15520222,0.2413592,-0.06519562,-0.02441734,0.05019473],[0.79214656,-0.7921441,-0.6606072,0.055532016,-0.11311045,-0.08024592,-0.0085274875],[-0.25042439,0.21615438,0.4954985,0.0046605244,-0.4504836,-0.13616334,-0.39802498],[0.49501747,-0.8520829,-0.74666256,0.59406155,-0.3424727,-0.42375195,-0.056689456],[0.09918636,-0.27861944,-0.06896329,0.07916021,0.39362162,-0.3197992,-0.38495535],[-0.44832206,0.775501,-1.5508496,-1.2964923,0.2656348,0.73607206,0.102380335],[-0.12338452,0.45182562,0.15285002,0.36166486,0.106165096,-0.44855922,0.26180896],[1.468655,-2.9420528,1.1340134,-1.8203074,-1.8435699,1.8503501,-0.6241417],[0.11571435,0.44641992,0.5466342,0.460799,0.34136263,0.118771955,0.03079372],[-0.89526504,0.4808293,-0.020656256,0.23367782,0.24296117,0.14677529,-0.17654741],[0.48179916,-0.9906037,-0.5923862,-0.4594782,-0.35988396,0.8058588,-0.045400906],[0.5093772,0.44455037,0.17609815,-0.81010824,-0.7701845,-0.67883664,-0.105422966]],"activation":"σ","dense_2_b":[[-0.016313186],[-0.23423415],[-0.11555125],[0.031153541],[-0.008395348],[-0.05427732],[0.04926095],[-0.03232725],[1.3587319],[0.039414253],[-0.2525624],[0.069728516],[-0.1901692]]},{"dense_3_W":[[-0.40749985,-0.48021835,0.56590366,0.18960631,0.38889936,-0.016490487,0.2452584,-0.49623072,0.38123888,-0.64162004,-0.4950841,-0.28877184,0.033746734],[-0.42167312,0.4292303,-0.117614456,-0.051768117,0.051334534,0.5342065,0.5592815,-0.093919486,0.65363497,-0.43596736,0.16242468,0.2578982,-0.2107315],[0.3909801,0.0338481,0.17298904,-0.6669294,0.66819596,0.5040033,-0.11421765,0.24396016,0.58365494,-0.4551556,0.13173825,0.29966846,-0.28813577]],"activation":"identity","dense_3_b":[[-0.039529935],[-0.049995966],[-0.054298006]]},{"dense_4_W":[[0.5930795,0.46760607,0.73884505]],"dense_4_b":[[-0.046037514]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EUV 2022.json b/selfdrive/car/torque_data/lat_models/CHEVROLET_BOLT_EUV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHEVROLET BOLT EUV 2022.json rename to selfdrive/car/torque_data/lat_models/CHEVROLET_BOLT_EUV.json diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET SILVERADO 1500 2020.json b/selfdrive/car/torque_data/lat_models/CHEVROLET_SILVERADO.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHEVROLET SILVERADO 1500 2020.json rename to selfdrive/car/torque_data/lat_models/CHEVROLET_SILVERADO.json diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET TRAILBLAZER 2021.json b/selfdrive/car/torque_data/lat_models/CHEVROLET_TRAILBLAZER.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHEVROLET TRAILBLAZER 2021.json rename to selfdrive/car/torque_data/lat_models/CHEVROLET_TRAILBLAZER.json diff --git a/selfdrive/car/torque_data/lat_models/CHEVROLET VOLT PREMIER 2017.json b/selfdrive/car/torque_data/lat_models/CHEVROLET_VOLT.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHEVROLET VOLT PREMIER 2017.json rename to selfdrive/car/torque_data/lat_models/CHEVROLET_VOLT.json diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68288891AE'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68288891AE'.json deleted file mode 100755 index a3d545654f..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68288891AE'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.373018],[0.9030777],[0.5074704],[0.04613504],[0.88142586],[0.8866381],[0.89388347],[0.8932321],[0.8819763],[0.8731947],[0.8590319],[0.045989916],[0.0460441],[0.0460619],[0.045975763],[0.045940377],[0.045967344],[0.045802947]],"model_test_loss":0.015751762315630913,"input_size":18,"current_date_and_time":"2023-08-05_06-59-32","input_mean":[[24.77125],[-0.0032338882],[0.0011955422],[-0.006900902],[-0.0038386101],[-0.0039004202],[-0.0042313747],[-0.0024037024],[-0.00096440193],[0.0012867558],[0.0017196954],[-0.0071007432],[-0.00707776],[-0.00704705],[-0.006997249],[-0.0070410697],[-0.007170475],[-0.0072323773]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.6144774],[-0.611369],[0.06358977],[0.3156127],[0.8767984],[3.4156723],[0.003413344]],"dense_1_W":[[-1.6343578,-1.049992,-0.0069447346,-0.07656319,0.9073908,-0.4678912,0.71257806,0.1714419,-0.26281458,-0.35347363,-0.3895179,0.44868368,0.380276,-0.39410144,-0.2020346,-0.5423825,0.033040486,0.34113047],[0.061624493,-0.82921517,-0.01718619,0.5021635,0.38075656,-0.9557198,1.0850599,-0.040632535,-0.06843774,-0.057645954,0.08296408,-0.80168,-0.18512976,0.29119503,0.110343546,0.41180205,0.12086572,-0.41889068],[-0.010757727,0.5473467,0.011401861,0.6086944,0.049230263,0.99673975,-1.3204706,0.28527504,0.3079167,-0.08217005,-0.11085929,-0.020257747,-0.23550712,0.24950017,-0.5063016,-0.26893258,0.0859618,0.10826616],[0.00026013076,0.23115467,-0.069196984,-0.75177777,0.22679992,1.7333206,0.07338034,0.116831884,0.0074134893,-0.018370198,0.30970082,-0.50682133,-0.19027503,-0.6724099,-0.18199274,0.13397577,0.164965,-0.20918545],[-0.20541261,-0.5444166,-0.021420065,-0.3442164,0.057785954,-0.30310464,0.30055538,-0.1295605,-0.19352978,0.24066639,-0.042200003,-0.36956027,-0.02677732,0.31982243,0.6093545,-0.115526475,0.1776776,-0.22874752],[1.5681508,-0.8700428,-0.003696639,0.28922054,0.5389638,-0.2202644,0.91082454,0.17935306,-0.5075993,-0.52194244,-0.18601756,0.29824322,0.11232214,-0.089093655,-0.6800216,-0.10418546,-0.23698366,0.39502653],[0.0059208865,1.0288696,6.2661505,-0.66229445,-1.1125858,-0.38614404,-0.32643217,0.47949737,1.3503966,0.5618509,-1.4472144,0.6179492,0.65568125,-0.07885619,0.13408393,-0.21204486,-0.24597093,-0.19171685]],"activation":"σ"},{"dense_2_W":[[-0.6874904,1.4170951,-0.12745337,-0.60079765,1.2469791,1.1586337,-0.78649855],[1.2081319,0.90333015,-1.1146795,-0.48159444,-0.3649141,-0.17463505,-0.6678926],[-0.55214715,-0.34822515,0.66485703,0.39923072,-0.12463221,0.08416195,0.28940073],[-0.050559178,-0.5941852,0.69570416,0.4125025,-0.4354757,-0.7011088,-0.16208832],[1.1914842,0.6823764,-1.2257708,-0.15821911,0.2223274,-0.7032655,-0.848314],[1.6538767,1.1209396,-1.2886561,-0.4070121,-0.115177,-0.8090923,-0.81735224],[0.22016695,-0.7717329,-0.11587681,0.21162826,-0.92120653,-0.97903466,0.43579248],[0.56604755,0.37791598,-0.20845827,0.09919322,-0.30082363,-0.038313784,0.5362454],[-0.68821806,-0.49654222,0.9537832,0.65139836,-0.11693425,0.14916053,-0.06942568],[0.046630222,-0.8000676,0.7262631,0.11821005,0.051495228,-0.85939616,0.057547066],[0.53842676,0.48920274,-1.0697515,-0.08906106,-0.111993946,0.0057545984,-0.07658284],[0.6831117,-1.0648286,0.68546003,0.0413394,-0.80540425,-1.5328187,0.56354785],[0.16279308,0.67666584,-0.6573683,-0.31834096,0.037058678,0.16600053,-0.30611348]],"activation":"σ","dense_2_b":[[0.18475154],[-0.5353296],[0.0045686276],[0.0644243],[-0.34292984],[-0.44532895],[-0.15199955],[-0.039516825],[-0.0066641783],[-0.121129245],[-0.30155125],[-0.13434392],[-0.20536488]]},{"dense_3_W":[[0.5609779,0.41182333,0.09668643,-0.11169122,0.65781176,-0.20218727,-0.20579323,-0.39217472,-0.1875857,0.07013257,-0.14129624,-0.8516521,-0.4181056],[0.17330131,0.5577742,-0.41269195,0.3908688,-0.28000897,-0.4038982,-0.7611636,-0.17782487,0.4776658,0.10774335,-0.63901216,0.07952478,0.30694935],[0.6155099,0.32474285,-0.5803224,-0.57116944,0.52884084,0.5404638,-0.44095984,0.5225624,-0.6491606,-0.3627888,0.35069153,-0.8106001,0.3223117]],"activation":"identity","dense_3_b":[[-0.08286718],[-0.068888254],[0.0319719]]},{"dense_4_W":[[-0.13953766,0.008684733,-0.9822762]],"dense_4_b":[[-0.035473026]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68378884AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68378884AA'.json deleted file mode 100755 index c7ee2877a3..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018 b'68378884AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.4114137],[0.8722323],[0.46932527],[0.044081252],[0.86028934],[0.8640826],[0.86798763],[0.8536187],[0.8410519],[0.82815075],[0.810109],[0.044043],[0.04407502],[0.04409199],[0.043937493],[0.043765776],[0.043546446],[0.04328152]],"model_test_loss":0.014643135480582714,"input_size":18,"current_date_and_time":"2023-08-05_07-24-40","input_mean":[[24.419659],[0.074539855],[-0.0017381747],[-0.008417752],[0.07829621],[0.077322125],[0.07638317],[0.07649018],[0.07914126],[0.07727339],[0.07422926],[-0.008268176],[-0.008305934],[-0.00833634],[-0.0085348915],[-0.008592072],[-0.008777455],[-0.008993609]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.6179284],[0.023280667],[-0.08620803],[0.06128514],[0.02275239],[-0.18200094],[1.8732487]],"dense_1_W":[[1.1412842,-0.65644145,-0.021648865,0.20894393,0.11492929,0.024267908,0.52723205,0.019462796,-0.47829676,-0.16443051,0.17201795,0.42243433,-0.36430183,0.22046827,0.32417053,-0.18519317,0.080741584,-0.16006538],[-0.005015809,-1.0202065,-5.871842,0.71349776,1.488136,0.45296022,0.71639055,-0.3002113,-2.253665,-0.42296624,1.242773,-0.7964674,-0.9905283,0.2496325,0.61510533,-0.15485354,0.21373129,0.04878167],[-0.010342299,-0.39523616,0.046641767,-0.24375893,-0.06735964,-1.2132907,0.37299547,0.3911464,-0.25198907,0.3312644,-0.34782395,-0.48724928,0.29790998,0.35056496,-0.0473569,-0.43243703,0.6975423,-0.29797408],[-0.00034046813,0.5919114,0.09751131,-0.5365073,-0.27980977,0.6561016,-1.3969619,0.7704919,0.22894996,0.1283786,-0.47947106,0.7656381,-0.072749116,-0.22385994,-0.35181323,-0.12690988,0.14871003,0.11680299],[-0.013497786,0.45467585,4.8478483e-5,-0.03120461,-0.101532854,1.0691814,-0.8467964,-0.021295521,-0.45961225,0.59129924,-0.089904785,0.008552424,0.18295166,0.22167599,-0.15085436,-0.24900465,-0.119021356,0.22574107],[-0.008662208,-0.63313335,0.018632747,0.3784552,0.43672615,-1.0928847,0.454874,0.19710287,-0.28992844,0.23891906,-0.09657884,-0.4631879,0.07360768,0.18814832,-0.12545085,0.2790517,0.08361877,-0.19971517],[1.1187938,0.60673416,0.01786017,-0.09599037,-0.13338761,0.18924287,-0.71290374,0.25608516,0.055396356,0.32042313,-0.14714265,0.16070165,-0.44769058,-0.3857691,0.32144114,-0.2591744,0.04301578,0.12334804]],"activation":"σ"},{"dense_2_W":[[-0.82576907,-0.44307485,-0.5584657,-0.26069835,0.025256865,-0.22589661,-0.30988473],[0.5059596,0.51916337,0.37335545,-0.78297406,-0.5575328,0.4401032,0.58699924],[0.11900411,0.11446233,0.19891147,-0.46948108,-0.9270995,0.35623828,-0.6453305],[0.19260314,0.21158606,-0.80488014,0.1861143,-0.40799478,0.14247413,-0.47271043],[-0.017787304,0.20611304,0.4156514,-0.61586165,-0.94270116,0.66989255,-0.67521656],[-0.31637055,0.20475076,0.49659994,-0.8381352,0.3070665,0.29303974,0.3692397],[-0.24042161,0.14646454,0.4807689,-0.38160017,-0.11857776,0.52430975,-0.6127423],[-0.65716666,-0.05448026,-0.08932297,0.44863978,0.6453178,-0.8167935,0.32415792],[-0.97310895,-0.9338679,-0.55535233,0.95583254,0.7763494,-1.2186505,-0.56390756],[-0.756582,0.030662287,-0.5920601,0.26177648,0.0058387904,-0.79189116,0.22250274],[-0.32252684,0.052682888,0.22795783,-0.22263758,0.1424579,-0.4165235,0.082806356],[-0.5069151,0.230296,-0.7718149,0.86378086,0.6413413,-0.7768083,0.09442894],[0.7895166,-1.1067913,-0.9261671,1.5575143,0.72259814,-0.71757495,1.2043413]],"activation":"σ","dense_2_b":[[-0.25221804],[0.009360817],[-0.21046683],[-0.30669668],[-0.19557822],[-0.051661972],[-0.010102212],[-0.07111588],[-0.024985338],[-0.20747323],[-0.070582196],[-0.024536485],[0.429603]]},{"dense_3_W":[[-0.05159049,0.4616699,0.31688318,-0.35587642,0.10358843,0.23453818,0.62690145,-0.17403877,-0.34668615,-0.2585309,0.042846948,-0.64290446,-0.66602695],[0.25770965,-0.6448781,-0.1178888,0.02731388,-0.62877536,-0.4874037,-0.16834061,0.3735322,0.6264744,0.23036048,0.57248384,0.0652369,0.033351496],[0.08815916,-0.34792545,-0.33370885,0.6393934,0.23722698,-0.3480035,0.47185498,-0.6307859,-0.080584675,0.27943882,0.40409383,-0.10291437,0.25641736]],"activation":"identity","dense_3_b":[[0.06215998],[-0.043686442],[0.044486612]]},{"dense_4_W":[[-1.0976462,0.4308298,-0.47021297]],"dense_4_b":[[-0.056185924]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68416742AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68416742AA'.json deleted file mode 100755 index 2614d74873..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68416742AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.639734],[0.85540456],[0.51403534],[0.0358391],[0.8370467],[0.8427152],[0.8486273],[0.84191525],[0.8333683],[0.81845397],[0.8031892],[0.03569495],[0.03575506],[0.035804357],[0.035734106],[0.035606634],[0.035394073],[0.035043836]],"model_test_loss":0.01249884907156229,"input_size":18,"current_date_and_time":"2023-08-05_08-42-51","input_mean":[[28.944149],[0.008511811],[0.006614594],[-0.0007803046],[0.008761563],[0.008401991],[0.0077602137],[0.010470908],[0.011851343],[0.013133246],[0.012414774],[-0.00091107877],[-0.00089483795],[-0.000888365],[-0.0009297467],[-0.00096828357],[-0.0011469029],[-0.0011704979]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.42215475],[-0.13067937],[-0.97678196],[0.032708973],[-0.21987508],[-0.13514404],[-0.035059012]],"dense_1_W":[[0.21781056,-0.33137965,-0.021430474,-0.025393143,0.41623712,-0.85452425,0.5125608,-0.028942296,-0.25001037,0.1056078,0.02808124,0.07531937,-0.1905481,0.16195467,0.12945747,0.20600978,-0.26016086,0.06601578],[0.45804447,0.39586294,0.016093273,-0.4889348,0.2889768,0.097107925,-0.4900717,0.08450028,0.12946251,0.029848771,-0.04884375,0.29394668,0.08218726,-0.18262681,0.046750773,0.006920203,0.25929216,-0.123556316],[-0.36142796,-0.4761168,-0.031057041,-0.03201091,0.3264201,-0.28861398,0.03595103,-0.03517199,0.12988408,-0.33035025,0.20245835,-0.050757732,-0.106270775,0.37782818,-0.1009953,-0.13087629,0.26906365,-0.10609762],[0.025104474,0.019358486,-0.024905588,0.21881673,-0.25832435,0.96893126,-0.7209163,0.41793713,-0.13289197,-0.12783904,0.13794017,0.21045911,0.050720435,-0.25170416,-0.62401164,-0.024670731,-0.29609823,0.35617065],[-0.008312407,-0.7407596,-7.084344,0.028729403,0.6807612,-0.014186225,0.67334884,0.29722595,-0.9668716,-0.531245,0.66484416,-1.1115197,-0.64549005,-0.120867796,-0.17233334,0.78614897,0.8250422,0.34976736],[-0.48205698,0.4224278,0.018553648,-0.2134916,0.04153917,0.7245894,-0.93251956,0.013013465,0.24247682,0.04031593,-0.08674914,0.14843619,0.25142464,-0.052657608,-0.067281075,-0.18016832,-0.3367292,0.36795783],[0.0060425145,-0.6726894,0.12755352,0.6079416,-0.19894339,-0.67753744,0.42177054,0.25688335,-0.6894623,-0.2502804,0.32992235,-0.27346176,-0.35465118,0.29624695,-0.12629414,-0.6665767,-0.173872,0.28384444]],"activation":"σ"},{"dense_2_W":[[-0.7923206,-0.009339641,-0.5352346,0.6091468,-0.04876316,0.39490545,-0.034111094],[-1.0249208,0.39700195,-0.58438927,0.16584569,0.17201081,0.5389196,-0.0868657],[-0.6531692,-0.007390197,0.17620674,-0.13442127,-0.58781165,0.47517285,-0.3037654],[0.93093103,-0.8664581,0.60659295,-0.41851223,-0.008249123,-0.3610143,-0.1658192],[0.18383585,-0.9612978,0.108306736,-1.0595605,0.6152441,-0.18968369,0.12764637],[-0.23412292,0.8866577,-0.36853278,0.41754025,-0.6953287,-0.2107403,0.3878631],[1.6182716,-1.1367084,1.2613131,-0.22455032,-1.5450573,-1.1383495,1.2916391],[-0.6907885,0.21876465,-0.37425384,0.28203624,-0.37134746,-0.060869645,-0.36596343],[0.32001236,-0.48894957,0.4011093,-0.63292897,0.14903933,-0.69945556,0.2776244],[0.7659646,-0.14666194,0.77608156,-0.29742083,0.26605186,0.016574113,-0.22834513],[-0.71138144,-0.062448937,0.30001172,-0.01717667,-1.2297869,0.69679105,0.046717945],[-0.7727106,0.2412452,-0.464044,0.80845594,-0.62951875,-0.08542672,0.07366458],[-0.025123067,-0.027039677,0.34798175,-0.7620366,0.43302727,-0.89325774,0.0035131366]],"activation":"σ","dense_2_b":[[-0.099672936],[-0.0876946],[-0.08204721],[-0.025810441],[-0.34068185],[0.060692374],[-0.024438279],[-0.07015547],[-0.039097134],[-0.14396088],[-0.15622896],[-0.005676818],[-0.011064758]]},{"dense_3_W":[[0.39419955,0.5720024,0.54087794,-0.73478484,-0.51288295,0.4327564,-0.5041765,0.3271926,-0.48603916,-0.5796963,0.72407377,0.71574676,-0.6588747],[-0.4544194,0.26937458,0.039873235,-0.34116194,0.16377093,-0.59205776,0.7291578,-0.12695956,0.7046899,0.10085361,0.14058925,-0.6534143,-0.31029704],[0.36182398,0.6130376,-0.03244722,-0.1537163,-0.62813044,0.25602,-0.7971318,0.06725275,-0.21288694,0.23565246,0.45994118,0.029152358,-0.028171498]],"activation":"identity","dense_3_b":[[-0.008158646],[0.024065692],[-0.046528816]]},{"dense_4_W":[[0.623884,-0.1895593,0.47617644]],"dense_4_b":[[-0.010568268]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68460393AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68460393AA'.json deleted file mode 100755 index d19a7be8cb..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68460393AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.4242563],[1.090038],[0.5387467],[0.045696616],[1.0706453],[1.0769838],[1.0826412],[1.0662853],[1.044258],[1.015598],[0.9955335],[0.045430943],[0.04546534],[0.04548917],[0.045445427],[0.045430474],[0.045357496],[0.045145508]],"model_test_loss":0.012552225962281227,"input_size":18,"current_date_and_time":"2023-08-05_09-07-51","input_mean":[[28.232662],[0.0413919],[8.108091e-5],[-0.00953157],[0.038943794],[0.03873717],[0.039187554],[0.038665015],[0.041457415],[0.042767525],[0.03904675],[-0.009741066],[-0.009699849],[-0.009670657],[-0.009643033],[-0.009600081],[-0.00964547],[-0.009827622]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.13912317],[-0.18454184],[-0.12308464],[-0.05414716],[0.22322485],[0.0986465],[0.046013463]],"dense_1_W":[[0.039979875,-0.45747104,0.01409263,0.1038344,-0.39685473,-0.33794326,0.87375444,-0.39493144,-0.022856656,0.16293114,-0.1021352,-0.16609733,-0.13024335,0.3786684,-0.14359765,0.29113892,0.29941785,-0.29400635],[0.052472137,-0.053698886,-5.422898,-0.21991543,0.313983,0.36116323,0.05229922,-0.48481512,-0.699478,-1.117739,-0.30874887,-0.38158453,-0.1338971,-0.44151375,-0.17320636,0.7264404,0.32501188,0.7165989],[-0.010304283,-0.98240876,-0.022742985,0.22672749,0.48251867,-0.9433817,0.9824343,0.13986214,-0.1942156,-0.30411872,0.28717113,-0.571053,0.24414678,0.07596924,0.18768153,0.14563765,-0.18377183,-0.043441784],[0.005285528,1.0535682,-0.017260179,-0.33124572,0.0039716414,0.74013585,-0.39428404,-0.272743,0.07434402,0.27876472,-0.08732285,0.96002966,-0.4802241,-0.25286382,0.28896594,0.02317922,0.14128046,-0.017183177],[0.28194147,0.18924262,-0.002696126,0.21734203,0.0018270598,0.7102033,-0.8090373,0.58956873,0.02791912,0.08000271,-0.14373638,0.92130774,-0.071700506,-0.61309874,-0.88973755,-0.11552046,-0.11336341,0.41735962],[0.31988075,-0.3792179,-0.0064482973,0.41482916,0.30242506,-0.8525714,0.587519,-0.21211164,-0.014709177,-0.25068194,0.2086841,-0.5114691,0.027261272,0.32500595,0.09924409,-0.19256444,0.16786371,-0.11739298],[0.0021515805,0.30027154,5.952735,0.5089647,-1.6394058,-1.0211537,-0.9829749,0.8358446,2.6611304,0.60455,-0.4308957,0.83339345,0.9026655,0.08858586,-0.7351174,-0.9489569,-0.40282488,-0.341631]],"activation":"σ"},{"dense_2_W":[[0.9260268,-0.8087541,0.7243133,-1.0124146,-0.4938717,0.81473345,0.11277119],[0.21146505,0.24969757,-0.018303309,0.021199943,-1.0386741,0.06976922,-0.5488614],[-0.3201507,0.091772825,-0.39746743,0.5359968,0.67508984,0.09967213,0.25258896],[-0.54746306,-0.0038191364,-0.20888582,0.43253246,-0.3283931,0.21827807,0.25115517],[-0.54352003,0.28153777,0.21302846,-0.8480698,-0.58262014,-0.61925584,-0.10825497],[0.3063305,0.2462994,0.23962738,-0.41100392,-0.53911793,0.321222,0.07766791],[0.10468989,-0.021128409,-0.6309457,0.36274424,0.28997198,0.0035589251,0.40533248],[-0.29012105,-0.5573741,0.27605262,0.3979421,-0.06551908,0.22975506,-0.36112309],[-0.64441514,-0.102396026,-0.47194633,-0.14262818,0.6258268,-0.06171014,0.020799521],[0.47843814,0.04975281,0.31482425,0.13627958,-0.5157222,0.59243554,-0.54984564],[0.5728869,0.45515713,-0.12804388,0.15026231,-0.317451,0.033666957,-0.3124569],[0.6588982,-0.52865326,0.89718544,-0.6003115,-0.33325368,0.73482186,-0.22547686],[-0.5273782,-0.087307595,-0.60608846,0.036910504,-0.22960147,-0.7512217,0.302108]],"activation":"σ","dense_2_b":[[-0.13479586],[-0.13513349],[0.0009373699],[-0.042181917],[-0.29355353],[-0.048629034],[-0.046268582],[-0.0064258813],[0.05825038],[-0.13651372],[-0.1501067],[-0.08589544],[0.048994377]]},{"dense_3_W":[[0.3654538,0.115187585,-0.439915,0.5377413,0.007418098,0.27751163,0.044657342,-0.17946307,-0.3654914,0.116421804,0.4164621,0.6509678,-0.427143],[-0.15930192,0.5932584,-0.62384886,-0.061347995,-0.07626731,0.02358485,-0.5655159,-0.30620593,0.20285667,0.5263857,0.33262604,-0.40084362,-0.63168716],[-0.39700428,-0.15882798,0.5767276,0.6016253,-0.090940565,0.20918909,-0.052728947,-0.0024816794,0.44058868,-0.63286716,-0.04175788,-0.5301039,0.33433867]],"activation":"identity","dense_3_b":[[-0.052033406],[-0.022464612],[0.028837651]]},{"dense_4_W":[[-0.79853165,-0.5028229,0.9493444]],"dense_4_b":[[0.032302264]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68524936AB'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68524936AB'.json deleted file mode 100755 index 3038daba51..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020 b'68524936AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[3.987233],[0.8537959],[0.3147956],[0.046582546],[0.84401494],[0.84688294],[0.84943753],[0.8459254],[0.8367666],[0.8265147],[0.81790316],[0.046407577],[0.046432234],[0.046448592],[0.046412252],[0.046326056],[0.046176534],[0.045897327]],"model_test_loss":0.015449066646397114,"input_size":18,"current_date_and_time":"2023-08-05_10-23-38","input_mean":[[25.967857],[0.06622085],[-0.0020416742],[0.015556498],[0.066534],[0.067036055],[0.06743562],[0.06573888],[0.06696677],[0.06556534],[0.06443423],[0.015573572],[0.015597905],[0.015617301],[0.015684133],[0.015687725],[0.01558393],[0.015239334]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0808946],[0.037367117],[-0.038749795],[0.9390711],[-0.32065046],[-1.1784762],[-0.88848305]],"dense_1_W":[[-0.00011032098,0.9780359,-0.0014145505,-0.4366488,-0.013176787,0.33611873,-0.29262367,-0.3578369,0.11645427,0.42088133,-0.2598451,0.6237576,-0.13795596,-0.09887536,-0.12733373,-0.08417586,0.4013575,-0.07988855],[-0.0009259077,-0.062645964,-0.0018059709,-0.12713021,-0.055080768,-0.22723031,-0.026899165,0.200585,-0.42516625,0.22538531,-0.08643315,-0.6855331,0.5384225,0.5383578,-0.28057948,0.35908887,0.18033692,-0.29071817],[0.00023606251,-0.2708152,-3.7008457,-0.18686758,0.7081413,0.5238141,0.29570386,-0.37760863,-0.7263605,-0.6313755,0.52763283,-0.7201515,-0.24693261,-0.0033690718,0.19305243,0.28949165,0.15849951,0.32188925],[-0.0030307523,0.9266019,-0.00071122346,0.2938597,-0.7209375,-0.25652483,-0.833887,-0.41061628,-0.6894746,-0.44843826,-0.023134246,0.7723488,-0.032426476,-0.21999909,1.0757654,0.2777427,0.4482543,0.7690393],[0.005163568,0.3910777,0.0008774753,-0.1327848,0.038467746,0.2735437,-0.44077805,0.32235864,0.39658654,0.20570071,-0.13710664,0.1422694,-0.52818966,-0.07204501,-0.05014466,0.01687801,-0.32406497,-0.30950892],[0.22730923,0.26141903,-0.000953725,-0.37078547,0.3688389,0.28006992,-0.35340187,0.032271273,-0.079801165,0.38975418,-0.13068317,0.51164424,-0.14360848,-0.15369992,0.077170156,-0.22220115,-0.43598184,0.27546084],[0.2213501,-0.15664451,0.00094546424,0.3464266,-0.53368324,-0.1391294,0.38088232,-0.02687833,-0.24897413,0.004964223,-0.012853597,-0.73865753,0.11176492,0.6087426,-0.2588389,0.3292955,0.21136026,-0.15702726]],"activation":"σ"},{"dense_2_W":[[0.8372817,-0.25008437,-0.12787572,0.2646305,0.31623498,0.13657083,-1.0080503],[0.046799798,0.00918828,0.40113875,0.2216699,-0.27304304,-0.38028294,0.39347392],[-0.23938853,-0.34641623,-0.62152797,-0.46418,-0.7241759,-0.5278883,0.25341335],[-0.09937506,0.8862087,-0.24579188,-0.27517456,-0.660784,-0.34946993,-0.0786754],[0.7788807,-0.035170402,-0.38853168,0.22640607,0.14605336,0.8359692,-0.7039278],[-0.16715685,0.30906233,0.4299202,-0.15657364,-0.75562745,-0.5894536,0.67901284],[0.011040685,0.72528595,-0.3475271,0.20744416,0.0671484,-0.801704,-0.032896496],[-0.10695809,0.57284784,0.13369241,0.09459562,-0.75450206,-0.65015566,0.64747673],[0.41928726,-1.2618666,-0.31203488,0.500999,0.60130423,-0.015696425,-0.93787414],[-0.3277222,0.70236963,0.41655436,-0.5232463,-0.6613873,-0.7214429,0.6023961],[0.5236259,-0.8083846,-0.4727932,0.5152158,0.49668074,0.51633376,-0.30741963],[-0.29883748,-0.70302063,-0.06388201,-0.46135828,0.15648502,0.5698643,-0.37563467],[0.8581469,-0.22009362,-0.6310318,0.2918128,-0.03789091,0.3939349,-0.40259096]],"activation":"σ","dense_2_b":[[-0.11143744],[-0.044303834],[-0.28920218],[0.07294065],[-0.20649768],[-0.017393855],[0.033349346],[-0.0056764074],[-0.25138023],[0.08198082],[-0.17676844],[-0.29986814],[-0.16457124]]},{"dense_3_W":[[-0.49123013,-0.094490446,-0.23686716,0.6143184,-0.5806659,-0.10567876,0.564474,0.3225216,-0.16980709,0.15226522,-0.5543669,-0.2539091,-0.2111866],[-0.67487806,0.6078758,0.5300193,0.3342076,-0.46282768,0.7419035,-0.11941694,0.1968823,-0.3510679,0.7736118,-0.1578716,0.12241213,-0.426154],[-0.028797744,-0.23915093,0.5088453,-0.23264304,0.015492338,-0.5100102,-0.40799907,-0.34939715,-0.29578912,-0.24078988,0.72473073,-0.1903113,-0.08354421]],"activation":"identity","dense_3_b":[[0.04028917],[0.022620372],[0.00910732]]},{"dense_4_W":[[-0.95017105,-0.7261867,0.14058225]],"dense_4_b":[[-0.029187044]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AC'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AC'.json deleted file mode 100755 index 479e2cb351..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AC'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6217413],[0.7114013],[0.42171296],[0.030692505],[0.70313025],[0.7054758],[0.7074203],[0.7039908],[0.70165694],[0.6984613],[0.69011045],[0.030523904],[0.030557213],[0.03057646],[0.030458547],[0.030253412],[0.029954236],[0.029606614]],"model_test_loss":0.014747933484613895,"input_size":18,"current_date_and_time":"2023-08-05_11-38-04","input_mean":[[28.228518],[0.08038404],[-0.0051411754],[-0.0056266068],[0.07707682],[0.07840141],[0.07956922],[0.07400305],[0.0744884],[0.072456144],[0.070939764],[-0.005806301],[-0.0057515134],[-0.0057001603],[-0.00563613],[-0.005653806],[-0.0057565314],[-0.0059536397]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.20161064],[0.3708137],[-0.2759572],[-1.7354532],[-0.006582411],[-0.1967276],[-1.6732626]],"dense_1_W":[[-0.0022043844,-0.47374737,0.12160097,0.6890159,0.3377973,-1.5650418,0.3390089,-0.20914559,-0.29470372,0.56673414,-0.3568904,-0.3345458,-0.1208839,-0.0800197,0.28805646,-0.16699065,-0.24808967,0.006654419],[0.22055951,0.5663217,0.014226842,-0.33060122,-0.48807305,0.8183591,-0.4619248,-0.16517015,0.22057265,0.120730974,-0.15235895,0.21393985,0.4685399,-0.42490304,-0.18560103,0.05731757,-0.09875112,0.17101038],[-0.18863444,0.46009055,0.0143123325,-0.09180277,-0.15147366,0.57024676,-0.45547467,-0.067543074,-0.022116022,0.31504935,-0.16846871,-0.01573877,0.087595,0.038511798,-0.007259396,-0.22452337,-0.12686455,0.20235924],[2.2950037,-0.15815431,0.0035836962,-0.67872524,0.08919689,-0.5821427,0.21903394,-0.044731744,-0.04884043,0.08973389,-0.054229386,0.02415706,0.070902705,0.26732698,0.2716208,0.2851963,0.22980438,-0.22686587],[0.0044000545,-0.21573843,-0.07105931,0.26565573,0.38492048,-0.6680098,1.1778332,-0.87731117,-0.20947257,-0.06640749,0.37599987,-0.25529432,0.014358948,0.2096504,0.005265327,-0.15837903,-0.03779916,0.04513996],[0.007100553,1.2550566,7.1150217,-0.43107417,-0.036019012,-0.31804258,-1.1444212,0.16977336,0.6080755,-0.29834473,-0.24948287,0.9989788,0.054998364,0.1742214,-1.2599926,0.17053154,0.40663227,0.12926742],[2.3231199,0.16382016,-0.0039322176,0.6659583,0.38590056,0.4255518,-0.53491396,-0.038882855,0.059910268,-0.08183135,0.11287891,-0.23418863,0.033189584,-0.24378267,-0.18320867,-0.231686,-0.18503504,0.1318578]],"activation":"σ"},{"dense_2_W":[[0.29945847,-0.4116662,-0.6404434,0.4817164,0.4524414,-0.32461753,-0.28166708],[-1.3570027,0.5354018,0.13801058,-1.1377261,-1.2545471,0.47778574,-0.6778595],[-0.53093123,0.3986449,0.514258,-0.44630268,-0.34877014,-0.09241833,0.015654555],[-0.33301157,0.015162718,-0.57307935,0.51319146,0.76107,-0.32635444,0.0483822],[0.4356511,-0.56064665,-0.60171497,0.31180757,0.058051504,-0.12626185,-0.16386817],[-0.49370843,1.3684434,0.6723376,0.47739267,-0.3493264,0.4534191,1.194232],[-0.6864368,-0.55467093,-0.28965995,0.21849571,-0.2885239,-0.4037181,-0.2568297],[-0.027406203,0.4347179,0.52915186,-0.7199698,-0.98106146,0.1689552,0.6664304],[0.53957736,-0.43386227,-0.17693467,-1.3255388,-0.7924073,-0.93818575,-0.79954004],[0.4243802,-0.7055154,-0.8640908,0.6045224,0.35185826,0.29153374,-0.043798342],[-0.18059891,-0.5451181,-0.31403798,0.29197556,0.48968676,-0.36734742,-0.6153273],[-0.21743168,0.0968663,-0.7951512,0.22858825,0.056076594,0.352806,-0.43122748],[-0.5219958,0.7666835,0.78582376,0.04805443,-0.69653535,-0.1948839,0.47690478]],"activation":"σ","dense_2_b":[[0.14940926],[-0.26764292],[-0.065943636],[-0.012099177],[0.020878451],[-0.037716556],[-0.27098712],[-0.24203163],[-0.3071356],[-0.19974586],[0.091521814],[-0.030127151],[0.011759832]]},{"dense_3_W":[[0.2272818,-0.7090007,-0.44646376,0.5245258,-0.11126927,0.06856284,-0.55245084,-0.03672042,-0.2831085,-0.26106173,-0.15778822,0.6185201,-0.25463623],[-0.6678536,0.27332652,0.32911164,-0.46993744,-0.57457846,0.51333696,-0.51108074,0.419496,-0.4008391,-0.28695276,-0.4039776,-0.2274611,0.65224385],[-0.4540261,-0.110272445,0.62588185,0.3793935,0.21624547,0.00488706,0.2968329,0.5401233,-0.0827374,-0.28764433,-0.7044611,-0.16364492,0.43638176]],"activation":"identity","dense_3_b":[[0.025508499],[-0.012451561],[-0.038591553]]},{"dense_4_W":[[-0.36511594,0.9680025,0.498792]],"dense_4_b":[[-0.017125914]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AD'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AD'.json deleted file mode 100755 index c10e99ad04..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017 b'68288309AD'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.597233],[0.65757],[0.39041167],[0.03043365],[0.64351803],[0.6471017],[0.6502902],[0.6549102],[0.6508157],[0.6482903],[0.64279133],[0.03026653],[0.03030699],[0.030344505],[0.030493243],[0.030504394],[0.030502517],[0.030399079]],"model_test_loss":0.01550232619047165,"input_size":18,"current_date_and_time":"2023-08-05_12-03-26","input_mean":[[24.96868],[0.017203558],[0.004998304],[-0.016466307],[0.014747153],[0.015813118],[0.016414983],[0.015427833],[0.0135320425],[0.01846833],[0.02000356],[-0.016424928],[-0.016428037],[-0.016443778],[-0.016528388],[-0.01664044],[-0.016721481],[-0.017032597]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.11971746],[-1.0482128],[-1.290418],[1.6633401],[-0.09557239],[-0.15225793],[-1.3385328]],"dense_1_W":[[0.029821552,0.035007924,5.103129,-0.37369263,-0.89283395,-0.5466001,-1.1722021,0.012656213,2.3184931,0.7863226,-0.40544683,0.035955865,-0.05933657,-0.36182928,0.14284906,0.47995996,0.0033706422,-0.05209815],[-0.19044665,0.46416685,-0.0097643575,0.022599934,0.1270844,0.3457657,-0.6301875,0.13222663,0.3651115,-0.04052697,-0.097950056,0.36680222,-0.53108186,0.37180126,-0.26814926,-0.22918452,0.24378005,-0.03704089],[-0.8465522,-0.15320513,-0.2111905,-0.33488435,0.19261867,-0.35840833,0.37324944,0.059546437,-0.20470025,-0.08982175,0.30586445,0.101371676,-0.18726619,0.18133822,0.12725775,-0.01725966,0.3126423,-0.20531909],[0.33607936,0.10578455,-0.012572882,-0.17274776,-0.05706274,0.27834845,-0.03742849,0.37046883,0.18207937,0.15750422,-0.21119557,0.58034253,0.14551485,-0.19281861,-0.6219534,-0.07461531,0.12687907,0.13601732],[-0.0028057445,-0.130438,-0.00028447545,-0.2205653,-0.061741494,-0.76060104,0.43488175,0.2109757,0.20559938,0.036044482,-0.22720902,0.10089816,-0.075031996,0.35783985,-0.16343401,-0.207879,0.11746362,0.11620118],[-0.04128383,-0.4868478,0.11253476,0.52899015,0.35399616,-0.4295484,0.33201,-0.13990371,0.08484948,0.10046226,-0.107716724,-0.22875123,-0.03329333,-0.11531053,-0.070716955,-0.003677542,0.12015404,-0.13361935],[-0.84564525,-0.20329769,0.20679265,-0.17321548,-0.43559217,0.6301703,-0.17066625,0.18654998,0.05553996,0.11210628,-0.30537042,0.45863834,0.17521833,-0.08643193,-0.42064783,-0.15470168,-0.061689895,0.282349]],"activation":"σ"},{"dense_2_W":[[-0.2675255,-1.0888523,0.5519257,0.19295022,0.6083571,0.013318467,0.068802685],[-0.029764846,0.5881194,-0.5320143,0.56432325,-0.7338648,-0.6991274,0.78376025],[-0.24376978,0.97442836,-0.43990833,0.58720297,-1.1058803,-0.24998356,0.5523079],[0.37818435,-0.04477066,-0.6413349,0.7311632,-0.7551129,-0.66932064,0.80996406],[0.42194343,-0.55635,0.24982749,-0.08299721,-0.47013214,-0.32509625,0.34097055],[0.18750918,-0.48607266,0.018563168,-0.4435128,0.025003254,0.37226567,-0.5008819],[-0.690127,-0.061610896,0.52321345,-1.2141404,0.24980456,0.39222413,0.29739323],[0.12713604,0.8961836,-0.0420679,0.3697559,-0.66627675,-0.9004507,0.36056203],[-0.17872968,-0.5655011,0.31398085,-0.0073691937,0.8368489,-0.102135964,-0.098749965],[-0.25579226,-0.1895283,0.65268534,-0.032067355,0.88545084,-0.2616384,-0.73489314],[0.038353052,-0.6248039,-0.17452268,-0.3505884,0.6240491,0.117965795,-0.40689456],[0.11943678,0.85648805,-0.7428271,0.4420883,-0.14259496,0.047728933,0.06425332],[-0.37097242,-0.49184024,0.3623645,0.066325314,0.36482123,0.62196106,-0.6113287]],"activation":"σ","dense_2_b":[[0.015802983],[-0.010237919],[-0.12576309],[-0.016577639],[-0.0723307],[0.007504116],[-0.2507953],[-0.20577176],[0.01650445],[0.004272095],[0.07060706],[-0.113387175],[0.05941394]]},{"dense_3_W":[[-0.102179505,0.7396626,0.40349957,0.35000306,-0.14271958,-0.41911846,-0.75510114,-0.080605164,-0.25986177,0.05678764,-0.36452737,0.42877302,-0.3750224],[-0.2336813,-0.17504057,0.076827765,0.26307496,-0.2195151,-0.025769087,0.016375436,0.34215918,0.22750534,-0.33795378,-0.350775,0.46386904,0.27268404],[0.4288828,-0.7942581,-0.19615512,-0.62076753,-0.11076431,0.41423005,-0.07186949,-0.72240573,0.56579494,0.56211066,0.2636863,-0.4551915,0.2820574]],"activation":"identity","dense_3_b":[[-0.045709725],[-0.0753816],[0.058061324]]},{"dense_4_W":[[0.6145353,0.11919738,-0.88881034]],"dense_4_b":[[-0.05525869]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018 b'68288309AD'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018 b'68288309AD'.json deleted file mode 100755 index 02c740db16..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018 b'68288309AD'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.082215],[0.9560447],[0.410062],[0.042449385],[0.9435806],[0.9485456],[0.9529106],[0.93789405],[0.9226771],[0.9034362],[0.883721],[0.04244234],[0.04244558],[0.042444732],[0.042347185],[0.042244907],[0.04203911],[0.041821305]],"model_test_loss":0.015666939318180084,"input_size":18,"current_date_and_time":"2023-08-05_12-54-12","input_mean":[[25.45074],[0.0068904622],[-0.000671541],[-0.0010801569],[0.0104450565],[0.008953298],[0.0077940514],[0.010752567],[0.011151168],[0.013636157],[0.015005147],[-0.001118472],[-0.0011114934],[-0.0011069404],[-0.0010113739],[-0.0010170324],[-0.001066506],[-0.001190821]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.011303913],[-0.101262875],[0.56544256],[0.19651274],[0.02540219],[1.1908269],[-0.025591249]],"dense_1_W":[[0.03296629,-0.9849526,-0.019233003,0.26284894,0.30721006,-1.0549244,1.2970554,-0.45588621,-0.42953083,0.06103454,0.2431949,-0.9065374,0.36690086,0.2656691,0.35073105,0.49389052,0.051688332,-0.3485854],[-0.03754764,-0.49999028,-0.007074961,0.79917264,-0.36037976,-1.3411741,0.58469564,-0.23178867,-0.068214,-0.08796609,-0.065810174,-0.13842778,-0.5216702,-0.056535564,-0.13458252,-0.2092706,-0.31087565,0.35361972],[0.27463603,-0.381356,-0.012061922,-0.31239793,-0.053919703,-0.6916296,0.3541282,-0.15095334,-0.10328145,-0.0723153,0.042322796,0.11545691,0.21939,-0.17112115,0.07391443,0.072348714,-0.040974505,0.090883106],[0.064744584,0.17418511,-5.185299,0.5444673,0.9003128,0.6023629,1.193266,-0.46961012,-2.531239,-1.2398077,0.90796435,-0.18854257,0.029938832,0.16980654,-0.6187146,-0.35119575,0.58308375,0.098467305],[-0.9406685,-0.2624951,-0.027796533,0.20334917,-0.34153846,-0.1046165,-1.0237727,-0.11846653,-0.1513934,-0.28889307,0.1425305,-0.16230091,0.041497145,0.13115646,-0.4476718,-0.026639748,-0.115308225,0.2959161],[0.26337644,0.9059509,0.0142672965,0.11553737,-0.15986507,0.4649627,-0.57561105,0.28975698,0.2352414,0.12916806,-0.24250211,0.5852871,-0.28024945,-0.32947764,-0.29004428,0.07504865,-0.22164239,0.1658566],[0.8496862,0.06132964,-0.026063204,0.33203503,-0.71281123,0.53899145,-0.5046964,-1.0536666,-0.46766424,-0.0017764475,0.28805846,0.3337219,-0.00876953,-0.1794407,-0.8609011,0.06300348,-0.16952239,0.4276372]],"activation":"σ"},{"dense_2_W":[[0.5989996,0.28228945,0.24243695,0.30473667,0.09565392,0.039883718,-0.012167493],[-0.5965035,-0.5132559,-0.809263,-1.0380533,0.74597716,-0.19448324,-0.51433825],[-0.50900024,-0.6781642,-0.055860262,-0.07686463,0.5264645,0.64901555,0.37830654],[0.45566165,0.4638939,0.18080807,-0.37435606,0.34035242,-0.17389183,0.09466603],[0.25517422,-1.1810887,0.02548111,-2.524108,-0.26499692,2.612718,2.0904224],[-0.07452685,0.45176342,0.5291961,-0.22377542,0.35242108,-0.58295393,-0.43978348],[-0.64365584,-0.28436708,-0.5298343,-0.7013793,0.43208584,-0.31733987,0.3173478],[-0.7023152,-0.3866031,-0.5978307,-0.52242154,0.5038582,0.18732077,0.032031976],[0.4123047,0.50972766,0.4979604,-0.016046334,-0.44517237,-0.36656827,0.027112957],[-0.108008094,0.34119272,0.5035501,-0.27905923,-0.5105666,0.12349028,-0.39550483],[-1.6549016,-0.76342964,-0.9001871,0.484857,0.38083476,0.5935866,1.0620447],[-0.8487929,-0.73791504,-0.902351,-0.034185782,0.5050549,0.61939895,0.6907873],[0.555242,0.61760396,0.53889614,-0.2472908,-0.5995396,-0.14475305,-0.4659583]],"activation":"σ","dense_2_b":[[-0.037849087],[-0.0046516205],[-0.06366198],[0.015965618],[0.48888913],[0.04543125],[-0.052545607],[-0.00619908],[-0.047677517],[-0.02190815],[-0.068623856],[0.03490071],[-0.04638153]]},{"dense_3_W":[[0.59825534,-0.7146144,-0.55275774,0.16583651,-0.29240578,0.5159985,-0.39059043,-0.5139529,0.074755795,0.25480804,-0.6676097,-0.45776275,0.18318963],[0.25388056,-0.35969815,-0.34763938,0.38946125,-0.42040497,0.5035119,-0.014665137,-0.4923147,0.66271615,0.11658979,-0.08055782,-0.3412976,0.6100553],[-0.36014816,-0.29852802,0.31007996,0.45297718,-0.111436516,-0.08528401,0.3125368,-0.56639135,0.013241491,0.4247302,-0.6792052,-1.0650945,0.05410819]],"activation":"identity","dense_3_b":[[0.032773122],[0.016646186],[0.008999612]]},{"dense_4_W":[[-0.85478663,-0.68413824,-0.13936913]],"dense_4_b":[[-0.024688363]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018.json deleted file mode 100755 index b3a029677d..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2018.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.08229],[0.9560322],[0.4162128],[0.04234246],[0.944914],[0.9496715],[0.9534703],[0.93756986],[0.9214626],[0.9029512],[0.8827786],[0.042334676],[0.04232983],[0.042330787],[0.04222349],[0.042102575],[0.041963458],[0.041727293]],"model_test_loss":0.015212969854474068,"input_size":18,"current_date_and_time":"2023-08-05_12-28-56","input_mean":[[25.450489],[0.007018491],[0.0017526483],[-0.0012496245],[0.010258301],[0.00915797],[0.008296782],[0.009687563],[0.010408748],[0.012445741],[0.015780684],[-0.0012874664],[-0.0012762811],[-0.0012723668],[-0.0012203716],[-0.0012326657],[-0.001319404],[-0.0014248163]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.0474128],[-2.0153387],[0.3068582],[-0.005494932],[-0.8460963],[0.043121926],[0.34363338]],"dense_1_W":[[0.40921986,0.83686906,0.017928291,-0.14663637,0.03245214,0.9670171,-0.557215,0.053447653,0.19983685,0.14913826,-0.07026286,0.35218892,-0.1331316,-0.24948378,0.23776667,0.024677012,-0.18177196,0.081563935],[-0.4710796,1.0182377,0.025632562,0.25463507,0.15371,0.5884998,-0.50182223,0.27641,0.27793694,0.40336907,-0.31872264,-0.23831047,0.10746539,0.053897705,-0.08914807,0.09828412,-0.39313728,0.18685032],[0.9079908,-0.5044986,0.027937002,-0.09682488,0.6568831,-0.38266635,0.9817865,1.2524801,0.38089994,0.12696266,-0.30947885,-0.50164545,-0.23758912,0.010382648,0.9870671,0.36033058,-0.08208099,-0.4297762],[-0.0020627899,0.96122843,0.0019422979,-0.2890112,-0.19326063,0.67663735,-1.2096393,0.69867593,0.24395284,0.015038193,-0.2639015,0.23797843,-0.19254467,0.17160857,-0.3693636,-0.3780116,-0.1757647,0.36420926],[-0.035085507,0.022627689,-5.207178,0.662441,1.6342354,1.2160088,1.2780991,-1.1770558,-2.9736173,-1.1000638,0.7337506,-0.5362961,-0.29924804,0.33022583,-0.7002066,0.04807395,0.3741729,0.31349945],[-0.002872556,-0.54440963,-0.0055537154,0.1456208,-0.30050763,-1.4995376,0.9476729,-0.74908423,-0.28116608,0.15615615,-0.03335187,-0.0051539144,0.13452101,-0.20905544,0.25087494,-0.45868522,-0.40181822,0.4119573],[1.0714998,-0.38579407,-0.024760136,0.06929095,-0.7495878,-0.25940558,-0.19196063,-0.39601323,-0.32055146,-0.10028662,0.06978139,0.50141144,0.43209225,-0.3733558,-0.8468494,-0.051437717,-0.19248068,0.45854166]],"activation":"σ"},{"dense_2_W":[[1.0826005,-0.20854715,0.12272468,0.45186186,-0.33309188,-0.11777644,0.57938504],[-0.5927767,-0.28290668,0.62141377,-0.6324294,-0.03813597,0.25737914,-0.082683794],[0.16264565,-0.50887585,-0.4667856,0.048738178,-0.5574825,0.1486967,-0.059898414],[-0.73018765,-0.33298212,0.464258,-0.22951585,-0.19468288,0.58376384,-0.10449995],[-0.3376829,-0.015965454,-0.5374289,-0.1125972,0.20699061,0.46242332,-0.39699847],[-0.7966657,1.1282952,-1.2893173,0.0007569245,-3.1860337,-0.18262017,-0.9651093],[-0.3432437,0.15395725,0.49788675,-0.6686831,-0.3084999,0.4104962,-0.19762419],[-0.6902327,-0.03177878,-0.3615717,-0.1965282,0.21896532,0.31481862,-0.39253464],[0.06330853,0.59432584,-0.7664653,1.0718739,-0.22649164,-0.9899889,0.19520594],[0.60814977,0.26673782,-0.8529133,1.0040137,0.14190473,-1.0532364,0.009188715],[-0.6209684,-0.01673939,-0.322892,-0.14584474,0.1624394,0.21571153,-0.7087542],[-0.5637814,-0.47300205,-0.21020818,-0.21443935,0.19412827,0.17739315,-0.7089613],[0.77079105,0.29888508,-0.3602861,0.5112615,-0.24378149,-0.1931251,-0.20249362]],"activation":"σ","dense_2_b":[[-0.03581929],[-0.046200734],[-0.1481214],[-0.077726975],[-0.17219913],[0.35100186],[-0.07100971],[-0.14290616],[-0.059892148],[-0.38624978],[-0.13309816],[-0.087655105],[-0.046923585]]},{"dense_3_W":[[-0.57040024,0.40345442,0.19436547,0.42902845,0.120898366,-0.63833594,0.39891332,-0.13518181,-0.37702882,0.18261324,0.54879117,0.5178564,-0.069270305],[0.16411436,0.5797063,-0.04110642,0.032352872,0.10857908,0.12132189,0.4528278,0.5046357,-0.54672295,-0.514517,0.102962494,0.39607972,-0.62058264],[-0.04601366,0.16334765,-0.16627654,0.103514455,0.6421524,-1.1889938,0.9212643,0.16994889,-0.85712564,-1.0109627,0.3073874,0.13189326,-0.2665801]],"activation":"identity","dense_3_b":[[-0.081992626],[-0.0802459],[0.057288777]]},{"dense_4_W":[[-1.0061765,-0.9223554,-0.31279898]],"dense_4_b":[[0.07849179]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68416741AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68416741AA'.json deleted file mode 100755 index 2cfe8d0c26..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68416741AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[3.540884],[0.72527695],[0.45695683],[0.034991868],[0.709294],[0.71476114],[0.72185975],[0.7211512],[0.7235535],[0.7168181],[0.7078516],[0.034848806],[0.03490882],[0.034961533],[0.03501503],[0.03508182],[0.035303213],[0.035285834]],"model_test_loss":0.008240409195423126,"input_size":18,"current_date_and_time":"2023-08-05_13-46-44","input_mean":[[25.921837],[0.0125832055],[-0.01164115],[0.0026885534],[0.014492291],[0.0139633],[0.013493571],[0.008726519],[0.008531813],[0.009844244],[0.0044681607],[0.0026176367],[0.0026374457],[0.0026502886],[0.0027010296],[0.00267962],[0.0024883181],[0.0022550253]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.13672608],[-0.041571867],[1.2636456],[-0.065467335],[0.011800385],[-0.46202916],[-1.372556]],"dense_1_W":[[0.007422458,0.6754113,7.4073644,0.11848473,-2.1631336,-0.912065,-0.8724629,-0.2556371,3.0907576,1.412602,-0.8293619,0.79462373,0.14016043,0.24535954,-0.30560818,-0.57401854,-0.60158664,0.14450504],[-0.0018305334,0.09137483,0.0048553096,-0.18322048,-0.17445193,1.1315465,-0.99553066,0.20692046,-0.1573373,0.10723841,0.034833677,0.013222382,0.04913359,-0.063011676,0.080315255,0.007860034,-0.06869685,-0.10426123],[0.41642052,-0.43292236,-0.00016212527,-0.28172606,0.22388797,-0.5387432,0.5000487,-0.0662662,-0.19251756,-0.24930976,0.21399923,0.21182868,0.23792529,0.36422804,-0.12048849,-0.10356604,-0.18955365,0.20988986],[0.007196369,-0.40141714,0.004146293,0.24328095,0.08316568,-0.7725523,0.24712877,0.31170592,-0.2618485,0.3492374,-0.23321508,-0.5998228,0.054245714,0.05656959,0.42039597,0.29605547,-0.16332126,-0.25805196],[-0.0066868253,0.24793896,-0.9155987,-0.22574951,0.2279949,-0.75932324,0.5498709,-0.50319123,-0.25042525,-0.16740315,0.9464338,-0.6654067,-0.46457547,-0.62106884,0.38022646,0.66043746,0.57050747,-0.051786408],[-0.013603165,-0.7850666,0.22816952,-0.94007343,0.6314619,-1.1180922,0.9316161,0.71419287,1.565776,0.82271457,-0.6743947,-0.03324018,-0.22406328,0.11753971,-0.86198115,-0.7191324,-1.2573929,-1.3663477],[-0.39971876,-0.90275395,-0.002747763,0.3259772,0.053136084,-0.1129504,0.67844796,-0.12035228,-0.111051224,-0.23912819,0.22313052,0.015122417,-0.042040545,0.31138957,-0.21768394,-0.19387904,0.17800824,-0.058540124]],"activation":"σ"},{"dense_2_W":[[-0.2712744,-0.27548417,-0.24589045,-0.94929534,0.056101516,0.37687665,-0.34930152],[0.12890357,0.107452646,0.05273279,-0.2842241,-0.26417354,-0.36303985,-0.88106096],[0.10812536,0.8229097,-0.48439428,-0.6146967,0.30271894,-0.47587743,-0.72306526],[-0.2970765,-0.9954584,0.8347318,0.28984168,0.22221072,-0.08318426,0.5174111],[0.022121632,-0.9320088,-0.13187025,0.84971243,0.11638838,-0.18265942,0.6944859],[-0.81018156,-1.4140185,0.0050559104,0.8047088,0.112945594,0.11903153,1.4750458],[-0.10029377,0.79245657,-0.129312,-0.96144485,-0.14801987,-0.19154973,-0.27617636],[-0.42813414,-1.1076767,0.41040602,0.6022723,0.2166483,0.101234265,0.25476956],[-0.2616646,0.06810875,-0.2897757,-0.34468642,0.19396816,-0.23995267,0.042478308],[0.064412996,0.088728696,-0.83973736,0.046822183,-0.044361882,-0.2079744,-0.5540397],[-0.9322635,-0.08910884,2.045478,0.7023676,0.27462402,-0.3360689,-0.5251471],[-0.82763696,0.09217775,-0.5712728,-0.1493765,0.17474991,-0.029826907,-0.55813324],[-0.30443445,-0.47327244,-0.5111389,-0.45714694,0.37277365,0.38366705,0.1959204]],"activation":"σ","dense_2_b":[[0.08118501],[0.07975673],[0.11642572],[-0.2567934],[-0.4266919],[-0.5458668],[0.18571955],[-0.08934562],[-0.29633301],[0.13670655],[0.07141965],[-0.30583197],[-0.0840992]]},{"dense_3_W":[[-0.5074871,-0.28185704,0.4593259,0.47745362,-0.44245535,0.07299903,-0.67817503,0.13860504,0.30813742,0.42423633,-0.060915153,-0.56996584,-0.0628069],[-0.63610864,-0.52725506,-0.59844047,0.43560866,0.6619392,0.40266907,-0.7854964,0.7018912,-0.12779734,-0.56247413,0.6380423,0.3426679,0.12550351],[-0.22990963,-0.22485729,0.11532963,0.1304727,0.34375438,0.09126867,-0.44410926,0.5529583,-0.08919587,-0.62609166,-0.042024292,-0.44053796,-0.45395342]],"activation":"identity","dense_3_b":[[-0.029381804],[-0.053650945],[-0.030720724]]},{"dense_4_W":[[-0.4063532,-1.1326009,-0.48396984]],"dense_4_b":[[0.045191046]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68460392AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68460392AA'.json deleted file mode 100755 index 6db2a51340..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68460392AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.110466],[1.1166294],[0.4333575],[0.04491246],[1.101045],[1.106509],[1.1112565],[1.0918282],[1.0688635],[1.0413644],[1.0151801],[0.044668887],[0.044713814],[0.04475609],[0.044801924],[0.04479171],[0.044668294],[0.04430072]],"model_test_loss":0.020542951300740242,"input_size":18,"current_date_and_time":"2023-08-05_14-14-04","input_mean":[[28.738178],[0.04136104],[-0.0026099419],[-0.0051334198],[0.044128302],[0.043093566],[0.041869074],[0.042427693],[0.046236813],[0.04548593],[0.042877004],[-0.005089196],[-0.005111265],[-0.0051377458],[-0.005226521],[-0.005262634],[-0.00543846],[-0.0057465434]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.037278734],[-0.079774134],[-0.8162887],[-0.31243566],[-0.22615224],[-0.8256233],[1.4499795]],"dense_1_W":[[-0.005449315,0.35854638,-0.0047398233,-0.1440494,-0.512616,0.7778192,-0.398415,0.0010072874,-0.5800812,-0.10013973,0.26047555,0.16202927,-0.008031342,-0.13875856,-0.22610746,-0.6603844,-0.10960839,0.40812218],[-0.051943477,-0.26004118,4.607082,-0.12921393,-1.9564761,-0.83791864,-1.289598,0.3517151,3.87916,1.1050774,-0.77605593,0.896561,0.58562213,-0.5287581,0.122337416,-0.44951877,-0.40622,-0.16376685],[-0.16226001,0.83511513,0.009577342,-0.011364819,0.009493924,0.34977683,-0.5710836,0.20358273,-0.047720235,0.21904317,-0.13963147,0.61891454,0.1469637,-0.6860567,-0.14435394,0.13068855,-0.094664365,0.1009682],[-0.0026090448,-0.75837827,0.00792941,-0.042877182,0.24020967,-0.6194338,0.44166493,0.017847896,-0.3192753,-0.4271276,0.41098025,-0.60054016,0.18626004,0.17326199,0.068281084,0.23828898,0.28316006,-0.3320513],[0.027624318,-0.76117027,0.0054043583,0.33760962,0.116977885,-0.9307711,1.0756055,-0.2172874,-0.21198179,0.080145285,0.04210036,-0.51823384,-0.11447423,0.13206464,0.51927197,0.14165966,-0.1777355,-0.111683],[-0.12876868,-0.7229542,-0.0074477443,0.16747089,0.050191335,-0.50053203,0.59926206,-0.26795742,0.048716802,0.004515228,-0.00087909383,-0.8720959,0.3561962,0.41411182,0.0037264847,-0.26657674,0.36355504,-0.20191583],[1.5456613,0.3672433,2.1607227,0.15501712,-1.0307076,-0.12250712,-0.5461449,-0.012928717,-0.08450569,-0.32112712,-0.7111483,0.63424677,-0.07049318,-0.2134942,0.5441593,0.11881617,0.13171925,0.11188784]],"activation":"σ"},{"dense_2_W":[[0.4314676,0.43680868,-0.33696127,-0.17014731,-0.05842231,-0.7266061,-0.5114572],[0.15322033,0.046555553,-0.43650016,0.8490571,0.8243241,0.27194533,0.093695216],[0.61560154,-0.12009854,0.3021778,-0.2980031,-0.6986972,-0.52874625,0.2868508],[-0.20433629,0.17755696,-0.016080111,0.48249146,-0.24425584,0.93740374,0.18655425],[-0.00067611254,-0.5348082,-0.04893072,0.16420071,0.84226584,0.48445752,-0.53488594],[0.5304203,-0.052413676,0.84903955,-0.7850803,-0.39337084,-0.48024574,0.22300348],[-0.40384635,-0.2198121,-0.9246295,0.21698718,0.013713661,0.33346254,-0.16243497],[-0.21693845,-0.5599039,0.16844617,0.33478138,-0.2944021,0.2285425,-0.45965782],[0.65655226,0.5756963,0.40696257,-0.87685615,-0.025619268,-0.60703444,0.34351036],[0.4858341,0.5645004,0.280065,-0.61226463,-0.070656925,-0.8439244,-0.4341403],[-0.5802423,-0.2585727,-0.5184978,0.41481337,0.55786633,0.19180918,0.27964547],[-0.1608777,-0.050595388,-0.75230426,0.0011275461,0.055260886,-0.035873853,0.49184152],[-0.052665144,-0.035036366,0.5804482,-0.8756545,-0.8726204,-0.6846766,0.07926964]],"activation":"σ","dense_2_b":[[-0.19394487],[-0.10838762],[-0.07325213],[-0.033972114],[-0.0065951333],[-0.2264441],[-0.26640517],[-0.066091046],[-0.1312786],[0.049138386],[-0.10959771],[-0.018617028],[0.049152326]]},{"dense_3_W":[[0.5829933,0.53154945,-0.6436874,0.26961514,0.2114049,0.48927963,-0.077363156,-0.117650375,-0.07863482,-0.42213118,-0.025127105,0.1802662,-0.78018814],[0.1384695,-0.57305473,0.30702972,-0.31226707,-0.617097,0.32141355,-0.5152638,-0.5388638,0.6503955,0.7239906,-0.5044503,-0.32009524,0.49322724],[-0.43255872,-0.18591267,-0.57748216,0.21049492,0.18677677,-0.35376894,-0.43073297,-0.34409273,-0.587622,-0.17651634,0.07379629,0.51700467,-0.6392041]],"activation":"identity","dense_3_b":[[0.030356286],[-0.044458546],[0.07339491]]},{"dense_4_W":[[-0.28381646,0.84335744,-0.5880341]],"dense_4_b":[[-0.055418875]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AA'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AA'.json deleted file mode 100755 index b944ebfeaf..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.7788153],[0.86318105],[0.45887572],[0.03240975],[0.84916407],[0.85424227],[0.8574619],[0.8389892],[0.81995696],[0.7941099],[0.7717739],[0.032342657],[0.03233888],[0.032331638],[0.03231616],[0.03229451],[0.032231897],[0.032137062]],"model_test_loss":0.026132144033908844,"input_size":18,"current_date_and_time":"2023-08-05_14-38-55","input_mean":[[28.931513],[0.014174745],[-0.00050709123],[-0.013757554],[0.015852991],[0.01568708],[0.0151331145],[0.015902033],[0.014520537],[0.010255078],[0.009157378],[-0.013667275],[-0.013699755],[-0.01373048],[-0.013899637],[-0.014020047],[-0.014123588],[-0.014132852]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0011439975],[0.08114154],[-0.047111176],[-0.00014506892],[-0.058797296],[0.008746821],[-0.112746514]],"dense_1_W":[[0.0036827116,-0.85230404,0.9694389,-0.6527038,0.10460156,0.8590413,0.14416954,0.9132283,0.17232226,0.01029374,-0.95463884,0.84203064,-0.34578338,0.032106902,-0.14620203,0.13692686,0.3113949,-0.13478504],[-7.447542e-5,0.9491887,-0.04109987,0.040202092,0.2734764,1.0008796,-0.82018507,-0.34369794,-0.270975,0.00058271387,0.25813425,-0.29383036,0.18492047,-0.31528273,0.09403308,0.24762149,0.21983506,-0.28232306],[0.0005957179,-1.5132132,-0.064817086,0.1532922,0.5894306,-0.46862274,0.68522537,0.05819377,0.22867863,0.007096001,0.020394647,-0.46124545,0.3289496,-0.03179155,0.22535956,-0.1858501,0.12605724,-0.11331306],[0.0037144264,0.17526588,0.8997809,0.13560319,0.7582112,0.3016461,1.6678429,-1.3722198,-1.1396137,-0.3491821,0.39440334,-0.2175496,-0.17992109,0.026779918,-0.19932391,0.65749645,0.42792454,-0.59700435],[-0.004916627,-0.86949986,-3.1472104,-0.046245735,0.58949816,0.13029447,0.49943313,0.119921446,-1.1917382,-1.7929658,-0.74677783,-0.51036227,0.06405667,0.093736,0.075880684,0.12603562,0.5108349,0.052058537],[0.0023457597,-0.664783,4.946816,0.81403846,-2.2644951,-2.0607138,-1.7517816,0.28588998,3.9568594,2.7328053,-0.2896687,0.79322964,0.75960326,-0.25073573,-0.5724614,-0.71555763,-1.2048925,0.40946966],[-0.0023486963,-0.7795025,0.021107612,-0.08805968,-0.32326528,-0.68839264,0.9240335,0.4994968,-0.023836527,0.175137,-0.34672633,-0.34674078,0.32279867,0.05844317,-0.023075575,0.37232506,-0.09687563,-0.12452232]],"activation":"σ"},{"dense_2_W":[[-0.37854546,0.34903055,-0.4462544,0.11327805,-0.24875195,0.35234123,-0.5626592],[0.42957336,0.53799313,-0.06286047,-0.31929597,0.14332363,0.52426404,-0.65911615],[-0.15604308,0.447812,-0.58008,0.051283363,-0.40378952,0.24825498,-0.20840329],[-0.3440618,-0.9011778,1.4646084,0.38501295,-0.4189048,-0.5722096,0.6253895],[-0.36881042,0.15492533,-0.12835744,-0.13917302,-0.41941592,-0.064528316,-0.024679296],[-0.3952051,-0.19353123,0.42472473,0.25226733,0.36719245,0.15404089,0.17196153],[0.046834674,0.48506153,-0.014719895,-0.01911938,-0.5700787,0.12933014,0.3826227],[0.5885063,0.33175373,-0.5520266,0.16487138,0.027746325,0.20234767,-0.6893546],[-0.24454424,-0.71767586,-0.108539544,0.74538267,-0.101703376,0.06964665,-0.1827993],[-0.8758459,-0.6128819,1.5650461,0.45312274,-0.5894857,-0.4010452,0.24010707],[-0.3640231,-0.295227,0.009693909,0.32785308,-0.42453107,0.5494616,-0.3201437],[0.6608706,-0.08454871,-0.5333993,-0.6653004,-0.021712486,0.63731277,-0.43692258],[-0.34482664,-1.5146594,1.5212393,0.5039458,-0.98475206,0.15418348,1.4046031]],"activation":"σ","dense_2_b":[[-0.012626887],[-0.060023643],[0.050328624],[-0.15241708],[0.002586862],[-0.0811935],[-0.032516863],[-0.047326654],[-0.04986636],[-0.058775026],[-0.035809994],[0.05208208],[-0.15562724]]},{"dense_3_W":[[0.6006235,-0.2893421,-0.28629094,0.28537595,0.56650835,-0.51059633,0.07124142,0.10285289,-0.06570319,0.27793735,-0.042230252,0.327788,-0.6483426],[0.23293988,-0.25339293,0.4200759,-0.49375746,0.0040358165,-0.6081097,-0.108511046,0.4325967,-0.2370615,-0.4646658,0.5137965,0.62279403,0.19901751],[0.46578276,-0.67444813,-0.6492283,0.40810102,0.13862292,0.4688345,-0.19089985,-0.38935006,0.5318019,0.25233418,0.2683579,-0.5857107,0.32623842]],"activation":"identity","dense_3_b":[[0.028790487],[0.028534047],[-0.03063328]]},{"dense_4_W":[[0.7596348,0.72767824,-1.0551875]],"dense_4_b":[[0.031701148]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AB'.json b/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AB'.json deleted file mode 100755 index 7e10555ddb..0000000000 --- a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019 b'68525339AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.7539926],[0.93529695],[0.4818552],[0.038544405],[0.9241015],[0.9277656],[0.93047893],[0.92769974],[0.9196844],[0.90819216],[0.8909238],[0.038282566],[0.03835162],[0.03842366],[0.03860774],[0.038648367],[0.038378567],[0.037988614]],"model_test_loss":0.01552480086684227,"input_size":18,"current_date_and_time":"2023-08-05_15-05-03","input_mean":[[28.271704],[-0.018472683],[0.008247399],[-0.011640539],[-0.016549714],[-0.016534679],[-0.015966991],[-0.012970649],[-0.013244884],[-0.021792166],[-0.030313933],[-0.0117374305],[-0.011689001],[-0.011635759],[-0.011480733],[-0.011386347],[-0.011478815],[-0.011520906]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.16247147],[-1.9445274],[0.015820462],[0.1109649],[0.18606652],[0.14743169],[-0.25301546]],"dense_1_W":[[0.033168066,-0.87919986,-6.0003424,-0.11847333,0.23891214,-0.017026797,0.21457405,0.06397584,-1.1299858,0.119912185,1.2341022,-0.718399,-0.26759303,-0.5534113,1.0412015,0.43450904,0.20104626,-0.084277354],[0.6811516,-0.121241845,-0.015429761,-0.15817125,0.8674318,0.3464547,0.028172173,0.14950341,0.32529193,-0.21055248,0.17845789,0.92391425,-0.07065611,-0.065732196,-0.22456542,-0.7568571,-0.347454,-0.64657813],[0.060744118,-0.73202413,-0.012868376,0.4323286,0.18275686,-0.9485156,0.8238945,-0.10487157,-0.10203484,0.05330652,0.008031068,-0.023272691,-0.24555291,-0.039335933,0.06328203,0.17615116,-0.27155656,0.016184507],[-0.022168336,-0.4993914,4.419826,0.3107063,-2.6004608,-1.7346139,-1.8055027,-0.15056731,3.5626802,3.1007571,0.50810057,0.7390148,0.39296082,-0.6219894,-0.9289591,0.29771698,-0.002542225,-0.38791353],[0.07870597,0.8395529,0.013242184,-0.37794262,-0.2873907,0.75163865,-0.4381639,-0.17677695,0.047819123,0.007587919,0.010396626,0.38303232,0.201019,-0.5262356,0.27791938,-0.081237584,-0.17390475,0.19786458],[0.25589576,0.27254564,0.0028974493,0.337075,-0.32846543,0.07265917,-1.2584563,-0.101628564,0.20059124,-0.32358432,0.050918363,-0.031572163,0.28416264,-0.78280866,0.062558874,-0.11689831,0.5253208,0.8678441],[0.16486502,-0.6348946,-0.0078088874,0.20368655,-0.37894782,-0.3180483,0.77805275,-0.105039515,-0.10222425,-0.17470093,0.12180855,-0.6105949,-0.108344056,0.27209398,0.18639357,0.055669807,0.4774451,0.18108374]],"activation":"σ"},{"dense_2_W":[[-0.5479722,0.51978314,-0.3325378,0.7052226,0.82599765,0.20821774,-0.5566406],[-0.47786564,-0.5044051,1.2295787,0.34785864,-0.5027773,-0.53672224,0.4329206],[0.3557253,0.010534457,0.42732254,-0.4092949,-0.46742332,-0.6942757,0.48867208],[-0.70371103,-0.37598246,-0.64199096,0.5582689,0.3377767,-0.16154085,-0.6031509],[0.28246686,-0.18254404,-1.0761517,-0.44560048,1.0163425,0.6645717,-0.7254034],[0.038954254,-0.6713239,-1.047652,0.3876244,0.296178,-0.048443664,-0.5365625],[0.15319476,0.32095867,0.7348781,-0.05432626,0.10117875,-0.50145245,0.5931825],[0.23199868,-0.5129736,-0.18174349,-0.5271858,-0.4329709,-0.0027121021,-0.46761963],[0.1928321,0.30944964,-0.6179093,0.20904343,0.51145256,0.19034328,-0.9151516],[-0.14230113,0.5926942,-0.46564186,-0.1299676,0.29295698,-0.15119109,-0.7302749],[-0.27700615,-0.49345413,0.12770167,0.36850908,-0.8730177,0.26205686,0.66320413],[-0.47383484,-0.05481399,0.00739117,-0.33691958,-0.48928645,-0.14246316,-0.07991372],[-0.24223731,0.29117322,-0.2750107,0.42836645,0.5076202,0.4529231,-0.034581553]],"activation":"σ","dense_2_b":[[-0.011054851],[0.11898975],[0.016430143],[-0.121288925],[0.033908624],[-0.1270793],[0.024081398],[-0.03873727],[-0.03128879],[0.0043782927],[-0.054906446],[-0.03501189],[-0.075150594]]},{"dense_3_W":[[-0.5973777,0.6543564,0.6513368,-0.6236035,-0.6703424,-0.5459989,0.5743272,0.303027,-0.17172754,-0.5232033,0.20740275,0.17208031,-0.37048194],[0.17000821,0.15035313,0.15856911,0.34882855,0.46245342,0.4996729,-0.02127124,-0.097889625,-0.309891,-0.5858313,-0.07663794,0.36841103,-0.12395392],[-0.1960993,0.25925174,0.46165013,0.112479284,-0.15205826,0.03679703,0.6391964,0.15686889,-0.34719947,0.024827098,0.5550302,-0.29560098,-0.13534045]],"activation":"identity","dense_3_b":[[0.06578365],[-0.039697763],[0.035733122]]},{"dense_4_W":[[-1.3297648,-0.00095071405,-0.35285485]],"dense_4_b":[[-0.06175809]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017.json b/selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2017_HYBRID.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2017.json rename to selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2017_HYBRID.json diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018.json b/selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2018_HYBRID.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2018.json rename to selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2018_HYBRID.json diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2019_HYBRID.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA HYBRID 2019.json rename to selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2019_HYBRID.json diff --git a/selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020.json b/selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2020.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/CHRYSLER PACIFICA 2020.json rename to selfdrive/car/torque_data/lat_models/CHRYSLER_PACIFICA_2020.json diff --git a/selfdrive/car/torque_data/lat_models/GENESIS (DH).json b/selfdrive/car/torque_data/lat_models/GENESIS (DH).json deleted file mode 100755 index e80fc2aa96..0000000000 --- a/selfdrive/car/torque_data/lat_models/GENESIS (DH).json +++ /dev/null @@ -1 +0,0 @@ -{"test_dict":{"[0.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.2699708,"[0.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.44897613,"[0.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.27972165,"[40.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.6288122,"[40.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.009419857,"[40.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.29464614,"[20.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.8718414,"[40.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.16241446,"[20.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.23373634,"[40.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.5460306,"[40.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.18178429,"[40.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.2661167,"[0.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.25971827,"[0.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.8656753,"[0.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.65435606,"[0.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.16348448,"[20.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.23745517,"[40.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.55276626,"[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.005459955,"[40.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.57930475,"[20.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.6679626,"[20.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.6516425,"[0.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.48749548,"[40.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.16435784,"[0.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.6784933,"[0.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.6372965,"[0.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.19476463,"[20.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.66950613,"[40.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.5756492,"[40.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.26849964,"[40.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.35364658,"[40.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.8425623,"[0.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.29070386,"[0.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.84755886,"[40.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.70718986,"[40.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.025362803,"[0.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.14202757,"[20.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.46855992,"[40.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.2911558,"[0.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.6686591,"[0.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.29949942,"[40.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.46808085,"[40.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.019595843,"[20.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.68658686,"[40.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.5766193,"[20.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.7178196,"[0.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.0318396,"[20.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.29348856,"[0.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.6638601,"[20.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.6627258,"[0.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.07437267,"[20.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.6055348,"[20.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.23798963,"[40.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.17592952,"[20.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.01030465,"[0.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.7545617,"[20.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.18164062,"[40.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.16152,"[20.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.8436983,"[0.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.9237289,"[20.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.19309354,"[20.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.19966654,"[20.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.48542765,"[40.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.1542686,"[20.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.011308879,"[20.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.95253545,"[20.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.92795116,"[0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.1619431,"[20.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.21448861,"[20.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.30357608,"[20.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.17162016,"[0.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.9254877,"[20.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.61486626,"[0.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.2479979,"[40.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.72604245,"[0.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.6708805,"[40.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.35719714,"[20.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.0061618295,"[0.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.8119934,"[40.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.4702388,"[40.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.830137},"input_std":[[8.253246],[1.2265166],[0.8396968],[0.03495619],[1.1769793],[1.1944457],[1.2117249],[1.2462167],[1.2448307],[1.2171412],[1.172086],[0.035094533],[0.035049263],[0.034998577],[0.034752842],[0.034525692],[0.034230117],[0.03413073]],"model_test_loss":0.003963234834372997,"input_size":18,"current_date_and_time":"2023-07-16_12-10-58","input_mean":[[24.465681],[0.14132848],[0.343076],[0.019675385],[0.10810958],[0.11891723],[0.12978078],[0.16952017],[0.17916267],[0.17290013],[0.1463772],[0.019302443],[0.019420939],[0.019535815],[0.01998929],[0.020338312],[0.020922989],[0.02162974]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"test_dict_zero_bias":{"[0.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.23143637,"[0.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.4652263,"[0.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.35620037,"[40.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.72915876,"[40.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.033811964,"[40.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.2459415,"[20.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.93224394,"[40.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.19291008,"[20.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.20748353,"[40.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.5995451,"[40.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.11259879,"[40.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.31002465,"[0.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.34267417,"[0.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.84346217,"[0.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.67134356,"[0.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.2411822,"[20.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.2577998,"[40.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.5963392,"[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.030760199,"[40.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.61936307,"[20.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.7194478,"[20.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.6834684,"[0.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.4523713,"[40.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.23015223,"[0.0,-4.0,0.0,0.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.6842142,"[0.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.62436,"[0.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.16453701,"[20.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.71494484,"[40.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.62495947,"[40.0,-4.0,4.0,0.0,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.20527135,"[40.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.37316445,"[40.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.95322937,"[0.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.24505597,"[0.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.8992404,"[40.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.7107156,"[40.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.023601279,"[0.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.12803368,"[20.0,0.0,-4.0,0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.4761059,"[40.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.34226668,"[0.0,4.0,0.0,0.0,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.66734576,"[0.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.2568946,"[40.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.5198489,"[40.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.039260928,"[20.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.6992957,"[40.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.57003254,"[20.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.7749707,"[0.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.06198548,"[20.0,4.0,-4.0,-0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.3452634,"[0.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.6636515,"[20.0,4.0,0.0,-0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.6915985,"[0.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.027520018,"[20.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.6457659,"[20.0,4.0,-4.0,0.0,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.27366233,"[40.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.20291242,"[20.0,0.0,4.0,0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.03861127,"[0.0,4.0,4.0,0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.8053802,"[20.0,4.0,-4.0,0.2,5.2,4.8,4.4,2.8,1.6,0.0,-2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.23112899,"[40.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.13886195,"[20.0,-4.0,-4.0,0.0,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.8606299,"[0.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.97973317,"[20.0,0.0,0.0,-0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.16530247,"[20.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.2352428,"[20.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.510034,"[40.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.15056436,"[20.0,0.0,-4.0,-0.2,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.02322955,"[20.0,4.0,4.0,-0.2,2.8,3.2,3.6,5.2,6.4,8.0,10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":1.0131809,"[20.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.93524235,"[0.0,0.0,0.0,0.2,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.20059028,"[20.0,0.0,-4.0,0.0,1.2,0.8,0.4,-1.2,-2.4,-4.0,-6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.2240225,"[20.0,-4.0,4.0,0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.2621489,"[20.0,-4.0,4.0,-0.2,-5.2,-4.8,-4.4,-2.8,-1.6,0.0,2.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.13601273,"[0.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.90459216,"[20.0,-4.0,0.0,-0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.6621921,"[0.0,0.0,4.0,0.0,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.2747507,"[40.0,4.0,4.0,0.0,2.8,3.2,3.6,5.2,6.4,8.0,10.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":0.83059245,"[0.0,-4.0,0.0,0.2,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,-4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.6849924,"[40.0,0.0,4.0,-0.2,-1.2,-0.8,-0.4,1.2,2.4,4.0,6.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":0.43381947,"[20.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]":-0.043959964,"[0.0,-4.0,-4.0,-0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2,-0.2]":-0.7887305,"[40.0,4.0,0.0,0.2,4.0,4.0,4.0,4.0,4.0,4.0,4.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":0.5149402,"[40.0,-4.0,-4.0,0.2,-2.8,-3.2,-3.6,-5.2,-6.4,-8.0,-10.0,0.2,0.2,0.2,0.2,0.2,0.2,0.2]":-0.8446559},"layers":[{"dense_1_b":[[-0.06827587],[-0.028500285],[-0.25173208],[-0.07750105],[-0.2940142],[0.6922563],[0.8121905],[0.7862803],[0.045949236],[-0.752093],[0.0956208],[-0.07192505]],"dense_1_W":[[0.9860141,0.06856981,0.16649614,0.34863472,-0.4680053,-0.5291158,0.22607322,-0.44315264,0.38767982,0.095361136,-0.04150002,-0.23525304,-0.02514362,0.030176405,-0.124883376,0.21063851,0.24710408,-0.0042801024],[0.7650095,0.40897316,0.15986899,-0.41831535,0.20153247,0.535765,0.31352526,-0.11838379,0.07478691,0.30549064,-0.25162768,-0.5103203,-0.74696344,-0.36560678,0.2748608,0.26366073,0.6311933,0.713333],[-0.13126527,-0.39487827,-0.13285579,-0.5997767,-0.07298161,-0.73874617,0.102481976,-0.4895145,0.20335777,-0.06410841,0.16459773,-0.49094355,0.15613374,0.11448425,0.020741098,0.16492575,0.4202937,0.23035619],[0.21678914,0.28709143,0.31667808,0.38460296,0.2784755,-0.118180774,0.23113173,0.31613338,-0.14956291,-0.21667449,-0.32722402,-0.27772832,-0.49006936,0.2742082,0.011245524,-0.43906662,0.3694417,0.1636142],[-0.49277544,-0.32197058,-0.020395037,-0.17285073,-1.8189527,-1.3681763,-0.9464799,2.308432,2.1192882,0.9617323,-0.55478024,0.17136998,0.28032053,-0.1915387,-0.2276642,0.34017745,-0.0736793,-0.046107627],[0.9547897,-0.1796725,0.08065475,0.2715653,0.6025838,0.07301243,0.63076055,-1.0844946,0.0689092,-0.19870193,-0.028648961,0.3244974,0.11944415,0.042525414,-0.11440154,-0.070732705,-0.13264629,-0.3839806],[0.4166084,-0.22970842,0.03894506,0.27970275,-1.6061078,-0.7616155,-1.0644445,2.3107653,1.3266898,0.7445326,-0.42004168,0.32592276,-0.5272901,-0.058386777,-0.011751664,-0.24185024,0.2550218,0.037888173],[1.227693,-0.08679133,-0.058664244,-0.32752186,-0.33977526,-0.44716588,0.1074168,1.2112535,0.38789093,-0.5875413,-0.13212678,-0.48916072,-0.5090327,0.048765358,0.009949782,-0.036129378,0.4284392,0.5424678],[0.05534743,-0.0070937686,0.012779384,-0.020212462,-0.810695,-0.7458955,-0.06678266,0.24761188,0.7959795,0.18153493,-0.77803063,-0.3331065,-0.41612664,-0.10347939,0.4260129,-0.12432382,0.19131409,0.5900885],[-1.3917207,-0.10825836,0.25955147,0.117827095,0.1907617,0.056196008,-0.44743136,0.46662346,-0.07211038,-0.27684382,0.048279505,-0.67529994,-0.1008146,-0.26535323,-0.21489926,0.33245432,0.37282628,0.8048224],[0.9139895,0.18345529,-0.11113925,-0.024819624,-0.0057961256,0.42582917,0.20965768,0.09122352,-0.04145471,-0.08591005,0.033041902,0.102651305,0.28468904,-0.14300235,-0.1514348,0.27464387,-0.3937016,-0.21395943],[0.14075463,-0.36453637,0.022140993,-0.24156585,-0.22243826,0.5132401,0.317588,-1.4172845,0.07024156,0.36280203,0.19390614,0.31465214,-0.43508086,-0.014590371,0.38123438,0.31295216,0.064947814,-0.3264055]],"activation":"σ"},{"dense_2_W":[[0.2944305,-0.1596823,-0.53525865,0.49642923,0.23475026,0.23187475,0.71439105,0.65725046,-0.721471,0.39266056,0.37784654,-0.27128077],[0.081694655,0.13397129,0.15713829,-0.09578413,-0.5178259,-0.08045092,-0.54402024,-0.33381253,-0.22557487,-0.44034663,-0.5231108,-0.014040657],[-0.53353846,-0.49547645,-0.5018153,-0.3451814,-0.4162906,-0.11419333,0.14722995,-0.4278855,-0.30550334,-0.57627094,-0.48164564,-0.6556868],[-0.3350859,-0.53481793,0.17310745,0.041560747,-0.17386791,-0.36399472,-0.6959931,-0.07396456,0.06297616,0.041960794,-0.44298738,0.47928327],[0.37257755,0.056011233,0.121093154,0.13028839,0.112854324,-0.15124673,0.18506464,-0.25879407,0.010806852,-0.38031578,-0.30364817,0.40391642],[-0.7007721,-0.05058494,-0.37102678,0.0057000583,0.36505723,-0.0139328055,0.33886233,0.13501829,-0.7866263,-0.08625708,0.06882772,-0.7447073],[0.24382925,-0.7427297,-0.087578066,0.27406982,0.55775076,-0.9633511,0.8514653,0.5075772,-0.8725846,0.26276717,-0.49534693,-0.85888404],[0.2656534,0.19259208,0.40583682,0.31773284,0.034196496,-0.16609356,0.15637825,-0.6308068,0.47307655,0.19246396,-0.28782868,-0.031524025],[-0.33996844,0.35855332,-0.8875853,0.34016752,0.1107245,-0.4759234,0.05391628,-0.3273293,-0.60782087,0.21380496,-0.42787686,-0.67130834],[0.28692353,-0.27509448,0.04464982,-0.3738229,-0.16551112,0.030297015,-0.48875,-0.19420627,0.017036378,-0.16820177,0.10364311,-0.35664937],[0.10276442,0.07036441,-0.09596506,-0.26394823,-0.21366283,-0.145804,-0.33585423,-0.6869976,-0.15877219,-0.13249736,-0.7068687,0.04853754],[-0.063890144,-0.34752303,0.036439255,0.007083208,-0.12175009,-0.21223761,-0.3370601,-0.6512872,0.024522861,-0.12854238,-0.12914781,0.24186853],[0.26432735,-0.32675922,-0.7650313,-0.027757708,0.35079917,-0.76993525,0.14455345,0.25884274,-0.22133446,0.37703148,0.23170869,-1.0444877],[0.32937536,-0.13382863,0.48463398,-0.047336943,-0.27687612,0.23009335,-0.32501528,0.15273342,0.12341018,-0.33050254,-0.5033011,0.36793295],[0.019172277,-0.46311465,-0.47122756,0.3662296,-0.05598463,-0.45946774,0.11587991,0.16402873,0.065510325,-0.06082724,-0.52629966,-0.15041721],[0.13054866,-0.29858604,-0.38646755,-0.26892266,-0.3903054,0.10999007,-0.6066756,-0.27233317,-0.09195491,-0.39942724,-0.7569417,0.04020184]],"activation":"σ","dense_2_b":[[-0.024400406],[-0.012108642],[-0.2738606],[-0.06441908],[-0.035198342],[-0.17128238],[-0.2096501],[-0.047762156],[-0.16214791],[-0.025786025],[-0.21445137],[-0.25522697],[-0.14236587],[-0.06891089],[-0.11348295],[-0.27611488]]},{"dense_3_W":[[-0.045766644,0.39230958,0.35891584,-0.4291976,-0.04042154,-0.30131957,0.2852373,0.22184609,-0.26795706,-0.3909815,-0.0844706,0.004657081,-0.12571083,0.081972,0.22855265,0.14256158],[-0.0930191,0.18007645,-0.19445603,0.17205104,0.24538551,-0.04826821,-0.21634555,0.19088717,0.026500426,-0.15073289,0.2712199,-0.035126556,-0.12222757,0.20960063,-0.38159323,-0.14284025],[-0.441732,-0.15396653,0.03677415,0.3120023,0.011853378,-0.29715177,0.3207848,0.345577,0.13360831,-0.058848828,0.4174631,0.05521104,-0.1556204,0.2805419,-0.34175965,-0.33693245],[-0.4516799,-0.23317254,0.23108752,0.21102518,-0.030421874,-0.1663392,0.29930797,0.10362555,-0.08888556,0.30611843,-0.10012278,-0.13986777,0.23634678,-0.3123206,0.20500444,-0.192751],[-0.004745441,-0.43816042,-0.034584858,0.19766587,0.3116471,-0.03267742,-0.20999157,-0.20225246,-0.067765154,0.2848538,-0.16701016,-0.059503432,0.3308554,0.22440504,-0.3225443,0.05546478],[0.05413141,-0.3679634,-0.08688536,-0.07090988,-0.29120877,0.1316063,0.44080707,-0.16184773,0.20294042,0.20072685,-0.12445014,0.3804063,0.20178777,-0.13255891,-0.30791807,0.10261593],[0.38054186,-0.036883593,0.111167036,-0.15566286,-0.23951554,-0.059736684,0.5326792,-0.41414064,0.3691683,-0.09329605,0.22044435,-0.21697398,0.2869305,-0.39302784,-0.13643056,-0.27738827],[-0.14465772,-0.4031915,-0.17516668,0.13024601,-0.37880698,0.40701059,0.2547356,0.094646186,0.19080016,-0.40483093,-0.2865975,0.23534034,0.31190503,0.24550194,0.39888,-0.27389622],[0.36007127,-0.093776844,0.11617923,-0.02295303,-0.08457082,0.09956218,-0.013975839,-0.46377388,0.2146814,0.2755668,-0.09221034,0.035337944,0.20806664,0.042331383,0.2022907,-0.19461066],[0.39033055,-0.52232456,-0.25495735,-0.5319784,-0.31744576,0.6584618,0.81467754,0.12727821,0.33764753,-0.0022844106,-0.543308,-0.39109668,0.36655223,-0.5292826,0.4390524,-0.44351915],[-0.14593528,-0.040282447,-0.30888835,0.19295529,0.07064081,-0.39783165,0.039676864,-0.06879557,-0.39840496,0.19014457,0.04776782,0.38430482,-0.2741348,0.08051817,-0.14613572,-0.100173116],[0.17331427,-0.24296136,0.33474293,0.19222625,0.29851925,-0.30138525,-0.019168438,-0.2754576,-0.122989416,-0.0025447265,0.33477452,0.28567022,-0.3947916,-0.037584867,-0.15590495,0.3125137],[0.4101434,-0.3299672,0.28667036,-0.08923333,-0.16061012,0.0777971,0.38074505,-0.103880584,-0.117819495,-0.24564442,-0.4328198,-0.18800925,0.23287506,-0.29935506,-0.09091186,0.10900072],[-0.026216649,0.34356278,0.16383435,-0.20038186,-0.15712044,-0.15588541,-0.077189654,0.20966166,-0.1291972,0.14222729,-0.3434131,0.007533742,-0.06533606,0.09545395,-0.19654328,0.24315165],[0.43069547,0.045578357,-0.25710672,-0.111668326,-0.017155485,0.10505446,0.34679157,0.28005412,0.031709734,-0.30453283,-0.12727985,-0.057555404,0.06327874,-0.33901685,0.034049414,0.108673126],[0.016011784,0.0637642,-0.38568556,0.18072137,-0.3611924,0.30670312,0.05511325,-0.075690806,-0.39434642,0.079114,-0.19587561,0.1014485,0.40695387,0.0076808794,-0.15043128,0.121672675]],"activation":"identity","dense_3_b":[[0.01894022],[-0.0973606],[-0.005777353],[0.020744076],[-0.046186622],[0.00427233],[0.004350739],[-0.018349739],[-0.14396259],[-0.02958251],[0.038920324],[-0.017607786],[0.0048550465],[0.02556554],[-0.030977953],[0.034558125]]},{"dense_4_W":[[-0.006525211,-0.010181395,-0.1280271,-0.17862214,0.0013907425,0.17761578,0.55933243,0.20846461,0.03992837,0.16985804,-0.12210165,-0.014709531,0.4256174,-0.040674876,0.20955296,0.010441904]],"dense_4_b":[[-0.0021002437]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/GENESIS G70 2018 b'xf1x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106'.json b/selfdrive/car/torque_data/lat_models/GENESIS G70 2018 b'xf1x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106'.json deleted file mode 100755 index 8904b3bb61..0000000000 --- a/selfdrive/car/torque_data/lat_models/GENESIS G70 2018 b'xf1x00IK MDPS R 1.00 1.06 57700-G9420 4I4VL106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.67504],[0.83055073],[0.4504677],[0.031510424],[0.8270034],[0.8270758],[0.8283119],[0.82153946],[0.82032317],[0.8195808],[0.8197018],[0.03126837],[0.03131486],[0.031380102],[0.03158359],[0.03163829],[0.03178264],[0.031831454]],"model_test_loss":0.001804972067475319,"input_size":18,"current_date_and_time":"2023-08-05_16-18-44","input_mean":[[25.399244],[0.061304945],[-0.0003437192],[-0.017434629],[0.06381776],[0.06372736],[0.063848905],[0.063940406],[0.065443896],[0.06275638],[0.06494871],[-0.017370405],[-0.017361412],[-0.017346727],[-0.017236443],[-0.017156692],[-0.017259058],[-0.017420387]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0690558],[-0.77586544],[-0.22050455],[-0.00765285],[-0.19674423],[-0.8347951],[-0.09352683]],"dense_1_W":[[0.020506917,-0.15335819,-0.0008360731,0.6498087,0.17344612,1.1971287,-0.2960149,-0.4612594,0.17628047,-0.22166184,0.34056312,0.75876623,-0.24494657,-0.78779393,-0.5285824,-0.06854418,0.110915035,0.108071424],[-0.5525338,-0.18559927,-0.8664502,-0.19414489,0.32285878,0.104777955,0.32996055,-0.5476456,0.2609833,-0.6216712,0.30093062,-0.44722554,0.10542638,0.3017626,0.10288904,0.38855773,0.19561474,-0.3270897],[-0.14589511,0.20689815,-0.0024478706,0.35753623,0.29983085,0.30490085,0.19881076,-0.5439725,-0.055093203,0.23563561,0.10342807,0.18627505,0.009484609,-0.5248601,-0.15741313,0.25914413,-0.06266835,-0.051203806],[0.011763201,-0.32582518,1.6164731,0.1839908,-1.0310354,-0.51407796,1.5570961,-0.35941225,-0.24897343,-0.20450619,1.1247143,0.07288912,-0.09742617,-0.011884875,-0.3086428,0.21652025,0.033836115,-0.14367257],[-0.00040854778,1.1504747,0.00023197546,-0.15424743,0.40093625,-0.89857256,0.12767099,-0.9129619,-0.77709115,0.5045758,0.12572749,0.08928875,-0.0022053611,0.0144833615,-0.18096298,0.17682968,0.198336,0.16687107],[-0.62956375,0.0370336,0.90060794,0.16559666,-0.26498243,-0.0035898676,-0.3527606,0.6536402,-0.15629528,0.18882553,-0.04355473,-0.0017563448,0.060951266,-0.07628207,-0.10434113,-0.33889666,0.12719911,0.032956228],[0.00914529,0.18054785,2.2880237,0.2819539,-0.25446033,-0.76159877,-1.333457,-0.0044576577,0.7970225,1.3939439,-0.08412827,-0.21678115,0.40472636,0.022984171,-0.405091,0.08374549,-0.27028057,0.09941351]],"activation":"σ"},{"dense_2_W":[[0.7266154,0.32628095,0.51000977,-0.4783954,0.086360686,-0.22168429,-0.2880397],[0.598752,-0.3016096,0.5087822,-0.5399995,-0.5202169,0.058336493,0.047094647],[-0.28886208,0.44084644,0.1333289,0.47497818,-0.28537926,0.033592604,0.07091276],[-0.21188565,0.3598567,-0.25231984,-0.32756943,0.39144737,0.048175387,-0.13305938],[0.03274561,-0.55677044,-0.11253939,-0.013972536,-0.06857901,0.28146827,-0.55059713],[0.5122463,0.43594432,0.17488275,-0.720984,-0.17414498,0.51594955,-0.16287713],[0.14888862,0.06988386,-0.29811302,0.23327418,-0.44284585,-0.313677,0.414895],[-0.7221291,-0.33080924,0.34764898,-0.15981244,0.09235077,0.24312954,-0.6309208],[0.31931618,-0.16977033,0.4973229,0.31941646,-0.33441898,-0.25843173,-0.33283034],[0.081630506,0.19055562,-0.32433864,0.38465676,-0.35722488,-0.5474165,-0.25410983],[-0.5063781,0.4390191,0.057292584,0.41282323,0.40151483,-0.69037515,-0.13255808],[-0.89217335,0.3417005,0.13010992,0.39993486,0.0745399,-0.006703715,-0.55569714],[0.46920383,0.00090861076,-0.34466454,-0.62741935,-0.54203355,0.26534078,0.31966165]],"activation":"σ","dense_2_b":[[-0.0036245622],[-0.013149616],[-0.11431158],[-0.068017736],[-0.21495658],[-0.016385378],[0.016726723],[-0.063780464],[-0.0170552],[-0.06312584],[-0.066713385],[-0.08563329],[-0.023486812]]},{"dense_3_W":[[0.05525152,0.3041412,-0.26633847,-0.4607755,-0.50169283,-0.13767284,0.525694,0.027187727,-0.54194945,0.00530328,-0.29629645,0.06593012,-0.13549523],[0.20180804,0.22567257,0.099739715,-0.5508954,0.5213892,0.6428468,0.41780272,-0.44941857,0.57049906,-0.5196749,-0.44776997,-0.3975976,0.3711528],[-0.104158744,-0.27345514,-0.4545859,0.40854144,-0.49072927,-0.49170205,-0.3166091,0.23397347,0.61358595,-0.037754327,-0.2841472,-0.10350736,0.2719038]],"activation":"identity","dense_3_b":[[0.052092277],[0.035965864],[0.066190146]]},{"dense_4_W":[[0.8467955,1.0950449,0.25318098]],"dense_4_b":[[0.043908965]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/GENESIS G80 2017.json b/selfdrive/car/torque_data/lat_models/GENESIS G80 2017.json deleted file mode 100755 index 84e07c5900..0000000000 --- a/selfdrive/car/torque_data/lat_models/GENESIS G80 2017.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.38813],[1.0174526],[0.39554036],[0.046162203],[1.0090938],[1.0111505],[1.0117267],[1.0022837],[0.9907708],[0.9691922],[0.93781143],[0.045898493],[0.0458996],[0.045888968],[0.04573459],[0.045532204],[0.045233488],[0.044901755]],"model_test_loss":0.012157289311289787,"input_size":18,"current_date_and_time":"2023-08-05_16-43-40","input_mean":[[25.00623],[0.054802105],[0.011563125],[-0.012088739],[0.050388798],[0.05198936],[0.05343812],[0.056934483],[0.05857226],[0.05653321],[0.05339159],[-0.012127758],[-0.012105216],[-0.012089895],[-0.012095662],[-0.012160323],[-0.012418678],[-0.012670423]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.23510607],[0.017906608],[-0.09428025],[2.0587661],[2.4378984],[-0.2166746],[0.17629944]],"dense_1_W":[[-0.008606778,0.34109786,0.6875069,0.0028993126,0.8000613,0.546632,-0.9264688,0.03937569,0.13737564,-0.2733249,-0.96302414,0.339788,0.60886014,0.26368546,-0.23521979,-0.1668846,0.3196768,-0.15900844],[-0.0011819584,0.729729,2.0695696,0.20169054,-1.0443937,-0.5805483,-1.2778925,-1.3182445,0.7515108,1.8376803,0.88894564,0.9433448,0.60453916,-0.5198952,-0.27219102,-0.18214135,-0.32308298,-0.5258672],[-0.0007019058,-0.45617288,-0.058651116,-0.1715701,-0.1380315,-0.021959623,0.026901057,0.082620144,0.1911437,0.00152804,-0.042670403,-0.3032745,0.45580253,0.032131206,-0.2713613,0.3809063,-0.021339726,-0.046729088],[0.9848692,-2.0930884,0.05227474,0.14134067,-0.5008443,-0.51911664,-0.10874144,-0.11555108,0.059225876,-0.20209119,-0.5084024,0.119557716,-0.17086504,0.5155482,-0.2892066,-0.723269,0.19560312,0.18627037],[0.9442295,1.9961289,-0.05074522,-0.043404724,0.6943,0.59966326,-0.045782663,0.08436519,-0.1630318,0.05319531,0.67571694,-0.3004089,-0.12995596,-0.41098842,0.36848706,0.87160724,0.39175102,-0.7181419],[-0.0074142898,-0.04797374,0.64808965,0.55981237,0.49558824,0.63315,1.5447174,-0.5666181,-1.9028187,-1.1591543,0.67295575,-0.3617059,-0.2785844,0.52386093,0.78436995,0.022645274,0.30185598,-0.6463948],[-0.002286195,0.25007936,-0.027766582,-0.2213954,0.28290057,0.71661454,0.073331274,-0.017547475,-0.64222115,-0.2412949,0.5705157,0.31924602,-0.050814595,-0.45005983,-0.31452417,0.30082983,-0.56895506,0.3093173]],"activation":"σ"},{"dense_2_W":[[0.49283543,1.4813224,-1.1632105,1.1330808,1.6111002,-0.79484963,0.521326],[-0.45535,-0.27000293,0.20228699,-0.021973267,-0.20624182,-0.20179789,-0.0924967],[-0.6126425,0.12641166,0.12921864,0.18841244,0.22053215,-0.0732061,-0.6845349],[-0.44073936,-0.26221433,0.71035826,0.8264845,0.27127275,0.1522136,-0.40632126],[1.1533407,0.74939775,-0.74686474,-0.15980572,1.3828646,-0.47532186,-0.49893177],[-0.010718742,-0.49425468,0.57077384,0.52116805,-0.1557675,-0.2101485,0.1713434],[0.123579755,-0.003964546,0.37106356,0.31162402,-0.1109699,-0.013212317,-0.050931312],[0.46784705,0.20873305,-0.51459223,-0.12245424,-0.35924026,-0.6009022,0.7039142],[0.6885935,0.4780248,-0.95869493,-1.1940409,-0.37541804,-1.0116334,0.3657836],[-0.084950574,0.20079572,-0.6036541,-0.5749908,-0.4149406,-0.06347254,0.3201109],[0.6054816,-0.26072496,-0.6472537,-0.10404058,0.28988326,-0.7315275,0.71709865],[-0.46448785,0.027026115,0.68479264,-0.25374988,-0.82326454,0.63361776,-0.95420885],[0.4081272,0.4028123,-0.54246926,0.45891264,0.535415,-1.0074925,0.021217577]],"activation":"σ","dense_2_b":[[-0.31526598],[-0.04387461],[-0.012186167],[0.16261126],[-0.48067328],[0.021213803],[-0.06306296],[-0.18538073],[-0.3133758],[-0.33385947],[-0.30100945],[-0.1241097],[-0.03466007]]},{"dense_3_W":[[0.21734363,0.043079853,0.18524005,-0.2568567,0.15158817,-0.36534816,-0.34965506,-0.36512575,-0.06888381,-0.31225628,-0.10772074,-0.67586124,-0.20552121],[-0.5188872,-0.5363552,0.6651099,0.42919686,0.35317427,0.5209541,0.4917763,-0.62617296,0.0038265921,0.033600807,-0.36337307,0.619507,-0.45799708],[-0.20623821,0.2606718,0.049107946,0.78371567,-0.46874192,-0.036460795,-0.09059373,-0.622457,-0.82094365,-0.10458149,-0.10322752,0.7906474,-0.24749829]],"activation":"identity","dense_3_b":[[0.030028654],[0.035442725],[0.060197428]]},{"dense_4_W":[[0.047837973,-0.35243145,-1.0255531]],"dense_4_b":[[-0.05134228]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN b'xf1x00JW1 MDPS R 1.00 1.03 57700-CU100 1C02'.json b/selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN b'xf1x00JW1 MDPS R 1.00 1.03 57700-CU100 1C02'.json deleted file mode 100755 index 1a2b1b864e..0000000000 --- a/selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN b'xf1x00JW1 MDPS R 1.00 1.03 57700-CU100 1C02'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.8666883],[1.3245112],[0.52562356],[0.052998435],[1.3207145],[1.3219501],[1.322223],[1.3074695],[1.2883352],[1.257932],[1.2234186],[0.0526958],[0.05277707],[0.052846666],[0.052899044],[0.052800883],[0.05247098],[0.05198219]],"model_test_loss":0.004962869919836521,"input_size":18,"current_date_and_time":"2023-08-05_17-34-41","input_mean":[[25.097816],[0.03033095],[0.009557012],[0.0017949705],[0.025300408],[0.02690665],[0.028368048],[0.032760378],[0.03126874],[0.0306388],[0.028780613],[0.0017470417],[0.001759046],[0.0017673858],[0.0017764169],[0.0017657065],[0.001777597],[0.0017051382]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.4459309],[-0.031835943],[-0.6412851],[1.5992996],[-1.8778602],[0.067136765],[-0.1248056]],"dense_1_W":[[0.23177835,0.5813533,-0.03405331,-0.5137932,0.4210262,0.27980956,-0.82241374,-0.19962446,0.11077991,-0.093077675,0.1452694,0.8414958,0.57338977,0.19254212,-0.737942,0.19993012,-0.20208997,-0.3420811],[-0.000672615,0.59404653,0.035378806,-0.02149494,-0.18110669,0.2673035,-0.31291944,0.18944205,0.16411953,-0.004739658,-0.18394397,0.08154405,-0.19406919,-0.35596544,-0.19057219,-0.75509447,0.12070875,0.52753425],[0.29864538,-0.47656062,0.03612531,-0.026517967,0.042197336,-0.7134168,0.7022738,0.3648459,-0.26705045,-0.120554686,0.0457595,-0.77211475,-0.1677129,-0.06930536,0.10366717,0.58520234,-0.1898025,0.50099725],[0.39080697,-0.61320007,-0.17329827,0.5142849,0.093346365,-0.8120696,0.27996528,0.053159885,-0.1457705,-0.18952872,0.0007353743,-0.23638912,-0.07647951,0.3922934,-0.42914188,-0.37108567,0.20613119,0.062412854],[-0.39423087,-0.40943775,-0.18895875,0.17182297,-0.6007384,-0.11699258,0.3204309,-0.2494266,-0.16516677,-0.13115573,-0.014376576,0.05930437,0.23952278,0.056292366,-0.34672272,-0.29824072,-0.15019956,0.32797214],[0.10670553,0.5959076,0.009395143,-0.41772658,0.22091666,0.25926113,-0.105012566,-0.24128042,-0.23561135,-0.16422139,0.39602,-0.030733602,0.1917602,-0.1896667,0.5195841,0.19198169,-0.09055647,-0.114016406],[0.004652841,-1.0700105,-4.301339,0.18097587,0.88896906,0.100279324,0.78191584,-0.1407951,-0.6152163,-0.36759338,0.3781233,-0.2559152,-0.22632733,0.0830458,0.30006638,0.070950896,-0.10994307,-0.077234626]],"activation":"σ"},{"dense_2_W":[[-0.59839344,-0.36497867,-0.02586302,-0.31546462,0.67249775,0.17433609,0.033796396],[0.7766115,0.40153167,-0.7150285,-0.80042535,-0.720546,0.31380758,0.4402431],[0.0970656,0.51849407,-0.65787846,-0.28156418,-0.7972932,0.52290595,0.16948703],[-0.16617168,-0.28093967,0.43271568,0.5635128,-0.15296243,0.05517985,0.5591824],[-0.07375612,0.9804654,-0.45864907,-0.011922217,-0.76456034,0.71113896,-0.17698406],[0.08965309,-0.3817331,0.56427354,0.22461765,0.36535984,-0.41643435,0.02309694],[-0.3194701,-0.9402775,0.035420515,1.0038631,-0.04493413,0.46595728,0.61562926],[0.3133922,0.54886144,0.20508583,-1.9232413,0.29925007,-0.15759094,-0.964843],[-0.07229484,-0.40885624,0.36455467,0.22989284,0.29330707,-0.23192556,-0.25334215],[-0.66204053,-0.6006576,0.46530548,0.8226111,-0.50858915,0.65410966,0.8907581],[0.062297866,-0.5300527,-0.24341863,-0.26440525,-1.0893056,0.6854048,-1.044881],[-0.3985859,-0.46718082,-0.12280806,0.5118322,0.58033365,-0.4268356,0.27308896],[0.66325355,1.5489223,-0.2619856,0.8496741,-1.5036632,0.18988253,-1.092742]],"activation":"σ","dense_2_b":[[-0.067070246],[-0.0031838221],[0.026247503],[0.016272478],[-0.05702159],[-0.06190444],[0.047330927],[-0.14584902],[-0.043730203],[0.10126568],[-0.23609862],[-0.107597634],[0.5373265]]},{"dense_3_W":[[-0.16748182,-0.4861085,-0.4175482,0.17064394,0.1626839,0.6020392,0.69299996,-0.7983646,-0.3389632,-0.22732152,0.15245983,0.19130903,-0.7817714],[0.16310972,-0.6437373,-0.5314633,0.23254934,-0.1725596,-0.4100144,0.43598408,-0.77505416,0.14245929,0.27584276,0.6299163,0.51607686,-0.5231239],[0.4058488,-0.5608606,-0.7491334,0.3631101,-0.32120687,0.37973177,-0.12449112,-0.1279431,0.57055753,0.59800303,-0.3972419,0.73630637,-0.36663607]],"activation":"identity","dense_3_b":[[0.12561505],[0.06481958],[0.04212058]]},{"dense_4_W":[[-0.47166833,-0.46609542,-0.5415291]],"dense_4_b":[[-0.052935593]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/GENESIS G70 2018.json b/selfdrive/car/torque_data/lat_models/GENESIS_G70.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/GENESIS G70 2018.json rename to selfdrive/car/torque_data/lat_models/GENESIS_G70.json diff --git a/selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN.json b/selfdrive/car/torque_data/lat_models/GENESIS_GV60_EV_1ST_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/GENESIS GV60 ELECTRIC 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/GENESIS_GV60_EV_1ST_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/GENESIS GV70 1ST GEN.json b/selfdrive/car/torque_data/lat_models/GENESIS_GV70_1ST_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/GENESIS GV70 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/GENESIS_GV70_1ST_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/GMC ACADIA DENALI 2018.json b/selfdrive/car/torque_data/lat_models/GMC_ACADIA.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/GMC ACADIA DENALI 2018.json rename to selfdrive/car/torque_data/lat_models/GMC_ACADIA.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA,A150x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA,A150x00x00'.json deleted file mode 100755 index 35fd803df5..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA,A150x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.97151],[0.74501616],[0.33569595],[0.028122501],[0.7403551],[0.73829293],[0.7401743],[0.7252648],[0.7144178],[0.7009765],[0.6888075],[0.028033128],[0.028054733],[0.028070904],[0.027984012],[0.027977224],[0.027935864],[0.027860973]],"model_test_loss":0.007779959123581648,"input_size":18,"current_date_and_time":"2023-08-05_18-55-32","input_mean":[[24.977537],[0.008342045],[0.002733684],[-0.0039678486],[0.0046404926],[0.00584171],[0.006370007],[0.008761067],[0.010619238],[0.012941762],[0.014379741],[-0.0040723],[-0.0040712818],[-0.004070556],[-0.004221088],[-0.004329774],[-0.0044895913],[-0.0046329168]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.06255275],[-0.10187155],[0.7811029],[0.5233844],[-1.1382071],[-0.1777123],[-1.2519176]],"dense_1_W":[[0.11130547,-4.7213726,-0.47437814,0.11127721,-0.18916543,-1.6377331,0.9418644,-1.1306248,-2.1403713,-1.7070324,-0.64424783,-0.33537778,-0.09433337,-0.21594714,-0.18122146,0.16977471,0.10330264,0.19049811],[-0.0004276181,0.6357742,0.05217043,-0.20857349,-0.80013305,1.4368694,0.5090257,-1.1573409,-0.36113778,-0.1694356,0.4889256,0.09562526,0.070235886,-0.3155261,0.23921712,0.034688536,-0.078639016,-0.010847355],[0.7599186,2.121532,0.72905946,-0.14806178,0.5078854,-1.3953625,0.24837576,-0.44519806,-0.4571781,-0.11445646,-0.1446055,0.013272849,-0.096724935,0.31767842,0.0024148482,-0.38241157,0.518821,-0.24625751],[0.6820916,-1.5524395,-0.7604904,-0.09014856,0.14045534,-0.09164528,-0.043247532,0.71089435,0.00785311,0.5674591,-0.06433367,-0.0075882818,0.078265265,-0.1252983,0.23067287,-0.24010041,0.17806269,-0.0014166064],[-0.5627969,1.037751,-0.86133707,-0.49025095,-0.46149084,-0.9962395,0.5214078,-0.56174046,-0.39522848,0.08022861,0.518166,-0.3117448,0.23640868,0.2056402,0.45708388,-0.06492579,-0.064152785,0.03409542],[0.13577399,0.5898029,-0.45204794,-0.57214713,-1.5238308,-0.8625397,-1.3790354,-3.5523987,-1.6210394,-1.4617451,-0.67999744,-0.4513496,-0.03868263,0.0944409,0.544846,-0.21822882,0.50802565,-0.085099295],[-0.68000346,-0.7993309,0.8909783,0.27740914,0.51246107,1.4516846,-1.2700812,0.45289844,0.44953805,0.022532407,-0.5839419,0.20553645,0.1257213,0.067001835,-0.839108,-0.08893746,0.19246873,0.060739163]],"activation":"σ"},{"dense_2_W":[[0.085230306,-0.29360268,0.51161885,0.23618865,0.6497735,-0.26098794,-1.0364774],[-0.22014649,-0.24637136,-0.42513672,0.5623381,-0.12819354,0.14416225,-0.39033532],[0.7196067,-0.34021074,-0.5724672,-0.37321565,0.49308595,-0.9088214,-0.8430574],[0.19003648,-0.14491072,-0.39664307,0.27051845,0.005819935,0.22110407,-0.15665153],[-0.34837252,-0.96703774,-0.14450067,-0.3116821,0.3658192,0.21894221,-0.35829273],[0.11697895,-1.0484563,0.5595325,-0.5593309,0.18357657,-1.3186389,-0.31535873],[-0.3179443,0.6616187,-0.046228375,0.5932086,-0.54266274,0.59215814,0.18800579],[0.13047467,0.6949298,-0.24352126,0.11897494,0.0057367617,0.66297096,-0.010114408],[1.5367961,-1.7399038,-0.69597286,-1.7319793,1.36763,-0.45350328,-0.15131596],[-0.32002783,-0.03297229,-0.607617,-0.49017462,0.34876344,-0.28122258,0.258027],[0.36292878,-0.3491634,1.0256252,0.7740448,0.7382758,0.10291141,-0.99806124],[0.6031384,-1.1245648,0.40815106,0.7438041,0.6337614,0.10372877,-0.10575027],[-0.57705086,0.21220624,0.038151897,-0.33815548,0.2740102,0.01581186,0.541243]],"activation":"σ","dense_2_b":[[0.012299448],[-0.04102267],[-0.034108546],[-0.27925974],[-0.0057511167],[-0.22451408],[0.009193072],[0.0060836924],[-0.31634617],[-0.062315367],[0.12637672],[0.0059941616],[-0.06976539]]},{"dense_3_W":[[-0.20017228,-0.14052714,0.03923989,-0.60445774,-0.04527449,-0.12592994,-0.66201633,-0.54722226,0.1441803,-0.37791568,0.04386546,0.50280595,-0.020515436],[0.35166073,-0.20586215,0.5838703,0.58067,0.55858165,0.3304557,-0.64685065,0.090058595,0.35607472,-0.38356113,0.3500607,-0.088301666,-0.022835555],[0.54761213,0.07857258,-0.34005758,-0.28216037,0.5361241,0.3974213,-0.26704797,-0.3374281,0.6506741,0.3128651,0.540587,0.5345023,-0.60392904]],"activation":"identity","dense_3_b":[[-0.029276293],[-0.044624712],[-0.05815794]]},{"dense_4_W":[[-0.9044067,-1.1482185,-0.6116598]],"dense_4_b":[[0.036644172]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A140x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A140x00x00'.json deleted file mode 100755 index ab8badd20d..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A140x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.992972],[0.761277],[0.33648303],[0.042408932],[0.76959854],[0.76725096],[0.7643645],[0.74037844],[0.7259183],[0.7094538],[0.6951536],[0.04228616],[0.042296555],[0.042313654],[0.042262528],[0.042218875],[0.04204096],[0.041743096]],"model_test_loss":0.02265222929418087,"input_size":18,"current_date_and_time":"2023-08-05_19-20-20","input_mean":[[24.21027],[-0.02817834],[0.013860759],[-0.0006401126],[-0.0324325],[-0.03152595],[-0.030524159],[-0.02442753],[-0.018565625],[-0.009745938],[-0.003067271],[-0.0006674106],[-0.0006681617],[-0.0006630953],[-0.0007476516],[-0.0006563686],[-0.0006758302],[-0.0007831018]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[3.7685766],[2.8427706],[-3.8559403],[-0.14407404],[-0.054108057],[-2.4449306],[-3.0141466]],"dense_1_W":[[1.8801908,1.4156594,-1.0323609,0.79236954,-0.80337536,0.58097416,-2.2510185,-0.1828844,0.15489013,0.27806175,0.015761895,0.25713542,-0.2735746,-0.14071672,-0.46098727,-0.13111337,-0.45133302,0.4580773],[1.8035195,1.6041955,0.8874118,-0.80396426,0.22453892,1.6733601,-2.4467292,-0.14284624,0.12720221,-0.07064604,-0.26454973,-0.114142805,0.27872777,-0.03267202,0.5485695,0.4108842,-0.18058304,-0.14545393],[-1.8154907,2.1600099,0.97071725,-0.58187705,0.003728732,2.3155384,-3.23783,-0.1090358,-0.13879994,0.10283042,-0.3239596,-0.13651542,0.10076348,0.14383954,0.36411935,0.49005857,-0.4234995,0.0010333508],[-0.013895141,-0.54229933,0.02395054,0.39421257,-0.9302867,3.529645,-1.1669548,-0.33310902,0.19925158,0.15934487,0.121357955,-0.34288648,0.6551107,-0.052651346,-1.2509402,-0.32869434,0.3425414,0.025959644],[0.038595013,1.9379244,3.9255502,-1.687313,0.69473827,1.657322,-2.1877844,1.0006453,-0.80904555,-1.0939405,-0.70684177,0.2738023,-0.4664105,-0.3705315,2.6731036,0.44496182,-0.3791093,-0.48865584],[-0.115257055,9.220496,-3.8134823,-4.2458467,9.2529545,9.778793,8.01551,7.5823874,4.997883,4.0989575,1.6614507,0.40712392,0.81142205,1.4502381,0.9823255,0.6349457,0.30227003,-0.36331397],[0.76528615,1.8912066,0.4003822,0.42052475,1.0807861,1.2272604,-0.09050154,0.26065364,0.34981024,0.48282778,-0.016957628,-0.016907506,0.46985832,-0.25855386,-1.092362,-0.57151246,-0.62681884,0.43833002]],"activation":"σ"},{"dense_2_W":[[-0.50458944,0.3265226,1.3503221,1.1455716,-0.24126105,0.30343592,-0.24365348],[-0.6311094,-0.504272,0.38552013,-1.1871966,-0.15529175,-0.5199216,-0.23288444],[-0.85456246,-1.0671792,-0.5235838,-0.058778144,-0.83717144,-0.25111958,0.6668136],[-0.18605676,-0.37535578,0.26066002,0.40830556,-0.26472908,-0.5714715,-0.4442903],[0.23003292,-1.1301463,-2.4274843,-0.6968535,-0.33779627,0.40726957,-0.7347456],[1.0467806,0.18329021,0.09319784,1.1631411,-0.15507531,0.493985,0.5579849],[-0.08045475,-0.05917078,-0.4645429,-0.6068606,-0.0685764,-0.17900154,-0.62299603],[-0.42154956,0.20449437,-0.698377,-1.0489599,-0.028300853,0.43246627,0.25651544],[-0.19329518,-0.8510341,1.2749082,1.3596451,0.8580042,0.60158896,-0.30835444],[1.9168442,2.0033686,-1.2564323,-0.30960408,1.3287855,2.8171167,0.6671751],[-1.4893216,-1.6534694,0.564758,0.19810775,-1.1537246,-2.037296,0.047834612],[-0.201097,-0.20977359,0.9980199,0.017591937,0.5220423,-0.32709578,-0.040991563],[-0.76144993,-0.66945726,-1.386429,-0.21879196,0.1684756,-0.07748325,-0.59191686]],"activation":"σ","dense_2_b":[[-0.7321166],[0.11477704],[0.19248009],[-0.20476317],[-0.01635628],[-0.306795],[0.14476658],[0.30890986],[-2.4419878],[-0.5385942],[0.10476772],[-0.5766014],[0.20005944]]},{"dense_3_W":[[-0.0791274,-0.7011603,-0.44377816,0.48128963,-0.21547104,0.16660322,-0.2547173,-0.44273084,0.101601996,-0.053882852,0.19060013,-0.3184192,-0.04856416],[0.54122835,-0.97574085,-0.4281066,0.53716606,-0.91660917,0.52668923,-0.25096038,-1.0447183,0.5229288,0.3251163,-0.78397036,0.10469802,-0.14347981],[0.17414881,-0.19212788,-0.57071036,-0.3887359,-0.38976607,0.53497523,-0.30920812,-0.97329575,0.73605007,0.53398937,-0.44441673,0.50344443,-0.57531935]],"activation":"identity","dense_3_b":[[-0.070742786],[-0.16557649],[-0.13552403]]},{"dense_4_W":[[0.26535642,0.6260712,1.0967736]],"dense_4_b":[[-0.12048781]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A150x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A150x00x00'.json deleted file mode 100755 index 63d3b65564..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A150x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.9692955],[1.0462041],[0.34472412],[0.04641226],[1.0452274],[1.0453075],[1.0450946],[1.024636],[1.0050676],[0.97589207],[0.9462255],[0.046267003],[0.046294868],[0.046317346],[0.04618255],[0.045980483],[0.04564968],[0.045252338]],"model_test_loss":0.03223121911287308,"input_size":18,"current_date_and_time":"2023-08-05_19-47-05","input_mean":[[26.72697],[0.015196333],[0.008158946],[-0.0072922846],[0.016061665],[0.01694688],[0.017287692],[0.020473402],[0.024061868],[0.02608422],[0.026487894],[-0.0072585293],[-0.0072514866],[-0.0072510433],[-0.007187894],[-0.0071194707],[-0.007084319],[-0.007147751]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.0053709066],[-0.069100745],[-0.24173476],[0.018720765],[-2.658498],[0.08992927],[2.6063461]],"dense_1_W":[[-0.7797147,-0.24583623,-0.88254195,0.0173836,-0.50750786,0.37038887,-0.8329198,-0.342489,0.24630426,0.21707475,-0.047959063,0.47431317,-0.025067769,-0.41275406,-0.17909347,-0.19092616,0.17230788,0.10136766],[-0.0012605502,-0.5430936,1.951147e-5,-0.18644217,0.56073266,-1.5806167,0.08031272,0.4637494,0.53803164,0.043792747,-0.41318613,-0.3511995,0.12757961,0.05843077,0.29561853,0.32287258,0.29052848,-0.35279953],[-0.015627703,1.0913446,5.4548607,0.0019527893,0.9042406,1.312217,-0.92229325,0.8994472,0.37474668,-0.73789614,-2.0389037,0.49409056,0.22369379,-0.06340535,-0.74901664,-0.085118875,0.23661421,0.09581273],[-0.022811597,0.30691484,0.77790153,-0.02884179,0.04066356,1.4911604,-1.467617,0.43204272,0.48140588,0.09566626,-0.42150202,0.3869267,-0.04126597,-0.44423687,-0.16106682,0.30693826,0.23328182,-0.23946704],[-1.2928423,0.067281894,-0.6787146,0.3759086,0.24533954,-0.6795638,0.03710647,-0.2054399,-0.6824192,-0.3679239,0.65891474,-0.48138765,0.090168886,0.6424454,-0.5723904,-0.41047156,0.18585621,0.14156008],[0.68296534,-0.64913756,-0.82184064,0.2655869,-0.41704178,0.9174468,-1.6555954,0.287859,0.48787528,0.13453256,-0.17992531,0.38143292,-0.23726897,-0.35850066,-0.29180393,0.050075218,0.19315714,-0.028771134],[1.3216897,-0.29175788,-0.6859045,0.14724936,0.10884442,-0.5644274,0.24575797,-0.0428606,-0.6327769,-0.36707297,0.61235654,-0.16210133,-0.01487571,0.30677927,-0.28883606,-0.2559978,0.18417324,0.053345177]],"activation":"σ"},{"dense_2_W":[[-0.103882276,0.31470892,-1.8375779,-0.534572,1.2007096,-1.7940954,-0.37573653],[-0.63279027,0.9299332,-0.111214824,-0.7431275,0.8024956,-0.55281454,0.28450286],[-0.43225008,0.60088736,-0.26085025,-0.39814708,-0.08506316,0.01633656,0.33291754],[0.039310254,0.47769195,-0.5393823,-1.6670729,1.3035929,-1.0608637,0.5870348],[-0.1174263,-0.97375834,-0.027412066,0.6608341,-0.37277678,-0.4925518,0.28332362],[0.13831323,-1.0317672,4.1466556e-6,0.27205467,-0.22654021,0.6352973,-0.3061979],[0.68478835,-1.1200122,0.49105233,0.0025720224,0.11970721,-0.31467515,-1.128045],[0.11189791,0.6215034,-0.6437067,-0.7515869,0.058660362,-0.32508639,-0.108250536],[-0.5286013,-0.16399997,0.6210019,0.64366394,0.22958006,0.18419576,-0.4012846],[-0.70348305,1.2658945,0.02501988,-0.935665,0.26696518,-0.5101827,0.6538908],[-0.21789736,0.6723394,-0.08539437,-0.8460047,-0.17483915,-0.37412062,0.7993581],[-0.8686919,-0.66447544,-0.6087589,0.24117005,-0.79812706,-0.9840042,1.0074927],[0.6557862,-1.2507699,-0.37768507,1.1560878,-0.24072878,0.6311272,-0.6242684]],"activation":"σ","dense_2_b":[[-0.19177495],[-0.112480655],[-0.089774124],[-0.34718063],[-0.112820394],[0.057589203],[-0.093300395],[-0.1753979],[0.019089865],[-0.034315366],[-0.085869856],[-0.38535318],[0.14190724]]},{"dense_3_W":[[0.5097348,0.67754096,0.52962065,0.04817331,-0.6922436,-0.36220315,-0.4028201,-0.46196294,-0.2545076,0.557987,0.46720836,-0.22117886,-0.4909693],[-0.46042284,-0.23727898,-0.3391561,0.04250506,0.65917873,0.33226073,0.61423135,-0.32596922,0.18013869,-0.7446482,-0.4805382,0.3051152,0.55622435],[0.6239629,0.6955541,-0.18727995,0.826164,0.35150817,-0.6036857,-0.46225572,0.246462,-0.12272623,0.59749544,0.039747227,-0.07667652,-0.95489794]],"activation":"identity","dense_3_b":[[-0.0060902396],[0.04111355],[-0.06983808]]},{"dense_4_W":[[-0.19373165,0.73869556,-0.8776082]],"dense_4_b":[[0.047680747]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A160x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A160x00x00'.json deleted file mode 100755 index cb334ad936..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A160x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.49194],[1.0090374],[0.32741097],[0.04503255],[1.0046614],[1.0036002],[1.0027647],[0.9775086],[0.9545954],[0.92410934],[0.8945295],[0.04490622],[0.04489754],[0.044878017],[0.044477623],[0.044133097],[0.043632846],[0.043093666]],"model_test_loss":0.033570460975170135,"input_size":18,"current_date_and_time":"2023-08-05_20-15-32","input_mean":[[26.035246],[0.045233466],[0.010294131],[-0.0072865174],[0.044775],[0.04602094],[0.047530252],[0.051602263],[0.055537395],[0.058699816],[0.059884205],[-0.007372401],[-0.007366469],[-0.0073642046],[-0.0073072882],[-0.0073471284],[-0.007360663],[-0.007469154]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.09299513],[0.99559826],[2.2766173],[-3.9771109],[0.12520352],[2.4193058],[2.7656164]],"dense_1_W":[[0.008882242,-0.5422807,-0.0002336353,0.01617526,0.8583874,-2.4942827,1.4216851,0.1248724,-0.13589047,-0.066334665,0.02762919,-0.4940848,-0.12450009,0.18496531,0.49923882,0.27323833,0.054380663,-0.27277908],[-0.15047085,11.108585,8.433331,3.1956594,1.8067094,3.30043,2.734295,3.0606732,3.369255,1.1053773,0.6848547,-1.8516142,-1.1967942,-1.1085081,1.346842,2.6222417,-1.195061,-1.624805],[1.3133404,-0.12083638,0.0007961169,-0.23202601,0.6129334,-1.6041852,0.99454767,0.15254462,0.20371678,0.24268706,-0.3928021,0.049325507,-0.054227505,0.55261385,0.059264336,-0.5856581,-0.03817136,0.28743318],[-1.9012314,1.385867,-2.025853,-1.0055757,-0.64875823,-1.7402864,-0.42040223,-1.4739327,-0.64548254,-0.48058653,0.87804145,-0.050029688,0.5145021,1.2076339,-0.2322068,-0.68835676,0.28086215,0.25951275],[-0.038164284,-0.08451804,3.1345243,0.2487556,1.0404258,1.7846637,-1.8702495,1.0127681,1.2862203,-0.032533776,-1.9886582,0.072810635,0.18250643,-0.6539082,-0.2870161,0.005425706,0.010262065,0.17513292],[1.34946,0.29742,0.00049295614,-0.22644196,-0.42795974,0.8740508,-0.4660372,-0.6542262,0.14851026,-0.060079012,0.21750873,0.15181087,0.2850322,-0.53175086,0.41612315,-0.11555391,-0.049993888,0.019541081],[1.7984701,0.3795027,-1.8703946,0.18217215,-0.52728933,-1.2252984,-0.2807449,-0.83578867,-0.8151141,-0.3777622,0.8302332,-0.33189002,-0.012024458,0.4554754,-0.05377574,0.08181595,0.11449017,-0.13549945]],"activation":"σ"},{"dense_2_W":[[0.30057818,-0.5125399,0.08678791,0.5703662,-0.16577314,-0.51497936,-0.59201944],[-1.3349988,0.17055506,-0.40969828,0.1002354,-0.40812024,0.7593544,-0.021026442],[-1.3476006,-0.307753,-0.39836642,0.32035866,0.34645033,0.6541528,-0.11978619],[1.0706519,-0.11172953,0.13594998,-0.31495008,-0.17336859,-0.90303296,0.30903512],[0.11788255,-2.1570463,-1.473401,2.0036843,-0.18897057,-2.3958793,-0.489127],[-0.21737087,0.70327544,-2.0328362,-0.14981914,0.34608698,-0.9596065,-1.543088],[0.7181709,-0.18646976,0.84519434,-0.08900306,-0.12886512,-0.6509856,-0.035224058],[-1.3900654,-0.39416093,0.0057178154,-0.22539444,0.1284596,0.5915423,0.25858587],[0.40323433,-1.4929813,2.3567243,-0.35257843,-0.23848845,1.4922398,2.6448793],[-0.3958001,-0.25138742,0.13818374,0.0016877509,-0.07190418,-0.27509594,0.43224633],[-1.0602188,-0.05900237,-0.8719072,0.28974754,0.6910853,-0.03215386,-0.3785859],[0.6947681,-0.27714795,0.06559979,0.9486355,-1.0534314,-1.2011576,-0.5980476],[-0.08220092,-0.34411815,-1.0552499,-0.42018646,-0.3000449,0.052615464,-0.306543]],"activation":"σ","dense_2_b":[[-0.4391624],[0.23300678],[0.056632668],[-0.34913296],[-0.46800882],[-0.24273382],[-0.2016009],[0.15158728],[0.24031189],[-0.49144945],[0.21675928],[-0.42321655],[-0.055365965]]},{"dense_3_W":[[0.25063983,-0.8822437,-0.051102765,0.49928358,1.177921,-1.1238751,0.28403863,-0.6484505,0.8230714,-0.17540641,-0.6073617,0.35004044,0.10672483],[0.3259577,0.17100744,-0.71396255,-0.010511353,0.86950207,-0.7843216,0.55835444,-0.5223806,0.10780978,0.22867572,-0.6069358,0.73018676,-0.6146279],[-0.26045316,0.07879293,-0.5699643,-0.46051645,-0.0956609,0.3587972,0.029547071,-0.5279882,0.38736728,0.37889102,0.40453973,0.2636936,0.11244217]],"activation":"identity","dense_3_b":[[-0.107788354],[-0.055486],[-0.051283088]]},{"dense_4_W":[[-1.1602503,-0.75891525,-0.0110743595]],"dense_4_b":[[0.06482917]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A340x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A340x00x00'.json deleted file mode 100755 index 7def5a2d03..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018 b'39990-TVA-A340x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.285257],[0.90969217],[0.3262842],[0.04224495],[0.90321463],[0.9048089],[0.90605587],[0.8943948],[0.880907],[0.86333126],[0.8418114],[0.04201932],[0.042064562],[0.042102545],[0.042084828],[0.041905332],[0.041611735],[0.041251395]],"model_test_loss":0.016588984057307243,"input_size":18,"current_date_and_time":"2023-08-05_20-42-14","input_mean":[[26.176859],[0.00011118907],[-0.004803623],[-0.0135722],[0.001126639],[0.00071867846],[0.00035347088],[-0.0023926632],[-0.0049975757],[-0.004179076],[-0.0032093525],[-0.01355709],[-0.013565135],[-0.013578342],[-0.01361649],[-0.013766948],[-0.013810823],[-0.01394108]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.5828786],[-0.42487454],[-0.5860775],[-0.3924228],[-4.156905],[-0.060464315],[1.6714457]],"dense_1_W":[[-1.2391292,-0.7255202,-0.7149997,0.16955006,0.43161064,-1.5196625,1.2468553,-0.071515016,-0.041017335,0.027320042,0.08827585,-0.62211466,0.2565574,0.14729472,0.09935687,-0.08157328,-0.15545787,0.21235037],[0.54294,-0.9017544,-0.0015285303,-0.2486782,-0.37458047,1.867659,0.01736451,-0.52015305,0.17510238,0.05885162,0.15736608,0.7702755,0.0045363996,-0.46379182,-0.20661989,-0.33729848,0.1395115,0.17314467],[0.6333146,-0.64309436,-0.0016357203,-0.30024365,0.29567558,-1.1414801,0.6359127,0.46182653,-0.16813087,0.29373816,-0.25674814,0.16211522,0.2612078,-0.11247607,-0.17053197,0.25727552,0.15015963,-0.07780689],[0.08204409,-5.296336,-0.19631286,-0.30446285,-0.9166598,-1.578382,-0.9072005,-1.8740348,0.8618472,-2.1606903,-2.506682,-0.087750815,0.7405412,-0.10877983,-0.024537828,-0.5145231,-0.0984921,0.3776963],[-1.5639482,0.6270082,0.92740273,0.1320447,-0.30681872,0.91045624,-0.56207407,-0.07224428,0.57218313,-0.25058916,-0.15184608,0.48521915,-0.37326074,-0.096426256,-0.2717795,0.17715892,0.36343423,-0.44790557],[-0.019131253,0.82311773,1.8916593,0.21888073,-0.06414682,1.3677776,-1.2980947,0.51103127,-0.04186381,0.18803987,-1.2860446,0.67675817,0.24575692,-0.7166477,-0.42896202,-0.12064442,0.21754202,0.05445969],[1.5609717,0.27270493,0.9630874,0.08518879,1.0404123,-0.8161039,0.7068876,-0.20095998,-0.16304882,-0.29293203,0.28063586,-0.076921694,0.19091095,0.4278214,-0.5607254,-0.02762551,-0.001111984,-0.07030928]],"activation":"σ"},{"dense_2_W":[[0.2804132,-0.13895643,-0.23771775,0.47444814,-0.51085377,0.21878356,0.58479327],[-0.08321861,0.14579421,0.2814126,0.52304,-0.293537,-0.47646093,0.5845127],[0.26914057,-0.34944284,0.74141604,0.1236916,-0.09920406,-0.060909335,-0.06005805],[-1.4356169,-0.5180524,-0.72453684,-2.6035,1.435797,0.60814214,-2.9555132],[0.64786196,-0.09151601,0.47274497,-0.39977676,0.17197065,0.18651703,-0.16694967],[-0.80667734,0.9907132,-0.91753274,-0.005180825,0.22297877,0.24063785,0.1417271],[0.20353276,0.099244505,-0.029554786,0.5615652,-0.33194682,-0.45568216,0.16432087],[-1.2388202,0.42652553,-0.1761103,0.36473453,-0.060970604,0.45147756,-0.7594475],[0.012322099,-0.51204675,0.38572678,0.2549631,-0.4418449,-0.29435337,-0.19872236],[0.077596396,-0.70494324,0.2179608,-0.23151939,-0.16577247,0.16438329,-0.37517852],[0.20178632,-0.62199104,0.48660368,-0.2870354,-0.6407446,0.41582656,-0.29254413],[-1.0518187,1.1063659,-0.7544956,0.10702813,0.74395657,0.15702203,-0.1864767],[-0.63775724,0.34627312,-0.8619933,0.04293425,0.6597697,0.645077,-0.7322161]],"activation":"σ","dense_2_b":[[-0.001978294],[-0.009128096],[-0.017481709],[-0.4458992],[-0.015151555],[0.05412811],[-0.004844698],[-0.04905217],[0.017835202],[-0.26468143],[0.030852908],[-0.028026102],[-0.08113619]]},{"dense_3_W":[[-0.10027717,-0.504976,-0.472057,-0.09842345,-0.41717574,-0.31354278,0.41566893,0.29177436,0.5562917,0.4179752,-0.17883797,0.6059956,0.37823814],[0.060615566,0.5161335,0.050068315,0.41364664,-0.19892827,0.60002375,-0.19573946,0.4755645,-0.5418251,0.06393862,0.15766098,0.7054907,-0.1107634],[-0.44845265,-0.60228455,-0.46412948,0.21494012,0.00026316356,0.37754428,-0.21720393,0.6286488,-0.5957711,-0.18741381,-0.5058221,0.7328814,0.5197948]],"activation":"identity","dense_3_b":[[-0.029418001],[-0.060718555],[-0.032819174]]},{"dense_4_W":[[0.072936475,0.9442555,1.3265595]],"dense_4_b":[[-0.036884606]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A150x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A150x00x00'.json deleted file mode 100755 index 041149b412..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A150x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.3568473],[0.6368644],[0.3621445],[0.028429369],[0.62337],[0.62633],[0.63082033],[0.62320864],[0.6176417],[0.609843],[0.602721],[0.028280454],[0.028343052],[0.02838899],[0.028202886],[0.028042728],[0.027971348],[0.027896484]],"model_test_loss":0.02074519358575344,"input_size":18,"current_date_and_time":"2023-08-05_21-36-06","input_mean":[[26.268566],[0.014088257],[-0.00889927],[0.0067222156],[0.017173024],[0.01741099],[0.016948618],[0.01863091],[0.019397574],[0.02196835],[0.023213096],[0.00668622],[0.0066892426],[0.0066930084],[0.0068618897],[0.0069062025],[0.006895933],[0.0069377027]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.1995587],[-0.47429535],[0.19334412],[-0.21672982],[-0.27716032],[5.8877892],[-6.008035]],"dense_1_W":[[0.0005194978,-0.65315354,-0.057737853,-0.39396256,0.30802312,-0.3239047,-0.3970071,0.88091785,0.6602338,-0.077789664,-0.5863329,-0.12479964,-0.2263099,-0.25829545,0.61697304,-0.15929471,0.24446645,0.021373697],[0.5315006,-0.45457247,-1.5373756,-0.22400512,-0.48288196,-0.21536522,0.08653377,-0.15771005,0.08480614,-0.34505862,0.6252429,0.2198124,-0.3875561,0.6826408,-0.26497376,-0.31600574,0.32690576,0.039243232],[-0.011016559,-0.22290792,0.047274135,0.31294435,0.36215684,-1.1929703,0.9624354,0.27155292,-0.23349008,0.23899989,0.012858517,-0.025381617,0.097487696,0.21736427,-0.060409587,-0.03895033,-0.039632954,-0.16827586],[0.007530679,0.6272331,-5.9082806e-5,-0.50064355,0.1890715,-1.4997022,0.2494477,0.34411368,-0.11911669,-0.1729306,-0.111411996,-0.31751806,0.31902125,0.4071708,0.19330676,0.046474922,-0.055167746,0.06530873],[0.06477413,-0.4143308,-1.1347487,0.49881503,0.3372273,-1.0338107,1.5387237,-1.2813011,-0.96986556,-0.06861591,1.1139094,-0.5686622,-0.1382266,0.59405875,-0.5119853,0.44440156,-0.27856424,0.061716564],[2.6618116,-2.6944232,-1.6849242,0.2943839,-1.2206858,-1.6760917,3.2621088,-1.346089,0.12785757,0.65797406,0.23447312,-0.2641723,-0.09202524,1.2026188,-0.35406348,-0.22568066,-0.22311862,0.33460006],[-2.524092,-1.1037054,-1.5745661,0.34811226,-1.0722256,-1.469448,1.1310738,-0.79519266,0.23566909,0.520147,0.04779183,0.06821212,-0.044598527,0.48379797,-0.09668029,-0.31965488,-0.022990584,0.22089563]],"activation":"σ"},{"dense_2_W":[[0.1452953,0.44373477,-0.37055212,-1.237667,-0.33072272,0.5906958,-0.72541124],[0.6050153,0.18081863,0.3219009,0.53810394,-0.27058914,0.5653902,0.39473966],[0.0072378046,0.33330625,-0.50146735,0.26918072,0.094004184,-1.0713059,-1.8176602],[-0.7740321,0.14885269,-0.049412318,-0.6021773,-0.15935902,-0.29204068,-0.23126967],[0.75276387,0.49135745,0.13820073,0.2738786,0.5364459,-0.13695998,0.109765306],[-0.495929,-0.5069509,-0.6110922,0.14872241,-0.74613875,-0.9538579,-0.4567764],[-1.0281471,0.62180805,-0.96085227,-1.6853067,0.018576303,-0.8588159,0.68361557],[0.42588946,-0.26907757,0.23912542,-0.06811771,-0.74220026,-0.27280283,-1.2218596],[-1.1149594,0.066279486,-0.9029124,-0.71226245,-0.06838502,-0.7946668,0.5717353],[0.45661336,-0.17646663,0.58106536,0.08798294,0.60043395,-0.07761284,0.7525004],[0.30987135,0.21097131,-0.16904172,-0.14777327,-0.11339709,-0.52481216,-0.03865954],[-0.060135614,0.019844456,-0.67346084,-0.35991776,-0.121882424,-0.61238956,-0.2918601],[-0.02398618,0.007916715,-0.40608528,-1.0254555,-0.35098127,0.23078367,-0.19067071]],"activation":"σ","dense_2_b":[[0.23936874],[-0.3634644],[-0.44582018],[0.06315371],[-0.2324115],[0.027791763],[0.3565209],[0.23263572],[0.25501364],[-0.33273873],[-0.29837456],[-0.15084697],[0.25726482]]},{"dense_3_W":[[0.046232812,-0.440931,-0.15037328,0.43493935,-0.51912284,0.045042932,0.88925415,0.14369765,0.78630996,-0.7177186,-0.17527293,0.22752169,0.6153992],[-0.54912806,0.433324,-0.35273063,-0.044021495,0.6402973,-0.35384876,-0.6985052,-0.6068913,-0.81778973,0.5319122,-0.07269251,0.13063483,-0.69683],[0.5169438,-0.35359862,-0.10132895,0.11897226,-0.085469395,-0.16861942,-0.08650058,0.37113622,0.70226514,-0.23939428,-0.13833824,0.02503397,0.38701722]],"activation":"identity","dense_3_b":[[0.04381452],[-0.016084831],[-0.0028816245]]},{"dense_4_W":[[0.72029024,-1.1095761,0.230978]],"dense_4_b":[[0.024953682]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A160x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A160x00x00'.json deleted file mode 100755 index 0583af9d50..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A160x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.052148],[0.99393505],[0.34106338],[0.043077335],[0.9844239],[0.98582995],[0.9884839],[0.9738173],[0.9590651],[0.93786967],[0.91432065],[0.042897582],[0.042924967],[0.0429479],[0.042887576],[0.042719226],[0.042463634],[0.042128034]],"model_test_loss":0.02400932088494301,"input_size":18,"current_date_and_time":"2023-08-05_22-02-42","input_mean":[[26.74306],[0.04475667],[0.0005680814],[0.005798226],[0.042986136],[0.042365443],[0.042118706],[0.042853605],[0.043510012],[0.047170512],[0.0480464],[0.005632593],[0.00564793],[0.0056592273],[0.0056284214],[0.0056102416],[0.00559482],[0.0054539493]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.14669883],[2.0542202],[3.5631552],[-2.4476655],[-1.6368238],[-0.08192704],[-0.12643908]],"dense_1_W":[[-0.002688858,0.903495,-0.0039008197,0.536614,-1.0010473,2.6391416,-1.4351965,-0.39022684,0.040289626,0.0038532107,0.1117465,-0.15723981,0.1849457,-0.3804201,-0.23395342,-0.027777348,-0.09085117,0.051439773],[1.4187059,-0.71839726,-1.4857477,-0.35429287,-0.29257032,-2.1014547,0.87460905,-0.5020713,-0.10428327,-0.08505193,1.1532818,0.29176822,0.12277781,0.4743827,0.03149446,0.2719759,-0.03777604,0.085584775],[1.8566557,-0.24062611,-0.0011948039,-0.101594344,0.04939513,0.19952813,-0.5482559,0.44138482,0.08667071,0.23756696,-0.270445,0.122838944,0.38297632,-0.2767516,-0.02534552,-0.11921599,-0.26003793,0.28193194],[-0.0047300863,-6.341346,0.008009274,4.7131796,-6.4125834,-6.832203,-4.170335,-4.4403443,-2.5265903,-2.792916,-0.96007043,-1.32485,-1.5275828,-2.0901973,0.05010127,0.5274726,-2.8127787,2.2884195],[-1.0541825,-1.1389667,-1.393989,0.049987935,-0.75335485,-1.2349916,0.44251662,0.024381286,0.071242295,0.017732512,0.83954465,0.23342346,0.104376666,0.39074865,-0.07692479,0.06292374,-0.20384182,0.2776107],[0.004347823,-2.0705073,-5.136332,1.5171243,-0.83530605,-0.83658594,0.6289342,-0.030435214,-0.09875959,1.0472045,0.6507859,-0.7110026,-0.61495453,-0.09955488,0.4563318,-0.39846316,-0.25004956,0.01138379],[0.028734487,-2.2628179,0.006837875,-0.67525387,-0.19999692,2.3506331,-0.6480495,0.32595164,0.22536819,0.17169411,-0.05625255,0.47865602,0.5283645,-0.26655892,-0.1795276,-0.25767052,0.1652347,0.17300352]],"activation":"σ"},{"dense_2_W":[[-1.7424338,-0.51204246,0.36681414,-0.43318233,0.26413685,-0.24067368,-0.4046541],[1.6531072,-0.47434783,0.02790722,-0.27149042,0.1917067,0.12952308,0.33537757],[1.2889733,-1.1361824,-0.624928,0.42658234,-0.23174223,0.11642459,0.93661875],[0.030492313,-1.5744985,0.3470011,-0.67208254,-0.35061973,-0.7376617,-0.118316226],[0.8261336,-0.8387976,-1.5988837,-0.8216873,-1.0717056,-0.3048729,0.8943968],[-2.0692046,0.5661956,-0.6376975,0.22744314,0.0028517665,0.22136337,-0.797771],[-0.2306479,-1.9774442,-3.616496,-4.481281,1.9556458,-0.058455996,1.4602649],[-1.3596288,-0.67229724,-2.6969142,0.41598597,1.6690115,1.0873245,-1.388754],[1.200881,-1.2607982,-2.0214107,-0.56441516,-0.6533298,-1.6340346,1.1757377],[-1.5519762,0.5947591,1.1866498,0.121581264,0.16602829,0.52355,-0.65718275],[1.1053609,0.028224928,0.8389564,-0.036384143,-0.54692584,-0.015354119,0.9502837],[-1.2469714,-0.28302318,-0.9857567,-0.46757036,0.2623652,0.31925344,-0.7774453],[1.5188146,0.4473179,1.9020143,-0.43271357,-0.99845284,-0.8403063,1.144983]],"activation":"σ","dense_2_b":[[0.071747996],[-0.24544376],[-0.40959486],[-0.14752373],[-0.56056744],[-0.035408586],[-0.76051474],[-0.42436004],[-0.28535128],[0.28020537],[-0.13632238],[-0.005974313],[0.43866658]]},{"dense_3_W":[[-0.6859634,-0.23211952,0.55380285,-0.090849504,-0.20580705,-0.28912854,-0.020036949,0.46019077,0.004479716,0.4496421,-0.14756668,0.32039902,-0.050126474],[-0.7476754,-0.19232515,0.4732885,-0.7891429,0.37273914,0.03617925,1.9029447,-1.6632549,0.3088266,-0.24991319,-0.35748976,0.24193496,0.3710967],[0.40051168,-0.4676041,-0.25612128,0.11686202,-0.45049718,0.7905412,-1.0448263,1.1216654,-0.95308435,0.618275,-0.58974785,0.43219963,-0.43541226]],"activation":"identity","dense_3_b":[[-0.07793948],[-0.0012238226],[0.19977793]]},{"dense_4_W":[[-0.0024938032,0.3952009,-1.017814]],"dense_4_b":[[-0.16230789]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A340x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A340x00x00'.json deleted file mode 100755 index 9b40cd1e3d..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018 b'39990-TVA-A340x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.621885],[1.0284406],[0.37194255],[0.046268534],[1.0293045],[1.0279852],[1.0266788],[0.99801177],[0.9776714],[0.9462372],[0.91703874],[0.04612887],[0.046153124],[0.046166956],[0.045992836],[0.04568058],[0.045171134],[0.04459945]],"model_test_loss":0.03329197317361832,"input_size":18,"current_date_and_time":"2023-08-05_22-29-17","input_mean":[[23.719963],[0.018466847],[0.009788129],[-0.01490712],[0.015184435],[0.015390393],[0.016122056],[0.019774657],[0.02080643],[0.020894347],[0.021406556],[-0.014832959],[-0.014840206],[-0.014854504],[-0.01494558],[-0.014958628],[-0.015116547],[-0.015349785]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[4.073725],[0.06636997],[0.45188215],[4.3373733],[0.61344504],[-0.05576782],[-0.029394656]],"dense_1_W":[[1.899682,-1.0220546,1.6209704,1.1128091,0.11807787,2.1193304,-0.84074396,0.9205597,0.6422064,-0.16473949,-0.2929423,0.015562142,-0.5113624,-0.5597578,-0.2079032,0.14909668,0.0016590576,-0.078255],[0.00257754,0.7842404,0.008843346,0.151356,-0.10317699,1.593811,-0.6585409,-0.792097,-0.18440624,0.21284863,0.18914178,0.038071778,0.59510386,-0.53487957,-0.26356593,-0.1510972,-0.23310432,0.2344722],[1.4983231,-0.18011008,-0.33435732,0.29978395,-0.644463,0.8832816,-0.6403558,-0.09016495,0.5140635,0.03930244,-0.2350084,0.14089371,0.071680106,-0.43234694,-0.25356972,-0.052213926,0.2982631,-0.12704615],[2.136221,0.94127697,-2.0502431,-1.0999187,-0.5389837,-1.0795466,0.15500735,-1.1946503,-0.7447494,-0.08565692,0.62933886,-0.3306759,0.72309256,0.5842993,0.4425341,-0.24024099,0.040228825,0.0051129814],[1.6822681,0.30469584,0.36311707,0.054079443,0.47980347,-0.75729567,0.9435193,-0.6902986,0.12720026,-0.32843223,0.32795638,-0.44525057,-0.07920844,0.27367336,0.5342503,-0.061932556,-0.1713259,-0.036089286],[-0.011671145,0.5296286,3.192862,-0.2014884,0.2564892,1.1807487,-1.3911327,1.1489043,0.83134156,-0.14983152,-1.5866762,0.5376133,0.41090357,-0.8031455,0.02215685,-0.24331515,0.30741853,0.0040395837],[0.015617138,-0.15004326,-0.1066052,0.05774972,0.84747916,-1.7410339,0.65046513,0.34189066,-0.1092925,0.13014615,-0.12986074,0.012468467,-0.46450385,0.55993074,-0.24884948,0.071061395,0.025357306,-0.017320933]],"activation":"σ"},{"dense_2_W":[[-0.30674583,0.06968486,-0.65429723,0.019582884,0.42960247,0.08177306,-0.7079286],[-0.4900685,-0.04209327,-0.5845738,-0.5474764,-0.44426113,-1.0495229,-0.31141305],[0.25227436,0.8856029,0.30998233,-0.6853428,0.13426903,-0.08633423,-0.7613986],[-0.61833984,-1.1719488,0.24792127,-0.19045483,0.45563322,0.42715865,0.69238126],[-0.27654642,0.30347988,0.21834162,0.23924747,0.15591425,-0.3061046,-0.93160504],[-0.2864238,1.0342413,0.3272169,-0.90983087,0.24268456,0.5175742,-0.8516676],[-0.05429682,0.61511075,0.27329326,-0.5729799,0.007327092,0.29609978,-0.8520901],[-1.074,-0.47218233,-0.90919787,0.18335287,-0.48629844,-0.7468036,-0.007822784],[0.58963263,-0.08803438,0.15459517,0.20894565,0.22934368,-0.25880885,0.24365251],[-3.1923928,-0.9013152,-1.5476278,0.92910975,2.0374515,-1.3871164,3.1174033],[-0.25149995,-1.1271017,0.45119533,-0.55721474,0.37220192,0.25739494,0.6835184],[0.24823236,-0.08169282,-0.8473349,1.7971821,1.7446034,-0.27146766,0.53165376],[0.13963719,0.48935938,0.39636797,0.09254681,-0.31144914,-0.44353837,-0.8852852]],"activation":"σ","dense_2_b":[[-0.11470798],[-0.23226368],[0.05471394],[-0.38724783],[-0.14420551],[-0.0023474924],[-0.08733412],[-0.23541285],[0.04872051],[0.6622674],[-0.29157898],[-0.08680658],[-0.08127291]]},{"dense_3_W":[[-0.5358264,-0.03906741,-0.3538137,0.05883006,-0.13302572,0.20354034,-0.41887388,0.3213541,0.6214788,1.0040325,-0.053876217,-0.32266176,-0.5326619],[-0.45899904,0.40331557,0.5624095,0.29449025,0.32427883,0.6714431,-0.09542968,0.43741795,-0.6450682,-0.22411184,-0.58734274,-0.05180798,0.32618254],[0.47514984,-0.60623705,-0.043168258,-0.61707187,0.05064353,0.51197284,0.24825503,-0.36806884,0.365072,-0.021128317,0.21732265,-0.58820313,0.2991621]],"activation":"identity","dense_3_b":[[0.06643589],[-0.06561],[-0.06563976]]},{"dense_4_W":[[-0.97301435,1.0852075,0.9260317]],"dense_4_b":[[-0.06335182]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018.json b/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018.json deleted file mode 100755 index 9076cc416e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ACCORD HYBRID 2018.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.381411],[1.0896009],[0.36953825],[0.047667623],[1.0861374],[1.0860499],[1.0858915],[1.059937],[1.0386494],[1.0071863],[0.9757613],[0.04749054],[0.047521003],[0.0475409],[0.047391217],[0.047076195],[0.04665814],[0.046108272]],"model_test_loss":0.034288953989744186,"input_size":18,"current_date_and_time":"2023-08-05_21-11-37","input_mean":[[25.474146],[0.03260382],[0.0059239552],[-0.003850426],[0.03166146],[0.031421233],[0.031903807],[0.03409185],[0.035556797],[0.036786668],[0.03876473],[-0.0039243186],[-0.0039191637],[-0.00391803],[-0.0038912839],[-0.0038927502],[-0.0039427923],[-0.0040721553]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[4.576026],[0.014205613],[0.023928426],[2.2423766],[5.1118927],[0.009245147],[-0.09884353]],"dense_1_W":[[2.4283671,-2.5114954,1.7636794,-1.1276282,-0.29702592,2.3460658,0.2110311,1.8921894,1.6966429,0.5912078,-1.7593364,0.1788557,0.30617765,-0.06459494,0.68998104,-0.04987163,0.25082457,-0.20820954],[-0.06577886,-1.3371822,-3.9895184,0.49147522,-0.6437115,-1.0457126,1.5372813,-1.0199159,-0.90439004,1.17174,1.0530282,-0.68119884,0.18246703,0.1336504,0.1513831,-0.24112555,-0.038728017,-0.0071232794],[0.0033733498,0.7199784,0.0044814195,-0.20844589,0.021990225,1.5578223,-0.86644346,-0.26690495,-0.3389482,0.19740379,0.1897156,0.42373288,0.11811549,-0.42115727,-0.18958901,-0.43254307,0.3219206,-0.043830786],[1.1540352,0.3651104,-1.2646542,0.12534688,-1.3592131,0.22650717,-1.2461386,0.33907446,0.30825207,0.041745562,-0.04699643,0.31513706,-0.53145754,-0.13887237,0.339121,0.03572653,-0.09926298,-0.031500425],[2.4470172,1.1391506,-1.6994115,0.6633088,-0.24181224,-1.3209784,-0.38846213,-1.2859731,-0.6845487,-0.27900544,1.0526913,-0.490945,-0.31496993,0.42710644,0.018268349,-0.34324366,0.14006558,-0.0737592],[0.048280872,-0.036711592,0.12419936,0.09806018,0.073621884,2.3262064,-0.7835345,-0.45401052,0.17831485,-0.057094287,-0.038377315,0.23754936,-0.03390427,-0.3424702,-0.39207128,0.3649582,-0.36824515,0.22671352],[-0.044838708,0.36282212,-0.12990756,0.5413003,-2.0524702,1.6110876,-0.7925812,-0.55331826,-0.12824701,0.14961694,0.17928742,0.3061131,-0.040306978,-0.5500592,0.22041802,-0.30549437,-0.029204259,0.083384514]],"activation":"σ"},{"dense_2_W":[[-0.27619088,-0.30106953,0.8406808,-0.3034487,-0.8182391,0.12433698,0.20802778],[-0.4154569,0.19215287,-0.5395798,-1.0011816,-0.3622965,-0.053402603,-0.61655515],[-0.9554062,0.9567613,-0.43412912,-0.8109775,0.11694456,-0.73263913,-0.9729235],[0.21786267,-0.43021828,0.32044673,0.17683136,-0.7033162,1.1777877,0.46853],[-1.4941593,0.53598636,-0.34361255,-0.8429453,-0.17071423,0.41571486,-0.76921165],[-0.94654614,0.7506226,0.57346565,-0.65036005,0.049414758,1.046369,0.621918],[-0.54215634,0.72266793,0.45845777,0.16018274,0.18923126,0.6181075,0.9243036],[1.2958286,-0.67843175,1.2844336,-0.98265636,-1.9873784,1.3621792,1.0309747],[-2.4644299,1.0382956,0.7543066,-2.2521183,0.15328787,0.34243378,-0.6569763],[-0.71319073,0.64474607,0.020551767,-0.35136765,0.58472896,-1.4593328,-0.6378294],[0.3122531,0.11463693,-0.34882697,0.10761847,0.24621284,-0.8933121,-0.8421242],[0.26174104,0.20181425,0.6962465,0.12650499,-0.685376,0.65012974,-0.25467616],[0.6355601,-0.26024923,-0.6393189,0.25180802,0.62417173,-1.4139053,-0.9215187]],"activation":"σ","dense_2_b":[[-0.053085864],[-0.03349851],[0.33215925],[-0.13303766],[-0.07017026],[-0.11995311],[-0.18605317],[0.10708742],[0.5208379],[0.11261442],[0.09599934],[-0.22087996],[0.25543278]]},{"dense_3_W":[[-0.5387559,0.5180723,0.18928285,-0.017278178,-0.1654849,0.2684458,0.0049315374,-0.70783985,0.79352444,0.13864544,0.43856966,-0.26839373,0.76968014],[-0.34399128,0.6650704,0.4771153,-0.555316,0.5630293,-0.60538894,-0.22792831,-0.3027566,0.20719895,0.5640226,0.6806705,-0.09628916,0.2438542],[0.004954449,-0.27236447,0.5799102,-0.50637424,0.124922864,-0.16860567,0.1477868,-0.27912074,-0.11646297,0.59069705,-0.5256959,0.2693647,-0.42514357]],"activation":"identity","dense_3_b":[[0.03715595],[0.044411514],[0.045904953]]},{"dense_4_W":[[-0.7679762,-1.1008085,0.064006686]],"dense_4_b":[[-0.03675505]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA,C120x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA,C120x00x00'.json deleted file mode 100755 index fcc323b691..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA,C120x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.5199685],[1.0041546],[0.38786623],[0.036677998],[0.9962397],[0.9980732],[0.9996651],[0.99639624],[0.9926015],[0.98370975],[0.97062755],[0.03642298],[0.036467228],[0.0365202],[0.03664619],[0.03662207],[0.03652128],[0.036423597]],"model_test_loss":0.01514572836458683,"input_size":18,"current_date_and_time":"2023-08-05_23-47-27","input_mean":[[24.48734],[0.0031791632],[-0.0077214316],[-0.012247895],[0.006253456],[0.0050531863],[0.0044050324],[0.0013900376],[0.0022928454],[0.0046939156],[0.0059022754],[-0.012277604],[-0.012273932],[-0.012272934],[-0.012301066],[-0.012308702],[-0.012408637],[-0.012596107]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.603401],[-0.16526419],[-1.8255664],[-1.6662012],[0.93965286],[0.79468465],[-0.15217474]],"dense_1_W":[[0.8369962,-0.030552765,0.5335952,0.43184772,0.23580156,1.2673365,-1.1400558,0.318804,-0.187539,-0.14375025,0.12492712,0.13123405,0.26685792,-0.9589225,-0.06946809,0.3054905,0.048283525,-0.14636886],[0.0075710495,0.34496903,3.662821,-0.1975815,-1.0349215,1.1001909,-0.22282363,0.5475843,0.55354905,-0.0045275143,-1.056081,0.844821,0.39349076,-0.296638,-0.6005872,-0.4671467,-0.6291099,0.90066314],[-0.9008946,-0.24484369,0.57615465,-0.15220997,0.2609631,1.0398844,-0.4644058,0.016499873,-0.018956503,-0.17380044,0.14669017,0.10224152,0.07262521,-0.36812365,0.23994175,0.08805341,0.32293737,-0.29662415],[-0.7426475,0.32210937,0.50062597,0.035566118,-0.29872537,1.0625906,-0.50212467,-0.24334303,-0.21319605,0.0060904995,0.06582723,0.41223416,0.33519742,-0.7705234,-0.060677625,-0.087017514,0.059937757,0.08177721],[1.350326,-0.9069702,-0.8710248,-0.032668646,-0.22678213,0.8018885,-1.0114281,0.4558404,-0.04972723,0.14267842,0.011223235,0.11178159,-0.08149843,-0.11696354,0.25129175,-0.022107668,-0.3123493,0.18239275],[1.4265958,0.7363564,0.9003141,0.5874882,0.36590812,-0.58121115,0.8468888,-0.6961116,0.19182444,-0.04914105,-0.041381188,-0.053005338,-0.37206975,0.0049440977,-0.06299007,-0.22749563,0.3903245,-0.22555515],[-0.0026155524,-1.6855055,-0.023907602,-0.020194484,0.9718681,-0.72989947,-0.072883844,0.6755627,-0.40358946,-0.36142477,0.24014348,-0.06568305,-0.18836774,0.24938382,0.26712775,0.26481214,-0.32187027,0.17701942]],"activation":"σ"},{"dense_2_W":[[0.055921525,0.79568124,0.622393,0.6891148,-0.41505626,-1.0494971,-1.1746889],[0.9990047,0.79401237,0.458197,0.044893876,0.7398994,0.1380711,-0.5833474],[0.49300948,0.40176773,0.69490945,0.017886199,-0.43334186,-0.42760152,-0.81184334],[-0.88839275,-0.39359003,-0.3923254,0.34303936,-0.4980547,0.3823284,0.31585476],[-1.0028759,-0.80133754,-0.038923886,-0.24988107,-0.6692906,-0.59269744,0.10528791],[0.95424086,0.5241753,0.69329005,-0.043293044,0.12808672,-0.54708153,-1.6431684],[-0.42091933,0.30759153,-0.8659509,-0.50176823,-0.4401355,-0.1235168,0.37031946],[0.9405245,-0.26903427,0.54586095,0.6150369,0.38332707,-0.45095354,-1.0229797],[-0.16152474,0.29404435,-0.4458113,-0.37584528,-0.45882532,0.44415447,0.28708586],[0.1605365,-0.54369676,-0.6820084,0.26447654,0.044480074,-0.1798705,0.29587266],[-0.88492364,0.28911477,-0.75960296,-0.038635474,-0.20156361,0.48187855,0.37745267],[-0.15852904,0.26374456,-0.1987117,0.15489428,-0.13169791,-0.14686994,0.23826097],[-0.27699766,-0.46768573,0.0784821,-0.71520346,-0.43777713,0.3317684,0.44976833]],"activation":"σ","dense_2_b":[[-0.4873253],[-0.31497946],[-0.33876145],[0.057083856],[0.15119348],[-0.19719751],[0.06655213],[-0.18075633],[0.0077841002],[0.047988962],[-0.013275895],[0.01678699],[0.054340936]]},{"dense_3_W":[[0.039507,-0.65482193,0.24057858,0.49380097,0.095387414,-0.71386194,0.54591215,-0.5667636,-0.471354,0.27266452,0.42956528,0.5700684,-0.14070532],[0.70610636,-0.21885805,-0.20008874,-0.03001694,-0.6918378,-0.18722558,-0.28595456,-0.13420972,-0.3792731,0.26539686,-0.73036075,0.41510108,0.3419122],[-0.47617888,-0.49639332,-0.47731593,0.37749213,0.8312911,-0.6428844,0.16035818,-0.5646238,0.49566412,0.44224903,-0.18195282,0.13512439,0.69913447]],"activation":"identity","dense_3_b":[[0.06694408],[-0.04941525],[0.065208524]]},{"dense_4_W":[[-0.57436824,0.5449645,-1.0910698]],"dense_4_b":[[-0.06264942]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C020x00x00'.json deleted file mode 100755 index 19d4e59be2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.576799],[0.91867346],[0.36527267],[0.042645145],[0.91787136],[0.91783434],[0.916926],[0.8943326],[0.87538767],[0.8462922],[0.8175801],[0.042509034],[0.0425443],[0.04257122],[0.04245028],[0.042234104],[0.041799206],[0.041292917]],"model_test_loss":0.02719402126967907,"input_size":18,"current_date_and_time":"2023-08-06_00-12-47","input_mean":[[25.356604],[-0.040762104],[0.015186845],[-0.010929545],[-0.03763134],[-0.036849402],[-0.03564124],[-0.030817972],[-0.029279217],[-0.026289875],[-0.024418497],[-0.010802534],[-0.010760807],[-0.010724829],[-0.010715251],[-0.010753985],[-0.010909137],[-0.011096374]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.7099435],[-4.4820223],[-3.7053332],[-0.15313303],[1.0490966],[0.08996243],[-0.3402487]],"dense_1_W":[[0.45726943,0.2803945,0.4495259,0.49884623,0.39872238,-0.36475766,0.26503468,-0.10885596,0.12820537,-0.06644224,-0.022389729,-0.3476893,-0.23661518,0.20323817,-0.1134223,-0.30204472,0.100813694,-0.06834288],[-2.3185985,1.2631202,-1.458182,0.048201833,0.24334751,-1.6046109,-0.30837595,-0.76168555,-1.0279249,-0.4423357,0.7814656,0.023939118,-0.3526689,0.34330973,-0.30489683,0.11396334,0.4730625,-0.1433239],[-1.9229746,-0.23190774,1.2471163,-0.34702885,0.12792219,0.39012522,0.5828723,0.19460873,0.9788912,-0.005666579,-0.41922984,0.19924892,-0.028308399,0.009771974,0.30980968,-0.25503463,-0.05167787,-0.03963391],[-0.00017526199,1.2134194,0.08365528,0.931635,-0.8134952,1.2126458,-0.3847136,-0.85404164,-0.029047096,0.057293534,0.099689804,-0.14430292,0.07266458,-0.035892077,-0.8494992,-0.16429287,-0.16963851,0.28444648],[0.66932124,-0.38224223,-0.48026696,-0.4556043,-0.16880098,0.11090016,-0.20848279,-0.0031408698,0.01483041,-0.057521474,0.0781242,0.3797575,0.15699562,-0.16381691,0.083613425,0.029958013,0.25532284,-0.049085815],[0.09758302,-1.5125183,0.51068544,-0.8873621,-0.039125204,1.2438344,-0.35688224,1.0463076,0.44335338,0.043060914,-0.3624858,0.18927102,-0.06789407,-0.11586316,0.5108622,0.23109579,-0.022569554,-0.22217596],[-0.022621945,-0.38620147,-5.9938316,0.57457525,-0.034727138,-0.31493336,-0.0024856962,-1.0160756,-0.4097327,0.31027526,1.5442436,-0.1086705,-0.06946156,-0.20705701,-0.29661253,0.24825081,-0.28626466,0.086528964]],"activation":"σ"},{"dense_2_W":[[0.053173117,-0.9156596,1.0074764,0.07819087,0.06604967,0.9604824,-0.46700448],[0.67615795,-0.6646975,0.40410203,1.1270711,0.51432085,0.36799482,-0.58051807],[-0.3406286,0.633063,-0.10993261,-1.4732538,-0.96888214,-0.10222697,0.36921522],[-0.22857061,0.048582908,0.106903225,0.39300185,-0.15854754,-0.00396511,0.5772822],[0.61022013,0.28100282,0.32486463,-1.4011261,-0.6755233,-0.6537198,-0.099644266],[-0.58349746,0.18500583,0.1230866,1.2761316,-0.29147163,0.23169333,0.03729417],[-0.9677123,0.12448332,1.4926296,0.14635411,-1.0473512,-0.392972,-1.2231176],[0.3896849,0.07481266,0.14770286,-0.88864774,-0.39602855,-0.64242584,-0.51282495],[-0.46045932,-0.6738887,0.017901536,0.6665944,-0.36764455,0.83067524,0.18793342],[0.057541758,0.5166745,0.49835142,-1.8220221,-1.4198332,0.05825049,0.30070993],[-0.021827364,1.1368597,-0.37343314,-1.2435678,-1.3651601,-0.8234563,0.6481897],[0.59054244,-1.6380736,-0.5568102,-0.24568368,0.028800676,-1.0597489,-0.9525837],[1.2516085,-0.38927004,-1.0174257,-0.60735077,0.85879636,-0.1796094,1.3270812]],"activation":"σ","dense_2_b":[[-0.12381021],[0.014428079],[-0.07002476],[-0.23227106],[0.076019384],[-0.18954094],[-0.39796123],[-0.023646781],[-0.20775545],[-0.18200971],[0.09294506],[0.04337285],[0.461896]]},{"dense_3_W":[[-0.26331434,0.46046373,-0.52959347,0.2898921,-0.5544527,0.12640098,0.053101886,-0.055325672,0.27165207,0.23696445,-0.9369918,-0.51779336,0.47617438],[-0.343167,-0.48102528,0.5826724,0.04648191,0.778018,-0.79673433,-0.6825545,0.36792636,-0.3386519,0.6587451,0.59682995,0.4857488,0.6149705],[0.7029585,-0.25926727,-0.274154,0.64148325,-0.07228898,0.21374674,0.65440977,-0.63847566,-0.2272515,0.42236963,0.25460508,-0.70692426,-0.6473448]],"activation":"identity","dense_3_b":[[0.016272327],[-0.07080089],[0.05776005]]},{"dense_4_W":[[0.27981392,-1.6592484,0.18638746]],"dense_4_b":[[0.06507368]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C120x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C120x00x00'.json deleted file mode 100755 index 8d0a5fe248..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TBA-C120x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.5490465],[0.91654193],[0.30993494],[0.04199027],[0.9220449],[0.91940266],[0.91617274],[0.88627845],[0.86233324],[0.8315542],[0.8018313],[0.041735847],[0.041725885],[0.041704368],[0.041467432],[0.04125315],[0.04087492],[0.040402256]],"model_test_loss":0.03576897457242012,"input_size":18,"current_date_and_time":"2023-08-06_00-38-31","input_mean":[[25.217424],[0.025067292],[-0.005204237],[-0.007812521],[0.026058447],[0.02579975],[0.025364147],[0.022783877],[0.022563396],[0.023355754],[0.023063915],[-0.007938141],[-0.007910316],[-0.00788824],[-0.007943815],[-0.00795849],[-0.008054328],[-0.008234501]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.56764346],[-0.2503772],[-3.2322495],[-1.2317773],[0.867053],[4.308423],[-0.07558963]],"dense_1_W":[[0.61443913,1.1731157,0.009846442,-1.1333587,-1.0492755,0.835613,-0.68129694,0.3589496,0.5659384,0.08182793,-0.46320507,1.2664362,0.3659727,0.043432895,-0.78966564,-0.2789253,-0.13537817,0.58561194],[-0.05032384,2.7911828,-3.7081556,-0.22916593,-0.360789,-0.8509512,0.3955322,-2.2810001,-1.5297779,-0.37920654,1.2837292,-1.0756621,0.05912324,0.79691005,0.09919885,0.5648314,0.12931578,-0.2828693],[-1.3801426,0.8747989,2.6738997,0.97103757,0.64060503,1.3203064,0.78513944,0.21045975,0.27105168,0.008706952,0.47002545,0.17457546,-0.019201785,0.022376636,-0.8146881,-0.56253856,-0.40608642,0.1788786],[-0.969806,0.27810913,-0.019731548,0.20302768,-0.9765407,1.7610842,-0.3367136,-1.2561709,-1.1086024,-0.23725067,0.82246333,0.4905772,-0.39064184,-0.62869024,0.1729788,0.09018552,0.26754,-0.16145436],[0.77530533,-0.44069135,-0.016620232,0.91353315,0.7982677,0.18398845,-0.06542974,-0.99103695,-1.0689898,-0.41018635,1.0071982,-1.0062531,-0.37093124,-0.11219994,0.9221856,0.06667381,0.102350205,-0.44873643],[1.837604,0.17821689,2.7829952,0.15930298,-0.18984689,1.3086654,1.0448655,1.2770351,0.9262832,0.571854,-0.44966817,0.9585924,0.4791195,-0.7341206,-1.1710364,-0.137599,-0.054511473,0.0011886378],[-0.13465121,0.42229307,0.01184741,1.9792279,-1.3213581,2.0345612,-0.38451922,-0.08214897,-0.052292295,-0.003056054,0.016048811,0.14917925,-0.21642695,-1.6820744,-0.51334184,0.4513876,-0.0945018,-0.17454582]],"activation":"σ"},{"dense_2_W":[[0.462196,-0.695528,0.16549478,0.2736693,-0.56030834,0.19088152,0.89675313],[-1.4432595,0.9668788,-0.052712087,0.48390535,-1.6715928,-1.1171504,-0.93195546],[-0.7672027,0.73007417,-0.41485545,-0.41052285,0.17164469,0.41768378,-0.6074929],[0.42105144,-0.07561751,-0.071338296,0.5440764,-0.23689774,0.29708165,0.5137933],[-0.9067054,0.2790484,-0.27540752,-0.10838713,0.2654337,0.43244293,-0.84643334],[1.1417533,-1.143838,-0.8191056,-0.42449018,1.7451103,1.1444204,1.5084718],[-0.3675419,0.17639667,-0.024025898,-0.2504475,-1.080494,-0.48680314,-0.49096605],[-0.3961711,-1.3744208,0.4152261,-1.47457,1.1814389,1.061417,-0.9474496],[-1.0131743,-3.5613608,2.3236957,2.097592,-2.561644,-1.4451259,1.6597106],[-0.49788824,-0.18982293,0.17864513,-0.37159964,-1.355421,-0.842698,-0.01138827],[0.5584375,-0.6589816,-0.14198032,0.27809986,-0.29245555,0.2221168,0.70997316],[-0.18313819,-0.16005597,0.18829824,-0.80455697,-0.7474139,-0.46905053,-0.532434],[-0.8919243,-0.26659176,0.03377461,-0.0041140113,-0.96533835,-0.18453701,-0.29215154]],"activation":"σ","dense_2_b":[[-0.72258896],[-0.015371009],[0.37933466],[-0.29024404],[0.16602242],[-0.036112666],[0.019811722],[0.13048169],[-1.32474],[-0.21386966],[-0.14519048],[-0.037656378],[-0.10292112]]},{"dense_3_W":[[0.085076064,0.3378735,0.17556626,0.20053186,-0.4336372,0.27722207,0.04970122,-0.20942238,0.20168552,-0.27926138,-0.1960737,0.020075899,-0.6230306],[-0.27460775,1.1687195,0.616611,-0.21896681,0.06441218,-0.4682532,0.5580457,0.36150676,-0.68175566,0.2615018,-0.27429396,0.32094082,0.47348568],[0.07691053,-0.9330427,-0.46400392,0.28614432,-0.67953914,0.32567665,0.023056043,-0.5036641,0.92684317,-0.21211706,0.6364576,-0.33836454,0.13877176]],"activation":"identity","dense_3_b":[[-0.035371166],[-0.039440315],[0.032718766]]},{"dense_4_W":[[0.043920163,-1.2300794,0.6862739]],"dense_4_b":[[0.038186513]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A020x00x00'.json deleted file mode 100755 index 8488bf11f6..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.428436],[0.8747422],[0.348336],[0.032838576],[0.8674841],[0.8698202],[0.872086],[0.8741188],[0.8746484],[0.8732703],[0.87034994],[0.03268689],[0.032726675],[0.032762397],[0.032804232],[0.032797463],[0.032751366],[0.032637663]],"model_test_loss":0.012720033526420593,"input_size":18,"current_date_and_time":"2023-08-06_01-03-18","input_mean":[[23.87719],[-0.09830344],[0.00987912],[-0.024293454],[-0.10104403],[-0.101183325],[-0.100655936],[-0.09613443],[-0.09292035],[-0.09032173],[-0.08915678],[-0.024517087],[-0.024474092],[-0.024432585],[-0.024249792],[-0.0241554],[-0.0241027],[-0.02419038]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.24818847],[-0.3569515],[-3.8611186],[0.052523665],[-0.061705776],[3.9736814],[-0.51413184]],"dense_1_W":[[-0.023707427,-1.1511034,-3.6214488,-0.88728464,0.7192584,-1.1216406,0.45078358,0.019147111,-0.16734436,0.21107747,1.2753613,-0.18621182,0.0021676207,0.64575016,0.555723,0.22198512,-0.105586044,-0.15878774],[-1.5766635,0.11333443,0.51480776,-0.36963126,0.10475719,-0.49697906,0.68160355,0.2969201,0.19487274,-0.030125976,-0.25609782,-0.630222,0.006213502,0.21161628,0.58924896,0.6157995,0.23309676,-0.61899596],[-1.8898737,0.33577567,-0.97434026,-0.037966143,-0.48877138,-1.5976278,1.1424898,0.56372863,-0.60689634,0.071804985,-0.0496236,-0.34190592,-0.014153756,0.52909875,-0.24744025,0.29303122,-0.23210055,0.05141031],[-0.024221305,0.44990522,-0.028304478,-0.0656701,0.17381778,-1.9562191,0.8350715,0.35282776,0.17968453,-0.019806169,-0.24479271,-0.81009316,-0.3293401,0.4533207,1.2084676,0.015344962,-0.15701972,-0.30990687],[0.011324843,-0.59531343,0.5854086,0.089412585,-0.9452245,1.9720498,0.19747502,0.20461471,1.2405642,0.14468583,-1.165413,0.27390787,-0.3910681,-0.16858988,0.39210764,-0.16402015,-0.12277656,0.07982532],[1.9530678,-0.08342983,-0.9890411,-0.32505137,-0.856526,-0.8791079,0.93317574,0.6200249,-0.06489498,-0.14845468,-0.1365828,-0.39299142,0.10178991,0.26328257,0.49346048,0.0047012162,0.015337047,-0.15793596],[0.0994865,0.37539056,-0.098761536,-0.13319957,0.8647312,-2.085531,0.26294917,0.35073626,0.08432079,0.027274208,-0.13727656,-0.21488512,0.3379102,0.3641513,-0.21915336,-0.2852004,-0.12663482,0.27321863]],"activation":"σ"},{"dense_2_W":[[-0.16425237,0.3091328,0.29525888,0.11240746,-0.74184674,0.43020418,0.70645195],[0.49677476,-0.43110228,0.21888019,0.20753606,-0.7800873,0.7741635,0.03567749],[-0.6097133,0.45192087,-0.781976,-0.23472853,0.57883346,0.05555812,0.20443378],[-0.46759868,0.36920962,-0.31299806,-0.34370378,-0.09269494,-0.4917414,-0.37711906],[0.23382114,0.43119097,0.12654792,-0.4602898,0.13595147,-0.6564136,0.19074993],[0.0017450978,0.44209385,0.52378607,0.5839574,-0.0767268,-0.28383034,0.26752976],[-0.4171056,0.3210464,0.27096882,-0.5315671,-0.12448658,-0.13850246,-0.24946442],[-0.15794876,0.45271224,-0.35790992,-0.13619353,0.45923787,-0.6412923,-0.6191985],[0.016369851,0.27200398,0.6724704,0.7589611,-0.1148256,-0.3482276,0.040378712],[-0.50706065,0.34294152,0.054178692,-0.34360346,-0.14778374,-0.58891815,-0.4531453],[0.3940274,-0.6713925,0.051861253,-0.898765,0.31961933,-0.59337765,0.05139436],[-0.11673336,-0.5929527,-0.15008944,-0.2537059,-0.0013014909,0.31044847,-0.12393371],[-0.19167545,-0.28842226,-0.11017555,-0.3114551,-0.035935447,0.29415083,-0.56570745]],"activation":"σ","dense_2_b":[[-0.13478862],[-0.23486298],[0.13705392],[0.15494871],[-0.020777982],[-0.13753998],[0.016483061],[0.121896364],[-0.123885065],[0.09847333],[0.03438525],[-0.03845259],[0.011853518]]},{"dense_3_W":[[-0.54575056,-0.47849953,0.5990695,0.42073256,0.5419929,0.043547045,0.54512763,0.3283325,-0.2048869,-0.31806502,0.5119246,0.4535623,-0.05827584],[-0.3388336,-0.28757206,-0.29846734,0.38009873,-0.24882287,-0.4701529,0.0076963897,0.17254484,-0.60017455,0.7332266,0.44687817,-0.0715153,0.6319616],[-0.032579347,0.5607797,-0.5665692,-0.39868695,-0.007274041,0.3449716,-0.072209254,-0.49229744,0.6039037,0.024303837,-0.4079465,0.11291028,0.18834813]],"activation":"identity","dense_3_b":[[0.03005079],[0.041132923],[-0.03719341]]},{"dense_4_W":[[0.74240994,1.0283083,-0.91570294]],"dense_4_b":[[0.038777113]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A120x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A120x00x00'.json deleted file mode 100755 index 06eea5a5c7..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG,A120x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.237355],[0.87519014],[0.44057557],[0.03548801],[0.87787986],[0.8774264],[0.8760763],[0.8587142],[0.8437336],[0.82851934],[0.8162014],[0.035328448],[0.035375077],[0.035424557],[0.03544107],[0.035294056],[0.03506294],[0.034851927]],"model_test_loss":0.022225305438041687,"input_size":18,"current_date_and_time":"2023-08-06_01-29-22","input_mean":[[22.534292],[0.058919504],[-0.0069944696],[-0.006594112],[0.057512816],[0.057811707],[0.057591096],[0.056336958],[0.057281986],[0.051038712],[0.04328098],[-0.006509515],[-0.006505374],[-0.0065190606],[-0.006622567],[-0.006714965],[-0.0068818894],[-0.0070974007]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.5739499],[3.878269],[0.45385617],[-0.20725146],[-0.079795115],[-4.091677],[0.36011276]],"dense_1_W":[[-0.22821122,-2.8194423,1.6595688,-0.4830238,2.3802936,1.9161788,-0.6213912,0.7039542,-0.6125425,-0.4726092,-0.23838855,0.67865574,-0.09634735,-0.7351034,0.53436965,0.28926876,-0.1594619,-0.037523255],[2.5516446,-1.2378905,0.00072916696,0.6147921,1.4464301,-0.31585398,-0.30207664,1.2950996,-0.16590804,-0.7658588,0.15745218,0.18785125,-0.21452165,-0.55619836,0.059614744,-0.24405465,0.18975312,-0.036489666],[0.00046311753,5.2895155,-0.0064032064,2.3568318,-3.7788632,-0.6730425,0.94534135,1.7328202,1.210308,1.5939676,2.7725132,-0.5959545,-0.2708361,-0.4567112,-0.26398024,-0.2822813,-0.13274622,0.08366669],[0.00060495536,-1.8627077,0.0016775115,0.011831294,2.4184442,-2.741676,0.9209026,0.2837613,-0.23187289,-0.9453196,0.7903965,-0.18015528,-0.081913516,0.082411945,0.48140436,0.35204688,0.08898967,-0.32223535],[-0.04008556,-1.1614711,-5.304956,-0.06615373,0.4991292,-0.93462783,1.6848874,-0.72819597,-1.0155044,0.67655045,0.24754661,0.25713775,0.25633144,0.46113673,-0.5089996,-1.4017544,0.52801764,0.53018683],[-2.6250875,-0.8428706,-0.0068993093,0.6359419,1.5150832,-0.8593881,-0.123320185,1.1137877,0.16923575,-1.062661,0.20523195,0.13212685,-0.509759,-0.021390263,-0.16270931,-0.41007507,0.4482517,-0.11212839],[0.121950485,-3.06296,1.6239958,-0.33307838,2.5052757,3.2169566,-1.3293189,-0.22467609,-0.37574983,-0.5922604,0.09215065,0.62051153,0.5787191,-0.8557021,-0.56089085,0.5316071,-0.062818,0.082696125]],"activation":"σ"},{"dense_2_W":[[-0.35287166,0.5735374,-0.33316278,1.2891138,-0.3599736,0.12537672,-0.66336924],[-1.423288,0.8357749,-1.3781912,-1.1710855,0.51321846,-1.5293682,-0.21053772],[-0.32105762,0.28671432,-0.5801889,0.35754833,-0.7569594,0.03212915,-0.5317869],[0.091680296,-0.7365891,-0.07562274,-0.25502372,-0.3725359,-0.041279055,0.18312061],[1.1346624,1.4142879,1.076152,0.8530887,-0.36640313,-1.5642645,0.8622971],[0.25187486,-0.8454855,0.24975924,-0.6653769,0.17570826,-0.1467031,0.52752095],[-0.52542835,1.0067426,-0.3432608,0.6156269,0.4721524,0.13591726,-0.41583073],[-1.4627284,-0.97950006,-1.8288456,0.23860978,1.5214525,2.4171803,-1.1142124],[0.762936,0.5988445,0.6786874,-0.67899644,-0.82305706,-1.1394529,0.61851394],[0.28733522,-0.8497635,-0.41946363,-0.0458478,-0.43066698,-0.29245007,-0.5107658],[-0.44353834,0.6743515,-0.37099394,0.461348,0.5619282,-0.27031732,0.15943629],[-0.30596974,-1.1035383,-0.51829547,0.14438403,0.09970497,-0.40294972,0.31800285],[1.0255032,-2.2046218,0.77438307,-0.21968207,-1.4422927,0.9943756,0.4114353]],"activation":"σ","dense_2_b":[[-0.18944573],[0.12252371],[-0.30214006],[-0.10644982],[0.2681959],[-0.09597638],[-0.06898104],[-0.60539126],[0.21081245],[-0.2496423],[-0.07610517],[-0.13910647],[-0.78967816]]},{"dense_3_W":[[0.22095068,-0.51939535,-0.36592597,-0.48365295,-0.41380858,-0.56315166,0.6327542,0.22628462,-0.16801901,-0.24263306,0.40058422,0.13298513,0.28335148],[0.113773875,0.5613844,0.37089002,0.57024395,0.4068071,-0.06056436,-0.65681094,-0.31930733,0.39740247,0.6750699,0.4575854,0.20065524,0.2139887],[0.7378495,-0.4070432,0.5941009,0.4365137,-0.33317804,0.1605702,0.64352435,0.26713678,-0.26348892,0.22799617,0.41001305,-0.50239944,-0.97245806]],"activation":"identity","dense_3_b":[[-0.03496299],[-0.0028519286],[-0.052557867]]},{"dense_4_W":[[-1.090145,0.25029793,-0.99950933]],"dense_4_b":[[0.038892392]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A020x00x00'.json deleted file mode 100755 index 38c0af829e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.9397926],[0.58847904],[0.2768134],[0.03328077],[0.5956492],[0.59220606],[0.5897729],[0.5776224],[0.56892926],[0.56445587],[0.56639653],[0.033096638],[0.033156663],[0.033203375],[0.03332432],[0.033254243],[0.033312503],[0.033484638]],"model_test_loss":0.028057441115379333,"input_size":18,"current_date_and_time":"2023-08-06_01-53-50","input_mean":[[21.049675],[0.18402193],[-0.003428923],[-0.007548354],[0.18359452],[0.1835885],[0.18393785],[0.18181257],[0.17725796],[0.17158064],[0.164546],[-0.0077345166],[-0.007683261],[-0.007645073],[-0.0075830934],[-0.0077846153],[-0.008191],[-0.008583602]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.8156507],[-2.4066193],[0.028636524],[-0.31134236],[-0.28471118],[0.08179851],[1.679371]],"dense_1_W":[[1.844903,0.027804963,0.5669119,-0.778688,0.8034288,-0.78931105,1.2116214,0.19344883,-0.6704197,0.016172517,0.20178398,-0.3408561,-0.25060442,0.1655656,0.71878904,0.5432098,0.24100736,-0.5256183],[-2.200448,0.405909,0.6434607,0.26235482,-0.18575469,1.2817595,-0.7119806,0.38927037,0.39060992,-0.49538943,0.016932135,-0.14391725,-0.0885561,-0.6673529,0.36674196,0.29924622,-0.29776922,0.022200285],[0.0029789726,0.6943829,-0.00041380787,-1.1453172,-0.50027996,0.85155296,-0.13035522,-0.7368721,0.06147018,0.18088032,0.012485195,0.4306581,0.5157353,0.28600702,-0.6693201,-0.008134162,0.35026318,0.11398255],[0.1142896,0.00468294,-2.5078979,1.377898,-0.73678875,-1.4563999,0.8267823,0.16948342,-0.14088418,-0.5553062,-0.21878052,-1.5041614,-1.117198,-0.30893826,0.59749913,0.702367,0.1315873,-0.670245],[0.0009085219,1.0001184,4.3506665,-2.042315,-0.15742837,1.0259328,-0.17750828,0.54632634,-0.46832186,-0.42449352,-1.556151,0.57148683,0.68085456,0.1495435,-0.39299193,0.8861771,0.7166561,-0.54555255],[0.100348786,0.014175879,-0.012427769,-0.5041687,-0.5826174,0.5256853,-0.52756214,0.07132036,0.34683812,0.07438995,-0.26059008,-0.13695654,-0.67984086,0.38298985,0.9229481,0.80970156,-0.29075277,-0.43736833],[2.0044293,-0.20208758,0.54538536,1.1377499,0.3106265,1.0160546,-0.32974172,-0.089798145,0.2855685,-0.03635302,-0.041824948,-0.18219398,-0.25772902,-1.0644519,0.43982273,-0.08722686,-0.2421627,0.051588144]],"activation":"σ"},{"dense_2_W":[[0.30571613,-0.18013296,0.5926545,0.14476953,0.16642626,-0.11212167,0.3821252],[0.94783115,2.5033114,-3.1206958,-0.15871608,-1.994079,-1.3640877,-1.5263621],[0.47148222,0.104184546,-0.37317687,-0.8472351,0.08160871,-0.6943246,-0.40566835],[-0.64335907,0.78053916,-0.20363255,-0.016910687,0.40413967,-0.23705012,-0.060175724],[-0.31357315,0.1102892,0.34789997,0.24466582,0.2282046,0.27680242,0.41566148],[-0.2819869,-0.49597213,-0.29658175,0.20754631,-0.1396202,-0.3569357,-0.3499282],[0.016052477,0.72212625,0.5342962,-0.58273345,-0.40965185,0.0081045525,0.16813238],[1.3594749,-1.0821377,-0.9876373,0.14710972,-0.7891241,0.990827,0.35404012],[0.10145038,0.27034414,0.099734664,-0.21233094,0.46582258,0.14897184,0.31720132],[-0.6530252,-0.9807932,0.80537784,-0.11495904,-0.7238929,-0.2512353,-0.7177895],[0.4390709,-0.23511182,-0.49958336,-0.14200853,0.25195497,0.6376854,-0.29144466],[0.24465889,-0.7938168,0.060746156,0.095193386,0.07138605,0.036473136,-0.7767482],[-0.36048752,0.43844214,-1.3429878,-0.18445532,0.037344575,0.018166453,-1.3115227]],"activation":"σ","dense_2_b":[[-0.08002864],[-0.27753568],[-0.33821508],[-0.06898969],[-0.07934998],[-0.022124004],[-0.014806774],[0.5396857],[0.04967859],[-0.20298636],[-0.017854981],[-0.3076046],[-0.053490125]]},{"dense_3_W":[[-0.4066065,0.97251016,0.033346247,-0.10809236,0.085812196,0.42724374,-0.22504164,0.30916232,-0.58347124,0.72406,0.47510427,0.4123366,0.73240745],[0.2478319,0.008268835,0.5303551,0.5601437,0.47338668,-0.5492546,0.47054175,0.45232275,-0.37064263,0.22936313,-0.08599906,-0.2583833,0.33278263],[0.12888186,-0.061529376,0.41770902,-0.6266616,-0.5737836,0.13413434,-0.46319184,0.70543456,0.042693373,-0.25845766,0.24550076,-0.44863605,0.488171]],"activation":"identity","dense_3_b":[[-0.039126486],[0.006651634],[-0.018630983]]},{"dense_4_W":[[-1.4650652,0.3291624,-0.77633846]],"dense_4_b":[[0.022054376]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A120x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A120x00x00'.json deleted file mode 100755 index 7e478a115c..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-A120x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.382928],[0.831745],[0.30223858],[0.03895733],[0.84030503],[0.837596],[0.8347243],[0.81036496],[0.7911638],[0.7661664],[0.741643],[0.0389547],[0.038950026],[0.03893477],[0.03872475],[0.038503967],[0.038221505],[0.03784756]],"model_test_loss":0.04651949554681778,"input_size":18,"current_date_and_time":"2023-08-06_02-19-12","input_mean":[[25.801882],[0.013322295],[0.00012067948],[-0.014118517],[0.012097556],[0.012325566],[0.012585732],[0.012787061],[0.012398119],[0.011666994],[0.01200301],[-0.014120493],[-0.014129876],[-0.014137334],[-0.01423779],[-0.014323668],[-0.014383154],[-0.014402781]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.68441534],[-0.13293418],[-2.3703692],[1.0513278],[-0.049006693],[0.4361167],[-1.6526378]],"dense_1_W":[[-0.3009049,-1.3486567,-4.1750894,0.1664098,1.4217969,0.1054205,0.59044117,-1.1253078,-0.6447645,-0.2502474,0.96328413,-0.28410953,-0.31804475,-0.1947907,0.38729358,0.4187392,0.4089219,-0.61806595],[0.010645178,-1.0883038,-2.5133154,-0.25236014,0.5784265,-0.51083916,0.4832404,-0.4849606,-1.0525901,-0.13375925,1.4631903,-0.4047331,0.0050009037,0.6095067,-0.09834975,0.2519382,-0.038879942,-0.069640845],[-0.8899254,-1.0230187,-1.439176,1.1679554,1.0210379,-1.1627477,0.8465841,-0.39189994,-0.7394402,-0.02806761,0.5266214,-0.40435284,-0.35882106,0.068795145,-0.2524109,-0.17227925,-0.18992348,0.12400747],[1.1131828,-0.5260197,-1.7403282,-0.33493716,-0.5395197,0.6774204,-0.8929776,0.60346586,-0.0066875615,0.0138423955,-0.11350326,0.6344896,0.1835288,-0.34619817,-0.4588385,-0.015822446,0.22261441,0.07688962],[8.6207525e-5,-0.70675,-0.0007860533,0.20384522,0.1318535,-1.014616,-0.009205295,0.9519155,0.46291843,0.028296059,-0.4624722,-0.6242399,0.016376816,0.6099459,-0.1398835,0.015813632,0.13008049,-0.14142884],[1.0258418,0.436164,1.851793,0.42419407,0.42999953,-0.19701813,0.41379267,-0.11730983,-0.3859213,-0.2814823,0.33615586,-0.5434531,-0.08128047,0.37816283,0.19217548,-0.36968186,0.09063848,-0.046774127],[-0.7571031,0.4970347,1.3990597,0.11719525,-0.56139064,0.7697264,-0.3542842,0.37262577,0.3073247,0.16176817,-0.36358887,0.43785885,-0.3470084,-0.07056978,-0.31751567,0.34110883,-0.28786156,0.15170412]],"activation":"σ"},{"dense_2_W":[[-0.30184454,0.3802063,0.4967091,-0.35028198,0.51986647,0.4000042,-0.21709704],[0.09750685,0.06357492,-0.7158158,0.2812576,-0.2995527,-0.7086002,-0.5355136],[0.08785149,0.3272583,0.47600603,-0.8402297,0.52597255,-0.45987862,-0.76386476],[0.08306526,-0.16242865,-0.6435881,0.53329647,-0.6757787,-0.37396497,0.7116671],[-0.22419164,-0.022920314,-0.04075283,0.8179769,-1.016423,0.34336585,0.5386958],[-0.15732218,0.33430022,0.11486374,-0.78740937,0.99910235,0.39482287,-0.5267216],[-0.77424455,-0.14682956,-0.55741477,-0.38432997,-0.28245547,-0.4974875,0.24210082],[-0.96440476,-0.7743205,0.13630813,-0.74980104,-0.007871434,-0.38619104,-0.035752743],[0.0011592604,0.10274233,-0.8914161,0.9206268,-0.62343633,-0.23734997,0.6717641],[-1.9650924,-0.90385705,0.55099785,-0.39466116,0.12528175,-1.7182279,0.89252603],[0.012258381,0.19495833,-0.08824382,-0.22507101,-0.15942216,-0.2785897,-0.22172463],[-0.1748081,0.17200747,0.4328849,-0.24547942,0.43270597,0.3054646,0.18000092],[-0.2559985,0.36312464,0.11709605,0.09233141,0.9310238,-0.029632417,-0.25157112]],"activation":"σ","dense_2_b":[[-0.1474299],[-0.3277726],[-0.21582118],[0.036078904],[-0.05503096],[-0.005676639],[-0.055123266],[-0.17541403],[0.0015975577],[-0.104181305],[-0.20293538],[-0.10939717],[-0.07661626]]},{"dense_3_W":[[-0.21298198,0.110187896,-0.60958046,0.45805818,0.54682696,-0.7046855,0.6269348,0.21081105,0.42615926,0.8367855,-0.1845897,0.06679362,-0.09966726],[0.15750672,0.1327235,-0.2181211,-0.36494306,-0.52508456,0.68815714,-0.5968023,0.026029408,-0.29523292,-0.05900207,0.06698885,0.25658783,0.51479304],[0.09501332,0.0035566674,-0.19596317,0.68399763,0.2697313,-0.61212915,0.09689588,0.17770325,-0.19476512,0.5935955,0.3390856,-0.20666745,-0.5220273]],"activation":"identity","dense_3_b":[[-0.030582575],[0.022597056],[-0.022908542]]},{"dense_4_W":[[1.1999085,-0.6172392,0.81952834]],"dense_4_b":[[-0.02394666]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-J510x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-J510x00x00'.json deleted file mode 100755 index d33eb1eac2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGG-J510x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9383917],[0.8355506],[0.3390312],[0.03119497],[0.82312363],[0.82553184],[0.828844],[0.81786305],[0.8089189],[0.7983574],[0.78663474],[0.031027893],[0.031051435],[0.031081835],[0.031122375],[0.031173797],[0.031170428],[0.031091694]],"model_test_loss":0.012541690841317177,"input_size":18,"current_date_and_time":"2023-08-06_02-44-08","input_mean":[[29.07186],[-0.06912211],[0.013657895],[-0.002133514],[-0.072693],[-0.072877966],[-0.072644964],[-0.06586901],[-0.06460334],[-0.0633031],[-0.06268608],[-0.0021806108],[-0.0022094164],[-0.0022406473],[-0.0022201212],[-0.0022082466],[-0.0021234895],[-0.0020255505]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.026404249],[0.13105589],[0.16516872],[-0.06090279],[-0.14405267],[-2.502384],[2.218792]],"dense_1_W":[[-0.0021143458,0.4845371,-1.1704693,0.95396703,-0.45841944,-0.29033682,0.53932166,-0.37416738,-0.41057795,-0.23133592,0.54513544,0.26240727,-0.17659351,0.054697156,-1.1045226,-0.40194085,0.27317593,0.23824252],[-1.7758781,0.48786885,-0.00477917,-0.22493805,-0.515321,1.3253579,-0.6839125,-0.6387143,-0.17747526,-0.1419738,0.30965427,0.1709874,0.23986466,0.087099396,-0.62111133,-0.1853607,0.43471354,-0.028164243],[-1.7272408,0.3076149,0.00765919,-0.3540082,0.38353494,-1.060162,-0.1053273,0.6142481,0.07908985,0.1091809,-0.28727072,0.12411787,-0.030564038,-0.13592651,0.42188758,0.2681106,-0.008810187,-0.16449693],[-0.044815022,-0.29972354,-0.71397084,0.24435022,-0.6555711,0.1949695,-0.53771883,0.91733986,0.5420983,-0.06943186,-0.35568416,-0.44354844,0.33030087,-0.29652244,-0.008032364,0.36644423,0.20427188,-0.3417492],[-0.003277743,0.84705424,0.019459587,0.33182937,-0.32682094,1.042309,-0.6059422,-0.4592401,-0.14659667,-0.02649014,0.19585942,-0.29718736,0.60278606,0.13007255,-0.9305752,-0.15275106,-0.0688484,0.28789634],[-0.8902708,0.15024209,1.0265517,-0.25550342,-0.17248401,1.1255769,-0.5883171,0.15187076,0.15472615,-0.036912397,-0.12170663,0.2438034,-0.19690259,-0.06634575,0.02245947,0.3350466,0.1365908,-0.21177408],[0.8790335,0.08951593,1.0052422,-0.36786625,0.26908866,0.5844786,-0.5167404,0.17875771,0.15087639,0.004691414,-0.13105698,-0.304317,-0.16428755,0.42695817,0.6963123,-0.10174697,-0.08647683,-0.09663916]],"activation":"σ"},{"dense_2_W":[[-0.5507626,0.7375308,-0.49619263,0.64276683,0.31423688,-0.047046438,0.14320022],[0.06431445,-0.91829306,0.61997795,-0.87665886,-1.1699272,-0.266563,0.2754743],[-0.23304823,-0.80016303,-0.62006134,-0.050004035,-0.19096582,-0.0061811367,-0.35022056],[-0.6022076,0.24352926,0.3797693,-0.4641736,0.58151716,0.086308055,-0.024125725],[0.42020667,-0.43386108,0.78020096,-0.07576871,-0.96067387,-0.7232814,-0.35634282],[-0.5178249,-0.06836039,-0.37178206,-0.50464267,-0.0235822,0.026802443,0.30778465],[0.6183374,-0.23700354,0.6740862,-0.8557632,-0.63150823,-0.45882928,-0.59726715],[-0.015967928,0.26693594,0.08684808,-0.3305254,-0.21529642,-0.9623077,-0.7667298],[-0.40488502,0.08908774,0.11001882,-0.48002744,-0.38036668,-0.5579617,-0.8118769],[-0.6996953,-0.08383944,0.14571202,-0.2791817,0.19681555,0.61584616,0.5265486],[0.33932468,0.4615041,-0.46465427,0.030247016,0.33767444,0.4764484,0.49228984],[0.739168,-0.5647498,0.87683797,-0.41238332,-0.6725376,-0.31792146,-0.80818856],[-0.29039443,-0.15418902,0.16983575,0.404602,0.8631,-0.08719541,0.4968237]],"activation":"σ","dense_2_b":[[-0.03965108],[0.28927684],[-0.18241821],[-0.108551204],[0.6023028],[-0.031586934],[0.09187851],[-0.025837803],[-0.2092672],[-0.095620565],[-0.14529799],[0.21532695],[-0.038257282]]},{"dense_3_W":[[0.69658524,0.13405359,-0.5135836,0.039699517,0.4089305,0.015523863,-0.37848678,-0.5778005,-0.39460537,-0.08848027,-0.47406712,-0.5140029,0.4353925],[0.36546764,-0.85153615,-0.26655787,0.3066136,-0.7395783,-0.21865855,-0.5632104,0.11118248,0.04402694,-0.31351718,0.64110416,-0.21988907,0.48327655],[-0.48011708,-0.64806235,0.50163656,0.42039683,-0.5115424,0.22310808,-0.30667087,-0.23503205,0.08582519,0.6786953,0.5058911,0.013384847,-0.13791536]],"activation":"identity","dense_3_b":[[0.017121604],[0.016458558],[0.014057028]]},{"dense_4_W":[[0.9904114,0.8519098,1.0665607]],"dense_4_b":[[0.015847046]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGL-E130x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGL-E130x00x00'.json deleted file mode 100755 index 782a71a292..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019 b'39990-TGL-E130x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.29796],[0.6869096],[0.3043955],[0.053746838],[0.69718754],[0.6945284],[0.6902723],[0.6647322],[0.648803],[0.6250414],[0.6004392],[0.05371038],[0.053712133],[0.053708736],[0.053587437],[0.053468417],[0.053344723],[0.05339542]],"model_test_loss":0.059682220220565796,"input_size":18,"current_date_and_time":"2023-08-06_03-09-39","input_mean":[[20.848803],[0.09077284],[0.0004920535],[-0.013807639],[0.08834558],[0.0896692],[0.090346344],[0.09061075],[0.08792884],[0.085393175],[0.07933361],[-0.013748395],[-0.013738229],[-0.013735628],[-0.01376535],[-0.013799873],[-0.0139192855],[-0.013997918]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.12927625],[0.039042104],[0.06305568],[0.5509221],[-1.2879711],[6.2787247],[-6.190384]],"dense_1_W":[[0.0027083303,-0.10112696,0.00021239324,-0.25530028,0.19750968,-1.0146434,0.19078395,0.17337662,-0.13830121,-0.34922576,0.18369395,-0.41599622,0.31424782,0.36015517,-0.025049085,-0.16560718,0.32461762,-0.14546283],[0.0011184415,0.34731707,0.000591945,0.020096293,-0.40281445,0.9857871,-0.54341626,-0.2996433,-0.0023747282,-0.11858881,0.16937213,0.40306735,-0.17791511,0.015529411,-0.32821342,-0.2275615,0.12587199,-0.13679199],[-0.01001298,-0.43627232,3.8718,-0.020895703,1.6419108,1.1942697,-1.3671072,0.8677243,0.6161768,0.25344366,-2.1509552,0.3635223,0.14490978,-0.93930185,0.51710093,0.37570456,-0.20570871,-0.06064528],[8.5005406e-5,1.5534368,0.0050369557,0.76705796,0.096726,-1.0784471,0.21296425,0.047997892,-0.504228,0.21246566,0.077220924,-0.5910409,-0.39798212,0.40880397,0.21635057,0.2121605,-0.57481694,-1.6995429],[0.0016134434,0.048475664,0.25585577,0.23253338,-0.4305987,0.23644239,-1.0944809,-0.41095805,-0.1506762,-0.39978436,-0.4151889,0.9040056,0.29542196,0.5904203,0.2782569,0.23929867,0.42858773,1.7019073],[4.025802,2.5585697,-2.4830704,-1.6901246,-0.3633653,-0.89175445,-0.29274487,-1.4318734,-2.3919513,-0.24146257,1.3682926,0.39687443,0.4862581,0.75898904,0.14836557,-0.61106664,-0.041406788,0.43938866],[-3.6613293,3.431119,-2.267677,1.7728403,-0.28788745,-1.4352858,-0.6164974,-1.5066901,-1.9746417,-0.3478911,1.202695,-0.8438115,0.29883432,0.07818771,-0.89911157,-0.89166856,-0.061227016,0.44411016]],"activation":"σ"},{"dense_2_W":[[0.24542594,-2.2395196,-0.14947067,0.041994963,-0.2406378,0.5588424,-0.41520935],[-0.8674741,1.2369518,0.48354208,-0.019096198,0.03493316,0.061816297,-0.6701676],[-0.34608337,0.24626403,-0.51114035,-0.7236035,-1.0586612,-0.8953887,1.0207646],[-0.6603612,1.3253964,0.6621064,-0.3136026,0.07262768,-0.73918,-0.087288626],[0.77753216,-1.2590296,-0.6827706,0.5964797,-0.081819944,0.025609335,0.23794611],[-0.027843717,1.0459992,0.16385391,-0.42424512,-0.60500985,-0.20268683,0.20546572],[-0.43445817,1.1618135,-0.25778547,0.38488075,0.3197356,-0.3485739,-0.6816144],[-0.7163731,0.474339,-0.11365654,0.0881506,0.23063587,0.097380914,0.07446911],[-0.9666889,0.9888771,-0.19698231,0.023333492,0.20297973,-0.0487526,-0.10499752],[-0.02302885,-2.0536203,-0.17813562,0.27943268,-0.45622507,0.46923488,1.5073433],[0.11166716,0.5468084,-0.059901386,0.17259055,-0.3219094,-0.50135636,0.19411519],[-0.51580197,0.98296887,0.12504756,-0.04137333,-0.5060232,0.20122856,0.0911331],[-0.39491713,1.1337756,0.17506048,-0.4171312,-0.10811109,-0.689537,-0.4207489]],"activation":"σ","dense_2_b":[[0.15749712],[-0.32822123],[-0.16269855],[-0.23587422],[0.1348652],[-0.16819751],[-0.13819136],[-0.1933703],[-0.16497153],[0.26468632],[-0.1549707],[-0.18713947],[-0.11378069]]},{"dense_3_W":[[0.36997053,-0.2313704,-0.4401421,0.026918795,0.8393843,-0.58421713,-0.44875944,-0.10873468,0.16037284,0.7108794,-0.46192494,0.07450364,-0.07943991],[-0.69230264,0.2847919,-0.2528415,0.40409324,-0.8334492,-0.019472836,0.005906335,0.3058701,0.62732667,-0.43410972,0.1603031,0.39690167,0.3522643],[-0.1730077,0.37127316,0.6238479,0.14937235,-0.54297125,0.56943595,0.46046963,-0.21287519,-0.046794858,-0.6515185,-0.625884,0.6049786,0.33925623]],"activation":"identity","dense_3_b":[[0.09230293],[-0.10100416],[-0.14628187]]},{"dense_4_W":[[-0.96249396,1.0031632,0.1955458]],"dense_4_b":[[-0.09062254]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA,A030x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA,A030x00x00'.json deleted file mode 100755 index d3a1bb6bc2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA,A030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.828868],[1.3588611],[0.41877922],[0.042109862],[1.341616],[1.3486344],[1.3538228],[1.3478316],[1.328037],[1.2895682],[1.2430215],[0.04203343],[0.042057183],[0.042080052],[0.04202502],[0.0419028],[0.041697],[0.04135808]],"model_test_loss":0.01706458441913128,"input_size":18,"current_date_and_time":"2023-08-06_04-07-16","input_mean":[[23.807858],[0.03894964],[-0.009764001],[-0.011655796],[0.041675754],[0.04040426],[0.038979076],[0.034793235],[0.032237094],[0.03182612],[0.0351043],[-0.011650053],[-0.011667487],[-0.011685415],[-0.011778335],[-0.011861333],[-0.012015583],[-0.012147856]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.5615673],[0.7718801],[-3.7769625],[0.4954386],[-1.2168337],[0.3834438],[-1.4409952]],"dense_1_W":[[1.6587557,-0.03201305,-0.4806989,0.36387846,-0.48278156,-0.3905921,-0.0388727,-0.14381675,-0.24559438,-0.24794875,0.020391222,-0.36554426,-0.045786988,0.37558827,-0.5150567,0.011279025,0.37533346,-0.15497313],[1.856302,0.3850902,0.3822126,0.35716665,-0.5155237,0.07582075,0.8278192,0.35297492,-0.5057421,-0.09577705,0.27150053,0.065463945,0.034616094,0.029208321,-0.22792868,0.005505799,-0.15835825,0.12173401],[-1.966878,0.09221255,-0.5907079,0.43561482,-0.8552626,-0.6498669,0.31348014,-0.25722724,-0.3638425,-0.01811314,-0.1542113,-0.05421908,0.22119746,-0.052404914,-0.6179151,-0.010884692,-0.09178448,0.26305836],[-0.14198878,-0.7116039,-0.08581363,-0.13187033,0.4916839,-0.7834652,0.32754624,0.055074025,0.17711979,-0.013773762,-0.08651409,-0.12673153,-0.14753248,0.2293844,0.40847418,-0.14559479,-0.11703128,0.04356386],[-1.872429,-0.15238704,0.40203246,-0.02868895,0.14101167,-0.40041912,1.2534008,-0.09318469,-0.03764272,-0.087983645,0.26885307,-0.67364323,0.31495255,0.37216207,0.24445911,0.17665292,0.012208228,-0.2388997],[0.11508778,0.6316238,3.0819817,-0.16016749,-0.2190627,-0.06308648,-0.9233147,0.6661318,1.2984458,0.091404624,-1.5613545,0.18205322,-0.15544152,0.17819074,-0.051608723,0.10189869,0.014511001,-0.011415061],[0.18752714,-0.78931046,-0.10892214,0.19746861,0.58102345,-0.6981444,0.18360513,0.14009249,-0.062272664,-0.18457152,0.10788008,-0.5033553,-0.35309345,0.4638519,0.12721097,0.21150345,0.28216785,-0.38438264]],"activation":"σ"},{"dense_2_W":[[-0.41296047,0.009994055,-0.56219316,-0.5554611,-0.26297602,0.18101925,-0.16817299],[-0.37041304,-0.7107613,-0.7427994,0.114892006,-0.34880233,-0.22947483,-0.6385373],[-0.49729323,-0.07977957,0.66374093,-0.017636025,0.4205715,-0.9580843,0.43858218],[0.38907713,-0.76856196,-0.4815348,-0.21716839,-0.3260819,-0.5470339,-0.92810947],[-0.31227747,0.2155603,-0.36565685,-0.55944705,0.021143533,-0.49740636,-1.0799714],[-1.6338145,-0.4843085,0.12082096,-0.9157364,-0.15951772,1.3216581,0.5687549],[0.058031183,0.1682733,0.74648166,0.3186676,-0.21778281,-0.7438653,0.29449734],[-0.24235114,-0.33672345,-0.046596766,0.9317643,0.45289803,0.5095793,1.5327915],[1.3766825,0.38467634,-0.38601008,0.906059,-0.043449163,-1.0596842,0.4888961],[-0.19836484,0.14401913,0.7339981,-0.35825434,-0.07396672,-0.8178357,0.06628493],[-0.7688364,-0.24399456,0.09368414,-0.77106285,-0.61470944,0.2647412,-0.3470581],[-0.37717023,0.5652293,-0.7643337,-0.8346215,-0.42952943,-0.7881854,-0.66797024],[-0.17988431,0.41044593,1.0204062,0.23822533,-0.5833684,-0.18772323,0.49101728]],"activation":"σ","dense_2_b":[[0.08490299],[0.019760115],[-0.34167358],[-0.048392903],[0.03218207],[-0.070515014],[-0.24773756],[-0.22226538],[0.0024391487],[-0.28946945],[0.11847323],[0.16301791],[-0.264623]]},{"dense_3_W":[[-0.6551264,0.20192637,0.17543362,-0.37154144,-0.4004771,-0.19728865,0.23193756,0.45298353,0.5133015,0.15628278,-0.747469,-0.79281825,-0.11067879],[-0.1810723,-0.41811052,0.42333624,-0.39242148,-0.33600914,-0.8151715,-0.07931125,0.42133102,0.40676335,-0.2168068,-0.7562931,-0.3301234,0.52793944],[0.21940233,-0.54502714,0.58356434,-0.5688791,-0.43637988,-0.79480255,0.5184784,-0.16852017,0.013635831,0.11912652,-0.33910868,-0.32096627,0.2924903]],"activation":"identity","dense_3_b":[[0.012673786],[0.01128344],[0.022662073]]},{"dense_4_W":[[-0.85258716,-0.6859794,-0.7441323]],"dense_4_b":[[-0.010446228]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA-A030x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA-A030x00x00'.json deleted file mode 100755 index ef1e50fb4b..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBA-A030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.321424],[1.0282952],[0.3231149],[0.050224524],[1.0217996],[1.0223825],[1.0230912],[1.0082365],[0.9936996],[0.9721316],[0.94674724],[0.050032564],[0.050057508],[0.050079145],[0.04995292],[0.049778342],[0.049467754],[0.04904953]],"model_test_loss":0.04801265150308609,"input_size":18,"current_date_and_time":"2023-08-06_04-34-24","input_mean":[[24.640993],[0.0068147755],[-0.00017586962],[-0.007561566],[0.0058099264],[0.005813637],[0.0063611735],[0.005459741],[0.0055605527],[0.004139945],[0.0030338452],[-0.007694561],[-0.007676937],[-0.007659136],[-0.007666928],[-0.00773279],[-0.007866388],[-0.007996489]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.7891235],[-1.3479378],[3.686604],[-0.041683935],[0.44453996],[0.89426214],[-0.07687369]],"dense_1_W":[[-2.6697454,-0.03765943,1.0202249,-0.52507985,-0.13629472,0.6595523,-0.13299626,-0.048831288,-0.13964303,-0.62626183,0.16865243,0.25943044,-0.5501048,-1.1343125,0.94113344,0.9836929,-0.003212936,-0.70527804],[-0.41116533,1.0958958,0.012986355,-0.32682467,-2.421896,2.745534,0.9753023,0.13926715,0.91335714,0.52315897,-0.7597256,2.3798738,-0.07218695,-1.5000907,-1.3250524,-0.9156551,0.118389815,0.88640165],[2.4582686,-0.72908694,0.94068986,-0.34913862,-0.041044798,1.2958984,-0.024698433,-0.24287732,-0.42381126,-0.74013126,0.52158904,0.19182011,-0.514857,-1.3592434,0.94803435,1.2861104,-0.039313756,-0.8227899],[0.033646453,-3.5824103,-6.09218,0.43962353,1.8247055,-1.3911265,1.4840937,-0.15692972,-0.5501356,-0.7384373,2.226222,-1.9952009,-0.8098372,2.1930652,-0.10924932,1.0031217,-0.57847834,0.072315976],[0.10464661,-3.4566085,-0.04553826,-3.0969014,-1.1141416,-1.5840448,-2.459453,-1.2589267,-1.7775773,0.013487749,0.36193714,0.9506872,0.2682508,0.8656542,-0.36186987,-0.22262314,-0.09480439,0.49781433],[0.23307775,1.1548069,-0.005890356,-0.36526188,-1.7491344,1.6553907,0.7824479,0.28973,1.0826069,0.27719763,-0.7125912,1.6590072,0.50719297,-1.3509704,-1.0290717,-1.1256452,0.31335434,0.72853845],[-0.047236566,-3.5460665,-3.2294989,-0.019556083,0.1316267,-2.8824382,0.1793949,-0.37179092,-1.2276187,0.8579884,2.932915,-0.8372722,0.085465014,1.8520348,0.1647215,-0.5610902,-0.38116512,0.21042979]],"activation":"σ"},{"dense_2_W":[[0.35697874,0.13488762,0.17423156,0.051741544,-0.4516404,0.37111923,-0.3326717],[-0.020012485,0.20876743,-0.470396,-0.48033553,0.032553833,-0.055029735,-0.5415699],[0.53745645,0.11958758,-0.59997284,-0.3589176,-0.1754238,-0.013715318,-0.19413082],[-1.2985301,-0.89441663,3.2249649,-1.9904556,-3.8377733,4.1878753,0.033228528],[0.30518278,-0.14937647,0.55065024,0.44417018,-0.07627243,0.16218498,-0.53365713],[-0.26422963,-0.05829067,-0.22699557,-0.35607624,-0.5975787,0.2094802,0.34373868],[0.42617777,1.194375,0.6779001,-0.27449745,0.8595841,0.21543206,-0.30614635],[0.56020504,0.1932858,0.28161722,0.5497468,-0.44715992,-1.0248823,0.45490965],[1.1460264,0.17489141,0.008437298,0.5179868,1.538886,-0.15028878,0.65506715],[0.19077669,-0.359682,-0.07988683,0.13030027,-0.07886453,-0.09370026,-0.39061382],[1.2301579,0.48008695,1.26726,-0.61532944,-1.0548761,0.45611963,-1.2783793],[-1.6239753,-1.8029108,1.2390069,1.7501497,2.0948563,-0.19781892,0.31619692],[-0.13156338,0.56530046,0.7108869,-0.15966755,0.09949921,0.847682,-0.5426604]],"activation":"σ","dense_2_b":[[-0.2809068],[0.071166106],[0.09345343],[1.8773439],[0.18102801],[0.0072933524],[0.044778902],[0.17261441],[-0.022777654],[0.12632732],[-0.19065998],[0.2023951],[-0.08659856]]},{"dense_3_W":[[-0.44438112,-0.027584514,-0.0035520266,-0.29944763,0.38794,0.4122213,-0.48664984,-0.16656086,0.25323913,0.23457485,0.40909493,0.062813886,-0.46914828],[-0.33397192,0.19350144,-0.6312562,0.4614687,0.3287365,-0.6280831,-0.16421531,-0.1758853,0.10033424,0.08385237,0.19110605,0.21503538,-0.5893766],[0.41958082,-0.17782119,-0.13674387,0.51600313,-0.31165692,-0.15396564,0.23499595,-0.47514582,0.51199234,-0.48403975,0.541148,-0.8224857,0.2995478]],"activation":"identity","dense_3_b":[[0.065908685],[-0.027226413],[-0.075099945]]},{"dense_4_W":[[0.023863196,0.109854415,1.0994612]],"dense_4_b":[[-0.07588644]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBG-A030x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBG-A030x00x00'.json deleted file mode 100755 index c40b267684..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TBG-A030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.345774],[0.6516757],[0.2946899],[0.036000013],[0.6570742],[0.65476614],[0.65189326],[0.6298937],[0.61620677],[0.5998042],[0.585703],[0.035867088],[0.035853058],[0.03583253],[0.035650827],[0.035447672],[0.03509526],[0.034743294]],"model_test_loss":0.04811468347907066,"input_size":18,"current_date_and_time":"2023-08-06_04-58-52","input_mean":[[23.215597],[-0.0051006116],[-0.0055196565],[-0.01567796],[-0.005811626],[-0.006771491],[-0.0076306327],[-0.0097848335],[-0.012780408],[-0.015299056],[-0.014718147],[-0.0158138],[-0.01582171],[-0.015839318],[-0.01598839],[-0.016109424],[-0.016302101],[-0.016615149]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.5351528],[-0.08217364],[0.7499818],[-0.9374063],[-2.8954298],[0.5392535],[-3.6015053]],"dense_1_W":[[-0.3087897,0.36021253,0.001141582,-0.5416911,-0.37556788,1.0140606,-0.10794389,0.041419383,0.09076369,0.22191924,-0.13948734,0.77267516,-0.42759845,0.05381029,0.18476713,-0.004047777,-0.30918673,0.26700374],[0.0053725103,2.3370762,2.1885164,-0.6068641,-1.8911628,-0.1114463,-1.1982107,1.506414,1.4532031,-1.4538794,-0.44084385,0.23688209,0.25542602,-0.57141525,-0.3206077,0.6730285,-0.21775477,0.139656],[1.3912241,0.5980732,0.007555601,-0.3157546,1.0649415,-1.0759517,0.38208148,0.39749306,0.4723742,0.079457946,-0.22618146,-0.52275753,0.36008105,0.15328345,0.31112024,0.47836456,-0.34323418,-0.06713888],[-0.5376176,-0.8203641,-0.0054783067,0.18999593,0.8493549,-1.6256207,0.5286132,0.17178455,-0.12867084,-0.57045287,0.380642,-0.21426243,0.012443455,0.08020425,0.04434846,-0.2713304,0.26582962,-0.11160915],[-1.6407828,1.6409405,2.1913364,0.022263499,0.09162234,0.83557415,-0.5309621,0.024207013,-0.07581847,-0.014490255,-0.81525505,-0.0492574,0.24616976,0.15028022,-0.59524703,-0.0825454,0.4095187,-0.094127044],[1.3961402,-0.08105169,-0.008954976,-0.07117163,-0.8383657,0.87360406,-0.6657976,-0.87985647,-0.5403045,0.18084845,0.17272979,0.52761483,-0.10129359,0.052255798,-0.6804288,-0.19871165,0.32997298,0.08579106],[-2.1104581,-0.24356179,-2.845604,0.654625,-0.96994275,-1.8767366,0.09136246,-0.1956461,0.53588957,1.3931365,-0.2444548,-0.15516165,0.21176384,0.14917651,-0.5694106,-0.70854956,0.0043206294,0.400021]],"activation":"σ"},{"dense_2_W":[[1.0278689,0.4348165,-0.7295973,-0.17747834,-0.10278106,0.8901122,0.17545664],[0.13757691,-0.1752453,0.14579734,-1.0508666,-0.22797246,0.38786298,0.19690785],[1.1957673,0.0039350316,-0.40309194,-0.2067109,-0.49688277,0.046528805,0.34363425],[0.9798856,0.49028137,-0.85653776,-1.1984895,-0.36523688,0.46900073,-0.32531098],[-1.2176576,-0.14628303,1.6475934,1.303342,-1.3007184,1.0287305,1.0352072],[-1.4576483,0.32830203,0.16497982,0.9603124,0.10295537,-0.26579857,0.044457998],[-1.0095707,-0.47438616,-0.8685609,1.2697761,-1.1946431,-1.4605931,1.2599539],[0.81197304,-0.09208761,0.40551397,-0.056155458,-0.58765817,-0.23485978,-0.2638987],[-1.5602592,0.087970994,0.52796125,0.39796272,0.12936676,-0.81510574,0.2554148],[-0.37163022,-1.1731296,-0.14651866,0.54896307,-0.6345117,-0.76398563,-0.594298],[0.55459255,-0.11434374,-0.7491592,-1.2193239,0.03146761,-0.27160767,0.13656238],[-0.41351238,-1.394458,0.32861343,-0.5550233,-0.06432965,-0.26546374,-1.3905721],[-0.07234112,0.12938619,-0.5258625,0.20187783,-0.11095027,-0.5983514,0.17259556]],"activation":"σ","dense_2_b":[[0.07223941],[-0.18307218],[-0.011371265],[-0.030353792],[0.399116],[-0.2056006],[-0.18057384],[-0.034727614],[-0.1045567],[-0.02377866],[-0.08901428],[-0.19908707],[-0.12886626]]},{"dense_3_W":[[0.6559019,0.16872415,0.47964025,0.6487196,-0.8777068,-0.23541385,-0.89913565,0.15309054,-0.58269215,-0.7279551,0.29873818,-0.32794726,0.08947766],[0.26739633,-0.18432048,0.59314704,-0.2931499,-0.4403377,-0.13366148,-0.7476601,0.040935304,0.4834687,-0.46328762,0.38387424,0.24528371,-0.11175901],[0.35347906,-0.0840438,0.3375809,0.18057397,-0.5231106,-0.3020804,0.014876371,0.24072316,-0.3709018,0.04671709,0.20817442,-0.017570972,-0.4402727]],"activation":"identity","dense_3_b":[[0.10084228],[0.0669727],[0.031454615]]},{"dense_4_W":[[1.4559509,0.20071371,0.08563809]],"dense_4_b":[[0.09271952]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEA-T020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEA-T020x00x00'.json deleted file mode 100755 index 691c3d8257..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEA-T020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.3856297],[0.59803385],[0.26888487],[0.03426154],[0.6021013],[0.60129803],[0.600173],[0.58730155],[0.5795345],[0.56942075],[0.56083477],[0.034230746],[0.034222513],[0.0342368],[0.034183532],[0.034086205],[0.03391226],[0.03362311]],"model_test_loss":0.04541628807783127,"input_size":18,"current_date_and_time":"2023-08-06_05-23-15","input_mean":[[19.52228],[0.079693735],[-0.0040563247],[-0.016650539],[0.080978006],[0.08070611],[0.080451526],[0.07918187],[0.07886801],[0.077705875],[0.07789241],[-0.016722582],[-0.016714904],[-0.01669564],[-0.0163877],[-0.016280727],[-0.016055403],[-0.015882453]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.08104281],[3.8909714],[0.057941712],[3.2389338],[-0.10055978],[-4.1230493],[0.006579657]],"dense_1_W":[[0.0019672236,1.7124008,5.2847867,0.31392902,0.54002285,1.149604,-0.40869483,-1.4113252,0.25494707,-0.3660509,-0.9714891,0.9837418,0.9273289,-0.36905542,-0.59060776,-1.2861198,-0.14369972,0.1715609],[2.0075417,-1.0534788,-2.5004108,0.10716736,0.4385972,-0.6827907,0.45479578,-1.0585693,-1.0196034,0.4777303,0.98654383,0.1564951,-0.558304,0.5957592,-0.12573951,-0.28325465,0.012213282,0.11858977],[0.093256205,-0.27820048,-1.1696479,-0.46487743,-0.5531493,0.66647863,-1.3765898,0.36791116,0.12435645,0.5120396,-0.24957871,0.12178344,0.8057537,-0.54323083,0.07556655,-0.0014235709,-0.056690272,0.15405625],[-0.024608504,0.010786505,-0.037946787,-0.32397965,-0.4846185,1.032738,-0.6093787,-1.2915424,-0.03675826,-0.21950667,0.44720176,-0.44202822,-0.5876285,-0.5605793,-1.8322814,-1.6573476,-1.3555098,-0.7895331],[-5.2810225e-5,-1.4757657,-0.0046121287,0.4629083,1.1526763,-1.8665615,0.6062522,0.7366192,0.40736353,-0.106786564,-0.2220295,-0.98978,-0.2532476,0.9250863,0.1220093,0.0031458773,-0.19573754,-0.063445985],[-1.8668225,-1.0928262,-2.4432688,0.76242334,1.1889721,-0.9581941,0.0032050284,-0.8823583,-1.2202708,0.3004889,1.2086878,-0.53652066,-0.28588182,1.1637923,-1.0296966,-0.27406633,-0.034686062,0.2627352],[-0.09106887,-0.31075913,1.17905,-0.74274266,-0.20221533,1.2496672,-0.28414592,0.021432078,1.0067991,-0.25608063,-0.43758723,0.52320695,0.09239755,-0.6291368,0.6016738,0.16577406,0.10509334,-0.21720383]],"activation":"σ"},{"dense_2_W":[[-0.085414894,-0.20918435,0.17373109,0.10737947,-0.82685804,0.20342289,0.212457],[-0.20115225,0.29464254,-0.44532576,-0.014358113,0.691581,-0.33132514,-0.13227542],[-0.09087903,0.5010818,0.5607322,0.03217964,-0.5053537,-0.39688778,0.47023636],[-0.30364254,0.49323803,0.055883832,0.05977077,-0.7746708,-0.17011528,-0.2880824],[0.18880495,-0.5190757,0.31874385,0.29983982,-0.3985195,0.035492044,-0.44292748],[-0.9273464,-0.13842295,-0.036056563,-1.1684054,0.9577527,0.66510856,-0.027885118],[0.099401176,-0.5396238,-0.6235069,-1.3781581,0.79803157,0.43778622,-0.40184033],[-0.9619544,2.0476668,-0.8396164,-0.12754412,1.6685368,0.44752124,-1.353382],[-0.5558298,0.5099584,0.110654734,-0.37428614,0.7436413,0.6881325,-0.9043214],[-0.06558644,0.24584974,0.6592815,-0.19850211,-0.9235771,0.078365356,0.45574242],[-0.57793844,-0.91109204,0.60808426,0.3936904,-1.3562016,0.5863055,0.008310561],[-0.8589996,-0.53710437,-1.2663639,0.18269065,2.293696,1.254948,-0.7799597],[0.6527474,-0.3124623,-0.34758097,0.27498147,0.002866847,-0.77761084,0.6969836]],"activation":"σ","dense_2_b":[[-0.0076770815],[-0.0019400008],[0.023349117],[-0.008292667],[-0.011734453],[-0.4216689],[-0.20562689],[-0.08058182],[-0.12332897],[-0.007057092],[-0.27095175],[-0.28152117],[-0.0048717586]]},{"dense_3_W":[[-0.54598933,0.30111024,-0.31070733,-0.30095556,-0.28257152,-0.30806056,0.61478865,0.639757,0.48092464,-0.31418368,-0.6392647,0.82360584,-0.12001248],[-0.4009894,0.28335997,0.059711292,-0.19983076,0.3395215,-0.6511789,0.46926227,0.012918541,-0.4768196,0.34748575,-0.33296925,0.40980956,0.29510143],[-0.32422495,-0.28320903,0.22919968,-0.18012339,0.25318158,0.44350082,-0.51897806,0.51467586,0.14846486,-0.5721817,-0.20305538,0.67044383,0.2138928]],"activation":"identity","dense_3_b":[[-0.043942094],[0.03467515],[-0.047385007]]},{"dense_4_W":[[-1.329141,0.5136682,-0.26201633]],"dense_4_b":[[0.043247793]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEG,A010x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEG,A010x00x00'.json deleted file mode 100755 index 1d04ec1f69..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016 b'39990-TEG,A010x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.414752],[0.809778],[0.32968998],[0.038563218],[0.81399393],[0.8130152],[0.8116411],[0.8044098],[0.7990659],[0.7908311],[0.7781809],[0.03845621],[0.038476728],[0.038496315],[0.038509805],[0.038388517],[0.03807538],[0.037689537]],"model_test_loss":0.007678080350160599,"input_size":18,"current_date_and_time":"2023-08-06_05-48-54","input_mean":[[21.623014],[-0.06315314],[0.028330239],[-0.0069412887],[-0.07000519],[-0.06754908],[-0.06473992],[-0.055388335],[-0.04912587],[-0.041271344],[-0.032815684],[-0.006859833],[-0.0068624676],[-0.006869615],[-0.0069527323],[-0.0069756005],[-0.0070287744],[-0.0070639635]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.7605686],[3.5044053],[2.0832198],[-0.25828874],[0.3039091],[-0.089539275],[0.118453376]],"dense_1_W":[[-1.7583797,0.589543,-1.0319984,0.110393494,-0.21674192,-1.7155991,0.8325825,-0.16004571,-0.913345,-0.0812225,0.67669153,-0.80105156,0.25075755,0.916074,-0.095394626,-0.020104544,-0.005883078,-0.080861904],[1.8151304,0.19393112,-1.090924,0.33811733,0.05085238,-1.1737207,0.32235587,-0.44897,-0.5966143,-0.14382847,0.75931793,-0.14169198,-0.35926667,0.5962395,-0.093506224,0.16791871,-0.18208155,-0.02677418],[1.5013692,0.84768164,0.9670481,-0.18950337,0.05811444,0.036552854,0.6984422,0.047381528,-0.19678752,-0.6145364,0.11384745,-0.26299715,0.15431781,0.42217052,-0.61956424,0.076191664,0.17176628,-0.015458679],[0.010009106,-0.08474945,-0.11727848,-0.5954893,0.21653149,-0.83162314,-0.12228016,-0.006441115,-0.48080042,0.007156214,0.22622024,-0.6214733,0.30532193,0.7250713,-0.22122426,-0.3155122,0.31625217,0.4177061],[-0.0022816912,0.36319026,2.6736248,-0.23002017,-0.6987022,-0.0061110156,-0.36389568,0.5511679,0.08328913,0.5146548,-0.5392843,0.7437445,-0.046624888,-0.21139482,-0.35767952,-0.3415711,0.3786916,0.07167081],[0.0050385734,-0.43462712,-0.05308,0.025633823,0.29115447,-1.6235275,0.13262115,0.3036328,0.48786274,0.30519634,-0.50269544,-0.89282864,0.34320372,0.69487166,0.34770367,0.17281933,0.122459196,-0.2835277],[-0.16018158,-2.6079166,0.051285002,-0.8959181,-2.6147542,-2.7455857,-3.0082538,-2.166046,-1.4802098,-0.9145916,0.4948057,-3.1999378,-1.971094,-1.618746,-0.6039725,0.5491652,1.9303606,5.316056]],"activation":"σ"},{"dense_2_W":[[-0.8494065,-0.94668996,-0.25524712,-0.49821833,0.10248175,0.16570607,0.08037025],[0.407395,1.2177871,0.6595171,0.51689386,-0.5024803,-0.112236835,0.55882525],[0.38773674,-0.94255173,-0.21581627,0.40207997,-0.7363527,0.35848704,0.21115805],[0.6955828,-0.40022588,0.18614924,-0.1998243,-0.5945706,0.63007945,0.121129975],[0.6693154,-0.42887792,-0.43107304,-0.12879528,0.096946076,0.4243904,-0.1448268],[-0.45311376,-0.06397047,-0.475693,-0.18040454,0.19093697,-0.36706218,-0.008771336],[-0.84971607,-0.5401956,0.28763822,-0.50512564,-0.279698,-0.8399409,0.5433065],[-1.0076836,-0.49472776,0.20072678,-0.19309734,-0.29518792,-0.08193111,0.2831805],[-1.0347741,0.15746295,0.09370998,-0.25177705,-0.017589109,-0.40057716,0.45802802],[-0.32091177,0.17798328,-0.49051303,-0.12601621,0.10984774,-0.7267025,0.09803074],[0.39275715,0.24044967,-0.058441114,-0.15604238,-0.051029686,-0.18873541,0.061358593],[-0.1873293,-1.9225551,-0.067686126,-0.5021896,-0.051216066,0.24865563,-1.235181],[1.4839585,-1.365924,-1.2432988,-0.8610499,-0.119583905,-0.20667724,-2.5413523]],"activation":"σ","dense_2_b":[[-0.090611175],[0.13049172],[-0.2995885],[-0.18042783],[-0.18258452],[0.03439863],[0.038779728],[-0.0974849],[0.2627597],[-0.09157007],[0.0042730095],[-0.022836503],[0.07373033]]},{"dense_3_W":[[-0.09544235,0.07383687,0.57643867,0.51306605,0.5831484,-0.39026436,0.4894308,-0.30050197,-0.3482933,0.16585375,-0.013200446,-0.538111,0.012991255],[-0.23729068,0.22367261,-0.22196151,0.670639,0.15204789,-0.5559103,-0.42776123,0.12732859,0.0007805089,-0.40029454,-0.12749611,0.1569053,-0.42127144],[-0.5697941,0.6104953,0.22483532,0.38580984,0.058564458,-0.20807105,-0.41168946,-0.49617398,-0.67103213,-0.032330584,0.30103138,-0.6870759,-0.7820781]],"activation":"identity","dense_3_b":[[0.0017381236],[0.0156807],[0.015327422]]},{"dense_4_W":[[-0.36441112,-0.7462365,-1.0239874]],"dense_4_b":[[-0.012290128]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T39-A130x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T39-A130x00x00'.json deleted file mode 100755 index f6b6dc3973..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T39-A130x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9030814],[1.0453333],[0.3170026],[0.04460543],[1.0398759],[1.0416826],[1.0431112],[1.0299109],[1.0157675],[0.99077934],[0.96246296],[0.044478334],[0.044504065],[0.04452782],[0.044476468],[0.044363912],[0.04419919],[0.043906868]],"model_test_loss":0.028506241738796234,"input_size":18,"current_date_and_time":"2023-08-06_07-28-34","input_mean":[[25.499252],[0.028501904],[-0.0028704705],[-0.006133777],[0.028923629],[0.028642828],[0.028525524],[0.027212968],[0.02708821],[0.025971029],[0.025491338],[-0.0061524976],[-0.0061464473],[-0.0061450717],[-0.006191866],[-0.006216849],[-0.006269715],[-0.0064120986]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.1612873],[1.1304555],[-0.045539603],[0.18508305],[-0.056664106],[2.359981],[-0.003104607]],"dense_1_W":[[-1.0261196,1.6714283,-4.9839725,-0.25472918,-0.5927435,-2.1332676,0.41972587,-1.4847857,-0.5297093,-0.5873834,0.4926704,0.35519528,0.5963999,0.29114577,-0.44986778,0.24840392,-0.19448282,0.29746208],[1.5984797,1.2807095,-2.855458,-0.28417665,-0.6741327,0.14131893,-0.8411344,-0.48792252,0.20918193,-0.12904613,-0.06057345,0.27155536,0.5005968,0.12182206,-0.4972699,-0.26681903,-0.13244413,0.41992095],[-0.01631524,-0.11127795,0.62778777,0.14360946,-0.19943185,1.6136284,-0.74262536,0.17609622,0.47054547,-0.66130835,-0.34703505,0.30890283,-0.011658758,-0.9054101,-0.07164689,0.6967732,-0.07093875,-0.29011974],[0.24211173,-0.12465638,-2.2150717,0.5197125,0.5969984,-0.9115877,1.2352886,-0.61733866,-0.70987016,-0.34082124,0.6792926,-0.14224347,-0.39383444,0.29159838,-0.6175597,0.5266842,0.09999084,-0.22068383],[0.0020527053,-0.124916494,-0.0072491574,-0.32790923,0.6288478,-1.2486193,-0.077829614,0.290347,0.27691,-0.38082907,0.04554726,-0.42446274,-0.11070265,0.38662457,0.4693785,0.28157672,0.053745594,-0.1984251],[2.0714083,-0.45528322,2.190492,-0.2294528,0.80421203,-0.24660808,0.631071,-0.50690234,-0.35972506,-0.05297636,0.38328585,-0.41214883,0.13557836,0.58240587,-0.12109465,-0.19043957,0.1687669,-0.041427426],[-0.007373681,-0.24503441,-0.766152,0.19888358,-1.297256,0.97417396,-0.7913301,0.32273322,0.63816434,0.11862124,0.2828841,0.32503918,0.26446965,-0.75070786,0.17617404,-0.102831915,0.12236231,0.072185144]],"activation":"σ"},{"dense_2_W":[[0.84075487,-0.9698966,-1.1863552,0.39111534,0.61300087,-1.074546,-0.6429345],[-0.16599394,-0.34588924,-0.34965044,-0.070526905,-0.5569146,-0.33049506,-0.07336439],[0.5915367,-0.5171752,-0.13241306,-0.46928012,0.92575246,-0.72971493,-0.722351],[1.5593696,1.5437826,-0.8387062,1.0409446,0.35062063,1.3033848,-0.048639357],[-0.030403387,0.44161096,0.46425432,-0.1915973,-0.7348229,-0.3039007,0.29630142],[0.5050197,0.5076173,0.4501814,-0.48338422,-1.1334643,-0.32370403,-0.065987155],[-0.53219205,0.38907552,-0.56034696,-0.21546341,0.62926334,-0.26963118,-0.11765221],[-0.13998857,-0.41180918,-0.68951356,0.5040533,0.43773162,-0.37432873,-0.3054661],[0.060598448,-0.052345384,-0.05926513,-0.79581696,-0.536353,-0.58540416,-0.5439933],[-0.1929987,-0.074298754,0.2989631,0.09550092,-0.7899365,-0.4491801,0.20246264],[0.1728909,-1.0256978,-0.30253175,0.36276552,-0.5255227,-0.3984827,-0.042940307],[-0.37483662,-0.5567497,0.24257487,-0.9368595,-0.71663094,-0.7617147,0.5222287],[0.3595344,0.31717294,0.641732,-0.1949688,-1.1738145,0.16135724,0.059228286]],"activation":"σ","dense_2_b":[[-0.2908681],[-0.11676679],[-0.20927037],[-0.022777379],[-0.056520674],[-0.1025079],[-0.010873501],[-0.08840967],[-0.20289198],[-0.08710838],[-0.3852181],[-0.09839834],[-0.18181786]]},{"dense_3_W":[[-0.45135853,-0.43684617,0.16072902,-0.3907492,0.5050306,0.5548873,-0.0016576584,0.30690256,0.43964118,0.4280059,-0.029079122,0.6312158,-0.16514885],[0.8751171,-0.41735888,0.5142745,0.41110802,-0.5030071,-0.30468556,0.5376879,0.45157358,0.087431885,-0.2522119,0.017974667,-0.5217977,-0.5559542],[0.10950831,0.45705712,-0.2692873,-0.15272701,0.5711136,-0.009069097,-0.36759618,-0.6967481,-0.29732275,-0.16078,0.037027664,0.5842399,0.46625558]],"activation":"identity","dense_3_b":[[-0.048144232],[0.038749587],[-0.04579552]]},{"dense_4_W":[[1.0830055,-1.3294458,0.5527587]],"dense_4_b":[[-0.04092441]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T43-J020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T43-J020x00x00'.json deleted file mode 100755 index a96719aa6f..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022 b'39990-T43-J020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9427967],[0.87432146],[0.3449518],[0.041372716],[0.88073754],[0.8794919],[0.8774352],[0.85170704],[0.8311592],[0.80134684],[0.7728664],[0.041213993],[0.041262195],[0.041307535],[0.04130587],[0.041196827],[0.04102109],[0.040738378]],"model_test_loss":0.032795943319797516,"input_size":18,"current_date_and_time":"2023-08-06_07-53-24","input_mean":[[23.424137],[-0.12035412],[0.0040231682],[-0.0048080194],[-0.118285224],[-0.11840886],[-0.118516885],[-0.116480246],[-0.11301401],[-0.107189395],[-0.09997545],[-0.0046797423],[-0.0047175437],[-0.0047546746],[-0.004927507],[-0.005063428],[-0.005227956],[-0.005348952]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.9417369],[-0.24273592],[1.4223384],[1.0486506],[1.447565],[-0.6927629],[1.0804037]],"dense_1_W":[[-0.4058283,-0.81563294,0.00033183617,-0.27639547,3.1342106,-1.7313385,-0.228073,0.9913803,-2.3060467,-0.96959984,0.75029725,-0.22633775,-0.21490769,0.52506644,0.95701593,-0.8487675,-0.19613568,0.23440045],[0.034500286,1.0905547,7.9065676,0.10637991,0.026667506,0.49172896,-0.59656775,0.9809094,0.0049328264,-0.4872245,-1.1707573,1.2050977,-0.18107356,-0.5157706,-0.38871238,-0.47595924,-0.17320715,0.5229742],[0.5588498,-0.6570481,0.0021321403,-0.2896172,1.1236126,-0.575634,0.56214845,-0.016197847,-1.0184777,-0.7082013,0.07940224,0.23188433,0.004668281,-0.2397409,0.34752426,-0.22746754,0.22416848,-0.100688644],[1.541966,0.42912173,-7.156812e-5,-0.5115884,-0.25799006,1.4016091,-0.72769475,-0.40935022,-0.5667163,-0.3968267,0.61420083,0.06877578,0.041468274,0.2682816,0.1332453,-0.3914694,-0.0010588124,0.10998447],[0.19860983,0.18228313,1.4962244,-0.24713515,0.309561,1.1720607,-0.4798918,0.60050476,0.5141609,0.010664739,-1.9016608,0.06223622,0.4967279,-0.18392076,-0.484281,-0.18898958,0.4617198,-0.01832523],[-0.051042855,0.36178812,1.3606699,-0.20764841,0.10236579,1.031499,-0.72788227,0.9447528,0.38027644,0.2683604,-1.9967669,0.91526955,-0.15156461,-0.5247163,-0.6771034,-0.011823598,0.7620024,-0.19407678],[1.524111,-0.18364623,-7.7449076e-5,-0.026552787,0.15087162,-1.7394279,0.66268677,0.75670546,0.7576604,0.20102891,-0.6852404,-0.28242418,0.23329456,0.32087836,-0.26189858,0.14684094,0.30590108,-0.1579458]],"activation":"σ"},{"dense_2_W":[[0.21370113,-0.5469511,0.38994473,-0.87885034,0.22193275,-0.2623318,0.9725592],[-0.39974675,-0.2669233,-0.7280023,0.0744481,0.31313443,0.68184376,-0.8690639],[-1.1618038,1.040867,0.07579963,1.2550652,0.9444778,0.6170199,1.5694822],[-0.55496246,-0.6109581,0.047377832,-0.6034833,-0.563908,-0.29172823,-0.1873672],[-0.47154403,-0.15439837,-0.33464748,-0.32102966,-0.43370283,-0.30466565,-0.50861603],[0.94471455,0.15859249,-0.49109864,-0.82194316,-0.28949282,-0.26072252,0.6200601],[-0.17757672,0.42580798,0.5348059,-0.86694545,-0.5312405,-0.20982458,1.0570047],[-0.9717297,0.6032017,-1.4936788,-1.3035914,-0.5127796,1.341816,-1.5745448],[-0.21112834,-0.380845,-0.2000692,-0.14918523,0.37498268,0.49246258,-0.07759563],[0.5571681,-0.37033182,-0.45625687,-1.1621255,0.45340016,-0.14524722,0.8753156],[-1.644583,1.9391878,0.6463959,1.3763337,0.7492759,-0.33528683,1.2163771],[0.20058957,-0.5563082,0.08262119,-0.48758602,0.08011511,0.15911381,0.589174],[1.0828615,0.3445846,0.008124553,-1.3508773,-0.7360904,-0.6484338,-0.007040125]],"activation":"σ","dense_2_b":[[-0.09792841],[-0.12135925],[0.28469688],[-0.3146848],[-0.030983448],[-0.22707085],[-0.07664623],[-0.28448796],[-0.03253531],[-0.19589026],[0.38351893],[-0.13162117],[-0.24342652]]},{"dense_3_W":[[0.6724217,-0.3455274,0.048990987,-0.08371895,-0.28143087,-0.019941397,0.6274694,-0.5836906,-0.40752873,0.17574412,-0.40815762,0.5177674,0.6628741],[0.71871656,-0.67533195,-0.5226403,0.0062096105,-0.03194264,0.2772788,0.45594773,-0.80367815,0.25479558,0.28959462,-0.7620481,-0.055599444,0.32025474],[0.49274486,0.089585,-0.58489066,-0.15075734,0.35932115,0.16879536,0.18689315,-0.38381797,0.37573037,0.19162786,0.30417326,0.35219628,0.20757556]],"activation":"identity","dense_3_b":[[-0.029657809],[-0.0076349713],[-0.10236976]]},{"dense_4_W":[[-1.0305482,-0.9352994,-0.15167141]],"dense_4_b":[[0.019799424]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA,A040x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA,A040x00x00'.json deleted file mode 100755 index c6e920b660..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA,A040x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.540721],[0.97576207],[0.3313625],[0.037843365],[0.9687592],[0.97072476],[0.97218126],[0.97131544],[0.9684263],[0.9628179],[0.9533884],[0.037710436],[0.03772708],[0.037749223],[0.03774041],[0.03766764],[0.037492532],[0.037175607]],"model_test_loss":0.008188891224563122,"input_size":18,"current_date_and_time":"2023-08-06_09-11-21","input_mean":[[25.743162],[-0.03419077],[1.694457e-5],[-0.0058412226],[-0.032445744],[-0.031978246],[-0.032078236],[-0.03277639],[-0.033087995],[-0.03541121],[-0.03758282],[-0.0058416994],[-0.005846817],[-0.005852368],[-0.0059208623],[-0.005982407],[-0.0061672865],[-0.0062656854]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.00080405985],[0.7854822],[-0.12339557],[4.3081584],[-0.7866419],[-4.1709423],[-0.8409999]],"dense_1_W":[[-0.011464089,-0.21720867,1.7038208,-0.8018396,-0.31464818,0.6335713,-0.37999704,0.64242667,0.94747055,-0.08193086,-1.2666425,0.025586708,0.432876,-0.09704421,0.07735149,0.66563797,-0.055053703,-0.16396695],[-0.92180765,0.47178316,0.037608773,0.25415114,-0.49117133,0.68139184,0.12054695,-0.040742125,-0.32435754,-0.20692724,0.31272388,0.33671296,0.19074297,-0.5344022,-0.32216358,-0.16691925,0.12728797,0.038775913],[-0.103043444,-0.30544865,-0.25746647,-0.17237106,0.052905187,0.4400764,-0.67536193,-0.06703455,0.24000691,0.061700933,-0.38188213,0.31053326,-0.18271814,-0.37914285,0.009493447,0.29651824,0.05323582,-0.039326254],[1.0605786,-0.060056392,-0.5810357,0.22576235,-0.13578887,0.011457395,0.030639524,-0.40217978,-0.83826524,-0.6082418,0.15762202,-0.23657623,-0.46672913,-0.047515202,0.35081884,0.13669041,0.22352155,-0.080405615],[1.6374902,1.1410245,0.59359837,-0.27866,-0.13386817,0.13762549,-0.16988072,0.41271707,0.14994158,0.27289742,-0.16715708,0.40429235,0.005580401,-0.69167936,-1.1274492,-0.71839035,-0.8099919,-1.0824188],[-1.0478101,0.0044337907,-0.5723063,0.11623494,-0.034284834,-0.650081,0.5400228,-0.29708397,-1.1310123,-0.20287414,-0.046815645,-0.61760116,-0.08759878,0.072666995,0.19055136,0.5814996,-0.16782755,0.014659258],[0.86524445,0.49477735,0.035929088,-0.13251677,-0.36860162,0.9281964,-0.471796,-0.18288918,-0.0002611768,0.058924783,0.05732142,0.45911258,0.06966288,0.0044731353,-0.40496862,-0.22457011,-0.16845165,0.31822684]],"activation":"σ"},{"dense_2_W":[[-0.15426435,-0.046661343,-0.43946412,0.624533,-0.09205635,-0.47168306,-0.8016902],[-0.53101015,-0.3685878,-0.5863992,0.4510693,-0.16216898,0.9400012,-0.21748114],[0.22712189,0.16995162,-0.29991642,-0.7336719,0.3751938,-0.53952307,0.26768756],[0.27349526,-0.6804414,0.07234837,0.6874648,0.106653705,0.12508605,-0.65603495],[0.07313242,-0.97843266,-0.5148208,-0.14121139,0.07274063,0.79724526,-0.4383511],[-1.1264609,-1.1770498,0.52797097,-0.36545604,0.5212269,1.5757213,-0.085593045],[-0.097091556,0.369785,0.14884436,-0.67693,0.5140766,-0.8676453,-0.016739987],[0.085827775,-0.100521185,-0.6224066,-0.30192837,0.35849503,0.041973434,0.35816756],[-0.42120174,-0.3240992,-0.4097286,0.18434778,-0.20248985,1.2600665,-0.68534833],[0.124515295,0.049313035,0.2003641,-1.1119213,-0.04333023,-0.38769117,0.48661488],[0.48089156,-0.05526323,0.25297868,-0.92118233,-0.34588912,-0.34006065,0.5504206],[0.50554097,0.048244223,-0.13434097,-0.4654796,-0.175737,-0.5890811,0.5968848],[0.2714133,-0.76585513,-0.4710219,0.72425234,-0.08094333,0.45696303,-0.24324968]],"activation":"σ","dense_2_b":[[-0.30605197],[-0.0722725],[-0.061257467],[-0.0143502485],[-0.055046625],[-0.11999873],[0.0056539187],[-0.047943417],[-0.031266216],[-0.028862225],[-0.044943057],[-0.006668254],[0.009506268]]},{"dense_3_W":[[-0.18731649,-0.08790928,0.05439343,0.08261642,-0.18359958,-0.42045295,-0.49756563,0.55669594,0.42419568,-0.36434284,0.29313055,0.55965924,-0.20341128],[0.17575984,0.11026421,0.10531715,0.39341643,0.4011678,0.34916008,-0.45358273,-0.12599039,0.6143738,-0.71328527,-0.583732,-0.4881176,0.5818727],[-0.1525316,0.094295666,-0.708604,0.46496,0.4017641,-0.020599859,-0.03952808,-0.17086326,0.27307847,0.0376419,-0.5269954,-0.020001007,0.52539593]],"activation":"identity","dense_3_b":[[0.0076207337],[-0.07809654],[-0.07344336]]},{"dense_4_W":[[0.03995432,-0.7892518,-0.67607296]],"dense_4_b":[[0.07132181]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A040x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A040x00x00'.json deleted file mode 100755 index b14894015b..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A040x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.041878],[1.0629945],[0.33361882],[0.04470225],[1.0674024],[1.0653876],[1.0623872],[1.0305605],[1.0037603],[0.9659078],[0.9315669],[0.044532184],[0.044523124],[0.044505402],[0.04425743],[0.04400374],[0.043602895],[0.043178014]],"model_test_loss":0.050424300134181976,"input_size":18,"current_date_and_time":"2023-08-06_09-38-42","input_mean":[[25.06497],[0.074133344],[-0.003671015],[-0.0061551738],[0.07510349],[0.07509486],[0.074765146],[0.07192954],[0.06950652],[0.06514102],[0.06143682],[-0.0061509674],[-0.006146431],[-0.006140578],[-0.0061463905],[-0.006205736],[-0.006276082],[-0.0062960368]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.045673113],[0.7692602],[3.6866767],[-3.3985317],[1.3993363],[0.0016273671],[0.036870282]],"dense_1_W":[[-0.052982505,0.06573528,0.5580607,-0.032680344,0.20608537,0.6934426,-1.0580161,0.66156256,0.06940833,0.55721414,-0.5868014,0.7408258,0.25445056,-1.0855104,-0.049797036,-0.38484633,0.13387734,0.20955376],[0.82260245,-0.01934001,-0.8111281,-0.418187,-0.78638,0.022366054,-0.8557658,0.23719062,0.43918282,0.55011797,-0.5533236,0.73082197,0.39111775,-0.66629314,0.08269158,0.29669186,-0.49751994,0.30054808],[2.0007224,-0.31018302,-1.8883644,-0.46103692,-0.182084,-1.1692013,0.18340528,-0.45994648,-0.63908005,-0.38715318,0.80325556,0.21984062,0.25636217,0.26680768,-0.064179085,0.06973789,0.029908044,-0.051753674],[-1.7532426,-0.44865423,-1.6179291,-0.5686573,0.20539987,-1.3053204,0.3192343,-0.39442357,-0.7004488,-0.24894904,0.73180014,0.023328634,0.32073107,0.6846023,-0.30778062,-0.08105825,0.2476391,-0.07462059],[1.0470898,0.13631506,0.9359457,0.7269999,0.48282263,-0.5516526,0.9416267,0.5219997,-0.12951173,-0.4016694,0.07761096,-0.9994486,0.00889868,0.37176034,0.17872189,-0.6502687,0.14589402,0.009702152],[-0.0022762392,0.54675275,-0.00070867874,0.030965228,-0.4284072,1.4484926,0.120421134,-0.8816781,-0.12615833,-0.3113866,0.5081008,0.26918358,0.42232123,-0.35750753,-0.4280094,-0.102303475,-0.05531494,0.061394636],[-0.0032405164,-1.2942008,-5.5235214,-0.3269165,0.6261494,-0.23602912,0.20249991,-0.63172483,-0.9731877,-0.5860727,2.2520695,-1.5046892,-0.71375567,0.421119,1.3741344,0.75040346,-0.39606163,0.1400608]],"activation":"σ"},{"dense_2_W":[[0.8646755,0.6376676,-0.26202708,-0.85868895,-0.07354249,0.69815946,-0.30686975],[-0.79679435,-0.32395786,0.058006734,0.82902014,1.1024014,-1.2736039,-0.13299379],[0.009736041,-0.35343233,-0.33363932,-0.5966722,0.2299318,-1.2228652,0.09423904],[-0.62453824,-0.16437167,0.10942579,-0.060125638,0.45838273,-0.27015314,-0.092518486],[-0.63952684,-0.032483563,0.028590042,0.8343624,-0.30501577,-0.4676638,0.4329707],[0.79951334,-0.10701151,-0.478834,0.11537501,-0.4790387,0.29373074,-0.45883498],[-0.38821566,-0.29865965,0.2401885,0.10201916,0.42648098,-0.95061827,-0.565707],[-0.33430934,-0.2328123,-0.4937564,-0.82547146,-0.38432762,0.33364365,-0.056874156],[-0.1879909,0.3929959,-0.035755124,0.042920403,0.099859655,0.34126663,-0.06774957],[-0.51760626,-0.7163332,0.46123,0.80046433,0.774819,-1.2809892,-0.071995825],[-0.2212481,-0.03539259,0.15500164,0.21800677,0.43387356,-0.9091443,-0.23553239],[0.0588365,-0.41657263,0.07661814,-0.45269957,-0.31246582,0.02730263,-0.52968377],[0.13910463,0.18369111,-0.8858626,0.21748419,0.09809011,0.5938796,-0.64197445]],"activation":"σ","dense_2_b":[[0.008012182],[-0.23325977],[-0.2646487],[-0.097698614],[-0.12920478],[-0.017523877],[-0.22028513],[-0.23008367],[-0.05471147],[-0.037543405],[-0.12661214],[-0.33879024],[-0.008564516]]},{"dense_3_W":[[-0.551337,0.31575167,-0.024517886,0.18234162,0.46279272,-0.56980455,-0.39026403,-0.40458184,0.12136029,0.77060765,0.5890807,-0.3826594,-0.66982037],[-0.5236327,0.1744381,0.2181645,0.23067036,0.3604599,-0.076701306,0.59198534,0.33430535,-0.3067706,0.40997064,-0.025134366,0.43618867,-0.18496975],[0.05840421,-0.04895308,0.13395454,0.1376814,0.007172281,-0.2367984,0.11277437,-0.39632714,0.30861083,-0.18120328,0.32123065,-0.3300665,-0.18326597]],"activation":"identity","dense_3_b":[[-0.044578213],[-0.053736046],[-0.039986763]]},{"dense_4_W":[[-1.1892661,-1.1514404,-0.23770276]],"dense_4_b":[[0.04846745]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A110x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A110x00x00'.json deleted file mode 100755 index cd654f158c..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A110x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.1835976],[0.50364196],[0.2896164],[0.03164149],[0.50323784],[0.5006565],[0.4974164],[0.47733185],[0.4672212],[0.4542667],[0.44199622],[0.03166166],[0.031591646],[0.03152813],[0.031085894],[0.030772492],[0.03049355],[0.030188115]],"model_test_loss":0.019862331449985504,"input_size":18,"current_date_and_time":"2023-08-06_10-03-07","input_mean":[[28.85244],[0.04425216],[-0.0041957223],[0.00189616],[0.043761343],[0.044177886],[0.044471547],[0.042200115],[0.042693224],[0.04143423],[0.039585713],[0.0020322406],[0.0019822456],[0.0019134535],[0.0018024064],[0.0017335061],[0.0015339962],[0.0013252598]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0658591],[0.1936436],[0.4518953],[-0.11609417],[-0.1570751],[0.048095826],[-0.046569347]],"dense_1_W":[[-0.004707457,0.4473956,0.13764602,-0.22395788,0.24242325,0.63776755,-0.08127542,-0.42399785,0.29475614,0.2582357,0.109188624,0.09910998,0.37004673,-0.2302277,-0.70400834,-0.546052,0.023547564,0.4741781],[0.0381955,0.18421915,0.04350661,0.21583354,0.5884542,-0.2158797,0.07718011,-0.5616537,0.9083394,0.28627363,-0.1894099,-0.2100446,0.2202206,-0.1370028,-1.1312602,-0.47487968,0.24832286,0.4408434],[0.7762898,1.0442834,0.11404148,-0.34878308,-0.69273955,0.19884741,-0.1626407,0.13349383,-0.10278405,0.23388162,-0.089451395,0.46177745,0.37723348,0.121763706,-0.13678956,0.17649323,-0.07549353,-0.3959775],[-0.783192,1.122855,0.11342515,-0.24931048,-0.2821019,-0.35657248,0.02068258,-0.05386639,0.06588212,0.02498524,0.044847738,0.4069754,0.47117302,-0.19849198,0.20845832,-0.0699782,0.33122358,-0.6795351],[0.00011326268,1.4474508,-0.098368526,1.2762718,0.11316425,-1.4516851,0.64065456,-0.46301305,-0.8283665,0.27508196,0.18671927,-0.077629045,-0.18879989,-0.3955652,-0.48879743,-0.4056032,0.56802994,-0.11471572],[-0.0065793786,-2.1783507,-4.4956875,0.762094,0.012346029,-0.15102327,0.2524295,-0.28421104,-0.21410158,0.61175346,1.7392899,-0.90156704,-0.70463955,-0.2968591,0.38830018,0.14128718,0.2747739,0.35311458],[0.02353997,0.5450724,-0.0693562,-1.2107227,0.037023995,-0.7917878,-0.85124665,-0.15312323,1.1409906,-0.098705195,-0.6119329,0.6510644,0.5715456,0.6724691,0.14829972,-0.040057376,-0.23069982,0.20904635]],"activation":"σ"},{"dense_2_W":[[-0.36790708,-0.18296367,0.087080166,-0.39760453,0.3830243,0.62241393,0.6919145],[-0.7202243,-0.5884722,-0.15091783,0.2659929,0.25983915,0.5449759,-0.28087506],[-0.21222237,-0.06622563,-1.3436327,0.88072056,-0.46033114,-0.9914056,-1.2281073],[-0.46628833,-0.6112388,-0.7006136,0.045268953,-0.23548295,0.7181559,0.20354599],[1.2175599,0.12018807,1.7073644,1.8852,-2.6759875,-0.3933904,-1.1572093],[1.3216994,0.41956323,0.8226303,0.4240975,-1.5096661,0.27466688,-0.9298248],[0.58509827,0.1648558,-0.6233443,-0.4295914,-0.07741821,-0.24388136,-0.73506886],[-0.04536918,-0.118758574,-0.3014637,0.047318716,0.64757127,0.14709125,0.39016318],[-0.6148649,-0.044658426,0.047632687,0.16062225,0.12757532,-0.034659315,0.21982273],[1.2609576,0.5800496,1.1579013,1.0035592,-1.7974799,0.22080913,-1.1055709],[0.13451947,0.16517463,-0.29923442,-0.058697946,-0.5875903,-0.06878949,-0.14853679],[0.89515847,-0.05425017,-0.032778192,1.0362097,-0.7897799,-0.25606072,-1.7008675],[-0.9417327,-0.41135532,-0.17152491,0.24920806,0.12018676,-0.27114066,0.35788602]],"activation":"σ","dense_2_b":[[0.035452064],[-0.061806444],[-0.30320156],[-0.12731765],[-0.6156671],[-0.28060502],[-0.23378925],[-0.117936365],[-0.048415676],[-0.6017655],[-0.06631394],[-0.66439056],[-0.23023686]]},{"dense_3_W":[[-0.11672003,0.29795578,-0.12456141,0.5381993,-0.53840685,-0.40247312,0.20989291,0.49159276,-0.22878003,-0.042824574,-0.33531192,0.28073245,0.41946027],[-0.32805252,0.475642,0.3573824,-0.49994805,-0.39569223,-0.047109567,0.37351373,-0.48844007,-0.24302717,-0.09685829,0.50959045,-0.5235462,-0.4820086],[-0.39068025,-0.54056823,-0.01175546,-0.18405816,0.17738347,-0.23445752,0.3221799,0.3147654,-0.12418336,0.099429056,0.4175861,0.476971,0.4542602]],"activation":"identity","dense_3_b":[[0.0010864699],[0.0154576665],[-0.007836798]]},{"dense_4_W":[[-0.5562848,0.1392212,0.80414385]],"dense_4_b":[[0.013946899]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A220x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A220x00x00'.json deleted file mode 100755 index a87088b951..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017 b'39990-TLA-A220x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9001546],[0.8910148],[0.3274157],[0.040540826],[0.8834622],[0.88589716],[0.8873834],[0.8764539],[0.8639384],[0.8453592],[0.82689476],[0.040332053],[0.040367138],[0.040403977],[0.040435143],[0.040342487],[0.04024493],[0.04013887]],"model_test_loss":0.020078090950846672,"input_size":18,"current_date_and_time":"2023-08-06_10-28-39","input_mean":[[25.522003],[0.08582278],[0.008883545],[-0.0002037975],[0.08510361],[0.08551095],[0.0860396],[0.08883015],[0.08862984],[0.0864298],[0.085077845],[-0.0002148503],[-0.00018821703],[-0.00016339964],[-6.241602e-5],[-6.687763e-5],[-0.00015304367],[-0.00029702246]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.915253],[2.939623],[-2.4185839],[-0.39643773],[-2.1530814],[0.4893658],[-0.13724159]],"dense_1_W":[[0.9216667,0.97025573,1.421669,-0.1396882,0.010332967,0.18803304,-0.9332185,0.2703217,0.00060562004,-0.12600191,-0.46021286,-0.2240383,0.20271374,-0.51589763,0.6207215,0.44742525,-0.39367884,-0.09291592],[1.6715853,0.7785398,0.005850832,-1.0173491,0.4553079,0.8458037,0.15688483,0.2634571,0.17708033,0.5423796,-0.055217728,0.9168812,-0.05433235,-0.024376664,-0.11111259,0.07965978,-0.23499657,0.3001446],[-0.7692335,0.45367107,1.3062898,0.12114362,-0.17871203,1.0367825,-1.3598495,0.32659042,0.01519312,0.08482268,-0.53881526,0.24113093,-0.12762344,-0.99958193,0.72357845,0.28504324,-0.07869418,-0.2410385],[-0.074967586,-0.8932838,-4.0057364,0.23615836,0.00941108,-0.7341468,0.49867523,-0.9044516,0.017188888,0.23537557,1.3382684,-0.77924585,-0.360125,1.0818274,0.53180915,-0.3764401,0.011514799,-0.08477046],[-1.5886045,1.2000962,0.004453795,-1.3671204,0.4819133,0.9824152,-0.5023873,0.28243682,0.40704778,0.07260184,0.1365017,0.86467725,0.03233452,-0.00952661,0.41033107,0.08297209,-0.46377563,0.34948194],[0.0075910687,2.266687,-0.0016384237,-3.0903444,-0.12066506,1.5151056,-0.63468546,0.5725647,0.6257293,0.4341759,0.15218543,0.8532952,0.8546602,0.40895426,0.53916293,1.0854417,-0.201866,-0.102309674],[-0.0011239403,-0.4433194,0.00013618177,0.07685914,0.44627297,-1.6901579,1.0461199,0.4270096,-0.19944872,-0.11602348,-0.023843208,-0.30021128,-0.7937927,0.82419336,0.41979665,0.24550915,0.12163588,-0.3639143]],"activation":"σ"},{"dense_2_W":[[0.08416271,-0.5661969,-0.094601616,-0.3356624,-0.43013197,0.29852423,-0.8936265],[-0.5426509,-0.31218562,0.1849797,0.92220074,-0.5298976,-0.28005078,0.958257],[-2.0036426,-2.5069656,-0.067196965,0.6672491,2.1173136,-1.5086235,1.268983],[0.8646879,0.21513842,0.4661601,-0.37882644,0.43791708,-0.2726415,-1.1590294],[-0.1635753,0.0068531507,-0.23812433,-0.30881009,0.19607985,-0.5296054,1.3078867],[0.65519524,-0.06720645,0.5960915,-0.5721334,-0.028427409,0.57693595,1.4606386],[-0.8911282,-0.3865244,-0.21443066,0.3449886,0.2604962,-0.21623199,1.1859549],[-0.031681005,-0.001625172,-0.53140074,0.5074547,0.17773396,0.117535636,0.6632053],[-0.0011490636,-0.36523163,0.0739205,-0.64264727,-0.18925111,0.30340505,-0.96839094],[-1.436539,-1.8282489,0.36490238,0.29383078,1.4719483,-1.199148,0.6856162],[-0.19116129,-0.55093837,0.68717355,0.5201886,0.015916765,0.39059064,-1.8648827],[-0.5506419,0.028565405,-0.78308797,-0.22101557,0.26896167,0.5421017,0.4748071],[-0.94420785,-2.5275416,2.1711938,-1.8177447,3.1286716,1.4996614,-2.2908063]],"activation":"σ","dense_2_b":[[-0.00038391305],[-0.11835421],[-0.47617963],[-0.19209594],[-0.3635465],[-0.25211266],[-0.3669457],[-0.18456477],[-0.10934913],[-0.38656622],[0.10978525],[-0.44773534],[-1.3670834]]},{"dense_3_W":[[0.047170885,0.4870071,0.71617556,0.12684053,0.6240494,-0.06735785,0.43605405,0.48105004,0.24143027,0.47041366,-0.81402504,-0.6457708,-0.80621207],[0.6236853,-0.39605463,-1.0041298,0.6159786,0.21967448,-0.37449515,-0.12439844,-0.47799566,0.8507706,-0.0146902865,0.67411196,-0.43745592,0.7313358],[-0.07477755,0.34393924,-0.19138569,0.24039291,0.40378293,0.16958828,0.10585917,-0.04923932,-0.29897973,0.25619817,-0.65909696,0.15387979,-0.470382]],"activation":"identity","dense_3_b":[[-0.12447261],[0.07334185],[-0.15171815]]},{"dense_4_W":[[-0.44094202,0.9386458,-0.12973748]],"dense_4_b":[[0.09239494]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPA-G030x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPA-G030x00x00'.json deleted file mode 100755 index b394c71309..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPA-G030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.034213],[0.75561374],[0.4482074],[0.029542489],[0.7461425],[0.7492127],[0.7519972],[0.75616795],[0.7586054],[0.76215684],[0.7658316],[0.029329019],[0.029394325],[0.029459374],[0.029631147],[0.029686036],[0.02966829],[0.029647704]],"model_test_loss":0.013146449811756611,"input_size":18,"current_date_and_time":"2023-08-06_11-45-32","input_mean":[[22.384304],[-0.09092718],[0.0023652136],[-0.01865998],[-0.0913438],[-0.0915985],[-0.0908737],[-0.090024576],[-0.087187625],[-0.08577747],[-0.08269682],[-0.01866263],[-0.018653778],[-0.01863699],[-0.018579295],[-0.018651243],[-0.018765053],[-0.018734809]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.047012586],[0.92324436],[1.1744541],[0.22243287],[-0.3944335],[-0.34763417],[1.5356755]],"dense_1_W":[[-0.00047711062,0.4344246,-0.003556974,-0.05324533,-0.104414105,1.1889359,-0.56735265,-0.37708575,-0.06931248,0.64209265,-0.22444351,0.38017142,0.09980623,-0.07572917,-0.9272979,-0.089443296,0.0127646355,0.3978492],[1.076277,0.7404641,0.068134926,0.1926029,-0.35190815,1.1527709,-0.7064761,-0.8153627,-0.5065293,0.47775775,0.02251806,0.14456208,-0.043609474,-0.26085764,0.00093237846,0.36519462,0.028837174,-0.4271338],[1.263567,0.35015926,-0.14665723,0.43871006,-0.10830087,0.7354503,-0.9999807,-0.022604555,0.034673784,-0.35979328,0.35240602,-0.18725228,-0.24774587,-0.41631046,0.20720515,-0.0032023392,0.047886286,0.17100596],[-0.00094677473,0.19828819,-1.8369352,0.30248693,-0.54879934,-1.1427166,1.008834,0.21161656,-0.41065678,0.8713622,-0.10214338,-0.40863365,-0.24902351,0.20304148,-0.12075667,0.458101,0.2590354,-0.43551084],[0.6667485,0.91926587,-0.22846676,0.33097208,0.73958164,-1.4895654,1.0193743,-0.5367387,-1.5389364,-0.11664559,0.9663045,-0.51155037,-0.23083033,0.06350666,0.1535683,-0.0091331415,0.19499558,0.03682613],[-0.04119794,0.9239906,2.6969457,-0.25119433,-0.041676786,1.493704,-0.05057316,0.7667589,0.37086174,0.17998935,-0.830209,0.039195158,0.3242035,-0.39648166,-0.05009495,0.03618407,-0.030978123,0.1289426],[1.3126956,-0.55459666,-0.08771991,-0.20699926,-0.049515888,-1.0882213,1.0564349,0.6318207,0.0051460112,0.37931073,-0.39057365,-0.09507244,0.09743938,0.3942499,-0.33766025,-0.32643616,-0.18655044,0.65716547]],"activation":"σ"},{"dense_2_W":[[-0.42937973,-0.1671434,-0.43484113,0.6091573,-0.40485424,-0.54429215,-0.23403765],[0.44798595,0.19865125,-0.28430828,-0.4019087,-0.35975724,-0.1540725,-0.5593976],[0.38287392,0.458221,0.15593868,-0.14855632,0.14968492,0.031657934,-0.36288145],[-1.0350971,-0.5071168,-0.6141563,-0.088436134,0.52254784,-0.8051361,0.45060462],[0.45581025,-0.32779318,-0.7036135,-0.8545516,0.12893179,0.24949677,-1.2301726],[-0.037454057,1.2664734,1.068089,1.4344928,0.36088267,-1.0365765,1.7306651],[-0.122854166,0.12376001,0.48009405,0.109703854,-0.56688136,-0.14703372,-0.024793213],[-1.0537682,-0.46469265,-0.12660673,0.6073404,-0.2877888,0.15866885,-0.14931393],[0.17649716,-3.0929239,-2.3515308,2.8477354,1.1622903,-0.68750924,-0.45515713],[-0.73418194,-1.0775651,-0.7719372,0.16897969,0.3085781,-0.16281687,1.0447707],[0.46595046,-0.3949184,0.18229371,-0.12530676,-0.26597655,-0.0012733624,-0.114680044],[-0.124461986,0.5196014,-0.34539875,0.10735016,-0.06331189,0.4852887,-0.5834995],[0.39723673,-0.09609674,-0.1471512,-0.51641434,-0.2519636,-0.34744382,-0.43439695]],"activation":"σ","dense_2_b":[[-0.11312245],[0.027094306],[0.017765665],[0.044731423],[-0.18022782],[0.09928121],[-0.09837057],[-0.1548419],[-1.0962769],[-0.053587534],[-0.0071940883],[-0.014310544],[-0.03562835]]},{"dense_3_W":[[0.18594098,-0.6818517,-0.12188004,0.65018547,-0.37953106,0.40454167,0.16297354,0.59620595,0.025523338,0.44727668,0.1114748,-0.48999,-0.062479552],[0.29692125,-0.21146217,-0.5138796,0.6005236,-0.7997973,0.20368089,-0.22437662,-0.2668092,0.8479786,0.28527832,-0.6137382,0.43294674,-0.24874023],[-0.27988523,0.5345244,0.52841073,0.26012418,0.5051741,-0.47729176,0.04220592,-0.024942419,-0.9326824,-0.69562954,-0.09658818,0.2498976,-0.07045708]],"activation":"identity","dense_3_b":[[-0.060025424],[-0.049905777],[0.058896556]]},{"dense_4_W":[[-0.78769284,-0.9394558,0.4579486]],"dense_4_b":[[0.05315631]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPG-A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPG-A020x00x00'.json deleted file mode 100755 index 19fe18efd7..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019 b'39990-TPG-A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.299596],[0.7368779],[0.3343281],[0.038595177],[0.74043566],[0.73867756],[0.7369786],[0.7199797],[0.7073316],[0.692301],[0.6776942],[0.038740512],[0.038692366],[0.038640175],[0.038314454],[0.038039386],[0.037639543],[0.03721186]],"model_test_loss":0.0196799598634243,"input_size":18,"current_date_and_time":"2023-08-06_12-10-34","input_mean":[[25.72662],[0.05758428],[0.0074817957],[0.00042151322],[0.054403115],[0.054942675],[0.055003498],[0.05778212],[0.058146343],[0.055029176],[0.052427325],[0.00031705483],[0.00029397535],[0.00027291433],[0.00026472707],[0.00016882192],[-7.878055e-5],[-0.00038947008]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.24635658],[-2.3609567],[0.8278294],[1.8481108],[-0.0009179342],[-5.722017],[-0.38498595]],"dense_1_W":[[-0.3599328,-0.22590983,-1.5835724,-0.45297816,-0.39821658,-0.84838223,1.0513067,-0.6676435,-0.3157859,0.36385095,0.60838795,-0.36815816,0.40623605,1.0187281,-0.8164682,0.725533,-0.109838545,-0.119914874],[-1.4658633,0.8083861,1.0365679,0.96016145,0.032342948,0.61396354,-0.7277645,0.117941886,0.31804556,0.06370998,-0.3070831,0.049492776,-0.5002591,-0.41411608,0.03904327,-0.024719765,0.01514654,-0.15549083],[1.6183398,1.3368306,-0.1774287,0.22880824,0.05070626,-0.26586214,0.6101463,0.20884643,0.13692065,0.27627236,-0.06529142,-0.047958486,0.45105627,0.6535041,-0.70374006,0.008929227,-0.6404756,-0.76474065],[2.0271378,-0.26031396,-1.3868793,1.0859234,-0.20835875,0.2494928,-0.80513215,-0.44871587,-0.146529,0.26627505,0.12287333,0.31685492,-0.6343925,-1.0001003,0.31669822,0.13197689,-0.18177116,0.01344866],[-0.004777084,0.52823824,-0.004140687,1.4137487,0.4144139,-1.1794671,-0.8262742,0.68985987,0.17687458,0.017687704,-0.3234715,-0.41124478,-0.74011046,-0.7056069,0.7699347,-0.18429211,0.079565994,-0.069221176],[-2.434899,1.0662471,-1.7045196,0.9491714,-0.4924587,-1.0995914,-0.13104963,-0.5397869,-0.56282854,-0.28371578,0.5355493,0.1188877,-0.3160381,-0.19142266,-0.8446787,0.21822764,-0.13194595,0.25231192],[-0.63578004,0.10998647,-1.5226461,0.2984399,-0.49102226,0.18339495,-0.71859634,-0.36171985,0.19367056,0.30713537,0.3568834,0.034046147,-0.028167615,-0.20357361,-0.037238467,0.22969781,0.55273587,-0.56385]],"activation":"σ"},{"dense_2_W":[[-1.1939403,0.627583,-0.29303935,0.31645858,-0.28299263,-0.20175016,0.27266392],[-0.35470998,0.5116036,-0.21302372,-0.2682391,-0.6379024,0.19036521,0.16326782],[-1.0515031,0.0016675633,-0.328475,0.5562253,-0.21258254,-0.58660126,0.28343913],[0.30803204,-1.06867,-0.17983183,-0.25306872,1.4627538,0.0038065887,-0.014348506],[0.6233269,-1.2878839,-0.005203554,-0.70451117,1.1213775,0.103565186,0.059290078],[-0.22157122,1.0198585,0.11228626,0.16640806,-1.4210382,-0.23331583,0.19227381],[-0.51894325,0.7483681,0.3329935,0.4065807,-1.060425,-0.07506867,0.37457123],[-0.10200199,-0.080105394,0.19919048,-0.5509593,0.11211719,-0.5586402,-1.0667413],[-1.0931015,-0.064168,-0.80489373,-0.41687313,-0.41320696,-0.33071667,0.742609],[-0.039056696,-0.54934025,0.22863005,-1.4414634,0.55120647,-0.38611275,-0.7619764],[1.028561,-0.8452004,0.035485722,-0.2982418,0.9679217,0.684532,-1.0359311],[0.372593,-1.0716276,-0.57134145,-1.3408467,1.7297199,1.9872373,-0.7560159],[1.0906591,-1.6118517,0.19121306,-0.9672179,0.58213896,0.7299898,0.15404381]],"activation":"σ","dense_2_b":[[-0.090343356],[-0.08339459],[-0.0072327256],[-0.13952537],[-0.3003466],[-0.035847075],[-0.20601946],[-0.23709813],[-0.14278656],[-0.34552336],[0.06587117],[-0.3463747],[-0.2306921]]},{"dense_3_W":[[-0.2524472,-0.27034226,0.6634469,-0.746348,0.25183922,0.6880417,0.85341954,-0.31553096,-0.12491534,0.45396265,-0.4605119,-0.58887863,0.27989408],[0.2640799,0.35472974,0.70435447,-0.70013833,0.13855529,0.36433235,0.056772206,-0.40470412,0.18910164,-0.14314908,-0.7391794,-0.8970169,-0.25722122],[0.53352684,0.34132504,-0.5049692,0.14928706,-0.51827705,0.7143463,0.5245271,0.32858804,0.5338223,-0.07519559,0.05255393,0.14157031,-0.27464214]],"activation":"identity","dense_3_b":[[0.073314704],[-0.005890205],[-0.042565797]]},{"dense_4_W":[[0.18600833,0.98189795,0.93567103]],"dense_4_b":[[-0.032305032]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA HRV 2019 b'39990-THX-A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA HRV 2019 b'39990-THX-A020x00x00'.json deleted file mode 100755 index 5b0e745ae2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA HRV 2019 b'39990-THX-A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.196055],[0.87593496],[0.33765027],[0.04197189],[0.886328],[0.8834333],[0.87928975],[0.85071605],[0.8310174],[0.8089368],[0.7878991],[0.041903123],[0.041929454],[0.04194031],[0.04174096],[0.041557845],[0.041190308],[0.040708046]],"model_test_loss":0.01768307387828827,"input_size":18,"current_date_and_time":"2023-08-06_14-17-31","input_mean":[[27.28112],[0.05775289],[0.0292109],[0.0014245252],[0.04902593],[0.05110525],[0.053358402],[0.06730357],[0.07672258],[0.086834796],[0.09349608],[0.0012768332],[0.001302666],[0.0013326345],[0.0014557338],[0.0014853236],[0.0014835508],[0.001441598]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.4649247],[0.16453019],[-0.28886992],[-0.3648863],[-0.42144147],[1.2591343],[0.26168013]],"dense_1_W":[[0.65970325,0.3643967,-0.0078023723,-0.3371772,0.44859505,0.13993022,-0.59133023,0.06776411,0.40852416,0.2055092,-0.22950652,1.1044699,-0.061070323,0.018156692,-0.92917067,-0.29989886,-0.24349432,-0.2445954],[0.0043564676,0.14943714,1.5694466,0.54570717,0.23205929,0.23940374,-0.8834056,0.29886281,0.13640915,-0.07918449,0.06823687,0.4230718,-0.20778643,-0.80100656,0.067888916,0.013294644,-0.17124765,0.11134056],[-0.004692583,0.8932629,-3.326059,-0.13999403,0.71647453,0.7221725,-0.42850545,-0.27863225,-0.17863697,-0.19051133,-1.0301774,0.54785955,0.09839519,-0.52338004,-0.028131597,0.10106243,-0.26319197,0.2228086],[-0.13291039,-0.4817582,0.0022403449,-1.604327,-0.1416615,0.6045698,0.6883181,-0.09455803,-0.119714886,-0.031930104,0.16707899,1.219931,-0.027221087,0.2683029,-0.017352045,0.0354093,0.08798443,-0.011031896],[-0.0001811604,-0.55647755,-4.251647,0.10555062,1.2620865,0.87399095,1.7948182,0.5045302,-2.1733336,-1.323175,-0.20426413,-0.8539617,-0.42787957,0.87268126,0.50717103,0.21002649,-0.043627627,-0.31594208],[-0.7002713,0.0439368,-0.007873659,-0.15335229,-0.08326318,0.8655352,-0.4760854,-0.06738273,0.33060014,0.61478436,-0.43724525,0.8940125,0.14382815,-0.5073753,-0.16832146,-0.39969006,-0.77300745,-0.07796513],[0.18735953,0.5023311,-0.00044152042,0.6289259,-0.7044324,0.8138658,0.3475159,-0.48989236,0.070642374,-0.012694965,0.0680297,0.7051084,-0.33375153,-0.81817293,0.061156776,-0.22678623,0.075785585,-0.11933581]],"activation":"σ"},{"dense_2_W":[[0.44918334,-0.44261467,-0.37257126,0.06871936,-0.76875246,-0.02301384,-0.45431],[-0.028300185,0.74804,0.16640806,0.42070544,-0.45251933,-0.21348317,0.6122552],[-0.75886244,-0.4412132,-0.88113075,-0.5994053,0.81894237,0.0319869,0.07787325],[0.016850863,-0.46549502,-0.84523696,-0.4440643,-0.08756868,0.010443555,-0.11621737],[-0.11881556,0.04645116,0.035857048,0.5879231,0.10456129,0.2670699,0.30576423],[0.18244462,-0.18358052,0.63081473,0.678613,-0.065976664,0.5200684,0.0114103705],[0.17458354,-0.758713,-1.1933472,-1.2458708,2.0880768,-0.35880476,0.043243304],[0.6276925,0.3325886,0.42858002,-0.19699302,0.26399422,-0.5362572,-0.32001755],[0.019581828,-0.7625633,-0.43383184,-0.56120574,0.28209898,0.18763974,-0.48512912],[-0.72589034,-0.39149624,-0.69566345,0.25285095,0.9949407,-0.6764689,-0.86815906],[-0.229745,-0.04891058,-0.23069735,0.05986481,0.24995661,0.65987855,0.42597428],[0.21872666,-0.2117571,0.25106636,0.69597656,-0.34293714,0.08462207,0.626666],[-0.28573155,-0.4643647,-0.40302104,-0.41738722,0.75807416,0.047476795,-0.82152224]],"activation":"σ","dense_2_b":[[-0.040295057],[-0.038580682],[0.41026086],[0.13927889],[-0.051729757],[-0.19358195],[1.3526292],[-0.060473673],[0.15599808],[0.31490785],[-0.026681194],[-0.103706256],[0.075545505]]},{"dense_3_W":[[-0.19065312,-0.68438256,-0.1597246,0.23868644,0.2844928,0.24808933,-0.33611223,-0.09016653,0.7001218,0.3639498,0.2646331,-0.4721014,0.4990256],[-0.31301543,-0.42533165,-0.35976458,-0.23861757,0.4356561,0.6322021,-0.6240161,-0.16950898,-0.17745121,-0.17519787,0.5549622,0.65472394,0.46188885],[-0.048509836,0.6186861,-0.56957906,-0.63238627,0.35587925,0.47782204,-0.622644,0.1277044,-0.32014754,-0.24985255,0.19653115,-0.11492239,-0.59642744]],"activation":"identity","dense_3_b":[[-0.0043907734],[0.0006517651],[0.0069493363]]},{"dense_4_W":[[-0.6007436,0.5252799,1.091879]],"dense_4_b":[[0.0049111033]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019 b'39990-TXM-A040x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019 b'39990-TXM-A040x00x00'.json deleted file mode 100755 index 4957b7620b..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019 b'39990-TXM-A040x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.561399],[0.9560459],[0.31967336],[0.04428853],[0.96082354],[0.95901185],[0.9568036],[0.9313539],[0.9091667],[0.8810181],[0.8528346],[0.04422074],[0.04421771],[0.04421117],[0.043970585],[0.043718267],[0.04335803],[0.04287711]],"model_test_loss":0.043126773089170456,"input_size":18,"current_date_and_time":"2023-08-06_15-33-56","input_mean":[[26.94165],[0.021270154],[0.0046278955],[-0.009065303],[0.021303134],[0.021765355],[0.021796774],[0.022019608],[0.023005532],[0.02868764],[0.03272592],[-0.009263705],[-0.00921664],[-0.009177719],[-0.009201262],[-0.009262942],[-0.009267896],[-0.009328963]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.8717046],[1.401547],[-3.6374924],[0.011636128],[-0.010584985],[-0.1608906],[-3.4310641]],"dense_1_W":[[1.1484131,0.2360844,-1.2279263,0.6593642,-0.706906,0.57722515,-1.5107461,0.148039,0.48555797,0.14457138,-0.4081769,0.12444598,-0.5787572,-0.6569945,-0.012713922,0.6449968,-0.18181801,0.03532019],[0.83998966,-0.7946136,-1.1200137,0.31668094,0.31830063,-0.95925987,0.99205875,-0.60420567,-0.1273,-0.11898313,0.2820395,-0.71049374,-0.48740363,0.55304694,0.13322441,0.119103864,0.31011325,-0.21130522],[-1.4661362,0.23715574,-1.2752273,-0.041717865,0.2500426,-0.56513333,1.121119,-1.1740829,-1.4563355,-0.31711218,1.0432303,-0.606916,-0.4165662,0.40286353,0.2652817,0.29227725,0.57232744,-0.4241923],[-0.014610312,2.4209461,-0.0010322147,-0.48897117,-1.4935441,1.4336565,0.21062562,-1.205451,-0.3245356,0.69025,-0.1866847,0.47154546,-0.33315396,0.31453168,-0.23816307,0.23188154,0.21139425,-0.31219307],[0.0049821893,-1.9138168,0.0008263949,-0.6567317,-0.6164778,2.2373643,0.1648842,0.29560664,-0.15978582,0.13433349,0.09199213,0.7548104,0.8661949,-0.5156456,-0.84439373,-0.769481,-0.13660415,0.8850856],[-0.04535164,-1.3319466,-5.446676,0.7491545,1.40338,-0.27946347,0.58855826,-1.6417941,-1.3516777,-0.061358944,1.9686421,-2.0562751,-0.9776005,0.5102906,0.71488136,0.8446566,0.029088987,-0.0021240264],[-1.6955886,1.0932087,1.2057613,1.2197119,0.26736736,0.40396026,-1.1926581,-0.027528899,0.41201085,0.04445834,-0.17239684,-0.047891464,-0.2615087,-0.34971696,-0.186749,-0.07132908,-0.2368726,-0.10784222]],"activation":"σ"},{"dense_2_W":[[-1.013594,0.5034582,-0.95556456,-0.08708601,-0.8562468,0.16710468,0.07527283],[0.6687172,-0.7619872,-0.53848594,0.6010305,0.9034991,0.014348103,-0.593205],[-0.860986,0.6847677,0.3897247,-0.18235233,-0.56724346,0.42058796,-0.9473925],[-0.57470554,0.049254473,-0.3956524,-0.27702963,-0.1518893,-0.22931539,0.0917812],[-0.7363305,0.19133672,-0.47538042,-0.037515156,-1.0081038,0.37126565,-0.02480417],[0.058126763,-0.3683029,-0.31503877,-0.33700588,0.28384364,-0.41182697,0.21078625],[-1.699499,0.43488288,3.1312578,-2.43165,-0.23042913,1.4457437,-0.23582318],[1.1079293,0.21069455,-0.10997463,0.67785615,-0.1292696,-0.19016528,0.23199928],[-0.18085922,0.26667058,-0.11703674,-0.13090491,-0.98974144,0.2998666,-0.34656715],[0.56333655,-0.9618346,0.17298692,0.49641728,0.3144268,-0.17813024,0.25162554],[-0.18821634,0.47741577,-0.53012407,0.021764161,-0.90728444,-0.15855366,-0.4862484],[-1.1602566,0.254095,-1.2540381,-0.8706271,0.036233105,-0.36567953,0.12120533],[-0.3278052,-2.3773234,0.59865904,0.86674654,0.14178967,-1.3721049,1.4259635]],"activation":"σ","dense_2_b":[[-0.013262277],[-0.22405964],[0.09981698],[-0.04231693],[-0.027923957],[-0.10180608],[-0.8146485],[0.0004782006],[0.038938325],[-0.23186892],[-0.031742647],[-0.032234117],[-0.57888836]]},{"dense_3_W":[[0.58763653,-0.32315147,0.1878662,-0.2600824,-0.02019101,-0.4588076,1.4286964,-0.16221656,0.019991938,0.1896809,0.17505044,-0.06803269,-0.3277477],[0.31274745,0.08359626,-0.48973972,0.19148718,-0.022602405,-0.10987586,-1.4325415,-0.11361555,-0.1394098,0.47897077,-0.15372795,-0.7521875,0.5662985],[-0.41849798,0.636405,-0.480077,-0.29047763,-0.3423191,-0.06704497,-0.5570328,0.70148677,-0.62109405,0.680771,-0.6235916,-0.40535742,0.8969159]],"activation":"identity","dense_3_b":[[0.11709517],[0.070712626],[-0.017060732]]},{"dense_4_W":[[-0.14990221,0.26407397,0.9163793]],"dense_4_b":[[-0.008794706]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019.json b/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019.json deleted file mode 100755 index 7125acea96..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA INSIGHT 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.603165],[0.968196],[0.31648555],[0.043116625],[0.97207046],[0.97122186],[0.9696193],[0.9440986],[0.9209154],[0.89170784],[0.8635297],[0.0430813],[0.043076806],[0.043065626],[0.04281562],[0.042584687],[0.0422511],[0.041811552]],"model_test_loss":0.0409439355134964,"input_size":18,"current_date_and_time":"2023-07-18_02-56-25","input_mean":[[26.58399],[0.02317232],[0.002863659],[-0.0103310775],[0.023948237],[0.024388459],[0.024497893],[0.02269405],[0.02217117],[0.02469916],[0.02554692],[-0.01046288],[-0.010425196],[-0.010389729],[-0.0103868665],[-0.010423806],[-0.010380345],[-0.010442573]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.7315183],[-2.0931118],[-0.08195505],[-0.07830412],[0.17271917],[-4.8443527],[1.3409065]],"dense_1_W":[[1.3492318,0.050542787,-2.0778215,0.23633496,-0.18946455,0.08569419,-1.1538246,-0.56782997,-1.1068271,-0.28026178,0.6351039,-0.5325991,-0.16680008,-0.6554269,0.7481424,0.39339453,-0.037751142,0.12015114],[-0.8597578,1.2366588,1.7126143,-0.63454264,-0.43808976,0.8164015,-0.69233084,0.61550444,0.9666506,0.42250025,-0.7908081,0.5167161,0.30983937,0.048737403,-0.14529826,0.22033516,-0.09019369,-0.3203758],[0.051401302,1.1819376,5.170329,-0.33289638,-1.3051468,0.29249665,-0.37950587,0.86728233,1.2912674,0.83467674,-2.1016138,1.439997,0.83915204,0.022718783,-1.1455536,-0.6881879,-0.294737,0.1764151],[0.13776821,-0.616747,-0.0515103,0.09284325,0.5059833,-2.2745788,0.8794392,0.23675422,0.050319634,-0.16485108,0.022945715,-0.55973744,-0.19152954,0.5871755,0.48204577,0.43679258,0.084300846,-0.48278216],[0.32304537,-0.17996605,-0.050503615,0.057818476,-1.1874164,0.93133926,-1.135065,-0.2207176,0.5842914,0.26639673,-0.4034041,0.74324435,-0.26271045,0.25194508,-0.33687708,-0.11164587,-0.21532725,0.31314066],[-2.675871,0.18930794,0.004894184,0.36429468,-0.28649125,1.037061,-0.8956486,-0.2692209,0.13867386,0.14524221,-0.07555664,0.13616084,-0.29872495,0.0028986863,-0.50115776,0.32039323,0.062777095,-0.08310216],[0.82229155,0.4732484,1.5131059,0.062322427,-0.036212314,0.24138685,-0.46806708,0.7292275,1.3152804,0.55548984,-1.013016,0.65633196,0.2736623,-0.5331334,-0.49591142,0.22494234,0.028473936,-0.29246685]],"activation":"σ"},{"dense_2_W":[[-0.07206964,-0.69786,-0.3486531,0.48960513,-0.0696577,-0.49357864,0.2556807],[-0.2884806,-0.41657805,-0.3665416,0.15454409,-0.028397316,-0.2936546,-0.16180961],[0.803782,-0.27441671,0.8961105,-0.4721216,0.7000408,0.5584937,0.4574221],[0.2588418,0.21096861,-0.08602997,-0.7243836,0.6489519,1.1368387,-0.47698346],[0.5214179,-0.4379109,-0.10204686,0.5734521,-0.5929383,-0.35884753,0.059597526],[0.7346847,-0.71839786,-0.044602457,-1.2187109,-0.13774236,-2.6510515,-0.51899457],[-1.7133079,-4.6997886,-0.25009632,0.4603738,-0.87082464,3.0611444,-3.0963175],[-0.048846636,0.91797,-0.31641433,-0.20087503,0.10279341,0.38753894,-0.038774494],[0.15197727,-0.81371284,-0.12212125,0.7514405,0.32369855,-0.2520269,-0.50490427],[0.25197092,0.8954266,0.3530475,-0.9002343,-0.6774651,0.55687094,-0.2753792],[0.9715217,0.11435808,0.7430187,-0.18673508,0.24399346,0.75376093,0.18281539],[0.07828533,0.40924087,-0.0052447147,-0.87007385,-0.16614385,0.75889,-0.09113192],[-0.42538083,-0.6130854,-0.18442006,0.81436867,-0.4363763,-0.4421119,-0.20321086]],"activation":"σ","dense_2_b":[[0.21890728],[-0.08548715],[-0.08091435],[-0.101685315],[0.10115151],[-0.14451991],[0.54433477],[-0.21013816],[-0.0104931025],[-0.4982431],[-0.1676464],[-0.31867242],[0.17811179]]},{"dense_3_W":[[0.7400645,-0.16807431,-0.12028546,-0.58515614,0.34891638,-0.5609874,0.7747953,-0.06871472,-0.044812664,-0.26168486,-0.2864116,-0.4026426,0.7852125],[0.13187477,0.58926487,-0.62580276,-0.043964617,0.5385393,0.07869039,0.43877578,-0.6161494,0.4016125,-0.06597045,-0.4159714,0.23538205,0.7423825],[0.11068092,0.26080158,0.051800307,0.3499296,-0.56061244,0.5514093,-1.840586,-0.14135396,-0.050766982,0.4223278,0.39574477,0.30749676,-0.8040509]],"activation":"identity","dense_3_b":[[0.034426726],[0.022138074],[-0.039126255]]},{"dense_4_W":[[-0.8798318,-0.64988774,0.49071792]],"dense_4_b":[[-0.03172631]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018 b'39990-THR-A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018 b'39990-THR-A020x00x00'.json deleted file mode 100755 index 690b647429..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018 b'39990-THR-A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.624078],[1.0587155],[0.30083516],[0.047404915],[1.0569501],[1.0572157],[1.0565227],[1.0357862],[1.0151423],[0.9855047],[0.9551931],[0.04727608],[0.047284212],[0.047292266],[0.047139347],[0.046923578],[0.046476692],[0.045933507]],"model_test_loss":0.03084651380777359,"input_size":18,"current_date_and_time":"2023-08-06_16-32-16","input_mean":[[24.835194],[0.0007982536],[-0.006176701],[-0.0052586584],[0.00027294309],[-0.0003220067],[-0.0009233009],[-0.0011664837],[-5.9159433e-6],[0.00031557973],[0.0022665297],[-0.005350762],[-0.005354779],[-0.005356321],[-0.0052974457],[-0.0052572815],[-0.0053089443],[-0.005361436]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.3534836],[-0.029432654],[1.8868316],[-0.09822117],[-2.4564312],[-0.062489524],[4.9500136]],"dense_1_W":[[1.3379444,-0.023224303,0.92547566,0.23139125,0.49582657,-0.19798304,0.17489886,0.19757572,0.4532939,0.05501206,0.44625548,-0.37186652,0.23857181,0.08223163,-0.40953666,-0.31662405,0.36565343,-0.02073929],[0.0018158369,-0.46781677,0.014307537,0.7127616,-0.183635,-0.75742817,0.6894066,0.24744697,-0.17661563,-0.27236703,0.15312704,-0.57848364,-0.5893935,0.2702419,0.44554567,0.22370823,-0.226104,-0.09203226],[1.799059,-0.198707,-1.016055,-0.011727806,-0.029179385,0.14295676,-0.29293978,0.17230937,-0.47932827,-0.69661826,-0.093703836,0.18523113,-0.10232647,0.03687105,0.44274545,-0.19036789,-0.29666153,0.107951805],[-0.003098032,-0.24532981,-0.017002787,-0.5023018,0.39906764,-1.200529,0.4519783,0.4683689,-0.14362553,0.06751771,-0.17091979,0.3470844,-0.1885182,0.16463032,-0.009498001,-0.10712965,0.6976556,-0.33137426],[-1.357193,0.119205914,0.77373636,0.08123809,-0.53554714,0.04073674,0.14673577,0.47008705,0.36763436,0.7785362,-0.2854519,0.033120852,-0.38505244,-0.0073482324,-0.027826203,-0.18191494,0.7202002,-0.36105922],[0.011540895,0.42653874,3.4537587,-0.14331447,0.17654268,-0.25341675,-0.9539831,0.67298365,0.9465182,0.5915356,-1.033552,0.40142527,0.23822671,-0.1597271,-0.6579629,-0.23393449,-0.18252316,0.27954388],[2.213533,1.03911,1.1523687,-0.7107895,-1.6353345,0.7368801,-0.029617624,0.59569466,-0.3488169,1.8759083,-0.59652627,-0.33486545,-0.16461614,0.23255706,0.38946012,0.0076609664,1.2241695,-0.82663125]],"activation":"σ"},{"dense_2_W":[[-0.38179168,-0.03762462,-0.16407442,0.22533777,0.21200526,-0.75755686,-0.70566297],[0.23745127,0.79392534,-0.13295732,0.2560252,-0.525396,-0.3199242,-0.37806568],[-0.07160659,-0.8020838,0.9527979,-0.8270174,0.4712437,0.30625376,0.11045921],[-0.760045,-0.27719706,-0.10346,-1.3937811,0.93653303,0.7137455,-0.27598134],[-0.47952121,-0.6838305,0.20842296,-0.347254,0.57235146,0.32606634,-0.29145405],[-0.75135994,0.47685748,-0.6925233,0.6067481,-0.47287223,-0.6708088,-0.5606238],[-0.1407047,-0.042412486,0.19884428,0.6875437,-0.051208068,0.089406244,-0.25268498],[0.15601759,-0.5533243,0.65179765,-0.9195583,0.54043883,-0.31588987,0.042402852],[0.016135221,0.43866783,0.14963633,0.45334944,-0.13526076,-0.47658014,-0.27877006],[-0.6760022,-0.99107736,-0.0065089352,-0.7310922,1.198063,0.26301616,0.15857588],[-0.53217345,0.08108589,-0.42232883,0.2585569,-0.6059891,-0.16030814,-0.38680902],[0.20514117,-0.7086649,0.30526543,-1.014871,0.70494556,-0.1754464,0.6393286],[-0.44732463,0.7236195,-0.20577241,0.6082023,0.08172972,-0.12622307,-0.26760522]],"activation":"σ","dense_2_b":[[-0.23157027],[0.10348182],[0.103248015],[-0.25145143],[-0.16215345],[0.05333198],[-0.007814407],[-0.12305106],[0.015793381],[-0.11626731],[-0.21887426],[-0.013616658],[-0.045431573]]},{"dense_3_W":[[0.11133691,-0.7149343,0.6122002,0.5992357,0.48934844,-0.8058861,-0.61579424,-0.20425087,0.0400084,0.7586056,0.21969084,0.73337686,-0.5684788],[-0.32940114,0.5844858,0.33521906,-0.1380717,-0.15706351,0.44334856,-0.03572488,-0.44520766,0.33684713,-0.0387427,0.3344798,0.22412832,-0.34584302],[0.41397762,0.5771128,-0.17538065,-0.2331263,0.2025833,0.167861,-0.30182636,-0.55495805,0.4524257,-0.08304705,0.5681975,-0.48104328,-0.034903586]],"activation":"identity","dense_3_b":[[-0.029943425],[-0.01140329],[0.025632406]]},{"dense_4_W":[[1.1838417,-0.092230946,-0.76815987]],"dense_4_b":[[-0.028896004]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A040x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A040x00x00'.json deleted file mode 100755 index 9f7945bc6c..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A040x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.3870325],[0.88046026],[0.31456453],[0.045971613],[0.8823275],[0.88133013],[0.8802286],[0.85606366],[0.83917105],[0.81649935],[0.7949408],[0.045805056],[0.045844175],[0.045870136],[0.045709606],[0.045540884],[0.04515765],[0.044633806]],"model_test_loss":0.03413263335824013,"input_size":18,"current_date_and_time":"2023-08-06_18-19-42","input_mean":[[23.715818],[-0.030671604],[-0.0010694538],[-0.002801656],[-0.03120858],[-0.03159417],[-0.032069772],[-0.028450362],[-0.02625614],[-0.023662683],[-0.020763114],[-0.002952926],[-0.002957236],[-0.0029530823],[-0.002849485],[-0.0027969833],[-0.0027900888],[-0.002775541]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.030706996],[-0.037872314],[-0.05548866],[3.9280896],[0.7474149],[0.90278316],[3.6281414]],"dense_1_W":[[0.024131007,1.1437668,5.7560873,0.15635465,-0.29974687,0.29323357,-1.209728,-0.08944458,0.8328114,0.55170995,-0.49652693,1.7797251,0.356449,-0.22379819,-0.6863433,-0.7702987,-0.084863424,-0.71548474],[0.039950125,-0.1556448,0.90247494,-0.21784821,0.081626974,0.20843558,1.5873073,-0.3335005,-0.6408446,-0.004191309,-0.01373474,-0.3732137,0.0840519,0.481374,0.0065601915,-0.0018563746,-0.11723978,-0.15687008],[-0.041693777,0.8153725,-0.93551993,0.8342616,-0.9125522,-1.0517205,0.80132794,-0.33272502,-0.5316489,-0.020130547,0.51738137,-1.1073763,-0.06170218,0.75484115,-0.099664174,0.078711264,-0.3155204,0.23027797],[1.347042,0.35269168,2.0550568,-0.19498034,0.82868904,0.7170074,-0.6723933,0.46272853,0.51815087,0.19424136,-0.32263738,0.5095938,0.105270185,-0.3356029,-0.6227554,0.18846878,0.35004437,-0.55869645],[-0.68249965,-0.7106739,-0.00091033557,-0.1215673,0.15705624,-0.83085936,0.22485417,0.6567156,0.13330625,-0.08166536,-0.17778291,-0.45113075,-0.04207592,0.35418072,0.21138912,0.44137782,0.0059437924,-0.133213],[-0.6332932,0.5227072,-0.0001976942,0.34365958,0.32673892,0.2907148,-0.113340415,-0.39088866,-0.26699466,-0.05758928,0.29842612,0.024981031,0.13643564,-0.099530175,-0.41440305,-0.029128596,-0.51134044,0.29531562],[1.258255,-0.44770962,-1.8778437,-0.04598984,-0.900177,-0.19406404,0.4236334,-0.42944542,-0.32314876,-0.38610578,0.3892241,-0.43024847,0.047275137,0.42269197,0.073702455,0.19503468,-0.13383509,0.37180188]],"activation":"σ"},{"dense_2_W":[[-0.6328002,-0.2733073,-0.91156006,0.084900156,0.24577273,0.21559577,-0.45250878],[0.31812322,-1.1152663,-0.6027436,0.2201572,-0.53793555,1.0482581,-0.9947389],[0.15643081,-1.0215927,-0.24996142,-0.19163433,-1.1767645,0.20719749,0.052449297],[-0.64238095,0.6003157,0.50265914,-1.0465411,0.7531211,-0.8987147,-0.47903138],[-0.045131184,-0.89249134,-0.2586124,-0.3946543,-0.66559446,0.7098345,-0.35624668],[0.01925909,0.70794433,0.6441276,0.05606592,0.5759388,-0.44503638,-0.16193989],[0.106712155,0.49243534,0.91235846,-0.508013,-0.17323163,-0.39521646,0.27420443],[0.14106807,-0.38276723,-0.74229676,-0.17772292,-0.2867895,0.07301143,-0.5713336],[-0.3910647,-0.331973,-0.71291363,0.44479296,-0.372079,0.43584257,0.23784764],[0.6200412,-0.46858776,-1.0548015,-0.37598544,-0.95491964,0.7775705,-0.32049537],[-0.5429174,-0.33909863,-0.51903373,-0.53528494,-0.9287474,-0.050585847,-0.24405093],[0.08782715,-0.5397067,-0.39007556,-0.11375101,-0.4224178,0.72133744,-0.851765],[0.23905222,-0.28642985,-0.86665606,0.44080213,-0.5833951,0.714745,-0.7849159]],"activation":"σ","dense_2_b":[[-0.28084794],[0.035663433],[-0.17919558],[-0.14884101],[-0.19750093],[-0.05943652],[-0.010351563],[-0.13942906],[-0.26031336],[-0.12523566],[-0.32246646],[-0.19670182],[0.03445928]]},{"dense_3_W":[[-0.54237396,-0.12057569,-0.33454332,-0.22615993,-0.5465151,-0.14707579,0.05022189,0.56217587,-0.17346314,-0.24858905,0.34007478,-0.00070786034,0.52975553],[0.5001979,0.41751292,0.6217282,-0.7284195,0.47918427,-0.6284354,-0.34686244,0.010521516,0.46527955,0.300923,0.1515217,0.24209905,0.6725099],[-0.36316845,0.706709,-0.09291999,-0.8208684,0.164437,0.1152729,-0.014193419,-0.3382088,-0.5153448,0.64160955,-0.4063204,-0.023448244,-0.27234897]],"activation":"identity","dense_3_b":[[-0.04338367],[-0.095272206],[-0.045654554]]},{"dense_4_W":[[0.4292374,1.7759846,0.5118597]],"dense_4_b":[[-0.059387]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A060x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A060x00x00'.json deleted file mode 100755 index 52fbc920a8..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A060x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.0581903],[0.92126673],[0.29617915],[0.04191473],[0.9171323],[0.9183279],[0.9188417],[0.9060646],[0.89225584],[0.87377656],[0.85549104],[0.04186598],[0.041867044],[0.041861024],[0.041707642],[0.041504312],[0.04113141],[0.040689647]],"model_test_loss":0.024623241275548935,"input_size":18,"current_date_and_time":"2023-08-06_18-45-10","input_mean":[[26.12887],[-0.018342948],[0.0023950052],[-0.00060018164],[-0.020283561],[-0.020622766],[-0.020715354],[-0.020511365],[-0.020389233],[-0.020154186],[-0.019204807],[-0.0007310425],[-0.0007260691],[-0.0007204341],[-0.0006898669],[-0.00067769137],[-0.0007068316],[-0.0007057846]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.34347212],[-0.04366823],[3.8996286],[-3.2322345],[0.0011430938],[0.31775263],[0.02871207]],"dense_1_W":[[-1.2845949,0.13241255,-0.00054695434,0.30559602,-0.457657,-0.50316894,0.41611654,0.76597494,-0.020354524,-0.1652268,-0.1537093,-0.95382077,-0.4738125,0.2229064,0.497753,0.5096397,0.2834458,-0.39443842],[-0.01576654,1.0631088,-0.0001952519,0.2668259,0.5884113,0.42140722,-1.0702667,0.06912717,0.29095903,-0.16439292,0.07887146,0.29752833,-0.5947841,-0.45468485,-0.29552692,0.02692619,0.34921086,-0.04025514],[0.918351,-0.39751226,-2.0331492,0.636789,-0.6820441,-0.2611252,0.43445766,-1.2055922,-0.8403307,-0.123105325,0.5316267,-0.883859,0.15459336,0.32164282,0.28913066,0.20976447,0.02999975,0.067868724],[-0.8948686,0.07852778,-1.858944,0.25246492,-0.72072095,-0.721946,0.2008207,-0.6164795,-0.620322,0.054701116,0.13644697,-1.0398991,0.23678952,0.9060979,0.24625729,0.06296468,-0.09471517,0.18253052],[-0.039542284,0.14739217,-1.8839234,-0.05269514,0.22938618,0.1295076,-1.715298,1.3541347,0.60284644,0.07251003,-0.58243793,0.369853,0.17180686,-0.93567884,0.41123584,0.22822875,-0.015471544,-0.1450907],[-1.309309,-0.0065789986,-0.0009026052,-0.43786958,0.66638273,0.6100126,-0.80755997,-0.44549793,-0.33233902,-0.14217907,0.4560685,1.0638386,-0.23771513,0.031021614,-0.31280205,0.110058166,-0.23958574,0.024892198],[0.021762278,1.2449024,2.3610842,0.10449084,0.035584703,-0.20509337,-2.1041403,1.2424486,0.5425319,0.13568977,-0.68708223,0.6785129,0.2722758,-0.94338864,-0.11912091,-0.061731618,-0.21562424,0.265597]],"activation":"σ"},{"dense_2_W":[[0.8672452,-1.6432475,-0.089617,3.4410927,-1.8457493,-1.653231,-1.1289697],[-0.8830999,0.42412817,0.3355593,0.30391192,0.37201688,0.70189875,0.76556355],[-1.0386908,0.7344996,-0.46029314,-0.045133006,0.41179648,0.23103125,0.06681513],[0.97836345,-0.851959,0.74249834,-0.25212237,-0.082773805,-0.61097443,-0.47594827],[-0.489878,0.80100036,-0.38931137,0.06700653,-0.20617403,0.2470712,0.9071803],[-0.9829343,0.34199762,-0.5856996,0.21864368,0.9632561,-0.06746073,0.14236969],[-0.22686507,0.0058632977,-0.67398316,0.106053695,0.06964084,0.42800158,0.84875035],[0.8461344,0.14065352,0.077666566,0.5249845,-0.3699625,-1.0579052,-1.0444427],[-0.6473488,0.069085024,0.1963253,0.106187075,0.045327008,0.5108394,0.20862271],[-0.18507846,0.81007284,0.59458715,-0.20684378,0.41903466,1.124245,-0.0002866817],[1.8409206,-1.6266977,1.558487,-0.14739716,-0.71901566,-0.9584196,-0.24527057],[0.061728116,-0.75477535,-0.22849028,-0.3439474,-0.65592027,-0.9196831,-0.34239137],[-0.24715817,0.27214324,-0.46822995,-0.11250425,0.4140462,0.5036997,0.808618]],"activation":"σ","dense_2_b":[[0.3682189],[-0.3061952],[-0.2186805],[0.26665255],[-0.20908445],[-0.25180277],[-0.16508935],[0.37200344],[-0.132723],[-0.0748416],[0.77447575],[0.07100879],[-0.28392908]]},{"dense_3_W":[[-0.7492231,0.6381115,0.22848813,-0.6114985,0.4652135,0.43796808,0.15224089,-0.86344284,0.23925477,0.66866344,-0.874919,-0.37883374,0.47491515],[-0.23657976,-0.20048968,0.14517088,0.0775067,-0.15648171,0.5634285,-0.51960784,-0.31498674,-0.14429168,-0.22901323,0.0648477,0.0648267,0.5823677],[-0.010220655,0.21547753,-0.08935665,0.67853194,0.40634638,0.30693397,-0.31160212,0.8876798,0.2663386,-0.41578376,-0.043752998,0.05976479,-0.30815133]],"activation":"identity","dense_3_b":[[-0.03995597],[0.043906566],[-0.009552566]]},{"dense_4_W":[[0.96169305,-0.013711991,-0.33541062]],"dense_4_b":[[-0.032807786]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A070x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A070x00x00'.json deleted file mode 100755 index d9ddfeb90d..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TG7-A070x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.899371],[0.91326123],[0.34754744],[0.047207538],[0.921164],[0.9188041],[0.9149523],[0.8824703],[0.86114454],[0.8327107],[0.80909157],[0.04698797],[0.04704211],[0.04708921],[0.0469777],[0.04675353],[0.04638313],[0.045919105]],"model_test_loss":0.029772095382213593,"input_size":18,"current_date_and_time":"2023-08-06_19-12-45","input_mean":[[23.732822],[0.017107664],[-0.0011733986],[-0.0058285887],[0.017914131],[0.017934287],[0.018237941],[0.017002761],[0.015237825],[0.013338944],[0.011673382],[-0.005840362],[-0.005826218],[-0.0058171875],[-0.005817545],[-0.0058693774],[-0.0060108923],[-0.00612493]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.20021264],[3.4939082],[-0.06716851],[0.058503635],[-0.010445441],[-0.16600388],[4.0031]],"dense_1_W":[[0.67624974,0.5699806,1.7589446,0.38397965,0.04085462,-0.35647398,0.94661707,-0.042084765,-0.36401713,0.15266082,-0.11755991,-0.42012995,-0.390879,0.27095684,-0.3359402,0.44403496,-0.50348926,0.20556912],[1.2939718,-1.0459632,-1.4953133,0.24710384,-0.07565443,-0.4741599,0.8066539,-0.5519822,-0.8259321,0.08815797,0.5646691,-0.22644426,0.6596317,0.49577862,-0.5832377,-0.30473575,-0.07392759,0.22181918],[-0.0067671034,-0.56580436,-1.5979874,0.72282726,0.14223135,-0.70996284,1.6942539,-1.0655241,-0.59319955,-0.13150467,0.68681896,-0.33786333,-0.6004301,0.93967056,-0.18882798,-0.21886076,-0.018479563,-0.026317876],[0.73770875,-0.35808742,-1.7224159,-0.11537585,0.23505013,0.3487726,-1.6180664,0.44352862,0.087284215,0.14080617,-0.049784306,0.67705816,-0.18708247,-0.038130477,-0.0593233,0.15170136,-0.2373075,0.12623678],[-0.00046603545,0.062258437,-0.00017648668,0.5743302,-0.14112268,0.7994641,-0.5734729,-0.1330987,0.122790836,-0.05908033,0.053587526,0.40562433,0.48647818,0.07770536,-0.8969449,-0.569001,-0.15433595,0.106549785],[-0.00043468282,-0.44794786,-0.0009173404,-0.15259606,-0.423234,-0.7315594,0.2841295,0.7197476,0.27196157,-0.043154158,-0.35170138,-0.3242454,0.4141323,0.15176967,0.3337161,-0.022378944,-0.016765838,-0.13956091],[1.370725,0.92907214,1.5363995,-0.07274529,0.06922402,0.47750995,-1.1804242,1.0793897,0.87313735,0.03309975,-0.787432,0.1583054,-0.06471896,-1.6379938,1.0917811,0.2863863,0.16701585,-0.370107]],"activation":"σ"},{"dense_2_W":[[-1.1142431,-0.98553467,-1.7528756,-0.7601161,0.023125764,0.29621416,0.057998575],[-0.57707655,-0.035297927,0.7552565,0.40910327,-0.045871045,0.7647045,-0.17583843],[0.54533637,0.37994358,0.48098484,-0.60859483,-0.679812,1.1466373,-0.7521221],[-0.766621,0.29065615,-0.96372104,0.4400032,1.691393,-1.3640326,1.5831442],[-0.03152584,-0.0041346215,-0.59791905,0.0149094295,0.5149197,-0.568262,0.5052371],[-0.62852687,-0.5016056,-0.88126785,0.6810648,0.76567554,-0.68329334,0.26362616],[0.09154294,-0.23193486,0.9080769,0.06993361,-0.50866467,0.6603812,-0.6362647],[-0.7537723,-0.8049923,-0.8947776,0.73191917,0.7269287,-0.6561125,-0.15393494],[-0.45121416,0.21887077,0.8701729,0.49937823,0.093833074,0.6793174,-0.26953593],[-0.21209432,-0.52174926,-0.84514666,0.044568583,0.4728377,-0.45035967,0.13409898],[0.5650158,-0.6122694,-0.23879126,0.88060015,-0.02077808,-1.9465554,-0.37588525],[0.19426925,0.5452357,0.12054777,-0.40416533,-0.81852937,0.9164135,0.20086637],[-1.2047343,-0.5585611,-1.8479179,-0.6856552,0.07956908,0.2805922,0.37198797]],"activation":"σ","dense_2_b":[[0.060228728],[-0.04707918],[-0.14618197],[0.106457904],[-0.03570688],[-0.08961752],[-0.05534363],[-0.121585414],[-0.109557174],[-0.067889966],[-0.14876497],[-0.058959074],[-0.12490072]]},{"dense_3_W":[[0.38950223,0.3090716,-0.4296155,-0.33159044,-0.105799004,-0.119462036,0.53925854,0.22593993,-0.034717377,-0.23057248,0.3610593,-0.022898644,-0.06612316],[0.7082383,-0.2031159,-0.35994145,0.57508343,0.49524105,0.3460956,-0.74825346,0.7125477,-0.066172495,0.29165456,0.6697642,-0.56427914,0.5089701],[-0.21685903,-0.047797453,-0.24373047,-0.06741093,0.49110416,0.062480558,-0.5235519,-0.48258132,-0.27274242,0.333045,0.41328818,-0.4939122,-0.037244707]],"activation":"identity","dense_3_b":[[0.018447949],[-0.053515278],[-0.02512046]]},{"dense_4_W":[[-0.07239497,1.4876865,0.61020267]],"dense_4_b":[[-0.03861425]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TGS-A230x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TGS-A230x00x00'.json deleted file mode 100755 index bb87addba0..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017 b'39990-TGS-A230x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.844337],[0.5474532],[0.2851794],[0.027097791],[0.54364073],[0.5449447],[0.54493386],[0.5406305],[0.53676015],[0.5303491],[0.52479345],[0.02704525],[0.027049432],[0.027056439],[0.027171213],[0.027275724],[0.027305145],[0.027313853]],"model_test_loss":0.011909760534763336,"input_size":18,"current_date_and_time":"2023-08-06_19-37-10","input_mean":[[22.95614],[0.03637806],[0.0046443446],[-0.009752038],[0.035477746],[0.03569809],[0.03587167],[0.038072705],[0.041633505],[0.043689143],[0.044423867],[-0.009905221],[-0.009882373],[-0.009861099],[-0.009661706],[-0.009565372],[-0.009564497],[-0.009780675]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.017572576],[-4.3160543],[0.0974798],[0.036516342],[-0.109429516],[-0.09818942],[4.911552]],"dense_1_W":[[-0.0024906907,-0.16255474,0.0021684417,0.15618499,0.51274085,-1.5496616,0.80450743,-0.17654379,0.029981567,0.29689407,-0.22370933,-0.40722302,-0.47401586,0.088543475,0.39740565,0.16661157,-0.21702406,0.18496276],[-1.7687228,0.7045914,1.427233,-0.52335125,0.59448713,0.15286753,-1.2777213,0.61541426,0.16629013,0.4778544,-0.32696342,-0.17506757,0.095090166,-0.1734923,0.12915663,0.4323549,-0.13984495,0.013180874],[-0.0005372349,0.14655821,0.00052846695,-0.1672421,-0.10420727,1.4758636,-1.3471918,-0.3041868,0.0994203,0.18412685,-0.011641346,0.20525645,0.029496245,0.26476464,-0.43268526,-0.11217049,-0.21945795,0.25870478],[-0.032725878,-0.5761932,-3.2336373,0.5103813,-0.077060595,-0.80228996,1.8519014,0.14672789,-0.111017115,0.24072622,-0.12112954,-0.3908596,0.10182307,-0.07298533,-0.080630735,0.008331639,-0.120116994,0.006328887],[0.03457588,-0.49316353,2.6339474,0.19689563,0.17444913,-0.8295214,1.600949,-0.595955,-0.69125766,-0.7232554,0.86711705,-0.012927358,-0.16348226,0.26314303,-0.0088081835,-0.46151197,-0.063149415,0.23691247],[-0.0007938469,-0.26171395,-1.7098687,0.26605788,-1.0185215,-1.438486,1.65897,0.34761468,-0.032835998,0.5944291,0.07509286,-0.3272494,-0.19096224,0.46081677,-0.099406004,0.1578144,0.2245294,-0.33107895],[1.8251307,-0.31498715,1.4632752,-0.25625032,0.15879938,1.4816606,-1.8760675,1.3390347,0.31716788,0.5548306,-0.5275588,0.24619943,0.06173876,-0.8373367,-0.09087632,0.6366511,-0.082824394,-0.030000336]],"activation":"σ"},{"dense_2_W":[[0.7515066,-0.5105429,-0.5129767,0.17204086,0.4370165,0.21994908,-0.6377811],[-0.8214936,-0.19322807,0.41158032,0.1989778,-0.14067653,-0.64911515,0.5294647],[0.51943374,-0.06608904,-0.29252574,-0.024339033,0.43838638,0.051782995,-0.806854],[-0.20359917,-0.32902804,0.337066,-0.61808026,-0.07043727,-0.34022537,0.30081543],[-0.24775623,0.51326185,0.5934297,-0.98377573,-0.11107068,-0.32810766,0.3160865],[0.5520875,-0.010964958,-0.69238853,0.44000012,0.18294834,0.55245346,-0.085966766],[0.266246,0.22741622,-1.3200338,0.31004852,0.4994686,0.6832114,-1.012235],[0.6528813,-0.3028174,-0.9139022,0.44758174,0.6425402,0.010288926,-0.20716433],[-0.5859752,0.29565674,0.641747,-0.30805898,-0.56379014,-0.216961,0.75915325],[-0.7312802,1.830524,1.2278521,-0.80010766,-0.8330499,-0.69043976,-0.28447995],[0.5335052,-0.064827405,0.027745938,-0.46684337,0.44196686,-0.48609126,-0.21828449],[0.14514819,0.4311585,-0.54999,0.5635193,-0.4327273,-0.14394662,0.111346856],[-1.0599593,1.1263603,0.78328055,-0.37957004,-1.5480173,0.1396851,-0.2799352]],"activation":"σ","dense_2_b":[[-0.23358788],[0.1585287],[-0.13420668],[-0.07403241],[0.010910343],[-0.18071596],[-0.14818127],[-0.12828562],[0.14517418],[-0.07583147],[-0.09213995],[-0.09467464],[-0.08490435]]},{"dense_3_W":[[0.34530333,-0.25396794,0.3704989,-0.45187533,-0.6564372,0.28631496,0.28807354,0.6734085,-0.5048169,-0.14331086,0.3927886,0.21402659,-0.19487047],[0.5606163,-0.28793406,-0.03255529,-0.27054605,-0.64770496,0.5929222,0.71289337,0.023057688,-0.31981897,-1.0039912,-0.42174533,-0.2053406,-0.33733523],[-0.05791618,-0.55499506,0.4860968,0.516192,0.107287996,0.33412755,0.3361389,0.28090212,0.30633086,-0.5674268,0.15556479,-0.100490406,-0.6992101]],"activation":"identity","dense_3_b":[[0.05391226],[0.12384217],[-0.0018761213]]},{"dense_4_W":[[-0.80719674,-0.53903717,-0.10743938]],"dense_4_b":[[-0.060299486]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A020x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A020x00x00'.json deleted file mode 100755 index 4fc4f99db6..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A020x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.526597],[0.8048686],[0.30508777],[0.03864828],[0.80819684],[0.80695915],[0.8048399],[0.78234345],[0.76694405],[0.7469485],[0.7296534],[0.038567755],[0.038570154],[0.038559318],[0.03835149],[0.03808803],[0.03767571],[0.037237816]],"model_test_loss":0.03462047502398491,"input_size":18,"current_date_and_time":"2023-08-06_20-57-06","input_mean":[[26.62668],[0.036549807],[-0.011428904],[0.0053228196],[0.03878817],[0.038509928],[0.03783984],[0.032552782],[0.02958787],[0.025563305],[0.02255467],[0.005326508],[0.0053158393],[0.0053043445],[0.0053029354],[0.005256346],[0.005181934],[0.0050085713]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.14232375],[1.8012465],[-0.09831748],[0.5650695],[-1.1499583],[-0.073488325],[1.0894103]],"dense_1_W":[[0.056877207,0.6916827,5.06491,-0.66757196,-0.064828135,0.602485,-0.75314325,-0.17327878,0.6848782,0.34329203,-0.5423522,1.1682849,0.17310293,-0.36728725,-0.4643529,-0.31240857,0.02507186,0.3971787],[0.8599211,0.040786155,1.3326324,-0.47951195,0.44746584,0.6010731,-0.21368843,0.12426477,-0.04983132,0.23454875,-0.15349868,0.19200465,0.3104551,-0.3557172,-0.13984811,0.4962251,0.053631846,-0.1638603],[-1.8845662e-5,-0.96039295,-0.008062018,-0.4011542,0.38096327,-0.589807,0.55235106,0.41631168,0.11027108,0.09306343,-0.19353023,-0.60363764,-0.12267431,0.49039286,0.5191193,0.55169106,0.30454066,-0.5621538],[1.0135822,-0.75806355,-1.6029091,-0.3095834,-0.22254121,-0.09464273,-1.3611665,0.771017,0.79057467,0.24156936,-0.58263016,0.49122322,-0.08950236,-0.12695374,-0.22518735,0.39627716,-0.10022992,0.050749615],[-1.2416042,-0.17200327,-1.6770357,-0.3177143,-0.34086037,-0.027091691,-1.5113678,0.49007565,0.66320384,-0.0010659369,-0.34323072,0.5169337,-0.15815243,-0.034780547,0.1575047,-0.0329744,-0.3683034,0.32797682],[-0.0022168742,-0.66831297,0.010362603,-0.41855475,-0.009861155,-0.94385296,0.1030419,0.45698124,0.26305547,-0.21666865,-0.11719163,-0.22144005,-0.04730197,0.7822476,0.046567436,-0.084721416,-0.086411186,0.39097503],[0.5916624,-0.35777295,-1.1239158,0.20729716,-0.6318845,-0.7276167,1.2016071,-0.27480146,-0.15381776,-0.08857165,0.15498745,-0.845312,0.26758724,0.7284694,-0.2389467,-0.1021588,0.118127644,-0.060775146]],"activation":"σ"},{"dense_2_W":[[-0.22620663,0.41269052,-0.24866156,0.6366785,0.7235434,-0.927365,-1.0595255],[-0.36320922,-0.8501176,0.7743313,-0.2655733,-0.20027223,0.3987106,0.16717343],[0.04363351,-0.39013597,-0.14777897,0.050077282,0.23006651,0.32082573,0.6458379],[-0.10794271,0.6917472,-1.081361,0.42123145,0.6480493,-0.3713631,-0.89706177],[-0.78707266,0.32178167,1.1140773,0.19835484,-0.92583483,0.54546994,1.2142284],[-0.4685015,-1.2930269,0.8641388,-1.1940204,-0.26867914,0.68155724,0.5093967],[-0.1882023,0.36285752,-0.6288009,0.08845282,0.53267115,-0.48252743,-0.72988355],[0.42914814,-0.29254675,-0.78575516,0.43952206,0.26590148,-0.6462319,-0.8898721],[-1.1129463,-1.0545493,0.41503805,-0.4397955,0.37739003,0.2824943,-0.12243744],[0.5261344,-0.49560457,-0.19782127,-0.63711095,0.24736477,0.4398861,0.6398021],[0.05428658,-0.59174234,0.26730546,-0.12481052,-0.08528374,0.07640281,0.28411782],[0.78370523,1.1058642,-0.23422256,0.77695924,-0.41036674,-0.23147115,-0.84960663],[0.22395311,-0.522629,-0.0788354,-0.15769184,-0.3324099,0.5808104,0.924355]],"activation":"σ","dense_2_b":[[-0.039920773],[-0.052275084],[-0.0664735],[-0.018644892],[0.00933328],[-0.054911967],[-0.00089501834],[-0.023597311],[-0.3882073],[-0.091632456],[-0.4284712],[-0.028570231],[-0.12698737]]},{"dense_3_W":[[-0.30708212,-0.07836911,-0.51141727,-0.12163258,-0.34234747,-0.13424605,0.5527976,0.338374,-0.08043284,-0.53650296,-0.08814839,-0.09911217,0.26711917],[-0.5153229,0.610062,-0.3431148,-0.43862098,0.6182512,0.8723251,0.027186068,-0.46111137,0.6949713,-0.20838192,-0.17872754,-0.25688672,-0.2768381],[0.5712013,-0.50477827,-0.41985807,0.6996244,-0.04315098,-0.090902686,0.57373744,0.65513474,0.2195478,-0.17768551,-0.16094655,0.4999511,-0.60238904]],"activation":"identity","dense_3_b":[[-0.019368384],[0.06465865],[-0.06263113]]},{"dense_4_W":[[0.30276972,-0.77930284,1.3356577]],"dense_4_b":[[-0.057673924]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A030x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A030x00x00'.json deleted file mode 100755 index 072cb370f2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A030x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.718611],[0.8000405],[0.316423],[0.04299987],[0.8036066],[0.80211085],[0.80001944],[0.7775613],[0.75944704],[0.7362369],[0.7155587],[0.042815663],[0.042829156],[0.042837203],[0.042570762],[0.042158205],[0.041655492],[0.04112391]],"model_test_loss":0.022167924791574478,"input_size":18,"current_date_and_time":"2023-08-06_21-24-15","input_mean":[[24.369797],[-0.025400253],[0.017546965],[-0.00700374],[-0.02907116],[-0.0272434],[-0.026022244],[-0.018144533],[-0.013257402],[-0.008418786],[-0.005300719],[-0.0070171817],[-0.006979727],[-0.0069393516],[-0.0067121363],[-0.006487458],[-0.0063709775],[-0.006421042]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.7274725],[0.025503755],[0.3050141],[-5.3191023],[-0.03876078],[0.005245881],[-5.0506983]],"dense_1_W":[[-0.2822948,-0.722028,3.7289326,0.10887399,0.23870549,0.50487334,-0.123285055,0.6266674,-0.16613187,-0.31120768,0.21549895,0.8222215,0.093914084,-0.508679,-0.32368693,-0.5741282,-0.12807958,0.4776648],[0.055145074,-0.08890773,2.0090845,-0.22150633,0.07060641,-0.22094366,1.112321,-0.9160675,-0.5255298,-0.2628351,0.6098551,-0.54194224,0.21753678,0.80302423,-0.20514414,-0.26842067,0.14056496,0.033558667],[0.07740017,0.015846146,2.7256997,-0.40292552,0.21246663,0.70980185,-1.5323384,0.36885697,0.4570335,0.031200917,-0.2520181,0.7061896,0.4765367,-0.40083462,-0.020111812,-0.83463514,-0.2164461,0.6454257],[-1.7542838,0.968146,-2.7611947,1.1451197,-1.0110191,-0.8876714,0.20558445,-0.9517466,-0.4182316,-0.12540092,0.31168443,-0.33938956,0.24651282,0.0059528793,-0.85313106,0.4553901,-0.33676484,0.039334722],[0.0048947604,0.28315127,-0.00082401093,0.1642722,-0.026302634,0.5552507,-0.4484803,-0.77365834,0.3072703,0.20140412,-0.07074192,1.1858759,-0.019229556,0.54098135,-0.6814733,-0.69271094,-0.06874056,-0.38412106],[0.0007334778,0.7766232,0.00028844643,-0.21648946,0.092252165,0.67591894,-0.27549696,-0.24640717,-0.29265153,-0.3485241,0.46819794,0.36771885,0.1777801,-0.9394743,-0.5500784,0.5453998,0.23175853,-0.06195575],[-1.6910515,-0.50021756,2.6513228,-1.0415213,0.7283371,1.1932234,-0.42946246,0.6699792,0.35031915,0.056402538,-0.2107231,0.35974085,0.18628371,-0.5288515,0.4471923,-0.037989102,0.38440272,-0.13335472]],"activation":"σ"},{"dense_2_W":[[0.32577014,0.79221934,-0.328502,0.93716705,-0.48035973,-1.1603907,-0.2849361],[-0.018025871,1.2269095,-0.17799911,0.3586097,-0.5202041,-0.9837849,-0.52449334],[0.4882362,0.007634269,-0.8909171,-0.3146946,0.22157149,-1.2225018,0.20821871],[0.80880105,0.06718037,1.1132499,0.29183453,0.04864204,-0.16105369,0.35970175],[-0.37581718,-0.5779451,0.3496446,-0.47957718,0.56743324,0.7492507,0.09928946],[-0.4170784,0.6871286,-1.0214018,0.49072498,0.097653925,-0.34628057,-0.669162],[0.07657919,0.3276044,0.025352756,0.4546719,-0.42029864,-0.9768511,-0.06424113],[-0.034272887,0.27446097,-0.026066864,-0.23361085,0.50696295,0.26659736,0.061146133],[0.20783767,-0.38495246,0.64545757,-0.5973285,0.28495064,0.6255407,-0.27093932],[-0.18777645,-0.10720107,-1.0076562,-0.91708684,0.035999604,-0.3695375,-0.40669018],[0.097274005,-0.0091937585,0.77790815,0.5603293,-0.007872101,0.16779582,0.57061195],[-0.27653685,0.8055118,-0.16641589,0.67337465,-0.68099606,-0.7176573,-0.09002476],[0.50360245,-0.814891,-0.0020142735,0.34887952,0.38281712,0.5023187,0.52313113]],"activation":"σ","dense_2_b":[[0.2157577],[0.2698682],[-0.019235173],[-0.10241727],[-0.100874275],[0.06276079],[0.035551473],[-0.12188733],[-0.1428853],[-0.20376948],[-0.16719232],[0.18453568],[-0.34984714]]},{"dense_3_W":[[-0.15546247,0.4479613,0.29678583,-0.07754084,-0.34736145,0.23861347,0.62535715,-0.21091194,-0.4652678,0.41793606,-0.08758342,-0.032690294,0.18323281],[0.70506346,0.4563717,0.3900941,-0.7799406,-0.11504136,0.42975253,-0.052854165,-0.2509722,-0.19303511,0.4449753,-0.030831125,0.6785045,-0.16403332],[-0.6801335,-0.18466944,-0.18921193,0.6546068,0.3580845,-0.63010234,-0.6467311,-0.13526618,0.15568815,0.35201934,0.61143976,-0.62779784,0.7224356]],"activation":"identity","dense_3_b":[[-0.05987917],[-0.07057249],[0.046607416]]},{"dense_4_W":[[-0.41022143,-1.0402968,0.69203836]],"dense_4_b":[[0.06063404]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A050x00x00'.json b/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A050x00x00'.json deleted file mode 100755 index e2f4fae4a9..0000000000 --- a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017 b'39990-T6Z-A050x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.436153],[1.0504706],[0.3418279],[0.044102445],[1.0572962],[1.055557],[1.0525179],[1.0187471],[0.9908011],[0.95748615],[0.92414606],[0.043971427],[0.044015896],[0.044045128],[0.04389467],[0.04364494],[0.043296155],[0.042847775]],"model_test_loss":0.038220494985580444,"input_size":18,"current_date_and_time":"2023-08-06_21-51-36","input_mean":[[23.848715],[0.018280305],[0.012880258],[0.00016874999],[0.015305563],[0.01623863],[0.01724972],[0.02289785],[0.026459597],[0.03181198],[0.03424346],[0.00015466582],[0.00016650796],[0.00017154339],[0.00011696259],[5.7035195e-6],[-6.984356e-5],[-0.00021620118]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.03454988],[-4.80883],[-0.0003980326],[0.045162812],[2.7693284],[-0.12798071],[-5.1148744]],"dense_1_W":[[-0.021953972,-0.6909956,0.0017137715,0.075967655,0.19107713,-0.6735136,0.5936085,-0.059220172,-0.3937673,-0.08009787,0.19657694,-0.92206305,-0.40902787,0.80064285,0.36957166,0.41741195,-0.09949758,0.0328572],[-0.41551954,0.34888965,4.58918,-0.58479553,1.2140695,1.0730668,-0.80987257,1.7057942,1.8264681,0.5418806,-1.5800008,0.90441865,0.40738422,-0.9309175,-0.5846453,-1.1779749,-0.21697095,1.2636313],[-1.3167963,0.22196263,0.00087620446,0.11951662,0.23572233,0.98367923,-1.184788,-0.15921544,-0.17442104,-0.03715148,0.20377636,0.7771119,-0.31182548,-0.39967468,-0.30966496,0.10307021,-0.1549598,0.16605021],[0.016689815,0.62469226,5.6109867,0.25332543,0.017362839,0.066708766,-0.90982044,0.4760742,1.3472136,0.47811866,-1.0950692,0.7803302,0.23873158,-0.12769687,-1.0736917,-0.9507369,-0.3849879,0.9753211],[1.010975,0.48392332,2.3908904,-0.09404196,0.29996136,0.6191447,-0.33926985,0.94034505,0.6360225,0.15894395,-0.681273,0.48581445,-0.14646457,-0.5143217,-0.61096245,0.016869107,0.16057582,0.25225523],[1.2771941,-0.12252131,-0.0015340669,-0.18589194,-0.108365774,0.8503448,-0.28897393,-0.25453618,-0.109775856,-0.07973199,0.20226198,0.16910028,-0.13213143,-0.004498944,-0.079716355,0.31004015,0.1381526,-0.22449149],[-1.9269731,0.68068326,2.6605928,0.31519896,0.73409057,0.86063737,-1.4537466,1.1653538,0.65197283,0.33013284,-0.82076246,0.5808779,-0.16310015,-1.1616337,-0.56682473,-0.24635708,0.90833735,-0.1679019]],"activation":"σ"},{"dense_2_W":[[-0.19316064,0.20220636,0.1543245,0.56923085,-0.5256424,0.6484845,0.5277906],[0.58739203,0.02642884,-0.5941336,-0.06645716,-0.47577676,-0.6182639,0.22779459],[0.47835082,-0.13229278,-0.5625976,1.091255,1.0804834,1.1058354,0.12684019],[-1.1107054,-0.5791231,1.0741233,0.6597225,0.1555275,0.37428802,-0.07498665],[0.71273017,-0.030820772,-1.1579764,0.3962723,0.1522951,-0.62006533,-0.22865336],[-0.43192923,-1.3364362,0.49843183,1.4019581,1.2106336,0.93200284,-0.84781635],[0.33329925,-0.50564456,-0.025362682,0.08924529,-0.44918236,-0.18738124,-0.9237199],[0.74970734,0.2891013,-0.88326615,-0.37782103,-0.12960875,-0.46564922,0.253634],[-0.38317993,-0.049594685,0.62969357,-0.4982168,-0.8223472,-1.1548349,-0.9691452],[-0.509654,1.1230011,-0.095659316,-0.08150701,0.13044642,0.76143026,1.9938471],[-1.733176,0.57158726,0.43324548,-0.34991685,-0.22035135,0.76057756,-0.052056145],[0.975577,-0.4635662,-0.9864897,-0.0116866175,0.28406203,-0.43784142,0.101669684],[1.0218577,-0.020748869,-0.8567677,-0.03760161,-0.33631977,-0.11666814,-0.17231067]],"activation":"σ","dense_2_b":[[-0.34342867],[0.0511681],[0.14040104],[-0.18537521],[-0.013827617],[-0.11964682],[-0.0019164886],[0.05570073],[-0.22459657],[-0.46932775],[-0.59917027],[0.19691558],[0.12876545]]},{"dense_3_W":[[-0.20874692,-0.03773357,-0.22803174,0.17655598,-0.21538508,-0.22147778,-0.36320722,0.2394826,0.309721,-0.50003666,0.18370363,0.965146,0.6532681],[-0.68880624,0.089210816,-0.13193853,-0.09678856,0.26519805,0.21867493,0.03511478,0.21086489,0.13713072,-0.3630258,0.02014443,0.5465172,0.19587718],[0.2179609,-0.33041763,0.349815,0.50508064,-0.6743199,0.49183506,-0.36830014,-0.34079608,-0.62299275,0.13984378,0.3973101,-0.7238013,-0.31278804]],"activation":"identity","dense_3_b":[[0.019930799],[-0.07322117],[0.0665013]]},{"dense_4_W":[[-0.13234596,-0.36558858,1.5018625]],"dense_4_b":[[0.064201705]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018.json b/selfdrive/car/torque_data/lat_models/HONDA_ACCORD.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA ACCORD 2018.json rename to selfdrive/car/torque_data/lat_models/HONDA_ACCORD.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016.json b/selfdrive/car/torque_data/lat_models/HONDA_CIVIC.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CIVIC 2016.json rename to selfdrive/car/torque_data/lat_models/HONDA_CIVIC.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022.json b/selfdrive/car/torque_data/lat_models/HONDA_CIVIC_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CIVIC 2022.json rename to selfdrive/car/torque_data/lat_models/HONDA_CIVIC_2022.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019.json b/selfdrive/car/torque_data/lat_models/HONDA_CIVIC_BOSCH.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CIVIC (BOSCH) 2019.json rename to selfdrive/car/torque_data/lat_models/HONDA_CIVIC_BOSCH.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json b/selfdrive/car/torque_data/lat_models/HONDA_CLARITY.json similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CLARITY 2018.json rename to selfdrive/car/torque_data/lat_models/HONDA_CLARITY.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V 2017.json b/selfdrive/car/torque_data/lat_models/HONDA_CRV_5G.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CR-V 2017.json rename to selfdrive/car/torque_data/lat_models/HONDA_CRV_5G.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/HONDA_CRV_HYBRID.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA CR-V HYBRID 2019.json rename to selfdrive/car/torque_data/lat_models/HONDA_CRV_HYBRID.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA HRV 2019.json b/selfdrive/car/torque_data/lat_models/HONDA_HRV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA HRV 2019.json rename to selfdrive/car/torque_data/lat_models/HONDA_HRV.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018.json b/selfdrive/car/torque_data/lat_models/HONDA_ODYSSEY.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA ODYSSEY 2018.json rename to selfdrive/car/torque_data/lat_models/HONDA_ODYSSEY.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA PILOT 2017.json b/selfdrive/car/torque_data/lat_models/HONDA_PILOT.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA PILOT 2017.json rename to selfdrive/car/torque_data/lat_models/HONDA_PILOT.json diff --git a/selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017.json b/selfdrive/car/torque_data/lat_models/HONDA_RIDGELINE.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HONDA RIDGELINE 2017.json rename to selfdrive/car/torque_data/lat_models/HONDA_RIDGELINE.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050 4CNDC106'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050 4CNDC106'.json deleted file mode 100755 index 810d5b1684..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050 4CNDC106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.83634],[1.3114692],[0.61259305],[0.04069087],[1.3149719],[1.3138335],[1.3109658],[1.2883614],[1.2688274],[1.2462783],[1.2217312],[0.040413603],[0.040479485],[0.040545307],[0.040706556],[0.040736057],[0.04062868],[0.040408727]],"model_test_loss":0.004580862820148468,"input_size":18,"current_date_and_time":"2023-08-06_22-45-30","input_mean":[[20.29631],[-0.20027053],[0.014035869],[0.0016505374],[-0.20306659],[-0.20239536],[-0.20110086],[-0.1928657],[-0.18353474],[-0.171302],[-0.16113067],[0.0016583024],[0.0016512063],[0.0016456466],[0.001655548],[0.0016689815],[0.0017368481],[0.0018190349]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-4.326124],[0.2025785],[-0.098271556],[-3.9150567],[-0.034150004],[0.15999922],[0.15790012]],"dense_1_W":[[-1.299842,0.7154461,0.50361294,0.707755,-0.32854462,0.5378334,-0.2463958,0.55273217,-0.11124414,0.0818784,0.12354188,-0.2839917,-0.0078714555,-0.43367207,-0.06824078,-0.11825003,0.009444434,-0.050293162],[0.012949336,-0.29667792,0.020020511,0.20652233,0.07910441,-0.9396354,-0.07545959,0.2788547,-0.13547169,0.24944903,-0.3807775,-0.20812687,0.6074481,0.8033544,0.63277185,0.624231,0.2708898,-0.12817378],[0.007405703,0.3899947,0.011966838,-0.28451037,-0.41553152,0.5924629,-0.3221766,0.27565926,0.12245936,0.07997573,-0.18988231,0.25652406,0.0025251263,0.024572864,-0.1805577,-0.041730937,-0.09416745,0.114651345],[-1.314923,-0.8099221,-0.5021875,-0.65911645,0.3549381,-0.34351438,-0.018062847,-0.33712468,-0.083063975,0.118071266,-0.21253352,0.42918342,0.22217433,-0.006059381,0.07905543,0.071201935,0.08123039,0.03532524],[0.0059883036,0.633405,3.1777372,-0.35775912,-0.48683342,0.45391664,-0.12081466,-0.10396013,-0.058201157,0.02189144,-0.2272636,0.3546558,0.3708983,-0.53645164,0.015508216,0.0337646,-0.060697123,0.12773308],[0.016417185,-0.08919656,0.0043452727,1.0047843,-0.27470052,0.3708835,-0.5663267,-0.29918858,-0.1055758,-0.048055023,-0.0047955806,0.3848289,0.09456668,-0.1911486,0.38866982,0.40791333,0.34307832,-0.107040025],[0.012326768,-0.35066816,0.023062164,0.11834323,-0.49445873,-0.40111482,0.67107445,-0.17822216,0.012243669,-0.015511885,-0.075803205,-0.20342149,-0.04872656,0.1803967,0.067403704,-0.13901299,-0.016193623,0.10545096]],"activation":"σ"},{"dense_2_W":[[0.68674135,-0.6659134,0.5956395,0.12655623,-0.062817745,-0.12547888,-0.25941992],[-0.61886525,0.17155291,-0.22070692,0.7328443,-0.5755818,-0.34458303,-0.08562272],[0.20490937,0.091596,0.17527196,-0.46830234,0.45194998,0.086104736,0.026383685],[0.41048616,-0.27680868,0.8749343,-0.3792618,0.015523265,0.13319112,-0.39641076],[-0.21381493,0.5849179,-0.9504806,0.21972664,0.120829634,-0.519766,0.78654087],[-0.07081899,0.30812186,-0.042367518,0.22959028,-0.8620051,-0.47999159,-0.10604032],[0.48751,0.14033422,0.3791711,-0.9662732,0.42280945,0.42151052,-1.1193146],[-0.42666185,0.0900884,-0.7094497,0.8601399,-0.023163248,-0.6888624,0.7585005],[0.7715003,-0.54247683,0.024090352,0.24359225,0.11092992,-0.21225674,-0.42073125],[-0.74185073,-0.08530311,-0.13807726,-0.13045816,-0.23199996,-0.5793514,0.31687632],[-0.29189909,0.6799488,-0.71430886,0.044500347,0.031233395,-0.36464205,0.23336875],[0.0026518344,-0.35539848,-0.24951808,-0.15187661,0.06614357,-0.51367974,-0.53242975],[-0.083562754,-0.36494836,-0.62077016,-0.5867332,0.061696846,-0.87958634,0.12203935]],"activation":"σ","dense_2_b":[[-0.11182095],[0.019549185],[-0.06678602],[-0.016046902],[-0.09487844],[-0.09783255],[-0.21236032],[0.04908964],[-0.26582202],[-0.059639674],[-0.094594166],[-0.29934412],[-0.23795456]]},{"dense_3_W":[[-0.6317685,0.5268228,-0.15907462,-0.7917317,0.5163576,0.30266294,-0.2348481,0.6155206,-0.027430234,0.17797364,0.41818848,-0.036049694,-0.5178868],[-0.26872328,-0.39003056,-0.09896492,0.12855911,-0.55909926,-0.5083438,0.2223784,0.64059246,0.22532892,0.23159789,0.27662674,0.23292752,-0.30605522],[0.15627481,0.2843338,-0.08109648,-0.6148113,0.47045776,0.15507717,-0.22756813,0.17076828,-0.17303488,0.011014704,0.2036813,-0.018549033,0.5282868]],"activation":"identity","dense_3_b":[[-0.08994592],[0.018008003],[-0.09251441]]},{"dense_4_W":[[-0.9093955,0.009164481,-1.0056945]],"dense_4_b":[[0.08682442]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050x00 4CNDC106'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050x00 4CNDC106'.json deleted file mode 100755 index e975ca93ad..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA050x00 4CNDC106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.59357],[1.477006],[0.56332403],[0.0488563],[1.4668952],[1.4705441],[1.4723984],[1.4532107],[1.4244952],[1.3764879],[1.322398],[0.048695624],[0.048735626],[0.048768714],[0.048758227],[0.048573222],[0.048228193],[0.04771695]],"model_test_loss":0.006445982027798891,"input_size":18,"current_date_and_time":"2023-08-06_23-11-36","input_mean":[[22.237236],[6.9949005e-5],[-0.011986303],[-0.00972222],[0.0063137817],[0.0058564004],[0.0051534283],[0.004587619],[0.0048142886],[0.005183529],[0.008339459],[-0.009665056],[-0.0096769305],[-0.009684455],[-0.009677782],[-0.009679327],[-0.009684613],[-0.0095741255]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.855301],[0.052071594],[-0.9259835],[-0.39606982],[-0.28288805],[2.4262483],[-0.34318432]],"dense_1_W":[[-0.43493858,-0.70013213,-0.31350356,-0.43949002,-0.598497,-0.5485545,0.4025656,-0.5401992,-0.018980056,-0.061278734,0.1137699,-0.25585833,0.4615678,0.1875789,0.30483955,-0.031047022,0.28664255,-0.0021283238],[0.16496778,0.69868094,2.0469344,-0.17368059,-1.1800704,-0.13566142,-0.42462012,0.23021017,0.65531075,0.49585822,-0.36106113,0.7175682,0.0027661566,-0.519457,-0.08598626,-0.26602933,0.166157,0.115440816],[0.7728235,-0.4924479,2.2911828,0.36538774,0.028460652,-0.89249814,0.8510172,0.028672855,0.31544507,-0.12564549,0.436127,-0.38716024,-0.22180186,0.23269372,0.10323456,0.09477643,-0.39314544,0.08314657],[1.5947833,0.21068165,-1.9855356,-0.33621395,-0.21167557,0.5248549,0.27686295,-0.20009576,-0.08829141,-0.38474026,-0.2801312,0.15994297,-0.16367479,0.23527442,0.0995661,0.087180234,0.0139048565,-0.01788154],[-0.1763247,-0.7516114,0.018385636,0.02481674,-0.13665949,-1.128679,0.63042605,0.19469936,0.008045146,0.17501755,-0.26599288,-0.36662114,0.17498758,-0.06488771,0.494955,-0.1309667,0.06411596,-0.025877746],[0.41982695,-0.89662635,-0.3100757,-0.18364146,-0.72511435,-0.31305894,0.42398736,-0.40684158,-0.09220529,-0.14246567,0.17467463,-0.16741924,0.34426558,0.06386407,0.064436376,0.07904302,0.37082943,-0.05846411],[-1.2621454,-0.40426448,0.008373463,-0.5806397,-0.37494826,0.25897807,-0.87750936,-0.34095204,-0.12761776,-0.22150302,0.18955815,0.19867262,0.21504422,0.07421347,0.14425631,-0.102518186,0.16319299,0.14805317]],"activation":"σ"},{"dense_2_W":[[-0.3315551,0.6894821,-0.077518575,-0.22825818,-0.15571377,-0.9379825,0.15222666],[-0.40593046,-0.07850631,0.2123167,-0.6120017,-0.32046098,0.25036517,-0.5017452],[1.6233888,-0.81733793,0.32388014,-0.49089634,0.5228173,0.27702752,-0.019065294],[-0.81814194,0.2933751,-0.43884784,0.24256489,-0.89946127,0.005718796,0.1616723],[-0.646881,0.11765002,0.020421116,-0.06024994,-0.7751037,-0.69670886,0.40203825],[-0.4584075,-0.29050452,-0.53295654,0.4170185,-0.4519702,-0.2822419,-0.35187477],[-0.6656979,-0.33147767,0.07978853,0.13856018,-0.66579354,-0.27202693,-0.45372754],[0.45943737,-0.61478317,0.09913581,-0.2357037,0.39553985,0.45948792,-0.12240596],[0.043193635,-0.08017425,0.03667257,-0.087842114,-0.8149818,-0.1100522,-0.41438082],[-0.37532488,0.7357754,0.1027241,-0.89521164,-0.2897733,-1.1208502,0.6037124],[-0.39368445,0.0629941,0.02851393,-0.046042874,-0.1590253,-0.016730668,-0.53213465],[0.31148022,-0.68707335,-0.06828221,-0.11472954,0.2530224,0.66532046,-0.10488325],[1.1789107,0.08234099,0.20439823,-0.51836455,0.7248978,0.5591445,-0.13914037]],"activation":"σ","dense_2_b":[[-0.11449777],[-0.1390032],[-0.37206075],[-0.01236088],[-0.04907102],[-0.05842376],[-0.15911177],[-0.19211829],[-0.11261235],[-0.15294583],[-0.13028015],[0.081644855],[-0.13006176]]},{"dense_3_W":[[-0.115885824,-0.47170904,0.5831736,-0.082577854,-0.31832224,-0.33083022,-0.11571216,0.19875251,-0.476999,0.02469458,-0.26611003,0.35896003,0.20480263],[0.2875189,-0.26662576,-0.2587217,0.49244243,-0.21378644,0.59825927,-0.085313775,-0.8429834,-0.09471229,0.7827554,0.05744314,0.1804075,-0.5764435],[-0.6480157,-0.07066631,0.13443626,-0.6231428,-0.4225046,-0.06471173,-0.16550478,-0.12601337,-0.10136987,-0.46307796,-0.026577879,0.6142914,0.4441342]],"activation":"identity","dense_3_b":[[0.06527926],[-0.009909654],[0.06479232]]},{"dense_4_W":[[-0.2580477,0.33718058,-1.1184793]],"dense_4_b":[[-0.062109288]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA070 4CNDC106'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA070 4CNDC106'.json deleted file mode 100755 index e992f30792..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.06 56310AA070 4CNDC106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.869463],[0.5858021],[0.32688117],[0.02582744],[0.58848983],[0.58583117],[0.584275],[0.58906364],[0.59349614],[0.59887445],[0.610877],[0.025786323],[0.025794433],[0.025818141],[0.025857087],[0.02581527],[0.025688644],[0.025606968]],"model_test_loss":0.0014639738947153091,"input_size":18,"current_date_and_time":"2023-08-06_23-37-00","input_mean":[[26.716673],[-0.074982375],[0.043144263],[-0.0048145084],[-0.09424786],[-0.086935855],[-0.080987304],[-0.06796313],[-0.063149996],[-0.056549143],[-0.056314655],[-0.0047811475],[-0.0048097097],[-0.0048591294],[-0.0050809965],[-0.0051085255],[-0.005041358],[-0.0050054914]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.078991316],[0.3026068],[-0.25273243],[0.013439778],[0.37009302],[0.13664821],[-0.16456622]],"dense_1_W":[[-0.0030744555,-1.0954541,-0.03142538,-1.6753882,-0.12300866,0.79268783,-0.56524116,0.06749773,0.08401616,0.6239685,0.59483725,0.9908935,0.2398722,0.2553315,0.21238373,0.056749463,-0.23877978,0.30825418],[-0.8543499,0.46904665,0.6405476,0.6127007,0.2573736,0.18805248,0.36992317,-0.25051284,-0.08710556,-0.09765011,-0.5353191,0.2860888,-0.31374735,0.2946619,-0.7910126,-0.3691096,-0.79668784,-0.8112845],[0.004426532,-0.38074616,-2.8285646,0.8732835,0.24752633,-0.13101755,0.24333438,-0.19012967,-0.750537,0.4089185,0.44140428,-0.6625775,-0.22507015,-0.15794866,0.21373549,0.1863199,-0.16652858,-0.13657795],[-0.00061952876,0.20687495,-0.031221379,0.15000737,0.057221938,-0.414117,0.08427917,0.028406061,-0.3196398,-0.16508502,0.2385029,0.21718143,0.20419118,-0.23100859,-0.07353892,-0.30362707,-0.14411929,0.2562531],[0.75676596,0.7595603,0.5913131,1.2620265,0.06014515,-0.35853025,0.65820545,-0.26407003,0.24967487,-0.14225705,-0.6774673,-0.34284183,0.23795949,-0.122109324,-0.8345771,-0.65687364,-0.34826776,-0.9373063],[0.015336452,0.8013101,0.25717196,-0.2589111,-0.070080526,-0.015039927,-0.18020448,0.43581685,-0.23000908,-0.49613452,-0.006530597,0.5405513,0.14728923,0.15658382,-0.35035008,-0.57975715,-0.4771852,0.07149061],[-0.0016935252,0.004342065,0.007302239,0.34465888,-0.025569389,0.35721523,0.01775156,-0.2676134,0.13569762,0.04341658,0.00885,-0.121513374,-0.008711255,-0.3805635,0.1356443,0.13222197,-0.06938037,-0.13515687]],"activation":"σ"},{"dense_2_W":[[-0.35044748,0.75662565,0.15265507,0.7413438,-0.4943425,-0.7841103,-0.4461334],[0.5878455,-0.53052,0.46835116,-0.15082686,0.21561971,-0.30972666,0.28406903],[0.20365499,0.4938969,-0.37405172,0.36490002,0.35413012,-0.9276364,-1.271868],[0.15956812,-0.38227826,-0.34810027,-0.014073657,-0.17678988,-0.24762544,-0.8106593],[0.22776775,0.13553928,-0.2668433,-0.55416316,0.092818014,-0.066418946,0.45135185],[-0.379788,0.040577516,-0.18843734,0.21656789,0.1811508,-0.56766593,-0.465205],[-0.23584001,0.24342734,-0.08911726,0.93044406,0.47716722,-0.79287815,-0.7560821],[-0.08083705,0.20666538,0.38358647,0.16494158,0.17152569,-0.5743303,-0.84767425],[0.024201993,0.40508404,-0.452589,-0.14900035,-0.33940226,0.47047055,0.12949952],[0.0010686722,0.10515713,0.31118774,0.42902952,-0.27714232,-0.8179147,-0.23361693],[-0.20535007,-0.012914676,-0.24386998,-0.32201836,0.07650227,0.40637252,0.18290128],[0.46828738,0.15236787,-0.09334366,0.13351235,-0.347683,-0.4621099,0.34972924],[0.11132558,-0.08493177,0.22236344,-0.5575323,-0.43925527,0.57304513,0.71222407]],"activation":"σ","dense_2_b":[[-0.033294365],[-0.02055917],[-0.012818121],[-0.15711962],[-0.008688181],[0.054913495],[0.07755708],[-0.019581897],[-0.043765243],[-0.053016193],[-0.26712343],[-0.07999009],[-0.05613337]]},{"dense_3_W":[[0.696178,-0.5648311,0.6407045,0.19891022,-0.50313693,0.40486115,0.22351098,0.5828681,-0.601358,0.35544997,0.2282452,-0.27341864,-0.26009113],[-0.3853707,0.18478364,-0.5145561,0.32450193,0.5612143,-0.056345817,-0.28207055,-0.359446,0.550403,-0.423757,-0.0041745333,0.059421163,0.12554394],[-0.25317714,0.23387927,-0.35460812,0.067600355,-0.37119082,0.52048504,0.7020422,0.29556522,-0.58882946,0.039621986,-0.4467602,0.32936186,-0.4934978]],"activation":"identity","dense_3_b":[[-0.03463644],[0.016086485],[-0.025971314]]},{"dense_4_W":[[-0.73397875,0.10442852,-0.5272976]],"dense_4_b":[[0.033531036]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 56310AA050x00 4CNDC107'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 56310AA050x00 4CNDC107'.json deleted file mode 100755 index 2124ae9ec3..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 56310AA050x00 4CNDC107'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.8824434],[0.71507746],[0.40526694],[0.027533442],[0.70021],[0.70435107],[0.70917654],[0.72280884],[0.7279133],[0.72587556],[0.71601045],[0.027381662],[0.027431164],[0.027479855],[0.027565915],[0.027533367],[0.027572744],[0.027474292]],"model_test_loss":0.0026778955943882465,"input_size":18,"current_date_and_time":"2023-08-07_00-25-13","input_mean":[[23.297268],[-0.03233586],[0.0028342474],[-0.0057605663],[-0.032880228],[-0.032776646],[-0.032454334],[-0.032823607],[-0.034516074],[-0.031360645],[-0.0298374],[-0.0057719713],[-0.0057596182],[-0.005749741],[-0.005749389],[-0.005687085],[-0.005583106],[-0.005525541]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.5215416],[-0.57060343],[-0.10824382],[0.24978213],[1.0079527],[0.3802316],[0.889446]],"dense_1_W":[[-0.26616007,0.32819784,0.00067071285,-0.17974856,-0.27740893,0.317025,-0.06948472,-0.059453495,0.011850398,0.09067377,-0.06956775,-0.018317414,0.17877837,-0.18234687,0.09975633,-0.06088335,0.67421824,-0.501803],[-0.2902224,0.03435688,-0.0007335937,0.096210994,0.12977274,-0.5014846,0.12585396,0.19064707,-0.33947954,0.09289936,0.0021525132,-0.5650862,0.1586393,0.24856442,5.5656827e-5,-0.16046683,0.47567898,-0.26273644],[0.004148071,-0.20369966,0.0006762518,-0.12915482,0.31135672,-0.40276182,-0.023599507,-0.048985712,0.14804183,-0.27225778,0.13084674,-0.2682165,0.079972215,0.3869157,0.16938664,-0.06664921,0.18059294,-0.10463955],[-0.042720374,-0.44797078,0.106441885,-0.23366769,0.3137181,0.46343398,0.44943058,0.6756963,0.63177943,0.18888515,0.6256494,-0.64797264,-0.7504678,-0.021724926,-1.2981596,-0.49731153,-0.041930113,-0.5024712],[0.93396103,0.0685933,-2.0326483,-0.108520836,-0.112476364,-0.18603157,0.4607162,0.0659317,-0.21982923,0.030069323,-0.005501312,-0.19012018,0.0807506,-0.08516471,0.017757716,0.59362125,0.06101577,-0.30881],[-0.039777555,0.6639411,0.10703323,-0.17111959,0.74993485,0.4655031,-0.24367447,-0.091623016,0.21031639,0.5017018,0.9008939,-0.2138174,-1.124537,-0.841201,-0.6622513,-0.45340645,-0.6225992,-0.35385105],[0.652006,0.12817843,1.9792969,0.122777954,-0.5505552,0.32176024,-0.59021205,0.6974296,0.23109314,-0.08562345,-0.243364,0.04599025,0.48566473,-0.2583534,-0.23012485,-0.47488052,-0.08368516,0.34066808]],"activation":"σ"},{"dense_2_W":[[1.3105916,-0.9507534,0.12762353,-0.48912024,-0.82522184,-0.28377983,0.09846663],[0.6104658,-0.36417446,-1.0213474,-0.0030217022,-0.5582867,0.26822597,0.1030378],[-0.2444796,0.6386674,0.64500415,-0.32919264,-0.2632627,-0.2914869,-0.41501835],[-0.17211501,0.72615033,0.8057921,-0.3012537,-0.06894025,-0.6685643,0.12407082],[1.0545709,-0.7296641,-0.7836252,-0.5428908,0.31110647,0.5414368,0.78908324],[-1.0883812,0.45824885,0.30062124,0.6135413,-0.5220157,-0.2808084,-0.65922874],[-0.45479217,0.72624725,0.80973893,0.16011865,0.14399557,-0.057426546,0.4549376],[0.26526257,-0.9891332,-0.5146369,0.21206275,-0.1548442,-0.29759446,-0.63057125],[-0.89195234,0.7344573,0.13697046,0.1335858,-0.3111978,-0.10358053,-0.5817338],[0.35159203,-0.53573203,-0.37090668,-0.07636804,-0.7223272,0.34780052,0.25976828],[1.4417952,-0.9369937,-0.5165861,-0.5886849,0.27827945,-0.17774494,0.33352372],[-0.83197176,0.056716688,0.3176061,-0.0045141433,0.40866536,-0.42308146,0.32042512],[0.21989709,-0.18666251,-0.56908923,-0.5630903,-0.44349894,0.4591227,0.2543278]],"activation":"σ","dense_2_b":[[0.13017428],[-0.26941714],[-0.088276364],[-0.046999395],[0.4457564],[-0.06871929],[-0.10337065],[-0.22012532],[-0.08198058],[-0.033206128],[0.10756691],[-0.02121439],[-0.059810642]]},{"dense_3_W":[[-0.10640557,0.06776593,0.32191923,-0.28953195,0.026864873,0.2731794,0.16903114,0.44673413,0.48168063,-0.3712548,0.23447442,0.29575455,-0.1468495],[0.66085047,-0.27319327,0.2644553,-0.5318593,0.7203917,-0.34130642,-0.5875807,-0.46950552,-0.6058821,0.41351122,-0.006779633,-0.31155804,0.5298571],[-0.29553437,-0.58076066,0.52323264,0.45213857,-0.16277957,0.25945267,0.4144006,-0.66534394,0.22506356,-0.63662976,-0.7497482,0.07323068,0.024176065]],"activation":"identity","dense_3_b":[[-0.034318473],[-0.04050105],[0.079460956]]},{"dense_4_W":[[-0.04219099,0.38754243,-0.83605766]],"dense_4_b":[[-0.053366307]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 x00x00x00x00x00x00x00x00x00x00x00 4CNDC107'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 x00x00x00x00x00x00x00x00x00x00x00 4CNDC107'.json deleted file mode 100755 index 2dbdb89f2e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021 b'xf1x00CN7 MDPS C 1.00 1.07 x00x00x00x00x00x00x00x00x00x00x00 4CNDC107'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.3239555],[1.2216686],[0.56163263],[0.040356442],[1.2047082],[1.2095532],[1.2141893],[1.2243134],[1.227764],[1.2343445],[1.2368515],[0.040138606],[0.04019667],[0.040256687],[0.040477395],[0.040625844],[0.040658556],[0.04046674]],"model_test_loss":0.003521745325997472,"input_size":18,"current_date_and_time":"2023-08-07_00-49-58","input_mean":[[24.67693],[-0.04921823],[0.0012857419],[0.0007996762],[-0.04480579],[-0.04406795],[-0.043653794],[-0.043152645],[-0.0432289],[-0.046706084],[-0.050676387],[0.0009143127],[0.0009410887],[0.00097576616],[0.0010559426],[0.0011112413],[0.0010468352],[0.0010160342]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.49570504],[1.3210211],[2.6898615],[-0.02208882],[-0.09377371],[-2.7531927],[0.006006821]],"dense_1_W":[[0.15420651,0.23067516,0.11304303,0.013207053,-0.28895557,0.4683098,-0.20896511,0.015550693,0.122526914,-0.109381676,0.07471001,-0.13962431,0.2163086,0.028139457,-0.44415337,0.0053714034,0.042319868,0.042410903],[0.50394976,-0.23329197,-0.15899694,-0.12280355,0.14703913,-0.48161858,0.69567484,-0.34582955,-0.36040807,-0.004507536,0.14408033,0.1836344,0.11809705,0.32179466,-0.16438203,-0.31062344,0.1120704,0.18364586],[0.49820933,-0.26314422,-0.26272264,-0.22503936,-0.12580016,-0.47477996,0.33671036,-0.34708446,-0.31003487,0.25983158,-0.15030581,0.091946304,0.03323872,0.34110484,0.39555183,-0.2991158,-0.2320138,0.28421888],[0.01583395,1.1208205,3.865706,-0.44494992,-0.5262589,0.31796062,-0.81724226,0.43527883,0.4510549,-0.08255983,-0.6121285,0.9358581,-0.0058640586,-0.34025922,-0.21380498,-0.23998466,0.11081464,-0.20770882],[-0.0034587705,0.21727203,-0.007030041,0.011187133,0.24777392,0.7926248,-0.55883515,-0.28467444,-0.32108763,0.23630463,0.122614495,0.5811709,0.06195977,-0.31027994,-0.46347076,0.063689135,-0.34609768,0.3360888],[-0.5817377,-0.59925795,-0.2828089,0.12346245,-0.023504892,-0.43106267,0.37201306,-0.25494003,-0.04706249,-0.23423873,0.07503895,-0.08940586,-0.017763922,0.51661766,0.123237476,-0.40396547,-0.06934791,0.2436692],[-0.00840452,0.30712155,-0.2591553,-0.13306698,-0.66947764,0.38101527,-0.18025695,0.18304327,0.42003196,-0.19946226,-0.31748682,0.37292734,0.12961847,-0.26775375,0.4295266,-0.30892614,0.2832681,-0.0377284]],"activation":"σ"},{"dense_2_W":[[-0.7306887,-0.3954964,0.39146426,-0.29959947,-0.47128507,0.3531377,-0.334773],[-0.20252958,0.19992398,-0.33168688,-0.44316828,-0.403189,0.8955503,0.049495354],[-0.5052344,0.2230648,0.7528356,-0.11088759,-0.22496831,0.6596836,-0.5600461],[0.7656071,-0.48874223,-0.57206357,-0.23170787,-0.06306857,-0.43644294,0.34748504],[0.1213388,0.25739238,-0.41398072,0.06884506,0.82274115,-0.41439316,-0.13129346],[-0.66222745,-0.39265332,0.34125367,-0.5192327,-0.01774378,0.07983937,-0.5983968],[0.05495612,0.7774879,0.5478655,-0.4151472,-0.3105426,0.10111106,-0.31487244],[0.20206158,-0.57719696,-0.76630634,-0.8810195,-0.77503985,0.31274256,-0.30636895],[0.6253499,0.25690252,-0.74118155,0.46701622,0.42273006,-0.3957298,-0.3012005],[-0.020889444,0.19570331,0.09289772,0.13839301,-0.5962096,0.24448077,-0.4408785],[0.38479564,-0.4298671,-0.22112085,0.36361158,-0.18309206,-0.19321738,0.38277677],[0.6633294,-0.20508423,0.10870525,-0.35996673,0.8237321,-0.77270275,0.51027477],[-0.03977624,0.15964952,0.7697739,0.24770993,-0.8757424,0.37308407,-0.7050307]],"activation":"σ","dense_2_b":[[-0.092581324],[-0.1461753],[-0.054165266],[0.06442791],[-0.00013360326],[-0.11788689],[0.06482655],[-0.25213814],[-0.059510298],[-0.23111191],[-0.030306052],[-0.00994865],[-0.10923587]]},{"dense_3_W":[[0.26818967,-0.13706638,-0.016091619,0.60452354,0.23608918,-0.5172543,-0.46327448,0.18274918,0.674987,0.38215277,-0.19895244,0.44653496,-0.5346905],[-0.592465,-0.39396238,-0.6349639,0.1223753,0.6926395,-0.30194458,-0.54252756,-0.0013925297,0.51748616,-0.26460662,0.20391932,0.058503315,0.03102843],[0.5844198,0.15142864,0.5510742,-0.54181045,-0.11530869,-0.38452375,0.34452912,0.33701643,0.21574911,0.43324685,-0.42422894,-0.22249535,0.19921371]],"activation":"identity","dense_3_b":[[0.043458235],[0.064931095],[-0.06555825]]},{"dense_4_W":[[0.75090593,0.62048215,-0.7586382]],"dense_4_b":[[0.054481287]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.02 56310BY050 4CNHC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.02 56310BY050 4CNHC102'.json deleted file mode 100755 index ca102af60e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.02 56310BY050 4CNHC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.952709],[1.1003942],[0.47154436],[0.03557234],[1.0985221],[1.100109],[1.1007283],[1.0919963],[1.0812235],[1.0604604],[1.0346675],[0.035514425],[0.035544988],[0.035569686],[0.03549034],[0.035385482],[0.035147294],[0.034815073]],"model_test_loss":0.004957424011081457,"input_size":18,"current_date_and_time":"2023-08-07_01-40-53","input_mean":[[24.884089],[-0.016909879],[0.012826358],[-0.026510358],[-0.019373143],[-0.018562341],[-0.01784492],[-0.013357136],[-0.008858641],[-0.0046453234],[-0.0011935525],[-0.026596593],[-0.026568031],[-0.026541922],[-0.026392153],[-0.026309952],[-0.02631445],[-0.02632764]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.4760303],[-0.18308954],[-2.167727],[-0.417148],[-0.013595293],[2.8997235],[0.019984849]],"dense_1_W":[[2.096428,0.04293517,-0.055048794,-0.46484697,-0.35501856,0.42526284,-0.45293817,0.22161071,-0.635065,0.12139629,0.0034814414,0.5435328,0.020969981,-0.072267376,-0.08442676,-0.28275377,0.42481178,-0.0931807],[0.03543624,-0.6877385,-3.3156288,-0.10774069,0.90167654,-0.23635304,0.26507783,0.22863936,-0.51606226,-0.7042943,1.0019395,-0.19395043,0.54403013,-0.22361496,-0.0723612,0.024753883,0.21771601,-0.058525223],[-0.2608231,0.1017871,0.077472344,0.2912071,0.06507552,0.55804306,0.16650774,-0.20267099,0.31049293,0.34334332,-0.22618186,0.56663543,-0.40060464,-0.41012672,-0.46737882,0.41070658,-0.19341056,0.07924895],[-2.1272566,-0.26860842,-0.056874078,0.028759755,-0.117427334,0.6830661,-0.49746,-0.15804365,-0.597628,0.20925169,0.075665824,0.06611037,0.1801026,-0.04828015,-0.060966395,-0.237039,-0.07277843,0.1432378],[-0.012815778,-0.123973764,-0.14136693,0.3905719,0.11651388,0.14950705,0.09933541,-0.7976692,-0.060879573,0.2617282,0.19549161,-0.40608075,-0.12369088,0.50207996,-0.102547385,-0.44343522,0.08439864,0.0862764],[0.31134474,0.71243083,0.095208526,0.27090108,0.3364311,0.3387401,-0.6072888,0.26359472,0.51003397,-0.03195535,-0.1718143,0.122315615,0.08455601,-0.29650295,-0.45320752,0.15260614,-0.14674625,0.12800558],[-0.013968377,-0.26977414,0.052489035,-0.20114611,-0.16536346,-0.5467719,0.34399673,0.33305255,-0.11911299,-0.012991744,-0.2281494,-0.38340676,0.2801909,0.06072155,0.11670941,0.27231306,0.056253888,-0.20349257]],"activation":"σ"},{"dense_2_W":[[0.25041997,0.10206583,0.715677,0.18107271,-0.95661914,-0.17999575,-1.1160771],[0.18456584,0.117620505,0.6509535,0.23106942,-0.979118,0.9328957,-0.4987036],[1.0633037,-0.7188896,0.55112547,0.08787729,-0.6966662,1.2828107,-0.46829444],[0.26642972,-1.0333931,2.0355246,1.8633006,-1.7384061,-0.27828768,-1.8381956],[0.22363526,-0.08106195,0.26395926,-0.62673736,-0.12962806,-0.7491592,0.7798321],[-0.09318676,-0.4941464,-0.38996404,0.26097637,0.17723922,-0.5002643,0.8469415],[-0.32657585,0.23485117,-0.6398364,-0.10261886,0.57225746,-0.9840285,0.23459736],[-0.6653256,0.20312071,-0.052869216,-0.010713486,-0.021094337,-0.53480285,0.46862552],[0.19337021,0.5902509,-0.45771724,-0.40887538,0.65314317,0.2744537,0.36075133],[-0.09122067,-0.13116741,-0.72494227,-0.5763938,0.48517498,-0.15608339,0.7322048],[1.1417534,-0.78113425,0.78245425,0.040167056,-0.5890334,1.335385,-0.67876405],[-0.39274675,0.036710966,-0.059761982,-0.35286152,-0.02719329,-0.27672735,-0.50070906],[0.02223952,-0.45935592,0.25860146,-0.30429536,-0.16111197,-0.3231146,0.62293917]],"activation":"σ","dense_2_b":[[-0.04028944],[-0.028142564],[0.078946814],[-0.46476564],[-0.0035999476],[0.030332983],[-0.25515258],[-0.018076524],[-0.026729377],[0.031496003],[0.08078611],[-0.27224502],[-0.045907073]]},{"dense_3_W":[[0.4620854,-0.02418078,0.7011184,0.020806301,-0.27951247,-0.5371555,0.116979554,-0.30603725,-0.18933018,-0.40903252,0.6753726,0.568753,-0.4310432],[-0.54020286,-0.041412946,-0.24306548,-0.61936015,-0.05605574,0.15100999,-0.07693919,0.16520485,-0.05813703,0.47304806,-0.64346826,0.19271328,-0.038352612],[-0.33212858,-0.55580896,-0.67064255,-0.3418983,0.586469,0.21342045,0.7920437,0.2883454,0.4300167,0.6901999,0.34964025,0.1846654,0.04058318]],"activation":"identity","dense_3_b":[[-0.059763335],[0.079902194],[0.035987742]]},{"dense_4_W":[[0.39221895,-0.7381316,-0.6760117]],"dense_4_b":[[-0.046233788]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050 4CNHC103'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050 4CNHC103'.json deleted file mode 100755 index 6494d76e93..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050 4CNHC103'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.5466146],[0.80981266],[0.4014232],[0.035715338],[0.808276],[0.80946004],[0.8099587],[0.8003049],[0.79292077],[0.7788614],[0.7569955],[0.035431836],[0.03552915],[0.035616748],[0.035825603],[0.035789166],[0.035539445],[0.035157643]],"model_test_loss":0.0024959088768810034,"input_size":18,"current_date_and_time":"2023-08-07_02-05-51","input_mean":[[20.843248],[-0.067527235],[0.00015006482],[-0.012940521],[-0.06860682],[-0.06791663],[-0.06730508],[-0.06773257],[-0.066599436],[-0.0642261],[-0.06246489],[-0.012981559],[-0.012971355],[-0.012961813],[-0.013026318],[-0.013139244],[-0.013358213],[-0.013696734]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.36959708],[-0.3927159],[0.015337716],[-2.6280007],[0.013323148],[-2.6784072],[0.012876663]],"dense_1_W":[[0.00441593,-0.28445426,0.12868425,-0.06594001,0.643517,-0.26863223,0.23516199,0.0933076,-0.54322356,-0.13129324,0.22534953,0.15129176,-0.13127483,0.19987836,-0.39554223,-0.0589629,-0.49924454,-0.28881076],[0.39027417,0.15401302,-0.056920696,-0.47890553,-0.3300009,-0.48306167,0.5828366,-0.065358765,0.11067453,-0.19332197,0.08158799,-0.13183025,0.08212273,0.34178394,0.30528525,-0.046424016,0.45213524,0.049064413],[-0.0018742161,1.0021389,3.8293767,-0.20225114,-0.7356092,0.38675764,-0.6186065,0.1530118,-0.19326465,-0.16745023,-0.09147689,0.3500271,0.28329384,-0.3719793,-0.11645031,0.012525024,-0.15232189,0.16442363],[-0.37709048,-0.18989839,-0.39395905,0.45258853,-0.27445865,-1.0695606,0.52972853,-0.24389778,0.18883058,-0.3289555,0.026898181,-0.4512817,-0.012726739,0.24032715,0.039549112,-0.15741278,0.23836505,-0.22582999],[0.0026869208,0.5816565,0.0047081015,0.33716485,-0.43749458,-0.90179884,0.090872325,-0.18876752,0.28434423,0.30354127,-0.45683673,-0.0043129507,-0.15474738,-0.12864216,0.33334208,-0.37975344,-0.17868224,0.17245947],[-0.37269658,0.056210883,0.39117196,-0.20178121,0.48395464,0.6668031,-0.19134971,0.05924893,0.20031299,-0.051123295,0.11479842,0.3327035,0.406696,-0.60037625,-0.55025846,0.3823001,0.067088164,0.03777696],[0.28842884,0.27748382,0.055223227,0.24982269,-0.25035748,0.6999531,-0.5086199,-0.16066559,0.18782836,-0.009960592,-0.09571262,0.5652131,-0.20471764,-0.25930697,-0.46783432,-0.36040586,-0.04924343,-0.036189865]],"activation":"σ"},{"dense_2_W":[[0.4325747,0.05352207,-0.019636882,0.23707733,0.51061547,-0.4637862,-0.40100852],[0.20493814,-0.20983218,-0.4001346,-0.008143373,0.2476857,-0.037123583,-0.67152816],[-0.38300198,-0.5133637,0.054119077,-0.6279624,-0.49244288,0.6256476,0.7907053],[0.19233866,0.08520638,0.08706983,-1.0209559,-0.61933124,0.5403933,0.96377575],[-0.5673173,-0.8495875,0.35421842,-0.16951926,-0.36651966,0.16976853,0.0146132065],[-0.11585242,0.6740597,-0.41580456,-0.12795658,-0.036778353,-0.3175067,0.04743779],[-0.07734896,-0.36116868,-0.13891894,0.13353403,-0.17158407,0.18492623,0.215829],[-0.079607025,-0.0628624,-0.40307927,-0.6614631,0.25177357,0.37012863,-0.057130966],[-0.39253744,-0.11905358,-0.0998102,0.14498588,0.031866945,0.4783852,-0.27589342],[-0.46258968,-0.5466553,0.5868711,-0.5633951,-0.14532568,0.22600377,1.0318995],[0.11289376,-0.40194705,0.4572626,0.7012955,-0.27434063,-0.30249357,0.39138433],[0.0068481546,0.33485183,-0.21508186,-0.07030695,-0.10074153,-0.07031553,0.2075642],[0.19613013,0.27113703,-0.25391266,-0.21612066,0.19921905,-0.14536792,-0.3427696]],"activation":"σ","dense_2_b":[[-0.012001398],[-0.02212474],[0.14096059],[0.041697618],[-0.008908936],[0.047332846],[-0.009194286],[-0.039932724],[-0.043813754],[0.036821954],[-0.0014258353],[0.00875199],[0.015467969]]},{"dense_3_W":[[0.32098088,-0.32571092,-0.6606648,-0.15589207,-0.29422677,-0.11235969,0.27968746,-0.4088068,0.46579373,-0.32524452,-0.25602353,-0.074144796,0.4581445],[0.2711465,0.4530056,0.31585717,0.165996,0.09512367,0.54065865,-0.5712976,0.093997784,0.22095615,-0.3393496,0.04974402,0.16312775,0.20385568],[0.6250006,0.51413673,-0.7039048,-0.40498862,-0.30975106,0.5319801,-0.030333402,-0.34835565,-0.48519892,-0.087083556,0.5168309,0.3949118,0.14679015]],"activation":"identity","dense_3_b":[[0.029179294],[2.9370978e-5],[0.024199445]]},{"dense_4_W":[[-0.8672829,-0.09036683,-0.9275841]],"dense_4_b":[[-0.027475327]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050x00 4CNHC103'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050x00 4CNHC103'.json deleted file mode 100755 index d347614e8c..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.03 56310BY050x00 4CNHC103'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[10.490675],[1.1291032],[0.58252037],[0.039405],[1.1280589],[1.1279522],[1.1269643],[1.1124369],[1.1045281],[1.0925866],[1.0763438],[0.039314747],[0.039330542],[0.039342582],[0.039305937],[0.039206024],[0.038994968],[0.03869199]],"model_test_loss":0.005967735778540373,"input_size":18,"current_date_and_time":"2023-08-07_02-32-21","input_mean":[[22.534412],[-0.032263618],[-0.0037575949],[-0.0020172608],[-0.032352883],[-0.032752782],[-0.032883693],[-0.034339994],[-0.03540198],[-0.038307104],[-0.037811134],[-0.0020329459],[-0.0019997917],[-0.0019778514],[-0.0019503924],[-0.001969454],[-0.0020386311],[-0.0020115753]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.476557],[-0.68177766],[-1.4334949],[0.9746544],[-1.3537669],[-0.16913444],[1.5312378]],"dense_1_W":[[-1.4674118,-0.24609241,-0.017173812,-0.1921773,-0.33003026,-0.7032546,0.8222835,0.45996,0.033816524,0.1080052,-0.2516134,0.101496324,0.052959982,0.008949171,0.2056011,-0.13730909,-0.070785694,0.091235936],[-0.15725255,-1.8879077,-3.1574435,-0.026291944,0.91971624,0.7033072,0.87052536,0.5834137,-1.1149441,-1.1206936,0.80906874,-0.29204804,-0.66741747,0.41703406,0.6053606,-0.0012035158,0.24638794,-0.3302526],[-0.6278058,-0.38527206,-0.31773865,-0.08035399,0.022208743,-1.0113361,0.106477626,-0.0055144937,-0.11381203,0.112506695,-0.0055704513,0.38441408,-0.06360585,-0.008369453,0.008495975,-0.45555764,0.25611266,0.114160754],[1.2448323,0.124219336,0.3851474,0.1306329,0.17512998,0.5563543,0.33161706,0.5850413,-0.12428443,-0.16596517,0.01010055,-0.5043342,0.37030837,0.16615497,-0.36301187,0.0164275,0.034172643,-0.044182498],[-1.5838906,0.20879757,-0.015540314,-0.18438894,-0.05623706,-0.16800252,0.08689027,-0.24974507,0.009985618,-0.004396259,0.034236554,0.11091792,0.11175782,-0.080768205,-0.24925712,0.37246683,-0.022103941,-0.048722908],[0.056122262,0.2864052,-0.05922396,-0.15394859,0.2536335,-0.6977994,0.12732469,-0.56870854,0.11164165,-0.16432123,0.20823452,-0.35387105,0.1299614,0.02070388,0.43777424,0.29617321,-0.0202072,-0.2295211],[0.29040423,-0.44746503,-0.37836528,-0.5874443,-0.40612307,-0.81674665,0.2653388,-0.074799396,-0.13337858,0.16270955,-0.046827342,0.16102041,-0.042110663,0.68649536,0.16037555,-0.6455673,0.2862756,0.15030107]],"activation":"σ"},{"dense_2_W":[[0.88346493,-0.88215524,-0.714372,-1.4153144,1.6741431,-0.96062607,-2.4220207],[-1.0811888,0.7783481,-0.61303014,0.08742927,-0.32858953,-1.0313102,-0.14017701],[-0.83909744,-0.51418436,-0.34867173,-0.40438738,0.38744128,-0.9341407,0.5689156],[1.2234789,0.4505039,0.883525,-0.9082529,-0.45139286,-0.037596144,-0.4650941],[0.28187194,-0.01952515,0.6481759,0.5426486,-0.35617682,0.15431538,0.9969678],[0.9743034,-0.5146453,0.46463448,0.4160945,0.36689076,1.08357,0.15814787],[0.98991585,-2.347642,0.09153862,-1.1622584,0.11513134,-0.03356802,-0.5818536],[0.22896764,0.23242263,0.2844799,0.4641689,-0.3848538,0.4694864,0.82048494],[0.5654004,-0.40305212,0.9788426,-0.47530088,0.11026323,0.9248025,-0.09487986],[-0.66444695,0.07370127,-0.9244193,0.23670202,0.02346553,-0.8573719,0.1414936],[-1.7262199,0.06688502,-0.24180819,-0.55838716,-0.031299785,-1.0274018,0.274008],[0.29235423,-0.4138396,-0.8648773,-1.1904085,1.2492888,-0.97297734,-1.8818952],[-0.6758243,0.089520454,-1.1900347,-1.3192135,0.22304952,-0.4525044,-0.4759342]],"activation":"σ","dense_2_b":[[-0.028017305],[-0.061963774],[0.20414406],[-0.6334071],[-0.03253269],[-0.25242165],[-0.16586097],[-0.124249145],[-0.3108962],[0.24476607],[0.23445076],[-0.09690479],[0.23614454]]},{"dense_3_W":[[0.012833234,-0.3479158,-0.5259433,0.17710736,0.40674126,0.61857796,-0.07993461,0.4996034,0.12137744,-0.7061775,-0.7857778,-0.22047266,-0.6328669],[1.1566063,0.04082107,0.8082871,-0.7832778,-0.23352258,-0.6495986,0.6835129,-0.091181114,-0.3048599,0.7264398,0.43395072,0.89236176,0.31225243],[-0.80061877,-0.6287943,-0.4909107,0.12166274,0.54646,0.12600482,-0.28478548,0.48107162,0.044651717,-0.007296607,-0.81748486,-0.8812352,-0.6868977]],"activation":"identity","dense_3_b":[[-0.050449766],[-0.01878802],[0.12566388]]},{"dense_4_W":[[-0.20012462,0.9402982,-0.45523268]],"dense_4_b":[[-0.0072831307]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.04 56310BY050x00 4CNHC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.04 56310BY050x00 4CNHC104'.json deleted file mode 100755 index 118eb1cf3e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021 b'xf1x00CN7 MDPS C 1.00 1.04 56310BY050x00 4CNHC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.336879],[1.3154227],[0.59994406],[0.036185816],[1.3162037],[1.3162056],[1.3148344],[1.2966222],[1.275338],[1.2474067],[1.2149154],[0.036175884],[0.036184948],[0.036186848],[0.03609507],[0.03606698],[0.03593411],[0.03568829]],"model_test_loss":0.004663573112338781,"input_size":18,"current_date_and_time":"2023-08-07_02-57-17","input_mean":[[20.966389],[-0.1988315],[0.007915254],[-0.0028921724],[-0.19796984],[-0.19835053],[-0.19851768],[-0.19411317],[-0.18918088],[-0.1827134],[-0.17358756],[-0.0029098932],[-0.0029171635],[-0.0029238905],[-0.0029175677],[-0.0029673595],[-0.0030402362],[-0.0030292866]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.50860286],[-1.1555929],[0.23071012],[-0.1957657],[-1.2921786],[-0.5563927],[0.019920422]],"dense_1_W":[[0.39047584,-0.47947386,-0.005918953,0.2007276,0.044099685,0.15533815,-0.040589128,-0.2630327,0.0071245213,0.061105832,0.04366077,0.1350462,-0.1124703,0.12785473,-0.04178164,-0.44747785,0.0028341468,0.23350663],[-0.34462857,-0.5556194,0.0146421995,0.0050324253,0.1526045,-0.52050006,0.40116233,-0.29075962,0.1761436,-0.34321496,0.18081273,-0.052150007,-0.34601086,0.51632524,0.06400605,0.0061850185,-0.32717043,0.20724139],[0.029175306,0.7315644,4.721232,0.08325713,-0.48493296,-0.24665754,-0.1523269,-0.005119804,0.22956513,0.3020592,-0.4038248,0.6253751,0.25363073,-0.5005454,-0.31425786,0.23239496,-0.31191078,0.047809538],[-0.010508659,0.15341635,0.43864673,-0.1464096,0.18380292,-0.08827558,-0.6522776,0.029167967,0.5192565,0.123401366,-0.32648972,0.15496483,0.31653887,-0.5059119,0.057938904,-0.04915116,0.21404971,-0.12505578],[-0.3848665,0.5562081,-0.031109845,-0.091075,0.122943915,0.46815628,-0.37999207,-0.12903124,0.1892725,0.27956063,-0.132565,0.096547544,-0.34272483,0.12283442,0.06688585,0.3923325,-0.27006665,-0.034028348],[0.08722563,-0.2605648,-0.0077059204,0.053181015,0.0549966,-0.57108873,0.17384295,0.23858054,-0.06958964,0.34006983,-0.2719506,-0.047910836,-0.11265416,-0.12560493,0.27393594,0.2091702,-0.055573467,-0.10821209],[-0.06763393,-0.37754446,-0.009697453,0.08860953,0.28071558,-0.67214215,0.34979525,0.117161624,0.16652317,0.029180126,-0.10343166,-0.21206415,-0.08761407,0.08291694,-0.07274916,0.22889741,0.40336818,-0.373356]],"activation":"σ"},{"dense_2_W":[[0.055040672,0.5993177,-0.22644603,-0.8265452,-0.0038502845,0.44068658,-0.03040217],[-0.70651376,-0.3338041,0.42435834,-0.18500227,0.81759316,-0.5486541,-1.110574],[-0.5266372,-0.7444737,-0.3628261,0.5852146,0.95713323,-0.26699162,-0.8405533],[-0.28034517,-0.2479486,0.64379674,0.7883626,-0.12794921,-0.8036546,-0.1523485],[-1.3158185,0.12383007,0.49551678,0.13944684,0.43195948,-0.86401516,-1.1620226],[-0.077836744,0.46037325,-0.11932971,-0.4114782,-0.32642493,0.08826335,0.3426612],[-0.869882,0.32593668,-0.9218525,-0.37414593,-0.120396055,0.61139256,-0.12451638],[0.018881803,-0.6284976,-0.21616842,-0.26261458,0.17759265,-0.4875057,-0.7788972],[0.23179096,0.5346621,0.14235991,-0.16656797,-0.6345287,0.6345263,0.6490954],[0.42456567,0.16523154,0.15447061,-0.33069327,-0.7372917,0.64228994,0.3790743],[0.3378659,0.57663065,-0.011852186,-0.34422934,-0.8071215,0.16176973,0.9347968],[0.8090811,-1.1519405,1.155839,0.8935971,-0.04736475,-0.6883236,-0.16425224],[0.5435343,-1.5603184,-1.8775592,0.040111613,-1.4295818,-0.6792629,-0.17226006]],"activation":"σ","dense_2_b":[[-0.16689628],[-0.2849929],[0.050556302],[0.0045983535],[-0.21896972],[-0.038251407],[-0.4631888],[-0.45150843],[-0.2340387],[-0.040570892],[0.017508559],[0.33123934],[0.029258676]]},{"dense_3_W":[[-0.48214975,0.61397964,-0.3610514,0.635723,0.8418613,-0.08425857,-0.6093145,0.36558312,0.05758606,-0.27470613,-0.981727,0.8191294,0.86783963],[0.6742536,-0.09863488,-0.8090672,-0.087475404,-0.34558988,0.46608582,0.0860837,-0.19014728,0.6121176,0.5906499,0.030970646,-0.84944576,-0.10872761],[0.34069678,0.72464764,0.53571326,0.3477245,0.24464273,-0.55484986,0.52443147,-0.5883181,-0.4959677,-0.40765953,-0.7288586,0.7889583,0.81876206]],"activation":"identity","dense_3_b":[[-0.13179861],[0.03719345],[-0.098335996]]},{"dense_4_W":[[0.6273808,-0.39738363,0.47976896]],"dense_4_b":[[-0.057788193]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI000 4NEDR106'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI000 4NEDR106'.json deleted file mode 100755 index 332a128784..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI000 4NEDR106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.042358],[1.4254401],[0.56163555],[0.046136778],[1.4076314],[1.4138519],[1.4181747],[1.4050233],[1.3790605],[1.3384784],[1.2876749],[0.045835752],[0.045892626],[0.045947872],[0.04606048],[0.04602913],[0.045808274],[0.0454029]],"model_test_loss":0.010334409773349762,"input_size":18,"current_date_and_time":"2023-08-07_04-17-44","input_mean":[[22.024511],[-0.043522414],[-0.002961347],[-0.0065920064],[-0.04150471],[-0.042428624],[-0.043336894],[-0.04086171],[-0.034525074],[-0.028886782],[-0.018756818],[-0.0065919408],[-0.0066040247],[-0.006626225],[-0.0068288157],[-0.0070200725],[-0.0073607014],[-0.0076632937]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.473138],[2.221549],[-1.0823368],[-2.8256664],[0.085434295],[0.028407706],[-0.061113566]],"dense_1_W":[[-0.0089028245,-0.9912872,0.009611258,0.25393942,-0.41998756,-0.32313955,0.8952989,0.029626163,0.11626525,-0.054468796,-0.1326496,-0.4476868,-0.2042107,0.46837947,0.069956504,-0.21724562,0.23439048,-0.047289353],[1.2613285,-0.96326435,-0.17513342,-0.000854132,-0.47149596,-0.018597946,-0.21429752,-0.21073529,0.1354099,-0.07295649,0.030318158,-0.12007737,0.12014077,-0.2163875,0.072022185,0.03959235,0.396182,-0.062489647],[0.012516819,-0.8584632,0.007924718,-0.30343324,-0.42617807,-0.7755947,1.0091652,0.1223127,0.3468889,-0.40062675,-0.07905825,-0.24530481,0.03633433,0.47560924,0.037581664,-0.13015322,0.22054312,0.031255197],[-1.5378897,-1.4828793,-0.18857823,0.16092972,-0.42702663,-0.34182322,0.41900903,-0.18607922,-0.13843817,0.24557483,-0.076981656,-0.4961918,-0.3452876,0.64607316,0.0009507385,0.08998216,0.14214522,0.046318714],[-0.0011267369,0.27540267,0.016030233,-0.20225953,0.013771044,0.6201634,-0.556872,-0.13545676,0.35052666,-0.124900356,0.002072807,0.4798739,-0.08431086,-0.10877774,0.04850312,-0.35767382,0.02486711,0.12758201],[0.024379028,-0.24700065,-2.853376,-0.32122508,0.8939814,0.82656956,1.4070201,0.09498728,-1.3611526,-1.5815003,0.30544436,-0.27033755,0.11556027,-0.054265734,0.20834558,0.13427551,-0.37772593,0.4640547],[-0.030686565,0.84678096,1.770179,-0.36134493,0.24199459,0.28295025,-0.47493774,0.23200317,0.70101535,-0.14119998,-1.0417818,0.40630406,0.13111247,-0.6430103,-0.2674837,0.017178508,-0.29887456,0.38562188]],"activation":"σ"},{"dense_2_W":[[-1.1036853,-1.3721989,-0.51504,1.2015524,0.09316521,-0.96497333,0.4021814],[-0.8097407,-0.7509286,-1.1158744,0.42325807,-0.20259377,0.0626439,0.31110045],[-1.2145201,-1.2441981,0.19279541,0.18892047,0.29747686,-0.25250465,0.6102425],[0.2313029,0.118307896,0.113481075,-0.15884186,-1.111768,0.13841225,0.20408762],[-0.71204215,-0.12088688,-1.1419623,-0.6261491,1.1400135,0.7190926,-0.7439571],[-0.25191402,-0.37898734,-0.28048715,-1.4491202,-0.3656834,-0.7907398,-0.641557],[-0.011884956,-0.5971226,0.335598,1.460086,-1.3101952,0.24946465,-0.7721908],[-0.291724,-1.2193375,0.9255212,1.4103785,-1.3861861,1.1069193,-0.9564451],[-0.005167844,-0.5868809,-0.04781744,-0.4605364,-0.5491854,-0.12518165,0.4831307],[-0.8599904,0.355135,0.13032773,0.4898609,0.9977364,-0.20243338,-0.3729824],[-0.8057951,-1.4712548,0.041369762,0.38580742,0.17479813,-0.5943229,0.58907944],[0.4630881,-0.67586523,0.7142299,-0.026821358,-0.4351039,0.16494957,-0.6159792],[0.47451556,-0.24695386,0.12806706,-0.45427,-0.49645072,0.16154642,0.051802393]],"activation":"σ","dense_2_b":[[-0.10206211],[-0.18115936],[-0.18227798],[-0.24110062],[0.019271357],[-0.057440575],[-0.268234],[-0.5252925],[-0.2866936],[0.05449511],[-0.24483305],[-0.18191986],[-0.07886301]]},{"dense_3_W":[[-0.5275586,0.21438916,0.42354757,-0.080388896,-0.22814655,0.08274758,0.58728325,0.23497643,-0.34910187,-0.65987664,-0.5979741,0.47347566,0.29530162],[0.2212618,-0.04398215,0.08195705,0.55958235,-0.2671096,-0.41001236,-0.07496751,-0.09160523,-0.40878737,0.17242602,-0.28486353,0.67506176,-0.4861643],[0.74257594,0.3091425,0.6776007,-0.5314211,0.5221815,-0.245857,-0.82829714,-0.7256044,-0.20003343,0.63602597,0.68443066,-0.60656106,-0.33084148]],"activation":"identity","dense_3_b":[[-0.08715922],[-0.015241552],[-0.020386416]]},{"dense_4_W":[[-0.18016826,0.060740642,0.8485467]],"dense_4_b":[[-0.027167765]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI090 4NEER106'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI090 4NEER106'.json deleted file mode 100755 index 326f775d56..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.06 57700GI090 4NEER106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.3275805],[1.0196048],[0.52010816],[0.0352276],[1.02782],[1.0252671],[1.0222956],[0.9997506],[0.985749],[0.96506876],[0.9418997],[0.035265286],[0.035257738],[0.035243317],[0.035129223],[0.034967538],[0.034930766],[0.034761045]],"model_test_loss":0.005986420903354883,"input_size":18,"current_date_and_time":"2023-08-07_04-42-18","input_mean":[[16.81989],[-0.0023870994],[0.016375398],[0.007987486],[-0.0038331433],[-0.0028706586],[-0.002052483],[0.0037261376],[0.0077264695],[0.015267296],[0.022873675],[0.007976887],[0.008012079],[0.0080480315],[0.0083447285],[0.008644844],[0.008951735],[0.009266214]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.081543066],[-0.056712516],[1.020892],[1.2038189],[0.8294046],[-1.550392],[0.14646924]],"dense_1_W":[[0.007095242,-0.3357324,-0.020644788,0.15498674,0.3233852,0.681572,-0.58889717,0.10339724,-0.101055495,0.14906228,0.10875192,0.6335114,-0.055108294,-0.29020736,-0.20417833,-0.15015094,-0.17299037,0.08851465],[0.004572572,-0.031241285,-0.13219641,-0.32799125,-0.15282044,0.3018361,-0.04475915,-0.1852419,0.29663882,0.11407058,-0.28158987,0.15243189,-0.138962,-0.818821,-0.21749938,0.16543967,0.674217,0.5435629],[0.6141752,-0.15518521,-1.046077,-0.2757983,0.08250556,-0.15337233,0.7715917,0.11102678,-0.09630107,-0.5728525,-0.09002878,-0.034704853,0.036534615,-0.08534044,0.17554262,0.59318084,0.4653607,-0.6824117],[0.36545298,1.5887244,0.07696325,1.0003874,-0.86354816,0.23606206,-0.5116619,0.38954034,0.11738926,-0.06503386,-0.26383808,-0.15202644,0.03476461,-1.241754,0.06332426,0.76582646,0.33149716,-0.796532],[0.65361756,0.13396756,1.0613457,0.26300004,-0.40400812,-0.013307764,-0.75999826,0.49663877,0.22844444,0.55961716,-0.1376457,0.37311572,-0.24733792,0.14654122,-0.5692375,-0.5544628,-0.27533975,0.66560614],[-0.34781328,1.6558565,0.07238359,0.20479903,-0.8403306,-0.32243812,-0.16335258,0.52112013,0.17627572,-0.04307547,-0.3611007,0.30237716,-0.6051238,-0.386868,0.38447434,0.46520847,0.3120966,-0.6709089],[0.0036248034,0.23074862,0.020143876,0.5349166,-0.40822935,-0.41078866,0.2051622,0.49179015,-0.1525134,-0.59394807,0.23505864,-0.066738114,-0.7911307,0.33049953,0.6046334,-0.020162396,0.5588138,-0.7296629]],"activation":"σ"},{"dense_2_W":[[-0.543734,-0.11568991,0.46326157,-0.3440383,-0.19483161,-0.22621068,0.3506779],[0.5665691,0.39223912,-0.3114283,-0.24454129,0.20308813,0.26517904,-0.55094284],[-0.37307048,-0.3695241,-0.5802875,-0.67846954,-0.4361852,-0.6546891,0.347107],[0.20529634,0.20746405,-0.6926493,0.35652137,-0.09917265,0.36297628,-0.30438402],[-0.13266158,-0.105559945,0.48330346,0.05460201,-0.7987386,-0.11119831,-0.1520496],[0.12158869,-0.16989066,-0.21201673,-0.8567653,-0.80356854,-0.6502743,-0.6812023],[-0.67351097,-0.4814339,0.0066772657,-0.36529928,-0.32967392,-0.014957418,0.56022096],[0.65586,0.5302613,-0.53480864,-0.1837586,-0.37755764,0.5224716,-0.65894675],[0.632538,-0.12352366,-0.17432757,0.053469837,-0.23578659,0.8563387,0.010090043],[0.755902,-0.33837405,0.06354072,-0.0023081547,0.24040125,0.19006617,-0.6459784],[-0.84905565,0.34682384,-0.74062455,-0.36064273,0.06456776,-1.0320303,-0.1568676],[0.11871192,-0.45685586,-0.43699044,0.6423253,-0.41473007,0.8033967,-0.24556923],[-0.7037791,0.28321943,0.3725407,-1.0338148,-0.7480845,0.16597597,-0.18685772]],"activation":"σ","dense_2_b":[[0.0362523],[-0.15209907],[0.06911948],[-0.098613776],[-0.05953099],[-0.11117059],[0.0083315335],[-0.14510527],[-0.099141985],[-0.024182098],[-0.008950716],[-0.078234635],[0.007288485]]},{"dense_3_W":[[-0.28421518,0.64839506,-0.67347926,0.24251053,-0.5610912,-0.08075926,-0.6807234,0.032682177,0.022037055,0.37259215,-0.27325115,0.662137,-0.691926],[0.526823,0.050769817,0.35217327,-0.046594553,0.26780704,0.11182747,0.11998007,0.086257815,0.3501235,-0.32662,-0.34344003,0.25669885,0.21290292],[-0.52280086,-0.16297898,-0.19620705,0.5186644,-0.12866393,-0.18155573,-0.6449941,0.5744024,0.6484104,0.11549675,-0.62331545,0.06612739,-0.012873929]],"activation":"identity","dense_3_b":[[0.031896967],[-0.058957797],[0.028432038]]},{"dense_4_W":[[0.7332587,-0.31298956,1.0786972]],"dense_4_b":[[0.029880757]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.07 57700GI000 4NEDR107'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.07 57700GI000 4NEDR107'.json deleted file mode 100755 index 75fdb3425f..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022 b'xf1x00NE MDPS R 1.00 1.07 57700GI000 4NEDR107'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.16771],[1.2480878],[0.50373644],[0.0415057],[1.240927],[1.243768],[1.2455409],[1.2407454],[1.2340634],[1.2248088],[1.211883],[0.041283466],[0.041348],[0.0414103],[0.041489914],[0.04143776],[0.041264478],[0.0409134]],"model_test_loss":0.007933193817734718,"input_size":18,"current_date_and_time":"2023-08-07_05-08-25","input_mean":[[24.345285],[-0.096162066],[-0.014125192],[-0.0055604912],[-0.09105816],[-0.09206972],[-0.09341297],[-0.10010282],[-0.10234851],[-0.10274896],[-0.10063276],[-0.0054888204],[-0.0055110557],[-0.0055406075],[-0.005718475],[-0.0058116997],[-0.0059951427],[-0.0062671383]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.23237821],[0.018722376],[-1.3757128],[-0.01460865],[0.02967189],[0.08705265],[-1.2340055]],"dense_1_W":[[0.06750661,-0.3542061,0.2432691,0.14180695,-0.5219781,-0.0007836083,0.42668152,-0.0022440958,0.10387852,-0.041751936,0.068489484,-0.14231609,-0.17892262,0.13729224,0.04235856,-0.1593134,0.008738201,0.012944615],[-0.0105973855,-0.33196992,-2.107344,-0.2111076,0.67654485,-0.085388966,0.36568716,-0.049111266,-0.44938025,-0.010503432,0.12672867,-0.15217097,-0.22909231,0.3746955,0.3520743,-0.3600366,-0.08118863,0.04671434],[-0.4432249,-0.2638647,-0.15509327,-0.22285405,0.39585304,-0.07322643,0.20026541,-0.19971582,-0.2071554,0.11940002,-0.09321449,-0.13317838,-0.06569787,0.48338866,0.2730768,-0.22072834,0.17696315,-0.09108241],[0.0020572126,-0.12674253,0.022357568,-0.1565539,0.045776367,0.47296986,-0.17684759,0.25313404,0.09111438,-0.07021955,-0.0518055,-0.12567686,0.21444373,-0.33187112,0.19476555,0.06619808,-0.21118708,0.023201488],[-0.00025779597,-0.35387865,0.012450542,0.14741261,-0.269924,-0.45123708,0.7130625,0.1300766,0.10266559,-0.19306725,-0.058982134,-0.36948946,0.1953737,-0.29075292,0.22910224,0.15611844,-0.11712315,0.058328316],[0.051375203,0.31793782,-0.14423588,-0.0068918834,-0.18315102,0.5918731,-0.28164175,-0.20071678,0.069824845,-0.020674566,-0.11778088,0.17801747,0.2703763,-0.2515284,0.2291236,0.0033097556,-0.43070522,0.29516613],[-0.4140676,0.39011925,0.14862205,-0.13030078,-0.52621514,0.5111128,-0.45828196,-0.27297536,0.23763113,0.3718947,-0.14322172,-0.21290484,0.089274585,0.020155977,0.22360091,-0.28303128,0.13209493,-0.042907283]],"activation":"σ"},{"dense_2_W":[[-0.31453168,0.033921305,0.70444196,-0.58351177,1.0959978,-0.66988647,-0.85257435],[-0.5903374,-0.44103688,-0.70230186,-0.0026794649,-0.34333006,0.5302745,0.918816],[-0.42183512,0.05530731,-0.5427745,0.69254327,-0.8815986,0.44960234,0.30365023],[0.122158416,0.16294368,0.63959545,-0.7836469,0.68446577,-0.47389457,-0.62848955],[0.901804,0.7217306,0.10951365,-0.3829389,0.87658155,0.29891163,-1.3996044],[0.031781312,-0.5354891,-0.7041477,0.31751466,-0.53644896,-0.15998416,-0.16574423],[-0.27697673,-0.28073364,-0.78330237,0.573196,-0.13137478,0.6830283,0.03175229],[-0.045285385,-0.5539421,-0.31835833,0.24435757,-0.6752784,0.5702699,0.70634973],[-0.20699495,-0.047943812,-0.558686,-0.11867195,-0.74516237,0.6060502,0.89396],[0.0669213,0.109555185,0.32660756,-0.73635364,1.029282,-0.38516814,-0.6496012],[-0.41036522,-0.10196122,-0.14805846,0.57442135,-0.6432521,-0.083222605,0.0065267035],[-0.006969785,0.23751916,0.84181625,-1.1058564,0.46725896,-0.6190618,-0.36652294],[0.21793355,0.290169,-0.93023765,0.36604545,-0.7807498,-0.17316261,0.07708634]],"activation":"σ","dense_2_b":[[-0.05177098],[0.037132636],[-0.06423338],[-0.10677436],[0.0036231237],[-0.19121082],[0.053780135],[0.007149082],[-0.021132331],[-0.06560636],[-0.013925233],[-0.20192423],[-0.011626902]]},{"dense_3_W":[[0.14344205,-0.07113653,-0.17046611,-0.59838146,-0.6294641,0.12431688,0.82706773,-0.054024965,0.0036742366,-0.16770674,-0.1288102,0.16114827,-0.18475987],[-0.47564578,0.31864712,-0.14267874,-0.3570462,-0.20744337,0.4933738,0.0050251503,0.44604447,0.3714721,-0.20655935,0.15740293,-0.67137367,0.5913701],[-0.7149089,0.7454441,0.5369203,-0.662988,-0.48257586,-0.2050814,0.18968539,0.2163754,0.17718616,-0.6017345,0.3639053,-0.034539547,0.3536264]],"activation":"identity","dense_3_b":[[0.16334216],[0.029995969],[0.03828924]]},{"dense_4_W":[[0.055147056,0.6825625,0.9658336]],"dense_4_b":[[0.03797484]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019 b'xf1x00AE MDPS C 1.00 1.04 56310G7301 4AEEC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019 b'xf1x00AE MDPS C 1.00 1.04 56310G7301 4AEEC104'.json deleted file mode 100755 index a14217fff8..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019 b'xf1x00AE MDPS C 1.00 1.04 56310G7301 4AEEC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.365931],[1.0053464],[0.48621035],[0.040902473],[0.9949335],[0.999163],[1.0026134],[0.99977523],[0.9919684],[0.97725195],[0.96077615],[0.04045883],[0.04060025],[0.040737074],[0.041246798],[0.04151738],[0.041603032],[0.041438416]],"model_test_loss":0.007651639170944691,"input_size":18,"current_date_and_time":"2023-08-07_05-59-00","input_mean":[[21.148514],[0.04878841],[-0.0029595776],[-0.042372182],[0.047377028],[0.048310757],[0.04831951],[0.046471857],[0.041722726],[0.038647328],[0.0400284],[-0.04253156],[-0.042471983],[-0.042429984],[-0.0424216],[-0.042509023],[-0.042691946],[-0.04297347]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.121761754],[-0.005262723],[-0.42553833],[-1.4800751],[0.39852682],[1.5660636],[-0.2885766]],"dense_1_W":[[-0.0071449946,-0.22166711,0.040895086,0.074089214,-0.24226914,-0.60404766,0.008154148,0.5209098,-0.03358146,0.32940406,-0.45302716,-0.26397997,0.026462026,0.3500697,0.13830581,-0.30527312,0.16121124,-0.07390656],[0.0022779773,0.00796991,2.0393221,0.3221699,-1.7534194,-0.89475006,-1.0659475,0.77743155,2.5998273,1.7403948,-1.4950538,1.2407383,0.099073306,-0.1965835,-0.6947619,-0.5265118,-0.42691574,0.052154247],[0.051531065,0.33934996,0.028932936,0.09824733,-0.27226272,0.6414971,-0.57750374,0.04495341,0.12243749,0.48152295,-0.4014161,0.2573053,0.36582318,-0.2320656,-0.45263124,-0.529971,0.06477085,0.36134705],[-0.69859356,0.37024122,0.18599005,-0.6343367,0.048961602,0.64901793,-0.014536332,-0.35943583,0.07028741,-0.49705738,0.3390023,-0.11667915,0.26095447,-0.13361779,0.18741582,0.45414707,0.04516702,-0.18339908],[-0.0724652,-0.03210611,0.0017774315,-0.021023385,-0.18996063,1.0227648,-0.6022702,0.09638655,0.004159916,0.11472787,-0.03836134,0.4005762,-0.29560152,-0.45276555,0.22651882,0.16092128,0.03422194,-0.106695466],[0.6899316,0.14993052,0.1758256,-0.60796994,-0.1518822,0.5145441,-0.05431888,0.17881271,0.05299809,0.14818904,-0.22618657,0.4235098,0.05817998,0.14069048,-0.5904664,0.058542084,0.4009274,-0.00811349],[-0.0029274654,-1.2603375,0.9620041,-0.3834267,0.5099088,1.114527,-0.28767705,0.72205675,-0.21023215,-0.49849328,-0.1329101,0.0074135163,0.32214153,0.15615329,0.093625374,0.092150904,-0.024664165,-0.09238503]],"activation":"σ"},{"dense_2_W":[[0.12002893,-0.17805395,-0.2880083,-0.38067022,0.12869482,-0.6071237,0.12071723],[-0.12379059,0.2787932,-0.35626152,0.121466,0.32586035,0.1355638,-0.45241648],[-1.130496,0.7352465,0.6112711,0.10642678,-0.08899688,0.04508099,-0.030892976],[0.67437845,0.13706607,-0.7985538,-0.17117155,-0.3313495,-0.3713848,-0.027845394],[-0.517497,-0.46660402,0.1784289,0.50726193,0.36130485,0.43994057,0.3730332],[-0.85701996,-0.3851742,0.50393444,0.33921102,0.42251298,0.54051745,0.14791974],[0.593431,-0.48125875,-0.015125809,-0.37809905,-0.25327942,0.48657876,-0.480061],[0.5388885,-0.7307186,-0.41774607,0.06747027,-0.86199886,0.08562353,0.24053545],[-0.09548584,0.04586038,-0.3076278,0.21206705,-0.670656,-0.5026032,-0.52725095],[-1.2665727,0.18871929,1.1413674,0.5228994,0.10997097,-0.34521362,0.120387435],[0.0748604,0.4996035,-0.0855786,-0.05275676,0.6006561,0.07183944,0.36708173],[-0.48888278,-0.7535756,0.3745485,0.6277024,-0.430217,-0.75581187,-0.6709151],[0.7400373,-0.59288275,-0.7235487,-0.15054081,-0.12360353,0.0075691734,0.16587299]],"activation":"σ","dense_2_b":[[-0.1345922],[-0.2812786],[-0.22687326],[-0.013213066],[-0.11886535],[-0.26479134],[0.110779524],[-0.022709124],[0.013283567],[-0.5753985],[-0.20628732],[-0.069668956],[-0.010791435]]},{"dense_3_W":[[-0.055820215,0.18302114,0.47397888,-0.44688433,0.5031685,0.2437073,-0.5109226,-0.6158206,-0.6161359,0.35794947,0.30956054,-0.39124405,-0.5219915],[-0.09907215,-0.4441128,-0.24953865,-0.61175,0.30950993,0.41822892,-0.2842331,0.23637499,-0.57602996,0.2360482,0.17507787,0.15714398,-0.16979274],[-0.4119329,-0.2348606,0.44085753,-0.46800396,0.37048897,0.27227882,-0.48144114,0.5093462,-0.5514392,0.020650176,-0.1336957,0.27199176,-0.15389821]],"activation":"identity","dense_3_b":[[0.08689549],[0.099912],[0.10019605]]},{"dense_4_W":[[1.2855291,0.25690037,0.18219778]],"dense_4_b":[[0.083643846]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2310 4APHC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2310 4APHC101'.json deleted file mode 100755 index c7fc30d6f5..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2310 4APHC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.9939313],[1.0528377],[0.5315027],[0.029189091],[1.0448871],[1.0467738],[1.0488317],[1.039207],[1.0235921],[0.9892058],[0.946193],[0.028987626],[0.029057996],[0.029122358],[0.029161116],[0.029061846],[0.028845914],[0.028680017]],"model_test_loss":0.005588449537754059,"input_size":18,"current_date_and_time":"2023-08-07_06-50-32","input_mean":[[18.301882],[0.08731057],[0.0127743315],[-0.015221847],[0.083781615],[0.084988184],[0.086485535],[0.08923056],[0.08884011],[0.083579615],[0.07677084],[-0.015187935],[-0.015199815],[-0.015214948],[-0.015418597],[-0.015619739],[-0.01592285],[-0.016167268]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.10865636],[2.3342428],[1.9012878],[-1.0550975],[0.42597178],[-0.072197296],[0.13246399]],"dense_1_W":[[0.014873456,-0.6716018,0.030190289,0.05807356,0.1659468,-1.2892563,0.7523864,0.17761192,-0.1367714,-0.25312293,0.10743949,-0.86903024,0.38059515,0.36618868,-0.17938752,0.4116222,-0.04126272,-0.16534285],[0.5307081,0.70384896,0.17447057,-0.5299634,-0.1137985,0.66921306,-0.4550779,0.4195087,0.022407524,-0.011906744,0.01779598,0.31284544,0.12419175,-0.37242392,0.29023978,0.29320818,-0.03838816,-0.1365707],[0.49472126,-0.9217689,-0.16751769,0.2551346,0.4287786,-0.7115711,0.13987176,0.081955396,-0.10713988,-0.14384302,0.056155935,-0.41739097,0.31321964,0.18086141,0.07986471,-0.59072965,0.019683728,0.2156733],[-0.21605797,-0.0773706,1.8579228,-0.054307144,0.09962813,0.459771,-0.43688956,0.4817178,-0.11751329,0.24354506,0.048119925,0.15544271,0.5567847,-0.44885188,-0.071555234,-0.21245098,-0.12196474,0.1607481],[1.1639537,0.22229235,-0.0055136923,0.18512912,-0.31992313,0.6914639,-0.441095,-0.47246328,-0.17016385,0.31878585,-0.050539054,0.5196653,-0.45885605,-0.06979618,-0.6328351,-0.1972874,0.34543124,-0.029788537],[-1.2173545,0.1734982,-0.006638391,0.31715307,-0.49786195,0.5964912,-0.46224737,0.428369,-0.27108857,-0.47364435,0.28244984,-0.38170126,0.3462351,-0.040848292,-0.57324094,0.092280604,-0.33654806,0.22344877],[-0.023229493,0.6459344,3.563477,-0.027724274,-0.50558513,0.3390488,-0.7422579,-0.26814136,0.10699902,0.7712946,-0.27946892,0.16129833,0.41574493,-0.38143778,-0.21668792,0.08835417,-0.18336411,0.06490999]],"activation":"σ"},{"dense_2_W":[[-0.7401138,-0.33438444,-0.30976433,0.15630613,0.13618709,0.44008145,0.43946928],[0.3344595,-0.32618588,0.32839847,0.15315771,-1.035439,-0.41636187,0.18828368],[-1.6167084,-0.46759644,-1.9622544,1.1570694,-0.06380261,0.70214266,0.045398716],[0.7825211,-0.885754,0.5565485,0.076575294,-0.52415085,-0.30411518,-0.025386691],[0.8624213,-1.7385436,-0.08763568,-0.8164249,-0.70833945,0.5085741,-0.4101307],[-0.5877383,0.8294365,-0.3091808,-0.512284,0.39336714,0.38540366,0.5915022],[0.34969604,-0.36038882,0.58447695,-0.14356469,-0.0804361,-0.3685647,-0.3614559],[0.72681546,-1.4046979,0.05443059,-0.16271566,-0.34866697,-0.22142158,-0.74306345],[0.5620642,-0.3955179,0.833503,-0.054495268,-0.54243296,-0.229325,-0.19776875],[-0.4541713,0.9203334,-0.70482004,-0.301528,0.21780983,0.25789845,-0.045716804],[-1.002443,-0.6559031,0.046121206,0.037933722,0.035592597,-0.0741523,-0.62133527],[0.9827719,-1.4614758,-0.3133424,-0.52563715,-0.24086906,-0.17160659,-0.6464693],[0.83488077,0.028223112,0.78030294,0.04748862,-0.31935772,-0.51587915,-0.18742341]],"activation":"σ","dense_2_b":[[-0.13555096],[-0.32605985],[-0.35664767],[-0.10862631],[-0.2544254],[-0.043318216],[0.000725854],[-0.23828812],[0.10916386],[0.00066704256],[-0.21592386],[-0.24546382],[0.03496515]]},{"dense_3_W":[[-0.48865333,0.012070441,-1.1093414,0.37793216,0.106044106,-0.37514287,0.2380262,0.6363306,0.13366772,-0.5155996,0.35994524,0.29682592,0.7856256],[0.07205148,0.53575456,0.73853123,0.31763637,0.29280093,0.4034669,-0.43210915,0.1826047,-0.6585059,0.087924495,0.4158608,0.10441277,-0.53451645],[-0.5815711,0.5280911,-0.4214647,0.73003256,0.8056002,-0.8074712,0.11868743,0.352855,0.50734097,-0.23951167,-0.20682806,0.3864585,-0.0063988008]],"activation":"identity","dense_3_b":[[-0.0008838433],[0.05478047],[-0.09860168]]},{"dense_4_W":[[-0.43285844,0.1527011,-0.5464815]],"dense_4_b":[[0.096321255]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2510 4APHC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2510 4APHC101'.json deleted file mode 100755 index 946d3622da..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020 b'xf1x00AE MDPS C 1.00 1.01 56310G2510 4APHC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.562192],[1.1790692],[0.4002067],[0.04594392],[1.1686502],[1.1728791],[1.1756221],[1.1729841],[1.156941],[1.1271893],[1.0963595],[0.045839865],[0.045870736],[0.045898065],[0.045978826],[0.04594467],[0.045800198],[0.045554243]],"model_test_loss":0.004118586890399456,"input_size":18,"current_date_and_time":"2023-08-07_07-15-40","input_mean":[[23.066132],[0.057099603],[-0.01063407],[0.004261095],[0.062055044],[0.060667243],[0.058939908],[0.05526614],[0.05360945],[0.051924873],[0.05241744],[0.00427781],[0.0042802687],[0.00428003],[0.004243646],[0.0041739033],[0.0040482194],[0.0038935656]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.10965323],[-0.052080173],[-0.1538397],[-2.384923],[-0.09352556],[0.0018890598],[2.3688684]],"dense_1_W":[[0.7755966,-0.2301085,0.06612401,-0.35135305,-0.36526012,0.6195271,-0.17558895,0.33820674,0.29887065,-0.27747476,-0.13994163,0.43222815,0.16581486,-0.0976609,-0.25181568,-0.47843766,-0.32353792,0.45968184],[0.7839898,-0.45771372,-0.06646608,0.0075052464,0.48982865,-0.43683746,0.25553277,0.032161202,-0.55129576,0.59574753,0.017138774,-0.6380152,0.14585742,0.4083551,0.21304548,0.6200874,-0.086530834,-0.21368058],[0.08205719,0.03429464,0.016315881,-0.12871714,0.07213858,-0.45993748,0.095523514,-0.11810924,0.06553878,-0.5675574,0.2978788,-0.1445707,-0.33768746,0.50254714,0.22325698,-0.1333724,-0.06763935,0.09734261],[-0.35377377,-0.43953004,-0.19076808,0.15645324,-0.23917644,-0.0014493754,0.17704272,-0.25057337,-0.78162295,-0.06046742,0.096349254,0.027729603,-0.36563933,0.80371153,-0.027431296,-0.2516018,-0.13851781,0.04337426],[0.00498448,0.8467486,3.7462854,0.1478785,-1.0097741,0.0915918,-0.5104059,0.09881933,-0.0863164,0.48782897,-0.091693185,0.5003006,0.5728494,0.21510558,-0.710957,-0.29564264,-0.25217718,-0.17932595],[0.037292775,0.549042,-0.020767516,0.042928286,-0.015053085,0.80091596,-0.5040608,-0.20316118,-0.30876288,0.18842556,0.16377552,0.7935661,0.03645923,-0.8193547,-0.08692827,0.11217417,0.064909056,-0.06385711],[0.35312757,-0.118093394,-0.19476774,0.5554578,0.1930753,-0.48555315,0.057567388,-0.7159381,-0.27626652,-0.37647247,0.20957941,-0.44620857,0.0002755669,0.58868754,0.10452296,-0.66695416,0.27288365,-0.14926693]],"activation":"σ"},{"dense_2_W":[[-0.19584657,-0.56228656,0.049819242,0.3356435,-0.8650626,-0.22927399,-0.7001092],[-0.08733842,-0.654029,-0.8732687,0.31039196,0.65217227,0.6601506,-0.9831877],[-0.28144318,-0.5611539,0.32681772,0.31215787,-0.44330865,0.008832871,0.37263072],[-0.09786935,-0.48769787,-0.69821197,-0.38688582,0.5728046,0.18644942,-0.7118146],[-0.8619828,0.0027679028,0.43955415,1.0463487,-0.69266444,-1.0750707,-0.07059785],[0.31811947,-0.2366228,-0.72350734,0.1262254,0.25636208,0.46176276,-0.34769687],[-0.69273907,1.5178095,0.8711242,-0.07443719,-0.69538844,-0.69129455,0.7530523],[0.3147337,-0.11657144,-0.8414669,-0.09644994,0.08891191,0.1703831,-0.6425643],[-0.3112073,0.35414124,0.11913388,0.3313928,0.11848869,-0.853674,0.47229782],[-0.60429984,0.27235946,0.7851893,0.31956023,0.6252034,-1.6533685,0.58046734],[0.41311583,-0.19508654,-0.0685557,-0.17002022,0.1134038,0.4991351,-0.3182844],[-0.8717183,0.66564476,0.12376991,1.2741002,-0.5322097,-1.1083273,-0.37658596],[0.67320377,-0.41162866,-0.042097807,-0.6380872,-0.46145105,0.875035,-0.52515566]],"activation":"σ","dense_2_b":[[-0.36951348],[-0.20310313],[-0.1163803],[-0.058099788],[-0.27018055],[-0.12597482],[0.15152946],[-0.2217294],[0.014968804],[-0.19001697],[-0.042399503],[-0.189941],[0.096105725]]},{"dense_3_W":[[-0.12309125,0.77507085,-0.3702677,0.4653985,-0.7352844,0.17442249,-0.20582232,0.52809495,-0.38240287,-0.38384795,0.35505968,-0.7694335,0.81513363],[0.49237758,-0.24538146,-0.54058105,-0.29702288,0.7292889,0.23451614,0.2204175,0.16993591,-0.58852774,0.5432413,0.13110612,0.1945469,-0.18632029],[0.40756968,0.5396459,-0.06640867,0.52895707,-0.22500473,0.5870712,-0.55817175,0.10517919,-0.51188445,-0.37411118,0.49139977,-0.56567246,0.21133785]],"activation":"identity","dense_3_b":[[0.039045013],[-0.05285484],[0.031891406]]},{"dense_4_W":[[0.4020106,-0.34673893,0.3534026]],"dense_4_b":[[0.032409564]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4000x00 4OEDC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4000x00 4OEDC104'.json deleted file mode 100755 index 62ea60b001..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4000x00 4OEDC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9823537],[1.4029322],[0.5391447],[0.04887051],[1.3963706],[1.3995055],[1.4009825],[1.3885417],[1.3692048],[1.3372831],[1.2967274],[0.04857869],[0.048658866],[0.048733797],[0.04879035],[0.048757277],[0.04862833],[0.048260294]],"model_test_loss":0.00437383446842432,"input_size":18,"current_date_and_time":"2023-08-07_08-07-32","input_mean":[[21.874346],[-0.0005797015],[0.010789347],[-0.012909609],[-0.003366453],[-0.002296705],[-0.0016360051],[0.0021639771],[0.005118338],[0.0068367384],[0.008824422],[-0.012872645],[-0.012881624],[-0.012900158],[-0.013073698],[-0.013239728],[-0.0134497825],[-0.013658659]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.66749334],[-2.3284407],[-2.552216],[-0.51326174],[-0.16542026],[-0.78371996],[0.58516866]],"dense_1_W":[[-0.20467584,0.3742327,-2.1127253,0.4140109,0.20715296,-0.40205246,0.7444451,-0.40750897,-0.32128036,-0.10457273,0.029910121,-0.114483304,-0.17820649,0.09675455,0.15047672,-0.07704191,-0.08496522,-0.05037796],[-0.75994927,1.0465562,0.074481115,0.45544595,-0.099778585,-0.30777687,0.45363194,-0.26308686,0.34833267,-0.061779257,0.19875576,0.0100148255,0.026750173,-0.087523125,-0.44454777,-0.16642322,0.22628598,-0.020208687],[-0.79274124,-1.5697699,-0.0782978,-0.27417132,0.8103041,-0.113830596,-0.45296183,0.41277897,-0.14532241,-0.25087643,-0.024198774,-0.08969185,0.0901834,-0.2042583,0.41698653,0.31030753,-0.13242747,-0.111738786],[0.72596943,0.70769554,-0.0069162454,-0.1704995,0.033077016,-0.14304133,-0.018031847,-0.013690503,0.2569981,-0.08117829,-0.07157592,0.62022674,0.22071594,-0.22532593,-0.5013286,-0.37610313,0.016311774,0.18602486],[0.07123103,-0.7177917,2.071481,0.12931369,-0.08568253,0.006763331,0.5998342,-0.65402156,0.13034452,-0.1689963,0.48351094,-0.1429906,-0.4140654,0.6116886,-0.28543368,-0.3805712,0.27751157,0.042374272],[0.7390709,-0.30262133,0.007570949,-0.09976768,0.11671621,-0.57199293,0.060994264,0.17037009,-0.23032549,0.08530586,-0.033951357,-0.04542262,-0.36450365,0.41992882,0.061726227,0.15781905,0.02539049,0.070994005],[0.27319646,0.6453565,-1.9857005,0.5767287,0.21463604,-0.2138314,0.2007721,-0.25790113,-0.2563649,-0.000869855,-0.091922425,-0.72040427,0.13880335,0.62027377,-0.44047758,-0.050440025,0.25620586,-0.2074692]],"activation":"σ"},{"dense_2_W":[[-0.22115013,0.055372495,-0.6996138,0.5370589,-0.47052458,-0.651092,0.3839152],[0.42745695,-0.38167813,0.14885446,-0.37276337,-0.05345867,-0.013708567,-0.3856122],[0.12907071,-0.54699695,0.39133784,0.2088913,-0.28036752,-0.3084716,0.032560136],[-0.5054007,0.7835044,-0.44982964,-0.23468708,0.12779902,-0.1858994,-0.6199746],[0.045793723,0.039428864,-1.0686759,0.91881555,-0.108995505,-0.029487936,-0.21528293],[0.19056086,0.6597351,-0.8134895,0.018328965,-0.45527688,0.03831411,0.214237],[0.31016105,-0.1720769,0.6232735,-0.0155809345,0.04817505,0.15304431,0.10533786],[-0.42903107,-0.13552563,-0.09239265,0.4200264,-0.4343141,-0.47912154,-0.39496207],[0.20956168,-0.2317832,0.21835831,-0.16000728,0.49696466,0.14894594,0.57515436],[-1.595405,0.8692183,1.0247264,-0.9062122,0.17050256,-0.7897474,-0.94245416],[0.51542455,0.5987507,-0.84974045,0.5130476,-0.10149645,-0.5025105,-0.49863508],[0.604559,-0.26422802,-0.07353111,-0.7784861,0.42281657,0.66297257,-0.4316652],[0.08229692,0.19338071,0.0894164,-0.5593924,0.03616016,0.012567026,-0.30123827]],"activation":"σ","dense_2_b":[[-0.056233797],[-0.0057250382],[-0.21214126],[-0.011911729],[0.085418984],[-0.15823714],[-0.06585213],[0.00472772],[-0.017725466],[-0.118805535],[0.026983896],[0.005067724],[-0.005340161]]},{"dense_3_W":[[0.22465749,-0.015047881,-0.32157594,0.1449359,-0.06417016,0.21772367,-0.12643653,0.51667756,-0.28002724,-0.052840073,-0.21226676,-0.3199402,-0.088716716],[0.38327125,-0.26344195,-0.22620219,-0.37501743,-0.12782073,-0.17671679,-0.0013878844,-0.39273772,0.29493284,-0.15408261,-0.6016259,0.6571256,0.38118032],[0.5750975,-0.63398695,0.040233657,0.29500204,0.55213654,0.23952343,-0.20580381,0.39102614,-0.5990083,0.6517685,0.48111153,-0.4062521,0.022178443]],"activation":"identity","dense_3_b":[[-0.025877675],[0.030203432],[-0.03420004]]},{"dense_4_W":[[0.7982145,-0.41420195,1.1245165]],"dense_4_b":[[-0.03153333]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4050x00 4OEDC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4050x00 4OEDC104'.json deleted file mode 100755 index bb7fd89979..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019 b'xf1x00OS MDPS C 1.00 1.04 56310K4050x00 4OEDC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.2050185],[0.9195626],[0.5246053],[0.026908562],[0.9114053],[0.91469693],[0.9157698],[0.9051642],[0.89098597],[0.8697803],[0.84026057],[0.02667492],[0.026759142],[0.026839804],[0.02711494],[0.027168302],[0.027056737],[0.02683038]],"model_test_loss":0.012174735777080059,"input_size":18,"current_date_and_time":"2023-08-07_08-31-57","input_mean":[[17.967325],[0.011739178],[0.026453309],[-0.011081186],[0.0075463396],[0.009542315],[0.011502368],[0.022000773],[0.02539335],[0.027365072],[0.028902],[-0.011176858],[-0.011109888],[-0.0110546965],[-0.010866341],[-0.010897031],[-0.011053293],[-0.011188322]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.07830097],[-0.106249824],[0.012656421],[-0.7821596],[-4.5630274],[4.243537],[-0.025950456]],"dense_1_W":[[-0.0061698896,0.9194918,-0.00018699981,-0.34165612,-0.23813021,0.5475082,-0.3704561,-0.42950627,-0.13424502,0.21240903,-0.011586605,1.1467392,0.22920804,-0.97056633,-0.19121549,-0.14086221,0.1938753,0.06405196],[-0.017454816,0.94919956,-1.7687415,0.4144439,0.8393141,-0.34053108,0.591435,-1.1978676,-0.8482392,-0.29364696,0.25886354,-0.35653427,-0.13556425,0.47442123,-0.4813972,-0.018155526,0.33277246,-0.18364869],[-0.040766764,0.3978997,-1.3777528,0.16677733,-0.3166893,0.5034032,-0.571129,0.6231584,0.10250656,-0.090288945,-0.61956155,0.77258164,-0.37414613,-0.29708913,-0.17747499,0.037844185,-0.56138355,0.47048673],[0.008608961,0.64667994,0.023636322,0.044800144,-0.5491374,0.11336454,0.20036654,0.08956678,-0.33463073,0.093234874,-0.018535366,0.532879,-0.23179846,-0.06182031,-0.34088808,0.03265121,-0.2914414,0.30612496],[-1.8624474,-0.19170734,-1.0794584,0.2858776,-0.1582014,-0.25510505,-0.03886111,-0.35928875,-0.14603446,-0.5926313,0.2556083,-0.33798292,0.021711705,0.8842171,-0.400223,-0.5245886,0.14859252,0.14324439],[1.9104458,-0.11458521,-1.0961788,0.19383249,-0.31420794,-0.17993532,0.25383317,-0.7584393,-0.2644037,-0.38957348,0.24189566,-0.5495086,0.5854412,0.56651443,-0.59044236,-0.0595582,-0.07797032,0.15840146],[0.0036954198,0.69409066,-0.012849071,0.46628892,-0.17679054,0.4750851,0.1464102,-0.27525088,0.07638812,-0.2049708,0.18918438,-0.12693706,0.07179836,-0.335187,-0.066388905,-0.20065263,0.34333003,-0.1499994]],"activation":"σ"},{"dense_2_W":[[-0.13210453,0.08910437,0.112129636,-0.6724287,0.32233343,-0.38829568,-0.6956729],[-1.2644566,1.0245068,-0.37191963,-0.15572028,0.32260516,-0.31606585,-0.22227848],[-0.03247183,-0.47341025,0.4291947,0.39933267,0.13988854,-0.39599544,0.55437887],[-0.90225273,0.96759653,-0.16322282,-0.085484885,0.7531134,-0.113716386,-0.94529647],[0.48373836,-0.3832921,0.46859494,-0.18692574,-0.41694966,-0.53875446,0.5226155],[-0.67205244,0.7038471,0.22241417,-0.48700184,0.42653432,0.7408016,-0.48191002],[-0.45786425,-0.30025077,0.2096484,-0.34739977,-0.48270205,0.44449425,-0.16691647],[-0.7252935,0.30027175,-0.36952794,-0.33110753,0.74412864,0.31916663,-0.48723075],[-0.24956082,0.15855722,0.11829418,-0.35178453,0.20442583,0.10315542,-0.5577277],[0.60572875,0.15592562,0.2794675,0.13093506,-0.44617447,-0.35550103,-0.050321754],[-0.3681325,-0.061035957,-0.2969062,-0.47592452,0.4287097,0.3534037,-0.18543088],[-1.0721568,0.7378009,-0.9598528,-0.12334156,0.38073373,-0.10097934,-0.232853],[0.04294625,-0.63974065,0.42062205,-0.42591855,-0.27762684,0.15938188,-0.47567785]],"activation":"σ","dense_2_b":[[-0.30254075],[-0.22242764],[-0.022691285],[-0.24312088],[-0.06020819],[0.030239394],[-0.026921261],[0.007865209],[-0.22096242],[-0.037584588],[-0.26260158],[-0.1736811],[-0.039475847]]},{"dense_3_W":[[0.25513327,0.070872426,-0.110507585,0.3759061,0.35881704,0.3910026,-0.6006786,-0.03306147,0.493357,-0.46323946,0.03671056,-0.21105683,-0.39182687],[-0.43874225,-0.18637833,0.6820224,-0.62881595,0.27813682,-0.48058766,-0.5119805,-0.54016674,0.04924179,-0.08472005,0.53560334,-0.2701661,0.002975206],[-0.32438537,0.13052621,-0.6701673,-0.32776773,-0.35359666,0.3229217,-0.29717216,0.11487679,-0.066415556,-0.12536126,0.4941659,0.1786442,0.120943174]],"activation":"identity","dense_3_b":[[-0.036048852],[0.051064212],[-0.037224863]]},{"dense_4_W":[[-0.5492757,1.0810244,-1.2183135]],"dense_4_b":[[0.040853735]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020 b'xf1x00OS MDPS C 1.00 1.00 56310CM030x00 4OHDC100'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020 b'xf1x00OS MDPS C 1.00 1.00 56310CM030x00 4OHDC100'.json deleted file mode 100755 index 89f76fc1e7..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020 b'xf1x00OS MDPS C 1.00 1.00 56310CM030x00 4OHDC100'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.320636],[1.4672288],[0.555081],[0.033456076],[1.4485593],[1.454114],[1.4598106],[1.4775645],[1.4885659],[1.5030168],[1.5086156],[0.033279758],[0.033330515],[0.03337976],[0.03357182],[0.03373127],[0.033942096],[0.034174994]],"model_test_loss":0.0034313653595745564,"input_size":18,"current_date_and_time":"2023-08-07_09-47-01","input_mean":[[16.719969],[-0.34553456],[-0.025382733],[-0.0116697345],[-0.3357296],[-0.33838782],[-0.34124425],[-0.34988672],[-0.35434204],[-0.36063692],[-0.36771125],[-0.01169898],[-0.011674334],[-0.01165932],[-0.011694122],[-0.011704462],[-0.011737361],[-0.011825235]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.12625436],[-0.030992975],[1.7781299],[0.1869105],[-1.89145],[0.008262398],[0.07576191]],"dense_1_W":[[0.009522326,-0.5508854,-0.03136063,0.029506687,-0.05980197,-0.63274986,0.97521657,-0.13758267,-0.011687601,0.08580122,-0.079591334,-0.6555507,0.22438921,0.28736886,-0.12301472,0.2645947,0.49559113,-0.4847965],[-0.018401735,0.37491256,0.0038027354,-0.07964615,0.38655296,0.3701792,-0.5896364,0.00059126964,0.04474745,0.26934335,-0.16293159,0.21059878,0.50954914,-0.18871093,-0.7607577,-0.2164596,0.43915057,-0.026766567],[0.9350977,-0.71919394,-0.3546374,0.20745265,-0.13460818,0.039738543,0.40334892,-0.07613035,0.030847827,0.008619683,0.08559006,0.15181334,0.12347329,-0.15474145,-0.24624701,-0.25018868,-0.195366,0.33170772],[-0.012065977,-0.27186581,0.051803753,0.2872634,0.20535347,-0.2876118,-0.20237778,0.08967258,-0.22776744,-0.11768601,0.09860908,-0.26557824,-0.34911528,0.6094111,0.072002344,-0.28330874,-0.15977615,0.20908129],[-0.94839776,-0.4837727,-0.37379816,-0.36139977,0.24034177,-0.30601895,0.071798995,-0.08959876,0.05900306,0.09905,0.025198964,0.03703683,0.15677285,0.38272214,-0.23764542,-0.28992912,0.1327766,0.1434804],[0.008056818,0.38128582,2.9280443,0.1751433,-0.3785394,-0.18362774,-0.77038676,0.3448695,0.30613825,0.60532063,-0.16727439,-0.08651086,-0.08615892,0.21958824,0.027262067,-0.003296754,-0.5401621,0.18965037],[1.0339775,0.45337832,-0.015582236,-0.0063054073,0.056368716,-0.30668864,-0.02802569,-0.19660905,0.43840367,-0.17627239,-0.030975454,-0.057090487,0.306885,-0.24460675,-0.060861766,0.19225666,-0.3149098,0.15006702]],"activation":"σ"},{"dense_2_W":[[0.6902859,-0.6393492,-0.44761193,-0.3838106,0.4084184,-0.509032,0.4051396],[-0.22254738,-0.08053956,-0.18914244,0.13284113,-0.6440283,-0.17699161,0.3351629],[-0.67853475,-0.18324746,-0.8725586,0.063068196,-0.50468117,0.4416853,-0.718201],[-0.21037722,0.026921168,-0.9217467,-0.5199083,-0.1263664,-0.42184907,0.10097415],[-0.4352312,0.13832696,-0.9440917,-0.61247665,0.11328457,0.5671792,-0.52296823],[0.39174297,-0.09831927,0.28159302,0.31369746,0.10481584,0.09035183,0.13667637],[-0.24003993,0.57464117,0.012518535,-0.31918442,-0.2873576,-0.105834864,0.13482167],[-0.1323263,-0.07528578,0.03620373,0.1001147,-0.34535193,0.2595585,-0.05328041],[-0.6540329,0.5568342,-0.3725302,-0.6058455,-0.09868532,-0.8560664,0.4088728],[-0.072663926,0.43851793,0.17612897,-0.22449215,-0.7815626,-0.23553626,0.42175516],[0.036100484,-0.17945322,0.7347332,0.62554735,-0.22215228,-0.49261123,-0.0353556],[0.4271888,-0.74014676,-0.46194273,0.3661966,0.7197653,-0.4986745,-0.6228453],[0.36488712,-0.13825116,-0.48768026,0.5608169,0.323051,-0.027168993,0.07831102]],"activation":"σ","dense_2_b":[[-0.027757965],[-0.016351482],[-0.024558742],[-0.085644595],[-0.046783354],[-0.07285203],[-0.0006671193],[-0.05067625],[-0.016443914],[-0.020814378],[0.03668154],[-0.20516597],[-0.048601683]]},{"dense_3_W":[[0.32911223,-0.26069397,-0.043751866,-0.48354477,-0.07570592,-0.33116663,-0.4901479,-0.13365264,-0.6457748,-0.36664736,0.58490235,0.1868273,-0.45664176],[-0.34076023,0.24871762,0.6651098,-0.2161779,0.12477483,0.10071758,0.59505385,-0.081202336,-0.16617194,0.083364025,-0.6090697,-0.2990762,0.18049675],[0.35747406,-0.3925092,-0.20388703,-0.22220151,-0.6932658,0.40903154,-0.59456044,0.10416559,-0.23720811,-0.17813742,0.5602839,0.33316627,0.6221551]],"activation":"identity","dense_3_b":[[0.03296679],[-0.010274947],[0.0053764265]]},{"dense_4_W":[[-0.38123104,0.6776871,-1.0605929]],"dense_4_b":[[-0.008991764]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103'.json deleted file mode 100755 index bc74f44fbe..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.03 56310-S8020 4LXDC103'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.175346],[1.2147926],[0.40956834],[0.043589003],[1.2094305],[1.2120428],[1.213341],[1.1980789],[1.1770303],[1.1413853],[1.096605],[0.043463618],[0.043503705],[0.043532778],[0.043430444],[0.043218896],[0.04280715],[0.04230417]],"model_test_loss":0.007078256458044052,"input_size":18,"current_date_and_time":"2023-08-07_10-44-09","input_mean":[[23.77826],[0.042549085],[0.0008366095],[-0.004325034],[0.041777823],[0.04188725],[0.04202964],[0.04286655],[0.041103654],[0.037775554],[0.035643935],[-0.0043570427],[-0.0043655117],[-0.0043805246],[-0.004415017],[-0.004466785],[-0.004567743],[-0.0046552946]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.965341],[-1.3328798],[2.873564],[0.35027432],[0.6997454],[-0.21583362],[-0.27257147]],"dense_1_W":[[-0.47184834,-0.69497913,-0.2730397,-0.13578247,-0.41297266,-0.36849588,0.45024145,-0.2319935,-0.30260193,-0.15122801,-0.51926386,-0.45438546,0.07730465,0.5861091,-0.020928165,0.48080453,0.056900945,0.042121172],[0.59712833,-0.7607585,0.026460258,0.32494903,-0.122338474,-0.1373476,0.071163654,0.1314587,-0.12158134,-0.2506838,0.13905102,-0.7858368,-0.19018257,0.18298808,0.830341,0.3877357,0.040660307,-0.34048963],[0.4699344,-1.0309892,-0.29336283,-0.13386539,-0.38560688,0.13875784,0.310352,-0.46929145,-0.19158518,-0.39478084,-0.32203192,-0.44451842,-0.03810472,0.13355829,1.0309442,0.12171281,0.06862913,-0.056783624],[-0.31507948,0.88658756,3.0891764,-0.016361725,-0.46861553,0.06094547,-0.7714304,-0.1749589,0.7333911,0.28544956,-0.52014995,0.7543131,-0.18914306,-0.438352,-0.09483591,-0.10935197,0.06640237,0.10865169],[-0.6810932,-0.62288636,3.2094796,0.23221104,-0.025693255,-0.024708634,0.39303362,0.26580834,0.01109397,-0.008134186,-0.011310946,-0.16316406,-0.22316264,0.030972356,0.5338975,-0.17917001,0.2126686,-0.2364076],[0.11154792,0.45386994,-0.0020048814,-0.13927853,0.20206624,0.26231214,-0.5960362,0.5244008,0.074492626,-0.26563543,0.07578456,0.25490692,0.20137514,-0.46869782,-0.06294161,0.13251714,-0.106802404,-0.038976945],[0.04923776,-0.56570596,-0.023485426,0.31115237,-0.015669545,-0.54184866,0.43453303,-0.05844923,-0.059031844,-0.3202865,0.20897299,-0.4897307,-0.5586684,0.590096,0.2163083,0.06288182,-0.15607044,0.043854684]],"activation":"σ"},{"dense_2_W":[[0.6042513,-0.41607365,-0.15501793,-0.9058375,0.494895,-0.5677933,-0.19259822],[0.24214138,0.89813733,1.3278699,-1.0037,-0.27477452,0.15186948,0.82211167],[-0.4369761,-0.27131867,-0.46790847,0.4080189,0.12101331,0.57774526,-0.6197042],[-0.3105224,0.19357671,-0.5197163,-0.1386291,-0.3751452,0.76656866,-0.42951363],[0.4263876,-0.19077252,-0.45208168,-0.2320784,0.2086758,-0.11445575,-0.5586836],[0.1574424,-0.08930149,-0.025565622,0.11400002,0.07183162,0.33150333,-0.67951137],[-0.00696618,0.02959456,-0.30796584,0.09413716,-0.016803082,-0.2540206,-0.64932644],[-0.478996,-0.22900066,0.17936084,0.51007396,-0.27805895,-0.19075584,0.362384],[0.011149391,0.36451602,0.42717254,-0.2344727,0.6348016,-0.77200013,-0.15786803],[0.43334863,-0.38772285,-0.4590563,0.33910498,-0.32742906,0.5451967,-0.672129],[1.9660255,0.25045738,-0.2614816,-1.1789049,0.25753427,-1.7329595,0.075383596],[0.80854565,0.44739807,0.09770806,-0.48315546,-0.13119374,-0.7300847,0.13286975],[0.11956496,-0.28744987,0.3014693,-0.28274173,0.52113587,-0.47521448,0.35999197]],"activation":"σ","dense_2_b":[[-0.1408794],[-0.06288287],[-0.012260787],[0.08074568],[0.02582188],[0.002878733],[-0.238239],[0.022335405],[-0.08137566],[0.048318516],[-0.48222473],[-0.11309628],[-0.17126083]]},{"dense_3_W":[[0.5729494,0.443129,-0.5894581,-0.52491343,-0.10086044,-0.36603114,0.09061523,-0.0777708,0.45014396,-0.44782442,0.61933756,0.6175609,0.5284045],[0.60463345,0.24479416,-0.64297765,-0.64166015,0.07398127,-0.23124957,0.013111015,-0.58013326,0.60139996,-0.5977943,-0.31441298,-0.034418926,0.5766632],[-0.41230297,0.0819272,0.021512562,0.40312076,0.5106018,-0.0969059,0.306975,0.06700377,-0.34809703,0.48136255,-0.21470276,0.09597008,0.49942]],"activation":"identity","dense_3_b":[[-0.04435611],[-0.025747824],[0.027492581]]},{"dense_4_W":[[-0.851287,-0.29851007,0.48474476]],"dense_4_b":[[0.038550936]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104'.json deleted file mode 100755 index 4e0dfca188..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8020 4LXDC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.056006],[1.4101361],[0.41225532],[0.045771565],[1.4047778],[1.4076663],[1.4089199],[1.3933164],[1.3716278],[1.3344857],[1.2923727],[0.04557442],[0.045628536],[0.045675997],[0.045730982],[0.04567293],[0.04542135],[0.045018636]],"model_test_loss":0.00867381040006876,"input_size":18,"current_date_and_time":"2023-08-07_11-10-56","input_mean":[[25.56377],[-0.052645843],[-0.0035276904],[-0.013127003],[-0.051226523],[-0.05180752],[-0.052373447],[-0.05199156],[-0.051400427],[-0.052954886],[-0.052905556],[-0.013169344],[-0.013158662],[-0.0131510245],[-0.013154536],[-0.013176389],[-0.013252023],[-0.013282005]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.68120617],[-1.2007718],[-0.50614536],[0.7864571],[1.8299532],[0.14825825],[-0.015340148]],"dense_1_W":[[1.1199652,-0.078471795,-0.02101174,0.3584074,0.17968981,-0.19903003,0.12223812,0.18867153,-0.1669939,0.012081453,-0.10156123,-0.16801898,0.13951854,-0.04682727,0.040429268,-0.04173933,0.19039303,-0.07381891],[-0.18552107,-0.63688856,-0.02137382,0.20457703,-0.29974234,-0.55259144,0.45336398,-0.021133235,0.01901811,-0.37169448,0.13456118,-0.3071185,-0.22914943,0.61524135,-0.27383205,-0.1330443,0.14043514,0.08927942],[0.1926113,-0.27000305,-0.008649953,-0.21855511,-0.030888382,-0.16513677,0.39715445,-0.30844018,-0.017153203,0.093351975,-0.012528175,-0.35072303,-0.10748886,0.113659255,0.49542776,0.28211826,0.23563762,-0.4190026],[0.9724377,0.5390427,0.01619258,-0.3782754,-0.13919044,-0.18610589,-0.25080666,0.039643906,-0.23925631,0.45390597,-0.16189374,-0.15735695,0.32372928,-0.49280795,0.13093178,0.40426654,0.30928588,-0.4606705],[0.31533858,-0.32204363,-0.031351704,0.25225377,-0.6184541,0.012579387,-0.013788457,-0.2484758,-0.38601685,-0.37180173,0.30587637,-0.41104367,-0.06381989,0.28475899,-0.11201605,0.15005648,-0.02408876,0.070196375],[-0.05559003,-0.57731414,0.0009183374,-0.15830034,0.32752046,-0.47376716,0.32692105,-0.028732348,-0.3711419,0.3037169,0.026518416,-0.16056052,-0.086504,0.080008745,0.2828945,-0.017448967,-0.06945115,-0.020946816],[-0.01733753,0.7237506,3.472701,0.27271795,-0.40486532,0.056092504,-0.24601175,-0.052139923,0.16743213,-0.068572104,-0.00896937,0.2883757,0.5440398,-0.29913893,-0.3024588,-0.5673238,-0.2726739,0.35933533]],"activation":"σ"},{"dense_2_W":[[-0.5932156,-0.17436917,-0.86359346,0.32812464,-0.7771405,-0.2133228,0.42944756],[-0.21486568,0.017540466,-0.3076961,-0.040222447,0.12777315,0.01670594,-0.72814006],[0.037832227,-0.3021096,-0.43493658,0.2691959,0.002386393,-0.90290415,-0.8527598],[-0.05667615,0.4105785,0.43791267,-0.66102684,0.19379678,0.0034966974,-0.63614714],[-0.24539289,-0.2868011,-0.971667,0.74372065,0.0054125004,-0.70493174,-0.27502376],[0.22307737,1.1438144,0.48204678,-1.34653,-0.48455057,0.64900017,-0.72665155],[0.47112092,1.0107919,0.5427512,-1.2793072,-0.42651054,0.5067852,-0.5551137],[-0.7673742,-0.6745484,-0.99198294,-0.41266263,-0.4100962,-0.174795,0.5818804],[0.0852762,0.18207242,0.8183619,-0.5843856,1.0058954,0.18574238,0.08424301],[-0.08769919,0.5601262,0.5962264,-0.0019132155,0.8132487,0.6793232,0.17075731],[-0.7578988,-0.79018444,-0.47751963,0.36069503,-0.040583238,0.050442085,0.2954631],[-0.4815163,-0.32178232,-0.15335134,0.6915401,-0.60536283,-0.56515604,-0.20786098],[0.2656557,0.9920723,0.4726771,-1.0218889,-0.14299747,0.23651631,-0.15890613]],"activation":"σ","dense_2_b":[[0.026248137],[-0.44299766],[0.043020185],[-0.44655073],[0.21503547],[-0.51649547],[-0.52930456],[0.09336591],[-0.2554213],[-0.28878778],[0.1169097],[0.3210494],[-0.4154725]]},{"dense_3_W":[[0.41299453,-0.066272356,0.33743006,-0.20297222,0.3149677,-0.66625124,-0.47435388,0.87357444,-0.46995607,-0.6577897,0.6913372,0.8391053,-0.41768512],[0.21756826,-0.04198229,-0.34622204,-0.077409394,0.36491418,0.34946445,-0.16554481,0.25513986,-0.21913688,-0.49385577,-0.107037865,0.13471128,0.3483314],[-0.65252286,-0.4097913,0.49876347,-0.57664716,-0.16723605,-0.40482098,-0.10828655,-0.3436007,0.1842379,0.20728882,-0.73673856,0.11894116,0.22566953]],"activation":"identity","dense_3_b":[[0.09075453],[0.16417536],[-0.034160458]]},{"dense_4_W":[[1.3366597,0.032031875,-0.25315842]],"dense_4_b":[[0.08058132]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104'.json deleted file mode 100755 index f115f5f8a5..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00LX2 MDPS C 1.00 1.04 56310-S8420 4LXDC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.973073],[0.95391583],[0.41054899],[0.04000471],[0.948944],[0.9501768],[0.9511314],[0.94470316],[0.9386586],[0.9273338],[0.9128515],[0.039655894],[0.039748702],[0.039835606],[0.040048752],[0.040042162],[0.039870463],[0.039569415]],"model_test_loss":0.006820903159677982,"input_size":18,"current_date_and_time":"2023-08-07_11-35-32","input_mean":[[25.87563],[0.03444932],[-0.005718268],[-0.0067776064],[0.035757456],[0.034977943],[0.03397304],[0.032574583],[0.033818536],[0.035891917],[0.03648409],[-0.0067452686],[-0.0067759207],[-0.0068118596],[-0.0069498047],[-0.0070627993],[-0.0072338316],[-0.0074106893]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.29337177],[0.66558135],[1.4415557],[-0.5266783],[0.16447654],[-0.10947574],[-0.06639086]],"dense_1_W":[[0.005461846,0.3028855,-0.9854084,-0.36890888,-0.53238684,0.52668965,-0.25776407,0.22581728,0.46904722,-0.04119145,-0.3861126,0.05695158,0.46752244,-0.22415254,0.03926628,-0.30610013,0.33170545,-0.08449963],[0.22456734,0.3669208,-0.0028302418,0.03447742,0.23297563,0.29559872,-0.5093176,0.085083686,-0.2612917,0.48527485,-0.1594518,-0.00450076,-0.21800643,0.43129826,-0.35478443,0.33027887,-0.5035417,0.14951973],[0.49297655,0.15207167,-1.0634992,0.11992674,-0.119991384,-0.032969154,0.3350461,-0.05330331,0.2389221,-0.31744695,-0.019832905,-0.011234121,-0.19565247,0.27552214,-0.02907322,-0.20475934,-0.27375516,0.22658962],[-0.2927863,-0.25061154,-0.86077774,0.38277695,0.46133354,-0.24130213,0.49445266,-0.30399632,-0.16158967,0.27781072,-0.081007525,-0.2356671,-0.027503187,-0.046890937,-0.062831424,0.13332452,-0.20753789,0.0064896126],[0.14027123,-0.31178385,0.00042652222,0.046416104,-0.06375891,-0.7625973,0.49403247,0.08477962,0.19782965,0.06535667,-0.2237524,0.00016943947,-0.4144055,0.47161788,0.22153234,-0.3320155,-0.17704901,0.29443938],[0.038497016,-0.37529072,-0.0028597962,0.108154766,0.060559765,-0.06721315,0.19045271,0.049022302,-0.2868929,-0.24597946,0.20001437,-0.54507667,0.13740665,-0.09072125,0.15628168,0.4834033,0.5418541,-0.52194417],[-0.084147945,0.7816322,3.3733516,-0.17901123,-0.5475804,0.13706692,-0.5615205,0.06558603,-0.15445961,-0.041518424,0.07307288,0.54342633,-0.091437295,-0.04500106,-0.18742481,-0.11182337,-0.32038802,0.37347284]],"activation":"σ"},{"dense_2_W":[[-0.33089092,-0.22617778,-0.2098423,0.464438,0.4536977,0.6569846,-0.11208219],[0.42292553,0.72667843,-0.3986618,-0.48419535,-0.89743257,-0.45015466,-0.03912514],[0.15107515,0.95479184,0.40600297,-0.19311583,-1.0210984,-0.8584778,0.5974732],[0.0047267857,0.15918939,0.07144057,-0.35448834,0.637432,0.184555,0.18535456],[-0.12454911,0.29654753,-0.34574932,0.34942415,-0.26024386,0.44442993,0.14613877],[-0.37099168,-0.5386991,-0.3271315,0.54532915,0.6926416,-0.17912938,-0.6608735],[-0.63072056,-0.3643776,0.64305526,-0.29544187,0.7246565,0.56209284,-0.16261125],[-0.04684182,0.7014187,0.08467743,-0.5152171,-0.0669242,-0.09466255,0.2614267],[1.1972748,0.91310155,-0.61666393,-0.3711597,-1.1699697,-0.8451692,-0.5264526],[-0.17695586,-0.7369236,0.15112078,0.4462285,0.8489584,-0.19433662,-0.18448965],[-0.53724587,0.017794129,0.4338191,0.24491285,0.36948907,0.70015615,-0.30459952],[0.757806,-0.034863185,-0.77135277,-0.2933871,-0.27939826,-0.9393837,0.2961518],[0.43675852,0.053857032,0.498965,0.37739882,0.4588103,-0.37056544,0.14442298]],"activation":"σ","dense_2_b":[[-0.06206714],[0.07846223],[0.107750826],[-0.046243668],[-0.033654705],[-0.035633843],[0.015834749],[0.017618928],[0.04875132],[-0.032331567],[-0.041599613],[-0.009607665],[-0.095047034]]},{"dense_3_W":[[-0.27053934,-0.5599827,-0.5261372,0.5703626,0.2743929,0.6257322,0.3774779,-0.20829831,-0.4448903,0.6131186,0.29582694,-0.49130827,-0.046639528],[0.2578624,-0.83337194,-0.027313164,-0.29705286,-0.3806988,-0.019476013,0.53997874,-0.44911963,-0.4572695,0.39203748,0.4073216,-0.5038811,0.19435048],[0.5505637,-0.52018625,-0.22615957,-0.042771284,0.30023396,0.07614445,-0.36263672,-0.5696729,-0.15394297,0.29655027,0.5070545,-0.16651826,0.013556858]],"activation":"identity","dense_3_b":[[0.004786969],[0.017816467],[0.008341951]]},{"dense_4_W":[[-0.70178753,-0.6261923,-0.58992994]],"dense_4_b":[[-0.009440654]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.00 56340-S9000 8B13'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.00 56340-S9000 8B13'.json deleted file mode 100755 index 3583885a42..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.00 56340-S9000 8B13'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6636677],[1.0415155],[0.4405441],[0.03810654],[1.0415744],[1.0396914],[1.0376655],[1.0191053],[1.0017574],[0.9810815],[0.9587672],[0.03804814],[0.038069014],[0.0380983],[0.038099322],[0.037983626],[0.037768982],[0.037503105]],"model_test_loss":0.0070123192854225636,"input_size":18,"current_date_and_time":"2023-08-07_12-25-32","input_mean":[[24.58516],[-0.053356342],[0.0018561187],[-0.028318454],[-0.052350596],[-0.05162282],[-0.050804704],[-0.052188896],[-0.050713386],[-0.048506834],[-0.04722293],[-0.028366687],[-0.028323544],[-0.028278554],[-0.028274836],[-0.028321512],[-0.028377615],[-0.028479535]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.40149847],[-0.036968376],[2.9324126],[-0.050440587],[-1.6624343],[-3.111909],[-0.08347813]],"dense_1_W":[[-0.2231008,0.43419427,-0.008418177,-0.25645596,-0.27315116,0.3730735,-0.56420225,0.531981,0.050561436,0.049857076,0.01984278,0.15615726,0.14532468,-0.1341266,-0.14356773,0.022001041,-0.47281718,0.04480727],[-0.3699377,-0.8539471,-0.011191063,-0.03840326,0.5528697,-0.5095522,0.79292774,0.53987986,0.3397071,0.09874697,0.16869819,-0.20077275,-0.38679546,0.18692482,0.27885512,-0.3531348,-0.11918749,-0.47793227],[0.44518143,-0.8884128,-0.12010096,0.2840199,-0.01654247,-0.37926447,0.6241959,-0.3588111,-0.18594895,-0.37540522,-0.1184817,-0.28526396,0.09523298,-0.08844218,0.28927204,-0.030794572,-0.22434682,0.02950121],[0.051157415,-1.5702069,-3.6776006,0.07019505,0.37266773,0.20280795,0.16947661,0.08074228,-0.93735164,0.26037607,1.2727387,-0.5875368,0.118953235,-0.052235976,0.5290898,0.0075836885,0.2145108,-0.341396],[0.8406824,-0.6357117,-0.012508759,-0.114874125,0.22464035,0.6901549,0.30033943,0.15118437,0.42181274,0.32857767,0.35121942,0.5021367,-0.826353,-0.3353306,-0.15846261,0.104648225,-0.16137573,-0.854983],[-0.48347813,-0.9890036,-0.12638868,0.4244501,0.22061923,-0.6496192,0.73929363,-0.2879861,-0.27470425,-0.47338513,-0.026745116,-0.7317621,0.03403621,0.31189573,0.43235132,-0.16640383,-0.20338999,-0.027866011],[-0.0053826473,-0.8913341,0.00012506823,0.27318633,-0.0037789296,-0.86155355,0.40793747,0.27253038,-0.080729984,-0.031735364,-0.02203216,-0.15663473,-0.13908623,-0.0398157,0.14052938,0.24337272,-0.40471002,0.18925937]],"activation":"σ"},{"dense_2_W":[[0.30025923,-0.26395065,-0.6900893,0.12076107,-0.27104673,-0.4204864,-0.12814534],[-0.59520245,-0.31921673,0.12515253,-0.10728783,0.30437303,-0.44225642,-0.7510248],[-0.97030437,0.091399565,1.041651,0.5298835,0.12482943,-0.39294013,0.3376671],[-0.35264635,0.030865038,-0.043722976,-0.25330108,-0.47328326,-0.044327017,0.23717652],[0.45056573,0.22202963,-0.79909515,-0.29515973,-0.34452644,-0.12819465,0.28630367],[-0.1962231,-0.06441422,-0.3860033,-0.45442382,0.5523658,-0.37580812,0.17132744],[0.15821941,-0.65717125,-0.29991794,-0.23657624,0.30773747,-0.4825543,0.3368553],[0.44671333,-0.23616415,0.060102407,-0.4938546,0.5823045,0.030239027,-0.5907059],[-0.7725862,0.65374887,0.99496603,-0.52427566,-0.74721336,1.1665807,0.485246],[0.5747518,-0.54922277,-0.4279965,-0.32235864,-0.39549112,-0.63029706,0.08336972],[-0.6286281,0.53232676,0.09173603,-0.3197821,-0.58844185,0.6930728,0.89978975],[-0.8540552,0.23237345,0.01174916,0.02329381,-0.21082848,0.4638076,0.61707777],[-0.38213924,0.12289726,0.02848087,-0.2358143,-0.09083596,0.68827146,0.39511114]],"activation":"σ","dense_2_b":[[0.007899074],[-0.24461511],[-0.17740962],[-0.0007998822],[-0.01197454],[0.04764368],[-0.017339833],[0.072300844],[-0.23241436],[0.096137755],[-0.14189208],[-0.18733168],[-0.09664416]]},{"dense_3_W":[[0.49906957,0.43125764,-0.0050584874,0.29804975,0.15355866,-0.29560578,0.35590634,0.5839829,-0.59895027,0.1900103,0.30921668,-0.6190028,0.016287152],[-0.09681585,-0.42354482,-0.550485,-0.07733479,0.41151676,0.5945164,-0.04800964,0.37133008,0.010906173,0.52148324,-0.5151786,-0.2838045,-0.49523494],[-0.25222576,-0.27630806,0.11442517,-0.29334897,-0.17029618,-0.20770106,-0.042667136,0.15740934,0.22484288,-0.6796396,0.36673924,0.31320038,0.2187441]],"activation":"identity","dense_3_b":[[0.041152943],[0.050569043],[-0.04529463]]},{"dense_4_W":[[0.6610413,0.93398947,-0.9665046]],"dense_4_b":[[0.04895585]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.01 56340-S9000 9201'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.01 56340-S9000 9201'.json deleted file mode 100755 index 17e7de42ee..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020 b'xf1x00ON MDPS C 1.00 1.01 56340-S9000 9201'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.31745],[1.1132171],[0.47852853],[0.042235937],[1.1178341],[1.1160868],[1.1140894],[1.0932467],[1.0700195],[1.0378196],[1.0042937],[0.042053793],[0.042099174],[0.042147044],[0.04229224],[0.042290386],[0.04213167],[0.04170115]],"model_test_loss":0.007971670478582382,"input_size":18,"current_date_and_time":"2023-08-07_12-50-19","input_mean":[[22.745663],[-0.02314496],[0.006329487],[-0.007906635],[-0.024401885],[-0.024847621],[-0.024651228],[-0.020919092],[-0.019033547],[-0.014008034],[-0.00841008],[-0.007998144],[-0.007991008],[-0.007984672],[-0.007925103],[-0.007978865],[-0.008057719],[-0.008112883]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.10009004],[-2.4347603],[-0.45647046],[-0.26168102],[0.4559833],[-2.3471363],[-0.024856634]],"dense_1_W":[[0.00685374,0.29781812,-0.0045040743,-0.2483261,0.36356887,0.7941921,0.115958326,-0.303391,-0.31066865,-0.4133796,0.5499007,0.6501906,-0.06862256,-0.59767103,0.10247653,0.22389303,-0.0670222,0.012925103],[-0.43374088,0.95874643,0.010345864,0.029017475,-0.63670444,0.31695086,0.07258637,0.13453023,0.47587368,0.46790752,-0.30345193,0.46282083,-0.093325965,-0.0597011,-0.52926123,-0.23205075,0.21186207,0.15266287],[-0.010350411,0.40709472,0.0041358415,0.5390394,-1.0806609,0.64311004,-0.09017517,-0.18798684,-0.12183539,0.010223074,-0.05575936,0.11231753,-0.13522181,0.09871264,0.1674028,0.2260443,0.92522573,0.22312124],[0.20998508,-0.7601628,0.0044564125,0.0017229705,0.8512942,-0.2566007,-0.22104141,-0.06553982,-0.23601292,-0.25825587,0.37305197,-0.1024032,-0.36825082,0.21398295,0.9294358,0.4860802,0.548133,-0.0834842],[0.37757793,0.6797055,-0.004590874,-0.56208813,-0.2976163,0.6580122,-0.56625277,-0.09451766,0.17261557,0.19591618,-0.17517307,0.20502836,-0.16963857,-0.29324597,-0.00045291794,0.17973329,-0.5582203,-0.4135608],[-0.43611768,-1.3107734,-0.009830083,0.20460518,0.74073887,-0.54199576,0.2283278,-0.0015428674,-0.17581679,-0.8339866,0.4044754,-0.4352709,-0.3658589,0.2867904,0.8084769,-0.29901847,0.13045451,-0.26202014],[-0.00031012832,-0.38003787,-2.2669997,0.3342903,0.09606713,-0.04249713,0.8710125,-0.60461634,-0.725245,0.3113496,0.45141265,-0.7288661,-0.29998294,0.6268596,0.084224634,-0.021362655,0.14650373,-0.14192608]],"activation":"σ"},{"dense_2_W":[[0.6022557,0.12733772,0.5688971,-0.47040647,-0.19734168,-0.25412557,-0.64506894],[-0.87848234,-0.2927233,-0.38882446,0.01753978,-0.66094726,-0.009080832,-0.046852414],[-0.6812371,-0.12201253,-0.17657526,-0.14278913,0.10146227,-0.33213505,-0.42730355],[0.5288182,-0.1530913,0.2752494,0.21740611,0.08138198,-0.79552627,-0.09336282],[-0.67439306,-0.7681033,-0.25968102,0.10087962,-0.073134035,0.74803954,0.5110043],[-0.26234108,-0.5890924,-0.90448207,-0.34318918,-0.14372866,0.06295756,-0.5832333],[0.56269956,0.31309462,-0.22407316,-0.74141455,0.3451219,0.16766134,-0.038615566],[-0.42197526,-0.6832733,-0.11012318,0.81781024,-0.49532312,0.5044022,0.6058622],[-0.22078349,-0.49892014,-0.6127092,0.39234552,-0.9247115,0.024139864,-0.1763933],[0.4427586,0.6229294,0.29448354,-0.64260805,-0.12868074,-0.14595105,-0.4953741],[-0.8060251,-0.57394534,-0.24703805,0.22687304,-0.019541593,0.08022944,-0.17855246],[-0.1300446,0.48822337,0.5738244,-0.4108309,0.12754422,-0.551131,-0.15526813],[-0.9597397,0.17972887,-0.75652325,0.14697702,-0.6045928,0.7029836,0.5235034]],"activation":"σ","dense_2_b":[[-0.047481403],[-0.06560398],[-0.27885428],[0.0077811894],[0.058150165],[-0.25603768],[-0.049105696],[-0.031028127],[-0.19086929],[-0.09221374],[-0.01903645],[-0.00713192],[-0.066267215]]},{"dense_3_W":[[0.04823237,-0.536979,0.27751818,0.1655786,-0.38873705,-0.2579097,0.089698836,-0.45589212,-0.138498,0.4641493,-0.38723156,0.27027082,-0.26783973],[0.61633486,-0.5096373,-0.36629617,-0.20646454,-0.7141381,-0.18465841,0.49784765,-0.26393116,0.26770627,0.6908027,0.36391553,-0.4442028,-0.09214944],[0.5473221,0.5475575,-0.34196937,0.420392,-0.2992392,0.3096095,0.6112058,-0.34745613,-0.20254803,-0.1975557,-0.50081915,0.5198232,-0.6212465]],"activation":"identity","dense_3_b":[[0.056188975],[0.049475864],[0.041392375]]},{"dense_4_W":[[1.0715346,0.3261359,0.63600165]],"dense_4_b":[[0.051208194]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8409'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8409'.json deleted file mode 100755 index 4cc4de130e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8409'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.896653],[1.2753624],[0.5317558],[0.04692811],[1.2610264],[1.2643604],[1.2686262],[1.2531861],[1.2319366],[1.202845],[1.1703773],[0.046726346],[0.046764154],[0.04680635],[0.046880126],[0.04682511],[0.046679065],[0.046382528]],"model_test_loss":0.007070815656334162,"input_size":18,"current_date_and_time":"2023-08-07_13-44-54","input_mean":[[22.618917],[-0.12753934],[0.0057965177],[-0.0060813604],[-0.1289674],[-0.12929432],[-0.13033809],[-0.12293899],[-0.12034268],[-0.11245273],[-0.10651569],[-0.0061726016],[-0.006176799],[-0.0061910134],[-0.0061672167],[-0.006181863],[-0.0062086484],[-0.0062240455]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.20530139],[-0.33197266],[-2.1811483],[3.7774518],[1.2599417],[-3.9418454],[-0.18807785]],"dense_1_W":[[-0.03620619,0.19689178,0.09866175,-0.09322594,-0.078725435,1.1390496,-0.7356808,-0.012869471,0.15444094,0.07297737,-0.14101654,0.03384644,0.15915924,-0.4428113,0.22565778,-0.04034416,0.19587907,-0.20443197],[-0.06502236,-1.4234812,-6.6071515,-0.25332624,0.78716946,1.0407856,1.018014,-0.38713723,-1.3469931,-0.75132585,0.98401487,-0.26469627,-0.3915288,0.12644795,0.454595,-0.08865953,0.17730202,0.021167783],[-1.5585331,-0.5798272,0.22335605,0.03818846,0.6245181,-0.47028995,0.5918746,-0.054077096,0.54335994,0.034108605,0.047890723,-0.41479602,0.2831795,0.124537066,0.255331,-0.33859366,0.039150972,-0.07043993],[1.394775,-0.23261723,-0.28053886,-0.22738497,0.10594227,-0.6431526,0.0015595681,0.1450129,0.015581782,-0.0155119905,-0.31749186,-0.25720045,0.47923756,0.052539762,-0.22887582,0.12794253,0.039806157,0.09652687],[1.740706,0.11734064,0.3073235,0.26312536,0.08612904,-0.15223877,0.44893447,-0.15653725,0.32468832,0.13602708,0.0652706,-0.584739,0.15232132,0.11354476,0.053987373,0.033912808,0.3362455,-0.4482535],[-1.4522748,-0.30714616,-0.29713413,-0.21153042,0.35632578,-1.3907708,0.5317352,0.12741564,-0.0064160936,0.12887736,-0.41460907,0.34433788,-0.2432804,0.09331247,-0.24749541,0.36895674,-0.23798321,0.21776763],[8.573988e-6,0.27198073,0.0034219692,-0.06563512,-0.29250515,1.0881044,-0.64386135,0.1843868,0.031134987,0.025746144,-0.008881639,0.6693814,-0.17966537,-0.19181062,-0.4711859,0.06456762,-0.24241222,0.27226776]],"activation":"σ"},{"dense_2_W":[[-1.4079269,0.36448163,0.54817736,0.5838273,0.023329774,0.6411659,-1.3597034],[-0.51554555,-0.4119896,-0.0757938,-0.52624255,-0.32881626,-0.09241929,-0.6173628],[0.17114219,-0.5917404,0.52103335,-0.91308004,-0.64996517,-0.45323023,-0.27036774],[-0.7816448,-0.34142476,0.27209246,0.83823246,0.25578618,0.78207064,-0.5922945],[-0.63912165,0.056242548,0.40855795,-0.16621237,0.15351564,0.39832217,-1.1449009],[0.4102927,0.34681398,-0.034716405,-0.62436956,0.011792132,-0.74056876,0.11482153],[0.24064858,0.38059077,-0.389402,-0.75450635,-0.05456221,-0.24500677,0.71137184],[-0.047961276,0.31060773,-0.3119071,-0.08383901,-0.21034946,-0.39693183,0.71529126],[0.8864901,-0.13776888,-0.40138802,-0.5242289,0.3239953,-0.2595277,0.62388825],[0.47216353,-0.35241503,-0.41698897,-0.24461508,0.41777575,-0.14391029,0.903978],[-0.8213227,1.2268875,-0.76732516,1.3276708,0.9519929,0.39465946,-0.77069944],[-0.72467273,0.39069507,-0.303594,0.23257187,-0.3579329,0.6990695,-0.30224627],[-0.8027119,0.16713265,0.5837898,-0.078509,0.07100372,0.7838912,-1.001968]],"activation":"σ","dense_2_b":[[-0.25387064],[-0.30531904],[-0.02434373],[-0.18550278],[-0.324516],[-0.007148533],[0.015090404],[-0.005064251],[0.035354376],[0.17334807],[-0.047236674],[-0.22442318],[-0.2525012]]},{"dense_3_W":[[-0.5563823,0.087780975,0.18698041,-0.3394262,0.008317095,0.66230845,0.58490086,-0.0028694326,0.66133267,0.11329112,-0.48986503,-0.11975826,-0.68024075],[-0.54618734,-0.104708515,0.64458096,-0.55121964,-0.24448135,-0.28165248,0.36517873,0.50535154,-0.17659181,0.5379147,-0.3447484,-0.52534163,-0.031908248],[0.3347168,-0.2290193,0.5621586,0.30639598,-0.36269528,0.5464596,-0.4033829,0.14275603,-0.34687775,-0.47407392,-0.01195648,0.4732098,-0.3589579]],"activation":"identity","dense_3_b":[[0.059350483],[0.070591144],[0.03717587]]},{"dense_4_W":[[1.0896041,0.62514883,0.03852297]],"dense_4_b":[[0.06460823]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8A12'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8A12'.json deleted file mode 100755 index 17e2a43814..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.00 56340-S2000 8A12'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.358906],[1.038606],[0.52003336],[0.03449092],[1.025025],[1.0285342],[1.033122],[1.0280541],[1.0189449],[1.0088568],[0.9928373],[0.034335066],[0.03436934],[0.03440254],[0.03445266],[0.034416895],[0.0341578],[0.033791963]],"model_test_loss":0.005529345478862524,"input_size":18,"current_date_and_time":"2023-08-07_14-09-26","input_mean":[[22.959547],[-0.052741483],[-0.004481133],[-0.0017092802],[-0.050769974],[-0.051488187],[-0.05162069],[-0.051915728],[-0.050174993],[-0.052261814],[-0.05214494],[-0.0018301547],[-0.0017879381],[-0.0017471444],[-0.0015715543],[-0.0013785135],[-0.0013404073],[-0.0012749063]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-4.502992],[-4.356874],[-0.0042948504],[-0.5028367],[0.051018726],[-0.15338463],[-0.1509676]],"dense_1_W":[[-1.6411753,-0.32697722,0.3120288,-0.39750454,-0.13167776,0.86057496,-0.6939451,0.6071072,0.14159355,-0.0063595567,0.25375837,0.44821614,-0.29423907,-0.028513383,0.3023456,0.1316031,0.036363505,-0.14323804],[-1.6328104,0.5942663,-0.30570295,-0.123248264,-0.034441516,-0.87338793,0.69189394,-0.6236746,-0.052855786,-0.13514496,-0.221532,0.0011332782,-0.20347112,0.4917645,-0.20858406,-0.14016572,-0.089411296,0.21504334],[-0.21007055,0.41557994,0.037863724,0.4959517,-0.45360732,0.7074271,-0.28405392,-0.111691974,0.18850206,0.015849397,-0.12006921,0.25533158,0.07951575,-0.8312149,0.03035362,-0.21261916,-0.1735698,0.18428572],[0.3310752,-1.6132231,0.045440618,-0.7522596,0.412424,0.76531404,0.04731471,0.6839483,-0.027021188,0.28972885,-0.1742223,0.42704728,0.58289766,-0.2732268,-0.12959486,-0.24415614,-0.101852916,0.3081016],[-0.011170702,-1.5589105,-3.495791,0.33255365,0.94771427,0.5074355,1.0023425,-0.1316612,-1.802023,-0.406795,1.0740488,-0.35055503,-0.06440544,0.37088916,0.3481748,-0.535885,0.018674394,0.108048186],[-0.03412157,0.6122013,0.07255059,0.06107659,-0.46524987,1.2860525,-0.8113254,0.04586139,0.033707816,-0.16047795,-0.015120353,0.37895563,0.42033595,-0.6925642,-0.38245085,-0.044110574,0.058740735,0.07787144],[-0.005288463,0.5904715,-0.10395662,0.34950814,0.29257905,1.0213965,-0.35862765,-0.72644925,0.097196706,-0.19612406,0.52340215,-0.017568931,0.2601534,-0.986547,0.5020255,0.2743259,0.23409082,-0.5168832]],"activation":"σ"},{"dense_2_W":[[-0.47496098,0.5138251,-0.7892653,-0.75560045,0.48735014,-0.53306115,0.16811597],[-0.3102205,1.9871738,-0.4366547,-0.41493884,0.11469561,-0.6691428,-0.44414428],[0.19802967,0.3727984,0.39753315,0.42768952,0.41358182,0.6435363,0.24335779],[-0.66378856,0.5819373,-0.051759593,-0.89287,0.096190274,-0.6734764,0.11215895],[0.3314184,-0.13227205,0.21310683,-0.12126428,-0.16501734,0.4487741,0.72218174],[-0.8345799,-0.4282664,-0.47909757,-0.4936077,-0.46425676,-0.7605428,0.2990966],[0.066827886,-0.5356042,0.10570844,0.5161373,0.062971145,-0.31447783,0.17028944],[-0.7473447,0.56870705,-0.67485994,-0.19401033,0.22181664,-0.14370336,-0.010975309],[0.24166872,-0.4976755,0.6000056,0.3400344,-0.38725704,-0.06810995,0.5731925],[-0.35525835,1.1168011,-0.22931977,0.10211827,0.0522062,-0.82619613,-0.69551224],[-0.9838338,1.1467155,-0.25217372,-0.08675337,0.07187647,-0.39047343,-0.51041925],[0.5434614,0.47051767,0.7331644,0.36079296,0.21453767,0.2669549,-0.24738385],[-1.5833589,0.7161828,-0.08223795,-0.0792626,0.7528849,-0.024336126,-0.06581944]],"activation":"σ","dense_2_b":[[0.22666334],[0.53868324],[-0.1864018],[0.20797202],[-0.102829635],[0.17410047],[-0.059639398],[0.046856824],[-0.15465018],[0.37563977],[0.42138037],[-0.040794667],[0.15081088]]},{"dense_3_W":[[0.059286855,-0.6201953,0.66562283,0.22414349,0.51240027,-0.13008,0.6259135,-0.5094883,0.33165294,-0.08362942,0.012212406,0.27687398,0.4015779],[-0.49880126,0.070532426,-0.43096852,0.37746346,0.10856794,0.5118211,0.2279282,0.27002206,-0.3318831,0.39096662,-0.351321,-0.09415256,0.6066714],[-0.62661433,-0.4761153,0.30911666,-0.43303257,0.7428668,-0.21072751,0.14316693,-0.31729576,0.503867,-0.40831396,-0.5834226,0.30889633,-0.3942228]],"activation":"identity","dense_3_b":[[0.008437807],[-0.045322042],[0.051086687]]},{"dense_4_W":[[0.20634736,-0.37115717,0.97134864]],"dense_4_b":[[0.040139616]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.01 56340-S2000 9129'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.01 56340-S2000 9129'.json deleted file mode 100755 index 3c127b3ecc..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019 b'xf1x00TM MDPS C 1.00 1.01 56340-S2000 9129'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.282052],[1.4976072],[0.5488163],[0.04954058],[1.4906036],[1.492054],[1.4935261],[1.4723681],[1.4461412],[1.4036433],[1.3585291],[0.049254097],[0.049325753],[0.049396638],[0.049512744],[0.04941646],[0.049044546],[0.04844633]],"model_test_loss":0.00627125846222043,"input_size":18,"current_date_and_time":"2023-08-07_14-36-50","input_mean":[[25.058535],[-0.022251762],[-0.0062643415],[-0.006741323],[-0.019891106],[-0.02031645],[-0.020919193],[-0.022687394],[-0.024389008],[-0.02746425],[-0.027944699],[-0.006677959],[-0.0066979136],[-0.006710192],[-0.0067440853],[-0.0067666965],[-0.006773558],[-0.006752982]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.17761493],[0.065649986],[-0.76249593],[-2.9280584],[2.8058326],[1.0595294],[0.66408336]],"dense_1_W":[[0.009145467,0.4170902,0.034774374,-0.0138638485,-0.39550337,1.045921,-0.68865854,0.19794099,-0.033008657,-0.044810697,0.031777132,0.11889747,-0.09361271,-0.012631721,-0.17615353,0.20466472,0.15644592,-0.16351333],[-0.0061399164,-1.4166915,-5.645784,0.073381424,0.5393407,0.32291308,0.31408218,0.2008273,-0.35585976,-0.43743655,0.7283993,-0.46206388,0.11366365,-0.11259773,0.06420009,0.11462869,0.35199496,-0.32473722],[0.75156087,-0.054094438,0.056640625,0.14823626,-0.48060635,-0.6280021,0.5193494,0.21376126,-0.3183618,0.16855966,-0.12529948,-0.49619958,-0.31324717,0.3645703,0.082277454,0.36189565,0.5037089,-0.29449514],[-0.7632688,-0.27169684,-0.23086967,-0.15549572,-0.079988874,-0.84466547,0.5305665,-0.14300905,-0.6319775,-0.18426856,0.20290938,-0.075952776,-0.1215382,0.9547558,-0.08411024,-0.18286705,0.14476883,-0.06562494],[0.7433322,-0.45799735,-0.22533219,-0.16057462,-0.43227366,-0.50694495,0.7030353,-0.27264476,-0.36092183,-0.18616752,0.113610044,-0.19430344,0.013998261,0.79424304,0.10917846,-0.07473551,-0.054330464,-0.032398082],[-0.0100051705,0.2767743,0.012484329,0.14437622,-0.21558216,0.60862535,-0.45100874,0.0608264,-0.20519726,0.11275251,0.0047225803,0.16176194,0.4537485,-0.5460852,-0.45898968,0.17339261,-0.0010471605,0.0726244],[-0.7537442,-0.23575833,0.058653012,-0.1419492,0.1560171,-0.88010234,0.43974218,-0.1777623,0.07786165,-0.18940662,0.11003291,-0.7475638,-0.46154422,0.7977223,0.62764406,0.48734587,-0.122180894,-0.07988648]],"activation":"σ"},{"dense_2_W":[[-0.44969195,-0.47718954,0.44621757,-0.10789645,0.611765,-0.18588941,0.012329608],[0.13036671,-0.5190893,-0.45879737,-0.15106045,-0.3414679,0.8747279,-0.12338378],[0.382678,0.49006438,-0.55374706,-0.7979588,-0.66582894,0.49023482,-0.22071177],[-0.82273644,0.6556447,0.6050713,-0.14068466,1.266661,-0.21573777,-0.105440065],[1.0855136,-0.30474165,-0.08955326,-0.34984973,-0.12816525,0.5724931,-0.68358016],[-1.020146,-0.46681815,0.47050923,0.23170453,0.49748507,-0.21584909,0.50045234],[-0.51235473,-0.16342548,-0.10362162,0.7775686,0.25859034,-0.5426786,0.15350342],[-0.7412454,-0.19349915,0.51770556,0.89931875,0.44185257,-1.0582427,-0.053990576],[1.1346184,-0.40109345,-0.22971821,-0.6369844,-0.07736686,0.45002407,-0.34542826],[0.8599848,-0.50594753,-0.01019188,-0.6136041,-0.44588706,0.10080783,0.19961627],[-0.74791193,0.3330768,-0.34094897,1.0123053,-0.008348638,-0.9700476,0.23540768],[-0.2771327,-0.008559937,0.33475313,0.34185767,0.7079121,-0.68679994,0.523643],[0.55554783,-0.041663673,-0.45565832,-0.08963832,-1.0109894,0.22129427,-0.42119744]],"activation":"σ","dense_2_b":[[-0.2371153],[0.11922548],[-0.030385548],[-0.0757551],[0.15123996],[-0.11702709],[-0.081945956],[-0.14611888],[0.25165284],[-0.0024621708],[-0.15761453],[-0.23728251],[-0.10741819]]},{"dense_3_W":[[-0.22576405,-0.19548972,-0.60756344,0.12658192,0.19608,-0.4017061,0.35516047,0.015072161,0.42969325,0.09205027,0.6273664,-0.4431949,-0.40578642],[0.035641454,-0.60118145,-0.11233975,0.5058922,-0.47696126,0.49505487,0.44402495,0.28497314,-0.49870777,-0.109422185,0.32074592,0.6422087,-0.25553414],[0.5741452,0.13303332,-0.6632543,-0.23719987,-0.19621162,-0.22117068,0.102075905,0.15589632,-0.5905995,-0.64983845,0.25684682,0.6521155,0.109088175]],"activation":"identity","dense_3_b":[[-0.019887898],[-0.09508023],[-0.051447187]]},{"dense_4_W":[[-0.08363187,-1.1579778,-0.26778743]],"dense_4_b":[[0.08655493]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022 b'xf1x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022 b'xf1x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19'.json deleted file mode 100755 index 616274010e..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022 b'xf1x00TM MDPS C 1.00 1.02 56370-S2AA0 0B19'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.993529],[1.324396],[0.5305161],[0.04294904],[1.3205608],[1.3210983],[1.3210579],[1.2954506],[1.2668177],[1.222909],[1.1779213],[0.04279379],[0.04282814],[0.04286333],[0.042902395],[0.042827405],[0.042586636],[0.042191453]],"model_test_loss":0.006565318908542395,"input_size":18,"current_date_and_time":"2023-08-07_15-28-26","input_mean":[[22.832775],[-0.040264394],[-0.02767458],[-0.003989959],[-0.03488428],[-0.03718118],[-0.03951456],[-0.05100156],[-0.06057131],[-0.07277594],[-0.083841816],[-0.0039337794],[-0.003943521],[-0.00395225],[-0.004023454],[-0.0040841275],[-0.0041823583],[-0.0042870827]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.18876944],[1.3463621],[-1.908932],[0.94169223],[-2.0187588],[0.0035511698],[0.0053254846]],"dense_1_W":[[0.005867352,1.2254535,3.4375358,0.068283305,0.16577429,-0.009294751,-0.5739759,0.19231455,0.27828252,-0.1432012,-0.838622,0.21616323,-0.06911776,-0.2046535,-0.27959976,0.06780521,0.39013436,-0.15592383],[1.3789212,-0.19859079,0.14766572,0.47943616,0.29903832,-0.6807818,1.1864055,-0.063221924,0.0021910756,0.15888207,0.3227435,-0.102154195,0.05816301,0.067887574,-0.14981405,-0.23042272,0.024423974,-0.20121309],[-0.6294663,0.81912273,0.117754824,0.045635737,-0.30043265,0.41747543,-0.72729063,0.30596933,0.083178654,-0.009687303,0.18535374,0.15427576,0.048291914,-0.27375552,-0.06383911,0.36632884,0.025411423,-0.36048925],[1.5819824,-0.44059455,-0.19170646,-0.11758157,-0.6440937,0.96508884,-0.54323167,-0.35875118,0.20947236,-0.018358774,-0.49196693,-0.30316466,0.13093069,-0.11939344,0.26340368,0.10947761,-0.3237495,0.4436966],[-0.8038508,-0.9236595,-0.12660962,0.053774275,0.24433418,-0.726227,1.2170812,-0.3135991,-0.23039672,0.09241596,-0.22223517,-0.362112,0.26941076,0.17195722,-0.3402102,-0.08320549,0.06449958,0.28475815],[-0.0011107235,-0.038697846,0.0022872635,-0.28063372,-0.14913365,1.2446141,-0.6184191,0.11545028,-0.017611,0.13889763,-0.023370638,0.33740774,0.31302363,-0.35052314,-0.42641684,-0.2141415,-0.34904203,0.42076],[-0.005175982,-0.7099676,0.00016399156,0.03889922,-0.30047348,-0.9106055,0.5045013,0.35966375,-0.023503177,-0.0043678866,-0.19590726,-0.6871834,0.24169926,0.17034449,0.21276642,0.10462949,-0.37484288,0.20454486]],"activation":"σ"},{"dense_2_W":[[0.104682855,-0.50470614,0.35854033,-0.035443306,-0.37905973,-0.27697846,-0.9634923],[0.112081155,-0.7351773,0.41254714,0.7830785,-0.38910425,0.9948105,-0.3034996],[-0.3261952,0.676342,-0.8663035,0.049848557,0.327171,-0.3208539,0.79908615],[-0.15818742,0.07726966,0.43970603,0.24589102,-0.50519943,-0.37369853,-0.4947362],[0.06886326,-0.4172607,0.28755546,-0.41808438,-0.52109635,-0.42815572,-0.263946],[0.051430058,-0.28650117,-0.009554365,-0.07774851,0.7187316,-1.0449941,0.017990898],[-0.08103111,0.17932983,-0.5922217,-0.5895948,0.3433449,-0.3952535,0.07908759],[-0.30518368,0.87019897,-0.8338993,0.51584834,0.7291329,-0.6600101,0.73442346],[0.46777672,0.60007197,0.4286051,0.8649935,-1.1103383,0.74301636,-0.80451095],[0.08020403,-0.6593858,0.086899064,0.23602426,-0.012647624,0.6520031,-0.9400746],[-0.35595152,0.041667316,0.3093184,0.03735144,-0.7210566,0.5299639,-0.15386833],[0.09228896,-0.71585226,0.30710077,0.2406018,-0.47016156,-0.11183533,-0.27596667],[-0.612182,-0.2192639,-0.19045848,-0.06639905,0.1694014,-0.33918324,-0.1311936]],"activation":"σ","dense_2_b":[[-0.21769845],[-0.07666798],[0.1883953],[-0.15336362],[-0.39611495],[-0.028968781],[-0.30332094],[0.133016],[0.062327497],[-0.11558597],[-0.038368657],[-0.13163656],[-0.23315099]]},{"dense_3_W":[[-0.20311363,-0.5751432,-0.09544995,0.40782174,-0.3749152,0.42719337,-0.27624348,0.23038137,-0.10259029,0.42679816,0.14456484,-0.28356594,0.40488628],[0.101418085,-0.10259608,0.37198663,0.20094174,-0.16163434,0.11256627,0.0009847895,0.36355582,-0.68457043,0.038573015,-0.30619755,-0.40124977,0.18100727],[-0.26906586,-0.5600097,0.5290126,-0.36010587,0.13541447,0.42952237,0.15362886,0.7573779,-0.41288292,-0.43268642,-0.23467787,0.1252901,-0.15268406]],"activation":"identity","dense_3_b":[[-0.04268578],[0.0621331],[0.05889129]]},{"dense_4_W":[[-0.026682906,-1.0218076,-1.0972601]],"dense_4_b":[[-0.0560793]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102'.json deleted file mode 100755 index 2c61a6ddc0..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLAC0 4TSHC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.194418],[0.9826876],[0.43571737],[0.03203097],[0.98284227],[0.9834058],[0.9829836],[0.9639176],[0.94775534],[0.92251784],[0.8937146],[0.03200366],[0.03202884],[0.032050643],[0.032007705],[0.031979978],[0.031913992],[0.031803887]],"model_test_loss":0.004605790600180626,"input_size":18,"current_date_and_time":"2023-08-07_16-17-55","input_mean":[[21.787415],[-0.073023595],[0.006111772],[-0.0030836551],[-0.07544397],[-0.07518822],[-0.074919075],[-0.072652444],[-0.07070591],[-0.06814254],[-0.06605076],[-0.0029780078],[-0.0030136248],[-0.0030446842],[-0.0032140582],[-0.0032444522],[-0.0033729817],[-0.0034472218]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.021883458],[-0.013235099],[-0.121804215],[-0.25270373],[0.013701096],[1.7847886],[1.8580865]],"dense_1_W":[[0.015979825,0.025676368,0.82048047,-0.20396332,-0.06994716,-0.19865473,0.85325474,-0.46978325,-0.24091806,0.10684887,0.10043876,-0.08637539,0.26329783,0.46833506,-0.48420766,-0.046872795,-0.19976763,0.2933011],[-0.010659484,-0.5590501,-1.8482552,0.18219163,-0.29451025,-0.039495107,0.69195104,0.3583238,-0.246975,-0.3466151,0.39438456,-0.101077646,-0.20400386,0.21190208,-0.20427756,0.02704431,0.14872628,-0.09532689],[0.28008336,-0.19451748,0.002395767,0.07651338,-0.013720813,-0.7281727,0.46541923,0.05587276,-0.076292664,0.27889255,-0.22249366,-0.20972478,-0.32013837,0.35491177,0.019567257,-0.05948678,0.061387423,0.12222018],[0.38760716,0.28468573,-0.0046121255,-0.503213,0.15541966,0.010528314,-0.08428991,0.20208262,-0.106319115,-0.12040755,0.10501226,0.4507385,0.60220087,-0.4585774,-0.02489347,0.114339024,-0.33559904,0.10983539],[0.0009784829,0.35729215,-0.003829106,-0.0028381112,-0.48749572,0.8682397,-0.29993644,-0.08423156,0.010641775,0.07446828,-0.037331752,0.27161676,-0.1789018,-0.30909738,-0.3551168,-0.248932,0.2984701,0.13843094],[0.44399467,-0.5334002,-0.23803857,-0.21615528,-0.016919455,-0.5706182,0.545457,0.27349538,-0.114982955,-0.39205012,0.124447465,-0.10823347,0.1663843,0.2260901,-0.15672842,0.13161573,-0.02115449,0.0032338887],[0.5019759,0.68048036,0.25314942,0.13284066,-0.33117083,0.582654,-0.24854451,-0.47353426,0.40295416,0.24269429,-0.14332053,0.23747285,-0.33417442,-0.106693946,0.0037535615,0.04599831,0.037733346,-0.04265533]],"activation":"σ"},{"dense_2_W":[[0.08401161,-0.2599535,-0.609856,0.7646542,0.67341596,-0.26291236,0.76118547],[-0.3651008,-0.20817277,0.31787935,-0.43461692,-0.29770243,0.018088236,-0.46393844],[0.2615463,0.48856091,-0.40368366,-0.18834044,-0.08188224,0.2784943,-1.0847317],[-0.52402174,-0.20936744,-0.77195823,-0.22592704,0.69131356,-0.7199108,-0.06898959],[0.080265164,-0.16496317,-0.8305106,0.6760351,0.37774935,-0.30932015,0.4807624],[0.37443948,-0.778584,-0.66466296,-0.3686006,-0.43090945,-0.57971597,-0.24787214],[0.07640942,0.3376665,0.6566895,0.113762006,-0.49356726,0.7215417,-0.42951873],[0.50611526,-0.21789505,0.79877114,-0.11904481,-0.68082315,0.22485676,-0.97027636],[-0.26019892,-0.22099318,-0.19246079,0.57908934,0.6265812,-0.54631793,0.5911588],[0.117363736,-0.5874855,-0.49562076,0.7931459,0.28048941,-0.39128372,0.27204272],[-0.45832366,0.06207395,-0.73029464,0.796244,0.60792464,-0.3163733,0.099765696],[0.120567635,-0.30641696,-0.59669787,-0.55059415,0.08865131,-0.259314,-0.06436874],[0.6329438,0.59759134,0.57218724,-0.645048,-0.735474,0.9010533,0.20121096]],"activation":"σ","dense_2_b":[[0.030452332],[-0.09173468],[-0.22073863],[-0.046627972],[-0.05838497],[-0.0528763],[-0.09991468],[-0.034997243],[-0.055857778],[0.04780818],[-0.05873308],[-0.317891],[-0.035200205]]},{"dense_3_W":[[0.3929027,-0.3861305,-0.49493206,-0.0818116,0.027093373,-0.31794766,-0.57132995,-0.5508263,0.24935243,0.44998237,0.27979627,-0.02445104,-0.590858],[0.5505083,0.5507326,0.19556087,0.2572581,0.4237801,0.65517,0.028538687,-0.09970234,0.18431105,-0.009243993,-0.021522932,0.17175677,-0.37279418],[0.00045096828,-0.19784781,0.35283023,0.6747326,-0.057934422,0.43838486,-0.45512754,-0.47786975,-0.2604245,0.16420609,0.05705802,-0.25166398,-0.37800297]],"activation":"identity","dense_3_b":[[0.058641378],[0.038829286],[0.08638757]]},{"dense_4_W":[[1.2422407,0.79126894,0.21478729]],"dense_4_b":[[0.05097585]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100'.json deleted file mode 100755 index 7096b57212..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-GA000 4TSHA100'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.052273],[0.9509479],[0.50553817],[0.038164727],[0.9445496],[0.94397974],[0.94506735],[0.93094087],[0.91978514],[0.90017253],[0.8804518],[0.037949175],[0.037987206],[0.038005527],[0.037829578],[0.03761687],[0.037189245],[0.036789745]],"model_test_loss":0.004591483157128096,"input_size":18,"current_date_and_time":"2023-08-07_16-42-35","input_mean":[[23.199976],[0.06977518],[0.010112249],[0.011418438],[0.06521592],[0.06679082],[0.06787061],[0.07323156],[0.07372562],[0.07214795],[0.07004894],[0.011164797],[0.011199542],[0.011221814],[0.011139646],[0.011041907],[0.010719572],[0.010505906]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.014942537],[-4.3474574],[-0.08941054],[-4.3885407],[-0.014533082],[-0.040196232],[0.061592374]],"dense_1_W":[[-0.012185595,0.2322522,0.7511205,0.02690325,0.5641042,0.42065173,-0.8066829,0.18944919,0.39064535,-0.5669989,-0.14261945,0.34274545,-0.20055962,-0.6011869,-0.12676005,0.13741869,0.45624214,-0.2540088],[-1.3546237,0.8447106,0.35209763,0.076260105,-1.0732373,0.3980371,-0.39189407,1.4404069,0.225998,0.47837642,-0.25626668,0.47501436,-0.20985436,-0.2627164,-0.21115017,-0.010310166,-0.54525554,0.4810268],[0.002832261,-1.1939845,-3.5876055,0.5727716,0.8229184,0.06148804,0.54211617,0.0322967,-0.6423043,-0.55174315,0.664836,-0.16645195,-0.5878055,-0.32204002,0.13268834,0.2666557,0.5713847,-0.38673636],[-1.3233963,-0.87649137,-0.3446561,0.14505188,0.6079438,-0.34363598,0.624898,-0.82965463,-0.60310423,-0.3681155,0.16082169,0.0010988517,-0.4206278,0.33600268,0.02962365,0.1367739,0.277682,-0.30213332],[0.013596902,-0.13552241,-0.70311356,-0.13047394,-0.32529,0.5773636,-1.1701663,0.24257344,0.43782198,0.043168012,0.08643236,0.48032,0.23322079,-0.021323098,-0.31740412,-0.11516121,-0.24237125,0.31669086],[0.001166192,-0.40128833,0.0049709324,0.111636855,0.27789602,-0.79010975,0.42289734,0.16445734,0.12562138,-0.34984663,0.12859115,-0.35596535,-0.0395504,-0.019919783,-0.21450609,-0.14650743,0.23265977,0.41473433],[0.0023671926,-0.6460285,-0.0019327962,0.14094958,0.38341612,-0.9574827,-0.101965494,0.004554995,0.46401522,-0.12909779,-0.1426274,-0.29289252,0.08252197,0.46871328,0.22656342,0.13870023,-0.055463392,-0.2501583]],"activation":"σ"},{"dense_2_W":[[-0.62714016,-0.42675447,0.39623365,0.09701159,-0.5383957,0.45013547,0.6001207],[-0.35508782,-0.57408017,-0.12564163,0.28653708,-0.08157015,0.20559573,0.46634027],[0.5093158,0.36876306,-0.4645391,-0.65979177,0.57504994,-0.35079157,-0.17476],[-0.31621355,-0.29714108,-0.34154972,-0.78180116,-0.008518251,-0.4106797,-0.19771425],[-0.43568668,-0.17445277,0.23282811,-0.3699338,0.16136363,0.05052372,-0.09912311],[-0.46512806,-0.5448078,-0.08042258,0.6210385,-0.16905335,0.28547442,0.5111774],[-0.034349065,0.5364692,-0.51728934,-0.16454658,-0.22226335,-0.42052928,-0.20821048],[0.33714008,-0.4330567,0.37451595,0.2814601,-0.47018304,-0.39796677,-0.55231714],[0.57910985,-0.024047505,0.30089426,-0.6221561,0.50119555,-0.50120574,-0.7213545],[-0.40165135,0.20899656,-0.2954376,-0.14917205,-0.59254116,0.37713796,0.22864541],[0.6255446,-0.06200693,-0.4204777,-0.036136795,0.446564,-0.2950839,-0.64832413],[-0.26900464,0.49159622,0.3034731,-0.13085237,0.56453574,-0.8307436,-0.28495753],[-0.47413096,-0.7120706,-0.035541266,0.24300101,-0.6801091,0.27434683,-0.107843675]],"activation":"σ","dense_2_b":[[-0.09530544],[-0.091849595],[0.10365482],[-0.28563413],[-0.27218583],[-0.11129274],[0.004807437],[-0.06996],[0.050393272],[-0.10061962],[0.04376929],[-0.04139788],[-0.13395813]]},{"dense_3_W":[[-0.66973096,-0.48279104,0.7676326,-0.5096833,0.2064793,-0.38637576,0.35450128,0.07051719,0.5298366,-0.20001142,0.28865328,-0.04322722,-0.4298923],[0.3608688,-0.3860877,0.34115362,0.10120958,-0.30185267,0.09988014,-0.46597403,0.5618963,-0.13389808,-0.2762836,0.5472369,0.30736694,-0.16745393],[-0.459392,0.11412182,-0.040371146,0.6745572,-0.27183312,-0.536198,-0.15377107,-0.07133568,0.04935285,-0.06970548,0.27231002,0.4255971,0.2895038]],"activation":"identity","dense_3_b":[[0.044112355],[-0.017487336],[0.043834195]]},{"dense_4_W":[[1.0927324,0.054080144,0.7976937]],"dense_4_b":[[0.042528085]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102'.json deleted file mode 100755 index 039dbb74b4..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022 b'xf1x00TM MDPS C 1.00 1.02 56310-CLEC0 4TSHC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9339604],[1.088105],[0.44446564],[0.040635813],[1.0915902],[1.0908207],[1.0892842],[1.0640342],[1.0442107],[1.0169972],[0.9836625],[0.040394578],[0.04044262],[0.040480178],[0.040640704],[0.040678967],[0.040454783],[0.040132876]],"model_test_loss":0.012677030637860298,"input_size":18,"current_date_and_time":"2023-08-07_17-34-14","input_mean":[[22.346836],[-0.1010392],[0.011439833],[-0.024613421],[-0.104070425],[-0.103574194],[-0.10293765],[-0.095743805],[-0.08788937],[-0.07853373],[-0.06978028],[-0.024727972],[-0.02470151],[-0.02467759],[-0.024601528],[-0.024534974],[-0.024629418],[-0.024778875]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.15558718],[-2.6034374],[-0.04039103],[0.65522605],[1.2802107],[-0.27219942],[-2.634381]],"dense_1_W":[[-0.24201536,0.7082375,0.0028008588,-0.027780006,-0.17135863,0.8042699,-0.29119372,-0.007927601,0.47618863,-0.03486508,-0.16500926,0.45117432,0.007103674,-0.5084788,0.060515866,-0.011655033,-0.18416026,0.17665891],[-0.4738057,-1.3893577,-0.26687565,0.5591557,0.19673826,-1.0583004,0.4100114,0.08631018,-0.27167842,-0.36606842,0.17948642,-0.91138256,0.396046,0.4691029,0.03294264,-0.1527472,-0.1440006,-0.040798534],[-0.062322266,0.8630222,3.1276238,0.31263065,-1.0991832,-0.350469,-0.7729707,0.5405366,1.1623893,0.3297452,-0.467351,0.8092153,0.47536352,-0.62649566,-0.13063848,0.078494415,-0.9319446,-0.035552464],[2.002557,-0.40489927,-0.013253979,0.0036408182,-0.96465665,0.19661005,-0.953392,-0.20606351,-0.26921293,0.00091835565,0.024142867,0.30179256,-0.05378692,-0.3731178,0.29126972,0.056546733,-0.13077201,0.019902507],[0.016891545,-0.07916437,0.11697357,-0.5920895,0.8242633,-0.11014468,0.3030195,0.35970256,0.08895364,-0.30832535,0.84346753,-0.8849758,-0.47036183,0.11911124,-0.22588879,0.065679416,0.021028057,-0.427552],[9.724902e-5,-0.38385,-0.020528087,0.05751557,-0.14688933,-0.86524874,0.8712383,0.03841566,0.18008858,0.11291066,-0.35409862,-0.13303213,-0.1636967,0.5216691,0.06455103,0.35800162,-0.08108982,-0.05743626],[-0.4588684,0.83262295,0.25882557,-0.19348866,-0.21520121,0.85895246,0.24441022,0.04129096,0.09734719,0.33709678,-0.10813452,0.626401,-0.23454317,-0.4344429,-0.44665545,0.30053115,0.17539406,0.007217913]],"activation":"σ"},{"dense_2_W":[[-0.651883,-0.28622374,0.12934318,-0.29924047,0.45619386,0.49076936,-0.5204953],[0.19332084,-0.8814819,0.12185404,0.1112917,0.09789456,-0.32125413,0.5419122],[-0.0070752506,0.30487537,0.22090623,0.374676,0.5418867,0.1608909,0.16253495],[1.6104504,-0.8317929,-0.48558232,0.23532712,-0.2672344,-1.3590785,1.5980096],[0.1554723,-0.67611736,-0.075388476,0.024493428,-0.4251306,-0.6432536,0.05229573],[-0.44482633,-0.36988914,-0.8266434,-0.77991384,-0.020200279,0.08657742,0.4415185],[0.37289235,-1.3610709,1.2108856,1.1463528,-0.08294851,-0.36348182,0.015509408],[-0.26891112,-0.4422061,0.04140005,-0.25809646,-0.45758307,0.12543325,-0.11151142],[0.6491537,-0.6115983,0.12226665,-0.022036532,0.25215194,-0.39254242,-0.08420935],[0.41343462,0.040416438,0.5110888,-0.30294675,-0.24655536,-0.94380873,0.4448432],[-0.21065868,0.49556023,-0.3594535,-0.1782758,-0.1000126,0.6914605,-0.44446382],[0.50264686,-0.51379687,0.38724154,0.19442251,0.023962934,-0.3308979,0.17989966],[-0.08920153,0.04748019,-0.23014763,0.21383081,-0.33842874,-0.65826106,-0.1681412]],"activation":"σ","dense_2_b":[[0.011876502],[-0.36479667],[0.017360244],[-0.07617602],[-0.23157506],[-0.28419593],[0.06942652],[0.011033443],[-0.086510606],[-0.045363814],[0.03267394],[-0.13571551],[-0.264156]]},{"dense_3_W":[[-0.6548141,-0.13956049,-0.48768273,0.120333016,-0.28902444,0.21501225,0.307953,-0.107009396,0.440212,0.4713256,-0.055264547,-0.3514998,-0.5159563],[-0.096859366,0.5156044,-0.23406532,0.55331874,-0.026274543,-0.5353379,0.25472736,-0.5028626,0.25127223,0.3485652,-0.64658546,0.40520468,0.34961805],[0.60555744,0.38062447,0.51950586,-0.049985483,-0.54793733,-0.44031206,-0.013909685,-0.4211523,-0.22971645,-0.38632122,0.6218737,-0.41705465,-0.09672569]],"activation":"identity","dense_3_b":[[-0.02192258],[-0.031370267],[0.023667987]]},{"dense_4_W":[[0.74219704,1.1328688,-0.6478822]],"dense_4_b":[[-0.026964737]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0000 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0000 4DNAC101'.json deleted file mode 100755 index 49384985ac..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0000 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.0880184],[0.927232],[0.38201457],[0.029326165],[0.9297298],[0.9282585],[0.926674],[0.9185298],[0.9110499],[0.9009496],[0.8885786],[0.02925959],[0.029274147],[0.029276866],[0.029164143],[0.028929831],[0.028371913],[0.027726393]],"model_test_loss":0.002121754689142108,"input_size":18,"current_date_and_time":"2023-08-07_18-58-26","input_mean":[[22.443861],[-0.06408811],[0.0033772418],[-0.0077469447],[-0.063098],[-0.0624671],[-0.061826434],[-0.05872468],[-0.052127004],[-0.04868136],[-0.043194663],[-0.007867037],[-0.0077954014],[-0.0077240258],[-0.0075072567],[-0.0073709814],[-0.007499314],[-0.0075947903]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.4392896],[0.11256368],[-0.009349937],[0.017267969],[0.07836847],[-0.49510518],[-0.36707103]],"dense_1_W":[[-0.0035144198,-0.07837074,-0.10444379,-0.21379957,-0.055707484,-0.43247733,0.12956916,-0.16459478,-0.026531655,-0.41787723,0.11838695,-0.36631712,0.29493195,0.8054866,0.48842925,0.3487459,0.29926014,0.33285514],[-0.00566682,0.0685797,-0.0070852637,-0.1262075,-0.117236935,0.11295796,-0.070642754,0.23535657,-0.13772064,0.20243229,-0.08022183,-0.3007161,-0.27897793,-0.74277157,-0.1217799,0.18944399,0.512346,0.80977684],[-0.00033654989,-0.31247973,-1.0609967,-0.4622876,0.098224156,0.07347569,0.4536589,0.16399379,-0.21179616,-0.25765136,0.28651273,0.2288293,0.3252808,-0.009037016,0.08319518,-0.38650706,-0.22199428,0.3495078],[8.025195e-5,0.117466316,-0.0020013717,0.25343972,0.21027248,-0.3314746,-0.24337924,0.21665736,-0.124749966,-0.16508707,0.118159376,-0.6589648,-0.38464743,0.24033323,0.11305636,0.06770096,0.3398314,0.020196075],[-0.123161614,0.23502746,-1.6969047e-5,-0.08013821,-0.13597044,0.68115455,-0.29792637,-0.023697855,-0.14486383,-0.10938473,0.1794991,0.07350343,0.15798949,0.06415683,-0.18382339,-0.21429943,-0.013510968,0.160445],[-0.0044880393,0.19351251,-0.1222242,0.38997644,-0.82055694,0.039774433,-0.34056687,0.69073474,-0.21781223,-0.43224278,-0.09824878,0.6865208,-0.13685298,0.07766766,-0.13825902,0.3761925,0.53175914,0.50025547],[0.19364405,-0.07879009,-0.0004976161,-0.16666786,0.40081018,0.60932076,-0.4746135,-0.16062911,0.00033986976,-0.12215615,0.24129596,-0.051383093,-0.29511973,0.03366455,0.4457546,0.17353448,0.10611054,-0.27080864]],"activation":"σ"},{"dense_2_W":[[-0.21429534,-0.2805947,0.33813262,-0.55704015,0.19794577,-0.41809848,0.5465813],[0.05483169,-0.48598504,0.2133983,0.4682273,0.08959408,-0.68643206,0.14104469],[0.5768833,0.2345835,0.23833336,0.88208973,-0.7001157,-0.87939644,-0.5970078],[-0.50687236,0.34342203,-0.60396534,-0.39049196,0.1544499,0.37261438,0.6712155],[-0.2097123,-0.5347513,-0.26231483,-0.16484694,-0.0996075,0.47142714,0.6025729],[0.14433241,-0.26973325,-0.40456578,-0.22319494,-0.16914153,0.34973475,0.41994274],[-0.39278847,-0.26437518,0.014975275,-0.3900699,0.20229916,-0.47895268,0.3397611],[0.018268416,0.19815785,-0.16354918,-0.6932698,0.82313913,0.33753312,-0.23361456],[0.84115773,-0.4972589,0.04639677,0.57515514,-1.2003638,-0.4645931,-0.35091218],[0.2870165,0.29187405,0.13971819,0.32765952,-0.43575177,-0.54234403,-0.47328368],[-0.534798,0.1346562,-0.35825455,-0.4411009,0.7369132,-0.24896927,0.43602455],[0.60806775,-0.6560042,0.121712156,0.8236341,-1.3794309,-0.54273456,-0.23115636],[-0.36894193,0.43866634,-0.4424108,-0.3495697,0.2603339,-0.26079863,0.54851836]],"activation":"σ","dense_2_b":[[-0.17165633],[-0.1849741],[0.04078258],[-0.08273829],[-0.16197646],[-0.22186738],[-0.10296965],[-0.15492782],[0.10536137],[-0.21006389],[-0.0909507],[0.008903828],[-0.12633856]]},{"dense_3_W":[[0.12136265,-0.18142237,0.20568378,0.43467548,-0.3135675,-0.30494106,0.32837293,0.43891245,-0.10172039,-0.6920788,0.3248927,-0.36158195,-0.36961478],[0.20634529,0.016585633,0.615192,0.3980539,0.31894875,-0.22123288,-0.44111037,0.21111517,0.5416054,0.48227146,0.4775837,0.023265895,0.086540245],[0.097952254,0.069732554,-0.85863006,0.5982017,0.4785997,0.2211003,-0.16872703,0.26387373,-0.45675164,0.3492257,0.14213935,-0.22985671,0.5829968]],"activation":"identity","dense_3_b":[[-0.089413054],[0.038146988],[-0.09979728]]},{"dense_4_W":[[0.7397742,-0.18844637,1.2101274]],"dense_4_b":[[-0.09552154]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101'.json deleted file mode 100755 index 75ef8f9f84..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0010 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.206886],[1.4504983],[0.49971998],[0.04266468],[1.4383729],[1.442444],[1.4449018],[1.4304984],[1.408558],[1.374435],[1.3352983],[0.042570964],[0.04259354],[0.042611882],[0.04251703],[0.04239174],[0.042183105],[0.041899502]],"model_test_loss":0.010444642044603825,"input_size":18,"current_date_and_time":"2023-08-07_19-25-56","input_mean":[[22.475485],[0.031372134],[0.0032399746],[-0.008984418],[0.032596383],[0.032747533],[0.033002835],[0.034930702],[0.03454325],[0.032979634],[0.030567244],[-0.009006616],[-0.008997529],[-0.008991521],[-0.008974956],[-0.008960746],[-0.008996439],[-0.0090720635]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.4730613],[-1.0220556],[2.2321498],[-0.24373206],[-0.12732792],[-0.5460787],[0.106436335]],"dense_1_W":[[-0.41534066,-0.9714392,-0.31006238,0.09352594,0.055552863,-0.83239764,0.31457546,0.21544012,-0.02930472,-0.10614339,-0.15644209,-0.32349718,-0.2776175,0.4681082,-0.023063358,0.07786211,0.2524736,-0.23179433],[-0.95453423,-0.26022857,-0.8862801,0.13255504,-0.07940164,-0.13633952,0.97671944,-0.32103124,0.13677597,-0.54467875,0.006754226,-0.5190258,0.22493096,-0.069508426,0.35693893,0.23997544,-0.24516748,-8.168083e-5],[0.4379902,-0.5599902,-0.32294285,-0.11438441,-0.28119034,-0.41465545,-0.007964375,-0.23656115,0.24708937,-0.0064412868,-0.27999642,-0.06364177,-0.022107648,-0.14844713,0.67481005,-0.39441112,0.21968858,-0.11588854],[0.0060809795,-1.1198676,0.0067951665,0.40737534,-0.17178549,-0.29760578,0.22654669,-0.15745667,0.113858625,0.35876435,-0.29039302,-0.09667714,-0.28005886,0.4659065,-0.2083599,-0.044308778,0.10261238,-0.015207596],[1.192366,-0.13911475,-0.7602778,0.061394785,-0.33700565,0.43223011,-0.383315,0.21897188,0.0576574,-0.06383468,-0.40268126,0.25918442,-0.083131015,-0.057717066,-0.16279124,0.056148607,-0.22752735,0.26602584],[-0.70031285,0.80340934,0.86016697,-0.10652274,-0.49268568,-0.25453496,-0.77597094,0.038994193,0.80372953,0.4799013,-0.42903787,0.16632754,-0.05639839,0.06240709,0.04071726,-0.36329105,0.119140625,0.0075790263],[1.2511556,0.18218865,0.8153701,-0.17519355,0.03620571,0.020730898,0.62968934,-0.6549357,0.038980555,-0.24152188,0.6776999,-0.15306287,-0.034662757,0.29590893,-0.04357369,0.18099506,-0.09237122,-0.09097706]],"activation":"σ"},{"dense_2_W":[[-0.3733046,-0.63211983,-0.2867291,-0.62118083,-0.010183722,-0.8466765,0.16133504],[0.0067310715,0.09728172,-0.6812141,-0.9659649,0.40198094,0.19644472,-0.74384815],[0.9709826,0.20648259,0.1305725,0.3045001,-0.48293394,0.117387146,0.25224584],[1.4520717,0.2679463,-0.0059825173,0.42838717,-0.34279865,-1.3324488,-0.41395462],[-0.14703725,0.24708863,0.47823694,0.2118483,0.19143926,-0.33324513,-0.41627753],[0.63378096,0.0006939869,-0.2391469,1.0002756,-0.46094698,-0.0097055435,0.49494484],[0.1101795,0.34717083,0.48524472,0.53889567,-0.20231925,-0.6760102,0.3543506],[-0.61280346,-0.46988106,-0.82949644,-0.14417309,0.5123994,0.38542563,-0.31748974],[-0.14198948,-0.46256673,-0.24424392,-0.5878419,-0.6047017,-0.9315717,-0.25987655],[-0.20438918,-0.2538593,-1.2795161,-0.36110374,-0.18944141,0.4315354,-0.09864795],[0.35757583,0.24092562,-0.48579407,-0.2887947,-0.2939099,-0.08969654,-0.53155077],[-1.1322478,-0.42064786,0.14613308,-0.4441744,0.60612696,-0.1682891,-0.77085215],[-0.9423813,-0.71970075,-0.32939398,-0.046559554,0.1559522,0.72302336,-0.31480452]],"activation":"σ","dense_2_b":[[-0.0395953],[0.10148138],[-0.08946762],[-0.5085817],[-0.16269651],[-0.09828724],[-0.14257945],[0.028001558],[-0.25607547],[0.19008303],[-0.15752983],[-0.08156744],[0.2400192]]},{"dense_3_W":[[-0.6305707,-0.7183922,0.61189455,-0.12082674,0.584848,0.7042283,0.2124863,-0.44369617,0.06019076,-0.84690446,-0.1584007,-0.1594603,-0.6551266],[-0.46845788,-0.041823298,0.21797846,-0.23213589,-0.018164458,0.39548802,0.30017138,-0.03640287,-0.08625531,-0.6911282,0.25928518,-0.51322585,0.30503047],[-0.070132144,0.36179328,-0.12638825,-0.6702514,0.2901435,-0.48632953,-0.3823228,0.6769935,0.23988372,0.72708833,-0.030890048,-0.0013352007,0.744018]],"activation":"identity","dense_3_b":[[0.030665295],[0.012413447],[-0.042725306]]},{"dense_4_W":[[-0.6892979,-0.21168873,0.8236525]],"dense_4_b":[[-0.033550464]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101'.json deleted file mode 100755 index 889660b7e2..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.9665575],[1.5094953],[0.52320474],[0.049412034],[1.494938],[1.5003909],[1.5036423],[1.4904568],[1.4657476],[1.4215478],[1.3661709],[0.049073346],[0.04916127],[0.049235035],[0.049330566],[0.049299713],[0.049100358],[0.048681706]],"model_test_loss":0.006334397010505199,"input_size":18,"current_date_and_time":"2023-08-07_20-16-55","input_mean":[[23.208042],[0.017637342],[0.0033097109],[-0.0011208885],[0.016748862],[0.016963536],[0.017422808],[0.018023973],[0.019261051],[0.018516017],[0.017028408],[-0.0012430567],[-0.00119908],[-0.001152659],[-0.0010296609],[-0.0009178911],[-0.00079258456],[-0.00066169875]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.9270706],[0.34167355],[-0.01630501],[3.9094112],[-0.043808307],[0.15332954],[0.118518315]],"dense_1_W":[[-1.5419726,0.58544344,0.56862235,-0.06356117,0.07506152,0.28493872,-0.35853422,0.20940292,0.24808577,0.45340854,-0.049729943,-0.34037575,0.31803313,0.018770482,-0.05861212,0.21162248,-0.21842924,0.08095126],[-0.07264593,-0.5357274,-0.024528537,0.15763216,0.3570794,-0.42941192,0.094519556,-0.16744949,0.18548526,0.052800182,-0.063974306,-0.5917518,0.29506087,0.2680911,-0.042359374,-0.037600614,-0.09749487,0.073244646],[-0.0029357334,0.72618747,-0.015540882,-0.093255214,0.22835523,0.555266,-0.62294084,-0.17355366,0.3260155,0.08499513,-0.09322718,0.27955085,-0.20150794,-0.20985933,-0.066402666,-0.24783993,-0.23513341,0.08126326],[1.5574979,0.559662,0.567851,0.1754574,0.23001745,0.08429833,-0.1186271,0.104694836,-0.034708384,0.5989565,0.003940667,0.0305492,-0.13524628,-0.33834115,0.23645407,-0.13648601,0.36581174,-0.23015225],[0.01866292,0.70351815,2.7991784,0.10008903,0.32329226,0.06749305,-0.7636863,-0.22283834,0.55308366,0.393383,-0.91913027,0.05840779,0.3406047,-0.19909629,-0.42205387,-0.11921279,0.065681584,0.23244768],[-0.11102194,0.20182216,0.020422867,-0.07504458,-0.041374493,0.92653614,-0.7219375,0.13102369,0.15029763,-0.3139946,0.18343666,0.3855709,0.13207433,-0.15633012,-0.43713525,0.017802745,0.13749008,0.023212397],[-0.12214576,0.27012697,-0.20684451,0.30103195,0.1707631,-0.061825205,-0.5469716,0.43340564,-0.0114306,-0.054020558,-0.16695587,0.03798708,-0.08483028,-0.18931572,0.10700518,-0.017429946,-0.3692487,0.19230193]],"activation":"σ"},{"dense_2_W":[[-0.28481036,0.4442005,-0.49662253,-0.30369344,0.28666368,-0.5901366,-0.19034614],[-0.39463997,0.82266545,-0.47083145,0.26275617,-0.55930537,0.09152094,0.12053862],[-0.065527946,0.7516073,-0.38549796,-0.4017811,-0.5203226,-0.34265035,0.35704702],[0.49352384,-0.07352777,0.31377402,-0.31515568,0.24645923,-0.40181553,0.16380012],[-0.44656533,0.9368167,0.067596,-0.3864591,-0.21814522,-0.50566894,-0.037946723],[-0.11529442,-0.77994573,0.49268404,0.60564643,0.42883676,0.14445429,0.1348402],[0.2191809,-0.33139595,0.16480243,0.16290003,-0.0043159393,0.6970341,-0.041437156],[-0.46837336,-0.39128634,-0.3864894,-0.42419514,0.5158304,0.16268568,0.089716256],[0.33990654,-0.64127713,0.6676083,-0.027778113,-0.36237058,0.54869413,0.3664469],[0.56407857,0.14337154,-0.07523904,-0.20489646,0.29481626,0.22405949,-0.68056136],[-0.039734222,0.16601059,-0.36197644,-0.5222118,-0.7296214,0.16421038,-0.07977159],[-0.1643846,0.2016056,0.0016275152,-0.34612948,-0.37732452,-0.4296534,0.097400256],[-0.32195345,0.8429351,-0.26391914,-0.64564407,0.23150569,-0.26123956,-0.60648614]],"activation":"σ","dense_2_b":[[0.10372978],[0.12321004],[0.13260162],[-0.16394557],[0.07401815],[-0.18640429],[-0.14209749],[-0.15091346],[-0.1005035],[-0.18927059],[-0.04283729],[-0.29649624],[0.123969376]]},{"dense_3_W":[[0.19306692,0.2528086,-0.3471299,0.34726095,-0.6172253,0.20776936,0.25171283,-0.26050565,0.62590677,-0.57339996,0.2380261,-0.6438946,-0.26486552],[0.6904486,0.42464823,-0.35924688,0.54782605,0.543181,-0.4043161,0.009881902,-0.16082425,-0.42172116,-0.22864279,0.05615898,-0.28659266,-0.4109365],[-0.29332277,-0.5604171,-0.74596137,0.29303262,-0.14240001,0.4824831,0.46960396,0.37756348,0.60751295,0.49847186,-0.4308299,0.2783596,-0.70612234]],"activation":"identity","dense_3_b":[[-0.056833137],[0.060321722],[-0.06470401]]},{"dense_4_W":[[0.8418126,-0.58512366,1.0991992]],"dense_4_b":[[-0.059645038]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102'.json deleted file mode 100755 index e5e8da5f6b..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310-L0210 4DNAC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.209062],[1.0191541],[0.56490785],[0.03716055],[1.0188767],[1.0189412],[1.0184771],[1.020577],[1.0258486],[1.0280116],[1.0317844],[0.037011214],[0.037051532],[0.03710102],[0.03726322],[0.03710542],[0.036862206],[0.036776513]],"model_test_loss":0.002482755808159709,"input_size":18,"current_date_and_time":"2023-08-07_20-41-25","input_mean":[[26.846655],[-0.005333997],[-0.006017142],[-0.010085426],[-0.0068516037],[-0.006621865],[-0.007106698],[-0.0063117202],[-0.001445884],[0.0037559327],[0.00702609],[-0.010317291],[-0.010258594],[-0.010206334],[-0.010051272],[-0.009953821],[-0.01002816],[-0.010258082]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.04493686],[1.2359415],[-0.16813134],[0.30498078],[-0.004396829],[-0.11936104],[-0.10290137]],"dense_1_W":[[0.028586365,0.6713196,0.037628382,0.4525395,-0.4088543,-0.52644724,0.25289974,-0.106175065,-0.05286671,-0.105505764,-0.06060507,-0.066001944,-0.16948535,-0.14447865,0.15240416,-0.12086707,-0.22067334,0.29359263],[-0.25259453,0.72662085,-0.019954639,-0.37567586,-0.14041515,-0.110880576,0.028293425,-0.111130856,0.09566052,-0.21661228,0.100265615,-0.12622023,0.32393003,0.1720742,0.23493229,-0.2314176,-0.29668775,0.054298155],[0.0075020846,-1.0379118,0.058415513,-0.6336649,0.1777533,0.3996224,-0.14824356,0.53841037,0.20370372,0.06709238,-0.20242065,0.16530342,0.005269978,0.07914464,0.18396617,0.3359595,0.11940208,0.41780698],[-0.26971325,-0.29349837,0.016340017,-0.28127313,0.19968756,-0.35273314,-0.12725332,0.16223203,0.31847185,-0.08272004,-0.13002057,-0.23478554,-0.21000664,0.18946603,0.4066612,0.3821535,0.22385387,-0.25274214],[-0.011883075,0.35591817,1.8070056,-0.06357242,-0.49122602,-0.32094464,-0.035770092,0.23602432,0.17338297,0.42658088,-0.5602121,0.20542847,0.16731963,-0.7897803,0.1867783,0.29209885,0.06069555,-0.044831645],[-0.1184021,0.49316457,-0.011386314,0.28487483,-0.52669007,0.39699084,-0.15737064,0.023462037,0.13752255,0.11296199,-0.18964504,0.13462819,0.020783164,-0.37708953,-0.05232704,-0.2913591,0.2881553,-0.29922846],[-0.00057304814,-0.1185001,-0.13426046,-0.5729028,-0.01707388,-0.430987,0.17981416,0.108656205,-0.09637776,0.20971496,-0.047136426,0.10920909,0.16905956,0.19190785,0.0035438074,-0.025583372,0.28871274,-0.07032088]],"activation":"σ"},{"dense_2_W":[[-0.49437255,-0.3074483,0.12577564,-0.80536854,0.3818203,-0.2508327,-0.77941257],[-0.590948,0.057729438,0.5775266,-0.82149684,-0.16385625,0.26468316,-0.1986721],[-0.8693337,0.20204362,0.1808782,-0.6436834,0.3982201,0.04757887,-0.7291577],[0.48308417,-0.22587106,-0.62049073,0.30455,0.25944746,-0.08833746,0.29077286],[-0.050321363,0.29200885,0.25033513,-0.55846786,0.1142234,0.7839083,-0.91171724],[0.52267236,0.182393,-0.44948658,0.33957008,-0.57718825,-0.3744284,0.7962124],[-0.5793259,-0.39043754,0.56887144,-0.95162636,-0.04339133,0.38223684,-0.22251375],[0.29715785,-0.73829925,-0.6508201,0.26157615,-0.04009715,-0.3925987,0.42690706],[-0.5547783,-0.23581004,-0.20441227,-0.7084414,-0.7474019,0.15549515,-0.3855206],[0.74185896,-0.4140863,-0.5546949,0.042983074,0.33081874,-0.43315694,0.48314857],[-0.94190675,-0.1646355,-0.072953984,0.065710135,0.06073757,0.06576593,-0.103899956],[0.016691964,-0.77896374,-0.30583504,0.5844499,-0.4492795,-0.8628446,0.3806826],[-0.8750809,0.30358797,0.28483135,-0.42145577,0.469206,0.36288846,-0.21708845]],"activation":"σ","dense_2_b":[[-0.16136013],[-0.147815],[-0.048753243],[-0.020298453],[-0.06278913],[-0.051829122],[-0.26132149],[0.015052996],[-0.2423293],[-0.06199252],[-0.122265354],[0.0028793006],[-0.06900899]]},{"dense_3_W":[[0.35378894,0.46196505,0.25659692,0.03284285,0.061739363,-0.08112019,0.21352358,-0.7698974,0.073869765,-0.54001474,0.1673904,-0.12502979,0.46009788],[-0.058786314,0.07694819,0.7003563,-0.64618176,0.6994461,-0.4292753,-0.09363771,-0.04728599,0.1309421,0.060272142,0.29588172,-0.62102175,0.56741786],[0.3380847,0.40602964,0.22502236,0.46803278,-0.7782516,0.16471472,-0.37719798,0.038931362,0.22495954,0.6876152,0.021589195,0.5572496,-0.62703234]],"activation":"identity","dense_3_b":[[-0.045253523],[-0.04910254],[-0.007204871]]},{"dense_4_W":[[1.0239853,0.8379715,-0.19809574]],"dense_4_b":[[-0.042378113]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0000x00 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0000x00 4DNAC101'.json deleted file mode 100755 index d9e967aaa0..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0000x00 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9410305],[1.0135205],[0.43755898],[0.035255913],[1.0150132],[1.0147188],[1.0138017],[1.0047818],[0.99736667],[0.9853777],[0.97017664],[0.035170607],[0.03518756],[0.035202954],[0.03514626],[0.03504212],[0.03485243],[0.034570012]],"model_test_loss":0.003483835142105818,"input_size":18,"current_date_and_time":"2023-08-07_21-07-13","input_mean":[[24.285349],[-0.05928403],[-0.01614233],[-0.009645592],[-0.053309042],[-0.05531696],[-0.056520157],[-0.062387902],[-0.06518509],[-0.06607999],[-0.06631701],[-0.009559443],[-0.009565792],[-0.009585358],[-0.009782268],[-0.009886353],[-0.010085134],[-0.010364845]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.32126558],[0.036132913],[0.14653946],[-0.16673681],[0.011947655],[0.8634933],[-0.8429776]],"dense_1_W":[[0.4527837,-0.36523563,-0.00895103,0.0708803,-0.37383398,-0.15341127,0.58478814,-0.08056343,0.17823605,-0.26987255,0.11071506,-0.03524059,-0.19979352,0.007495296,0.41383117,0.05486684,0.34592432,-0.36494422],[-0.005359442,-0.2667065,0.013745064,-0.084581405,0.24264771,-0.15815671,-0.086041525,-0.26656815,0.012661911,-0.2871439,0.47772396,-0.571899,0.061434507,-0.15776612,-0.11044384,0.37591726,0.2713445,-0.026513515],[0.004771754,-0.26444337,-3.0509355,0.42927757,-0.16592573,-0.5067485,0.500884,0.20909443,0.04189764,-0.027662966,0.37295133,-0.43910545,-0.21445197,0.1298138,-0.10558352,0.2703849,0.1670119,-0.43948233],[0.39938697,0.29979974,0.008373226,0.16164267,-0.26766345,0.43186393,-0.039016787,0.019693874,0.1261662,-0.37198588,0.1659897,0.1892901,0.117931575,-0.6488737,-0.16253956,0.0455478,-0.0022032904,0.025826642],[-0.011956519,0.021317355,0.021973232,0.3160384,-0.28960922,-0.29251087,0.60586154,-0.41510195,0.128146,0.22726218,-0.32743308,-0.2132152,-0.10418378,0.035125237,0.119344465,-0.1968828,0.0840623,-0.04892973],[0.4348723,0.22955361,0.015684376,-0.16318707,-0.31230125,0.19132592,-0.2461668,0.23461606,0.09528534,0.4775696,-0.3119358,0.0008261773,-0.13662255,-0.09776182,0.34027192,0.13092493,0.0071137655,-0.14361662],[-0.32389423,0.38325608,0.0145612145,-0.11149766,0.051686168,-0.008923491,-0.25343153,-0.36856908,0.40953627,0.27845463,-0.15776885,0.014580425,0.035484746,-0.1405985,0.008262141,0.0750361,0.22170645,-0.17522527]],"activation":"σ"},{"dense_2_W":[[-0.6714466,-0.34783113,-0.12780505,0.91295844,-0.19930731,0.36767703,0.5786663],[-0.6771721,-0.11134032,-0.033869732,0.45200992,-0.19539332,-0.059520427,0.39429346],[0.43033612,0.83407825,-0.5783082,-0.9366921,0.93509126,-0.028040314,-0.72735274],[0.15360972,0.077082366,0.35429364,-1.051215,0.7068334,-0.85113597,-0.18565065],[-1.3485137,0.31199598,-0.9909041,0.35103118,-0.8839503,-0.51250356,1.0146881],[-1.1571593,-0.21886723,0.22874051,0.36782742,-0.33092886,0.5572583,0.21506594],[-0.86161023,-0.9853974,-0.45453233,0.28777933,-0.9925813,-0.37540138,0.96739244],[-0.5824667,-0.54830873,-0.7745198,-0.02694336,-0.8390693,-0.05262828,0.9321934],[0.90932316,0.36091605,-0.29672763,-0.4059818,0.5786526,-0.32232416,-0.83604115],[-0.0006442681,0.18862467,-0.693046,1.0736086,-0.44083816,0.92259085,0.4656397],[-0.1815308,0.3588715,0.97227794,-1.3006788,0.060749445,-1.4515802,-0.3403856],[0.13273185,0.4301123,0.09077474,-0.66371524,0.5008187,-0.8510345,-0.8018143],[-0.32866758,0.45398203,0.11124515,-0.40842384,0.4973462,-0.7254867,-0.8856933]],"activation":"σ","dense_2_b":[[0.0012725799],[-0.11492474],[-0.017718269],[-0.3617725],[-0.1245201],[-0.038838513],[-0.22801119],[-0.1657449],[-0.04381892],[0.11536696],[-0.42785484],[-0.074301556],[-0.3165186]]},{"dense_3_W":[[0.7072188,0.32837203,-0.8357544,-0.07334732,0.36024168,0.6057319,0.73583984,-0.059062883,-0.6172043,-0.002954617,-0.55209947,-0.6971218,0.38010213],[-0.69038504,-0.23186448,0.36981446,-0.3447812,0.38637486,-0.032711018,-0.046227716,0.39877996,0.38114014,-0.111415684,-0.082114026,0.21984167,0.5183156],[-0.51899433,-0.12916048,0.5884876,0.71727073,-0.6060962,-0.33618042,-0.24320374,-0.5715705,0.822553,-0.59673494,0.3488014,0.63506675,0.38828656]],"activation":"identity","dense_3_b":[[-0.0030867092],[-0.08421286],[-0.05693552]]},{"dense_4_W":[[0.26367742,-0.0008218267,-0.6682586]],"dense_4_b":[[0.034324795]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0010x00 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0010x00 4DNAC101'.json deleted file mode 100755 index 5988f76d32..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0010x00 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.724716],[1.4959972],[0.5397873],[0.048951324],[1.4975377],[1.4972339],[1.4954233],[1.4662817],[1.4340023],[1.3873618],[1.3405958],[0.048942763],[0.048936542],[0.048920844],[0.04871155],[0.04843174],[0.047928806],[0.047302604]],"model_test_loss":0.008742202073335648,"input_size":18,"current_date_and_time":"2023-08-07_21-34-23","input_mean":[[22.895647],[-0.05509051],[-0.0009339962],[-0.0024197318],[-0.05186684],[-0.05237507],[-0.052418586],[-0.051652323],[-0.04790127],[-0.043305434],[-0.039102893],[-0.0023933721],[-0.0023879136],[-0.0023819967],[-0.0023226556],[-0.0023347258],[-0.0023805785],[-0.002389813]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.1189297],[0.028616758],[-0.120110326],[-1.3364003],[-1.155689],[4.545205],[4.6856055]],"dense_1_W":[[1.6764991,-0.2165616,0.02171967,0.16306138,-0.33178213,-0.51356286,-0.92342836,0.073167734,-0.3029504,-0.49412876,0.22411734,-0.050114613,0.45258516,-0.39424014,-0.27986053,0.68608093,0.5258633,-0.16820106],[-0.052571695,0.91275,-0.014465118,0.043426633,-0.025098825,0.6740059,-0.13264339,-0.07667199,-0.09834313,0.036156673,0.09688627,-0.3393718,0.2594245,-0.45005876,0.22202903,0.16855074,-0.18687673,-0.25429112],[0.035393406,0.03501877,2.4415658,-0.43501148,-0.05228597,0.2040651,-0.20346655,0.38124704,0.24086578,0.21851066,-0.5910301,0.24155477,0.3626571,-0.36362377,-0.028416263,-0.33286482,0.31952125,0.0679023],[1.2067224,0.446494,0.0043112906,-0.16087066,0.18499684,0.39496493,-0.5509506,-0.075064704,0.13784459,-0.0049934876,0.006677537,0.26749933,0.39251417,-0.03499381,-0.6604564,-0.17244674,0.16260312,0.11549027],[1.0689722,-0.8116208,-0.006096875,0.34023157,0.47210988,-0.4384605,0.5331227,-0.41759884,-0.069540545,0.19452903,0.044704154,-0.47479782,-0.5569904,0.34265992,0.62784165,-0.021865688,-0.0069787498,-0.18864322],[1.831592,0.787637,0.15575852,0.030726168,0.3170631,-0.2733012,-0.09314743,-0.054926086,0.25987238,0.3793867,0.17776896,0.3717297,0.16224486,-0.16089486,-0.75732154,0.07296396,0.22855438,0.05832146],[1.7819636,-1.194306,-0.15287273,0.1887876,0.27201483,0.029433675,0.21670823,-0.35105628,-0.034238473,-0.11963524,-0.24842486,-0.26960924,-0.4148937,0.21680552,0.606679,-0.034082934,-0.29762813,-0.009257641]],"activation":"σ"},{"dense_2_W":[[-0.4629005,-0.4974006,-0.2904858,-0.6057455,0.7039836,-0.41832525,1.0372955],[0.28977782,0.80422324,-0.13876091,0.116478674,-0.019442132,0.9098352,-0.26412618],[0.26888716,-0.03308781,-0.11852592,0.05119105,0.31046206,-0.46183512,-0.50962996],[-1.0175097,-0.2795209,-0.91239053,-0.49764445,0.46378636,-0.72158617,-0.30564114],[-0.13860786,-0.5658692,-0.37510815,-0.2453204,-0.09008834,-0.40480798,-0.38012755],[-0.44616798,0.29338104,-0.093062796,0.35459974,0.14732593,0.3038334,-0.11383935],[0.22607525,-0.17798835,0.35510284,0.40880376,-0.8194073,-0.17143391,-0.46821502],[0.4565513,-0.55615324,-0.13392484,-0.49555677,0.7522913,-0.8161395,1.1037465],[-0.12025648,-1.121007,-0.07142694,-0.48535815,0.806789,-0.2798449,0.904912],[-0.6080642,-0.3117671,-0.7829517,-0.8494238,-0.41115513,-0.7792509,-0.17217514],[-0.3106535,0.37121254,0.16562602,0.6343219,-0.45030606,0.21602832,-1.0619884],[-0.48947912,-0.78191125,0.010906762,-0.2521157,0.61846507,-1.1840519,0.18846932],[-0.2804687,-0.8394935,-0.39661968,-0.5188922,0.90818566,-0.8677206,-0.12709521]],"activation":"σ","dense_2_b":[[-0.0071314005],[-0.017422963],[-0.04535261],[-0.2071086],[-0.061347343],[0.0069322526],[-0.026729736],[0.07267423],[-0.18793571],[-0.049161524],[-0.05531663],[-0.099349104],[0.08250706]]},{"dense_3_W":[[-0.25297967,0.50810736,-0.46908683,-0.03641949,0.038947254,0.34386054,0.5226972,-0.039223388,0.1741124,-0.5845979,0.7130592,0.2419447,-0.4491347],[0.5216683,-0.018714925,-0.06133189,0.31551158,0.32538223,-0.11293018,-0.16491419,0.6735836,0.35999843,0.32989758,-0.6725572,0.58409536,0.079916805],[0.038063955,0.29448617,0.57898533,-0.0692794,0.28799778,0.13160062,-0.37904146,-0.67243326,-0.32990336,0.2804782,-0.2603852,-0.19796656,-0.3136028]],"activation":"identity","dense_3_b":[[0.06003448],[-0.08627991],[0.07051213]]},{"dense_4_W":[[0.9887464,-1.0906954,0.7141598]],"dense_4_b":[[0.06921589]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC101'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC101'.json deleted file mode 100755 index c9966e62df..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.973185],[1.2308006],[0.47124374],[0.039767727],[1.2234948],[1.2267562],[1.228702],[1.2206274],[1.2050939],[1.1789762],[1.1437212],[0.0397065],[0.039725386],[0.039734013],[0.039686594],[0.039645616],[0.039555065],[0.039334625]],"model_test_loss":0.005078984424471855,"input_size":18,"current_date_and_time":"2023-08-07_22-00-26","input_mean":[[22.121334],[-0.010464258],[-0.004889951],[0.003433857],[-0.00816012],[-0.008416927],[-0.008662932],[-0.008998272],[-0.008217049],[-0.0068580806],[-0.006010885],[0.003438706],[0.0034568459],[0.0034763422],[0.0035396859],[0.0035731636],[0.0036217745],[0.0036836462]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.10654221],[-0.2905768],[-2.871999],[-0.1245177],[0.16143306],[0.082655065],[2.428078]],"dense_1_W":[[-0.009274342,0.5175485,-0.040819537,-0.2658763,0.66790605,0.5001351,-0.3282055,-0.21050686,0.13056423,-0.19473574,0.27589467,0.500145,0.09231609,-0.6249076,0.07356131,-0.2784489,0.2743887,-0.14142068],[0.045650993,-0.7187672,-3.9221926,0.25971168,0.0050335308,0.815766,0.9371128,-0.28306046,-0.60010844,-0.4402398,0.334732,-0.3486068,-0.43578961,0.25923377,-0.06565995,-0.33657274,0.63861084,-0.118178956],[-0.21374783,0.42282847,0.266799,0.05025237,0.0064825355,0.820618,0.2315524,0.26671964,-0.082816996,0.4062073,-0.17926975,0.1487991,0.139769,-0.3999773,-0.13033853,-0.06021389,0.13246544,-0.12687539],[2.2001243,-0.46080446,0.021041024,-0.025847267,-0.0166095,-0.59955376,0.71440715,0.577141,0.040229637,0.1345268,-0.21883093,-0.07305829,0.07283621,-0.030786302,0.3648521,-0.32475784,0.45030454,-0.24509932],[0.0038562298,-0.60293394,-0.020617504,0.019694017,0.3763915,-0.5692821,0.9114758,-0.21734723,-0.1944635,-0.018555427,0.17110226,-0.13353539,-0.5393221,0.6298117,0.1664842,-0.04548269,0.03591765,-0.080464125],[2.0805016,0.294753,-0.015689991,-0.55368453,0.109172165,0.39725655,-0.34113577,-0.54655766,-0.3882753,0.09528684,0.21858771,-0.055341844,0.22205897,-0.2005731,0.5021007,0.059200656,-0.046633355,-0.09212842],[0.21265858,0.5654287,0.24386185,0.10141437,0.066008195,0.45167878,0.1299337,0.4275724,0.05719904,0.15785104,-0.13811876,0.19489175,-0.2531665,0.06650904,-0.31723106,-0.05296288,0.14543928,-0.10396655]],"activation":"σ"},{"dense_2_W":[[0.7208203,-0.5637391,0.59667504,-0.24075457,-0.9961346,-0.13531135,-0.12724179],[0.08353179,-2.235628,0.29917157,-1.315324,-0.22382064,-1.8709669,-0.44139647],[0.5387289,0.32765672,0.35890356,-0.52188003,-0.70411855,0.3507985,0.5237647],[-0.25249085,0.050148275,0.6831794,-0.27731276,-0.10181721,0.8868131,0.51331794],[-0.061348394,0.0007661709,-0.43009564,-0.5424198,0.14139919,-0.5450331,-0.039015777],[-0.18883842,0.14738812,-0.23603185,-0.3689771,0.36367714,0.12600073,-0.4179159],[-0.4459407,0.36866704,0.113049746,0.29777262,0.1801355,-0.38669178,-0.7965472],[-0.017579421,0.05280841,-0.38046154,0.4176994,0.14375417,0.10180892,-0.53780746],[-0.13019691,0.32150963,-0.7783258,0.4411255,0.9020806,0.30856878,-0.24670088],[-0.71212524,-0.3333824,-0.10890434,-0.05027984,0.58339226,-0.3812356,0.18127146],[0.4350403,0.11608274,0.16477108,-0.072991945,-0.6695063,-0.11097746,0.06759265],[-0.7526205,0.5938332,0.34072697,-0.696911,0.17783667,-0.74074334,-0.9378376],[0.804114,-0.12623003,0.16351596,-0.31503728,-0.7229197,0.40303767,0.2082207]],"activation":"σ","dense_2_b":[[-0.31468102],[-0.17055899],[-0.2285355],[-0.097128555],[-0.010586535],[-0.015096155],[-0.0655667],[0.019932993],[0.071114086],[0.026876245],[-0.35583144],[-0.100859694],[-0.06898828]]},{"dense_3_W":[[0.2983101,-0.7078514,-0.65568393,-0.36758986,0.13057497,0.6307905,0.36659017,-0.25304082,0.42478424,-0.14673297,-0.34746668,-0.24960928,-0.6091494],[-0.3587975,0.03995377,-0.4216834,-0.5777477,0.10252213,-0.20580202,0.28845647,0.40347326,0.67879415,0.48831588,0.15095003,0.6822594,-0.04936859],[0.22906187,0.17523333,0.50960416,0.23045082,-0.21069351,0.058853656,0.3477555,-0.40553525,-0.54917115,0.047501687,-0.12622266,-0.13184138,0.646118]],"activation":"identity","dense_3_b":[[0.042785127],[0.029713841],[-0.12879385]]},{"dense_4_W":[[-1.0081478,-1.2892519,0.112720646]],"dense_4_b":[[-0.032802135]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC102'.json deleted file mode 100755 index 988cca6227..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS C 1.00 1.01 56310L0210x00 4DNAC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.848481],[0.8862211],[0.48629978],[0.033282995],[0.8825565],[0.8842056],[0.88548553],[0.8823946],[0.8792348],[0.8754788],[0.869421],[0.03292297],[0.03304511],[0.033158313],[0.03340195],[0.033433877],[0.033367477],[0.03335788]],"model_test_loss":0.004575948230922222,"input_size":18,"current_date_and_time":"2023-08-07_22-26-28","input_mean":[[18.430927],[-0.07129647],[0.018491521],[-0.026260056],[-0.07448064],[-0.073375314],[-0.07258443],[-0.065266214],[-0.063046746],[-0.059541434],[-0.054584157],[-0.02657762],[-0.02647423],[-0.026383044],[-0.02612497],[-0.026040455],[-0.026031366],[-0.026007706]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.001867291],[2.5971534],[0.22938758],[-0.22608748],[-2.7614555],[-0.07245665],[0.011351448]],"dense_1_W":[[0.0048964336,0.32368863,0.0071244487,-0.06219253,-0.69971055,0.66141987,-0.1635048,-0.32375827,0.06625927,-0.06529672,0.21220222,0.6800635,-0.10624061,-0.30102918,-0.25439295,-0.24798034,-0.30751342,0.45424858],[0.8717096,0.27175072,0.008614075,-0.39488295,-0.5048402,-0.07688018,0.21375221,0.25862306,0.3802419,0.780373,-0.34666312,0.07282488,0.2847437,-0.38848653,0.20993155,0.44143435,-0.11863596,-0.10396724],[-0.0052353255,-0.31822816,0.004281337,-0.30333275,0.034296587,-1.0526781,0.15911727,0.13257483,0.3769281,0.06922915,-0.31705686,-0.13642934,0.15893984,0.35623473,-0.2221777,-0.53985226,0.31177884,0.1331077],[-0.0026488309,-0.46307364,0.0040305443,0.21302664,0.10572383,-0.33876655,0.11481708,0.06491223,0.22308613,0.20670146,-0.18406537,0.18875864,0.001323788,-0.15270492,-0.009875742,0.10065525,-0.10484487,0.07724725],[-0.8517313,1.2480507,0.009313202,-0.59048694,-1.1145165,0.34028202,-0.09743023,-0.15318984,0.5041415,0.41274792,-0.16457404,0.8264525,-0.21307376,-0.43806297,0.17587166,0.0247668,0.416932,-0.20631395],[-0.0018124692,1.0170236,-2.7477639,0.19892676,-0.17666285,-0.57476693,0.5719481,-0.52562296,-0.88914037,-0.8647134,1.5394452,-0.3119364,0.088813215,0.07492086,-0.11926867,-0.3707679,0.21501637,0.24960175],[-0.023958094,0.095316805,-0.016534787,0.16063792,0.04441202,0.39860037,0.024935467,0.1530449,-0.15884824,-0.40695116,-0.09302091,0.56395507,-0.28016278,0.13766079,-0.5281072,-0.44597715,0.28976548,0.1696837]],"activation":"σ"},{"dense_2_W":[[0.15154204,-0.78675294,0.22928046,-0.033503618,-0.15833412,0.45278502,-0.4705822],[-0.5834908,-0.14377658,0.38843614,-0.029937692,-0.35921872,0.36018422,-0.058587343],[0.053825956,-0.6018707,0.35535994,0.5998146,-0.44884253,-0.37599027,-0.13201852],[0.073090784,0.5060707,0.09179472,-0.24177255,0.38017172,-0.23855892,0.20076287],[0.06758576,0.10149547,-0.86642444,-0.6211972,0.19965667,0.40455145,-0.032479934],[0.5254006,0.2655984,-0.13189656,-0.57774425,0.29848206,-0.013868569,-0.47990555],[0.5851224,0.48843405,-0.07289669,-0.42773506,0.3975408,-0.44622093,0.1360654],[-0.015633296,-0.62110466,-0.38382724,0.0018601576,0.1371097,0.0743509,-0.3674576],[-0.6463754,-0.70364404,0.25133833,0.18379001,-0.28124034,0.38435185,0.32847217],[-0.61743426,0.28012255,0.51616675,0.08034732,-0.3428058,0.39314508,-0.211209],[-0.4220699,-0.4960329,0.33365622,0.41486493,-0.45122844,-0.29246688,-0.30248302],[0.09507034,-0.3089235,-0.5273463,-0.7179823,0.86094236,-0.2863892,0.14491831],[0.24167342,-0.19868858,0.18480074,-0.42431474,0.15458284,0.12002474,0.038593136]],"activation":"σ","dense_2_b":[[-0.053941116],[-0.019561898],[0.053443328],[-0.07374648],[-0.30186814],[-0.10220643],[-0.006079856],[0.005632312],[-0.06199264],[0.0008034756],[0.06794324],[-0.13134351],[-0.025431834]]},{"dense_3_W":[[0.6019684,0.08368994,0.11931014,-0.5326191,-0.5951374,0.17335932,-0.6391729,0.5901674,-0.44038236,-0.26132423,-0.13372217,0.4315051,0.07855694],[-0.38172075,-0.4879406,0.26037207,-0.19332667,-0.50175065,0.5571594,0.3143821,0.21798374,-0.5415063,-0.11827112,-0.7028584,0.52945256,0.61205876],[-0.27886352,-0.20352115,0.5313796,-0.33827436,-0.23451158,-0.11697601,-0.4642654,0.21843909,0.17134716,0.55283946,0.53888303,-0.64016294,0.59808445]],"activation":"identity","dense_3_b":[[0.028694455],[-0.02157225],[0.021652581]]},{"dense_4_W":[[-0.88839185,1.1335969,-1.251347]],"dense_4_b":[[-0.02365967]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100'.json deleted file mode 100755 index 982d9a2e7a..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020 b'xf1x00DN8 MDPS R 1.00 1.00 57700-L0000 4DNAP100'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.8251824],[0.97374165],[0.39678615],[0.039650038],[0.9675714],[0.96974653],[0.971445],[0.96010584],[0.9482498],[0.93838036],[0.9262751],[0.039522577],[0.039549936],[0.039577607],[0.03943945],[0.039266065],[0.03906478],[0.038730167]],"model_test_loss":0.005850189831107855,"input_size":18,"current_date_and_time":"2023-08-07_22-51-04","input_mean":[[23.948711],[-0.11042184],[0.0008513909],[-0.004719362],[-0.10913178],[-0.109804966],[-0.11005321],[-0.10579765],[-0.10312579],[-0.10175711],[-0.098089136],[-0.0047842367],[-0.004759096],[-0.0047326833],[-0.0044965143],[-0.0043862625],[-0.0043439874],[-0.004256917]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.19536564],[-0.0041716034],[-1.7697656],[0.034405522],[-0.9804138],[1.5592381],[-4.038623]],"dense_1_W":[[-0.96289176,-0.16844435,-0.33135042,0.04781623,-0.0905433,0.31838787,-0.7973821,-0.6977461,-0.22462271,-0.15944098,0.05584555,0.032361288,-0.017556911,-0.4097252,0.08451744,0.47493675,0.24613103,-0.13016479],[0.0025252467,0.36295822,0.0051952563,-0.061572302,-0.35887212,0.22229104,-0.22204724,0.034594852,0.14076412,-0.17208177,0.011452716,0.090597436,0.29632482,-0.23263389,-0.075431645,0.027754778,-0.26631972,0.22669151],[0.98580307,0.1460111,-0.006533776,0.25585753,-0.2031787,0.75645447,-0.19832224,0.22909965,-0.22415143,0.056795266,0.034398753,0.4630238,-0.19674145,-0.13854524,-0.4064176,-0.12922981,-0.060546197,0.065589026],[0.045029007,0.50269336,2.7796633,-0.0076377117,-0.63786316,-0.06653349,-0.55045384,0.08327676,0.27944806,0.5322522,-0.36390388,0.3737667,-0.20071353,-0.21758012,-0.16247746,0.31800562,-0.12797713,0.037218444],[-0.55134237,-0.18539825,-0.19819416,0.27468693,-0.15253156,-0.55906934,0.24991404,-0.03944831,-0.2475911,-0.038619418,-0.102022864,-0.13440825,-0.39271066,0.31743523,-0.016324805,0.19443971,-0.21604395,0.17059657],[-1.036423,-0.37088332,-0.0090809995,0.4914565,-0.09154215,0.25218782,0.24309473,0.30631322,0.35170037,0.23679022,-0.34137195,0.12669902,0.0069693094,0.13518511,-0.4373841,-0.6247206,-0.14910895,0.30531472],[-1.0771234,0.76018256,0.35249147,-0.31738096,0.097953156,0.07492969,-0.1556959,0.533758,0.14374508,0.8647132,-0.44715706,0.62586576,0.11443575,-0.3779071,-0.2320536,0.10263231,-0.2999651,0.04361549]],"activation":"σ"},{"dense_2_W":[[-0.10324592,0.11039738,0.51771843,0.09347721,-0.87196016,0.6635172,0.24947388],[0.024585094,0.59421515,0.068763964,0.5486269,-1.4608854,0.88192827,-0.39993966],[0.4413766,0.7881249,0.39034104,0.18230437,-0.9140034,0.05566271,0.09512442],[-0.47279245,-0.3493564,0.14005436,-0.5340587,0.5966407,-0.46430302,0.22444999],[-0.45392346,-0.04614412,-0.35355964,-0.18547632,0.3873904,-0.7008455,0.12206877],[-0.36739802,0.20268749,-0.12268851,-0.106193095,0.5999196,-0.37765756,-0.44922847],[-0.54880965,-0.7290866,-0.28915912,0.17727232,0.38667715,-0.6511501,-0.1383285],[0.52068883,0.50054383,0.6252861,-0.23605038,-1.4634428,0.41514036,0.9438054],[-0.648459,0.2471083,-0.65482795,-0.119111195,-0.30439776,-0.04859132,-0.6602194],[-0.5173293,0.11870849,-0.33469254,-0.796215,-0.45731404,-0.4510818,-0.40196368],[-0.45839694,-0.41415405,-0.6876088,0.11170082,-0.13311273,-0.35558105,-0.49632224],[0.39769867,-0.35987017,-0.20037495,-0.5226243,0.72143537,-0.20635548,-0.46655688],[-0.37865394,0.016113892,-0.520626,-0.25705534,0.94881725,0.11235735,-0.83941835]],"activation":"σ","dense_2_b":[[-0.4009523],[-0.35328817],[-0.17279775],[0.024035925],[-0.0030043991],[-0.0042769755],[0.08547396],[-0.49828207],[0.03243174],[-0.38892063],[0.16030122],[0.15409443],[0.15423937]]},{"dense_3_W":[[-0.35692686,0.11431418,-0.20940931,-0.16842283,0.5645013,-0.037901483,-0.5341042,0.054549012,0.54704887,0.54749495,-0.27935258,-0.17022972,-0.36970934],[-0.4523077,-0.20165743,-0.606432,-0.17038603,-0.01184516,0.4348867,0.696362,-0.133869,0.5862017,0.3475741,0.57729375,0.45561698,0.055455644],[0.17490287,-0.49273917,-0.6702675,0.52635163,0.24822022,-0.15901737,0.50198627,-0.7415996,-0.32407025,-0.50210077,0.2912399,-0.02596676,0.75527865]],"activation":"identity","dense_3_b":[[-0.030630419],[0.020200811],[0.036532093]]},{"dense_4_W":[[-0.01753921,-1.0593574,-0.9545534]],"dense_4_b":[[-0.026306424]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102'.json deleted file mode 100755 index 7e8479916d..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5450 4DNHC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.689964],[1.1172562],[0.47065306],[0.039288677],[1.1148199],[1.1146759],[1.1138787],[1.0997579],[1.0863613],[1.0626523],[1.0341643],[0.039109986],[0.039163604],[0.03921246],[0.039282],[0.0392662],[0.03901584],[0.03859772]],"model_test_loss":0.006890684831887484,"input_size":18,"current_date_and_time":"2023-08-08_00-34-17","input_mean":[[22.360703],[0.03464188],[0.0027785136],[1.2959163e-5],[0.037677385],[0.03741321],[0.03715227],[0.03595462],[0.03641664],[0.032926656],[0.026464323],[-2.0994983e-5],[-8.1254e-6],[-7.6023986e-7],[-6.278352e-5],[-8.228038e-5],[-0.0002560112],[-0.00051422045]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.4041638],[-0.009381184],[-1.2474654],[-0.32208985],[4.033501],[-0.6852106],[-3.9728174]],"dense_1_W":[[-0.687249,1.1542901,2.1917975,-0.54792583,0.11244576,0.16998574,-0.49382955,-0.13925558,0.09835213,-0.15130454,-0.9653543,0.16384646,0.027884314,-0.14891884,-0.48109746,0.091843285,0.5578272,-0.05534039],[-0.0014183326,0.726647,-0.0035275402,-0.11533925,-0.4059522,0.7295035,-0.47751862,-0.2416707,-0.02734288,0.06507004,-0.0064442307,0.6041324,0.67849165,-0.55099046,-0.23613937,-0.032516804,-0.16318728,-0.08419399],[-0.5954915,-0.76488334,-2.0431242,0.15687804,0.23584543,-0.42583415,0.10554652,0.11953392,-0.15156066,0.21460378,0.87915903,-0.35293782,0.25323242,0.39901143,0.25572163,0.08249874,-0.38727182,-0.047129497],[0.14069723,-0.3919022,-0.0008744924,-0.059669092,-0.09359133,-0.6368598,0.5902478,0.20133625,-0.121440604,-0.065659136,-0.0057477783,-0.30779642,0.24014011,0.40626147,-0.12158061,-0.14876814,0.16586542,-0.033642642],[1.5318011,1.1091315,0.0042629745,-0.28907332,-0.062063456,-0.10614539,-0.03415317,-0.004241847,0.26679656,0.012595347,0.6646693,0.22112225,0.17988127,0.090471245,-0.17571782,0.19749698,-0.393442,0.21523812],[0.310905,0.29187796,-0.0007723808,-0.363841,-0.6149396,0.70793575,0.0772483,0.04830643,0.29118708,-0.17558831,-0.028698755,0.21452032,0.6498187,-0.6480603,0.19537422,-0.61544496,0.34354338,0.06310341],[-1.525909,1.1347268,0.006725862,0.065649055,-0.52072847,0.30013448,0.3943772,-0.4068202,-0.0063213394,0.3581553,0.6199145,0.49079955,0.060594473,-0.46649554,-0.118231915,0.08833182,-0.1837789,0.1082475]],"activation":"σ"},{"dense_2_W":[[-0.41003475,-0.5941811,0.35549054,0.70805454,0.06241565,0.24009907,-0.2571945],[-0.17879263,-0.5668489,0.078311555,0.26954442,-0.46130812,-0.2986236,0.026367432],[-0.032109488,0.4100262,-0.53486085,0.4058389,0.044560365,0.16679758,-0.3034037],[0.73847044,-0.20993896,-0.5642298,-0.3659582,0.20961727,0.43580025,0.0177744],[-0.4672462,-0.61421245,-0.44849893,-0.17692474,0.22861485,-0.3238457,0.15435395],[0.22824611,0.28959498,-0.2854186,-1.4559703,0.9620582,0.74461776,-0.108179726],[-0.02588813,-0.3127553,-0.71865684,-0.44503638,-0.27046338,0.14424235,-0.038083725],[0.32513967,-0.3561943,0.24827418,-0.32704267,-0.38088554,0.2438981,-0.1064644],[-0.17885895,0.42748332,-0.74465275,-0.8093966,-0.11033694,0.3553823,0.62148225],[0.131998,0.100577846,-0.17490678,0.6352548,-0.47178045,-0.57052344,-0.17243351],[-0.6209595,0.369551,0.19621795,-1.3971734,0.64587736,0.51646644,0.4175135],[0.0005163468,-0.24055383,-0.20226417,0.67244124,-0.23466797,-0.48380762,-0.53093874],[-0.22020346,0.3996716,0.2970228,-0.7995752,0.09480631,-0.08127671,0.62530756]],"activation":"σ","dense_2_b":[[0.031364277],[0.07349004],[-0.05814894],[-0.024128156],[-0.0155091975],[-0.29374],[-0.26029426],[-0.021580614],[-0.16836035],[0.012105176],[-0.36115757],[0.10476691],[-0.13135944]]},{"dense_3_W":[[-0.5763429,-0.56471676,0.12633902,0.5479549,-0.6422557,0.27148914,-0.23865283,0.15508497,0.5120569,-0.18321085,-0.20305811,-0.3290402,0.043243363],[-0.02372374,0.39314762,0.15481226,-0.5593528,-0.5013217,-0.16603263,-0.23262566,0.25007325,-0.20149072,0.21564138,-0.6830406,0.700577,-0.50517535],[-0.5742908,-0.04224201,-0.06110482,-0.050169945,-0.53291845,-0.1360594,0.564487,-0.24321367,-0.24506827,-0.27379003,0.5516074,-0.5063531,0.4253847]],"activation":"identity","dense_3_b":[[-0.02731678],[0.03552884],[-0.0069239554]]},{"dense_4_W":[[1.098094,-0.99127156,0.16504136]],"dense_4_b":[[-0.030831616]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102'.json deleted file mode 100755 index 157ce56e6c..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.02 56310-L5500 4DNHC102'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.806735],[1.2785676],[0.5104689],[0.044312194],[1.2728615],[1.2750368],[1.2765797],[1.2632731],[1.244448],[1.2167825],[1.1834176],[0.044200357],[0.044231147],[0.044254437],[0.04425257],[0.04418865],[0.044067442],[0.043792143]],"model_test_loss":0.01218547485768795,"input_size":18,"current_date_and_time":"2023-08-08_00-59-43","input_mean":[[23.11654],[-0.032949522],[0.009155593],[-0.029586772],[-0.034678016],[-0.034348194],[-0.033619005],[-0.028988048],[-0.025731714],[-0.019963661],[-0.016452389],[-0.029611032],[-0.02960542],[-0.029594153],[-0.029447835],[-0.029455785],[-0.029506048],[-0.029566707]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.8828355],[0.40646476],[2.090121],[0.8059917],[2.205458],[0.9334858],[-0.33200896]],"dense_1_W":[[-0.53053826,0.27904403,1.8534683,-0.2955934,-0.3956192,0.78547305,-0.38176653,-0.35697734,0.3331119,0.34091163,-0.686063,0.7608489,-0.5477775,-0.041410368,-0.1755996,0.27248794,-0.08716658,0.06782427],[-0.0023688215,0.28428173,0.0065304525,-0.08413256,-0.49787298,1.0713955,-0.62245727,0.101583414,-0.008971785,-0.22987749,0.13199726,0.29666874,0.24260923,-0.649986,0.11152149,-0.28588438,-0.0071382457,-0.29161188],[0.3604459,0.8241495,0.008147093,0.061904266,0.021917332,0.83537346,0.071819894,0.21101502,0.039214145,0.07105925,0.017073013,0.5363549,-0.0137413,-0.37729445,-0.37352064,0.1549617,-0.30158794,0.29164574],[0.50972414,0.21102065,1.906497,-0.3665385,-0.2077211,0.5899225,-0.7436237,-0.027170774,0.59833825,0.55375063,-1.0024506,0.2756846,0.1362578,-0.4424235,0.17111245,0.14868937,0.27094048,-0.2256927],[0.3570491,-0.9449637,-0.0038414046,-0.18648717,-0.21053085,-0.71682775,0.19967486,-0.24819107,-0.12916584,-0.021362225,-0.01222075,-0.39958,-0.110254936,0.35989097,0.5008998,0.0059754075,0.054075558,-0.20690106],[-0.0066155936,-0.92957646,0.013711732,-0.28924587,0.9040592,-0.5274747,0.5186851,0.4869224,0.07748703,0.21800375,-0.13250247,-0.3384952,-0.19564785,0.61564326,-0.33629382,0.21877833,-0.17645325,-0.85731995],[-0.15106708,-0.18163809,1.5749623,-0.080494866,0.0063749384,-0.41591707,1.2240275,-0.5400741,0.18987378,-0.2516748,-0.13973542,-0.62628853,0.36244768,0.08076608,0.24033926,0.054027114,0.13816029,-0.222367]],"activation":"σ"},{"dense_2_W":[[0.18049516,0.06898391,0.026188483,0.50226945,-0.836067,-0.15816489,-0.035430282],[0.77764225,0.4938293,-0.18668377,0.33298555,-1.4891886,-0.24971096,-0.17076197],[-0.60486037,-0.68777907,-1.0724757,0.35820767,0.6229709,0.89322317,0.55584955],[-0.6130941,-0.45594084,0.2157379,-0.32011363,0.8813185,0.22641036,0.34688213],[-0.054075092,-0.7679671,-0.13776255,0.19197619,0.26417407,-0.16748618,0.29280367],[-0.10182613,-0.12194571,-1.0255779,-0.60696757,-0.09953989,0.23414455,-0.36724913],[-0.20329732,0.5056915,-0.016156103,0.11111321,-0.5714082,0.2851215,0.07377184],[0.050893724,0.2936281,0.19905426,0.02157211,-0.71915215,-0.31541398,-0.32369208],[-0.38534418,-0.57820314,-0.69817704,-0.78573805,-0.22289091,-0.1444706,0.84120387],[-0.22642383,-0.1060583,-0.6594286,-0.86231923,-0.11660855,-0.09651285,0.41405997],[0.35768324,0.29057413,0.52457124,-0.084269114,-0.76201826,-0.09401483,-0.106591016],[-0.43864337,-0.53775054,-1.1092063,-0.5224982,0.116868414,0.6581688,0.5014254],[0.34511328,-0.054018814,0.8002029,-0.07694278,-0.40526733,-0.13650577,-0.44867894]],"activation":"σ","dense_2_b":[[-0.09483589],[-0.30355707],[0.013573359],[0.045211345],[-0.0871814],[-0.24410044],[-0.0775358],[0.11720473],[-0.008279821],[-0.2442025],[-0.2776844],[0.015379876],[0.09168367]]},{"dense_3_W":[[0.40055394,0.582905,-0.4111319,-0.31334177,-0.48468548,0.11764927,-0.08204717,0.27377617,-0.7112729,0.19272773,0.26190874,-0.8084976,0.4428442],[-0.21866779,0.3226937,0.10855049,0.07141476,-0.13760294,-0.22177294,0.160254,-0.37559277,-0.5011528,-0.32128072,0.5026536,-0.39558798,0.10326434],[-0.18509546,-0.48764798,0.19780253,0.2646118,0.09047094,0.31383237,-0.58293486,-0.08110487,0.6763159,0.46092844,0.059963726,0.57369226,-0.64778125]],"activation":"identity","dense_3_b":[[0.052880295],[0.07685314],[-0.04764411]]},{"dense_4_W":[[0.9994107,0.08082187,-0.78512675]],"dense_4_b":[[0.05184357]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103'.json deleted file mode 100755 index 85544ca5c7..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021 b'xf1x00DN8 MDPS C 1.00 1.03 56310-L5450 4DNHC103'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.26363],[1.2876029],[0.4691794],[0.042342793],[1.2798712],[1.281447],[1.2820183],[1.2581282],[1.2295567],[1.1863525],[1.135284],[0.04198092],[0.042049758],[0.04212124],[0.042146564],[0.041984763],[0.041710183],[0.041294366]],"model_test_loss":0.006388714537024498,"input_size":18,"current_date_and_time":"2023-08-08_01-25-55","input_mean":[[22.872793],[-0.08689881],[0.0010234753],[-0.0038607456],[-0.08724453],[-0.087999865],[-0.08858455],[-0.08748225],[-0.08481368],[-0.08042719],[-0.07732415],[-0.003858866],[-0.0038813055],[-0.0039040009],[-0.0041669253],[-0.004390024],[-0.0046632714],[-0.004900364]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.5336922],[-0.6008307],[-0.6673705],[-1.177618],[2.1967514],[-2.8734276],[-0.27195445]],"dense_1_W":[[1.2013925,-0.38953242,-0.028237127,-0.14180943,-0.18575947,0.1106242,0.12136914,-0.71949697,-0.20943782,0.047901746,0.09341362,0.0044323304,-0.29708275,-0.052522436,0.53091663,0.27349496,0.3104034,-0.38801497],[-0.23073046,0.8099321,-0.03846076,-0.91607964,0.11726978,0.42854434,-0.07123206,-0.2530622,0.029919352,0.23274454,0.029808447,0.55654866,0.31956628,0.027127922,-0.24346891,0.12953727,0.1545052,-0.016463429],[0.4944997,-0.507676,-0.021496933,-0.13818543,0.00021766199,-0.45922992,0.5179483,-0.1616277,-0.13048062,-0.02763714,0.031596903,-0.2688555,0.3347001,0.022401655,0.18831164,0.16599877,-0.00036161195,-0.058895797],[0.79052234,0.5169544,0.004457134,0.07639163,0.040505003,0.16811295,-0.49953467,0.30723387,0.43350053,-0.30323687,0.0021920651,0.5147583,0.1054229,-0.8480872,-0.08184729,-0.10606368,-0.11437162,0.14529237],[0.87388206,1.4188874,0.005403591,-1.2710905,-0.5001256,0.66239464,-0.049878355,-0.09099538,0.22368619,0.1436128,-0.05005276,0.5060512,0.5519586,0.14216568,-0.03614136,-0.30450502,-0.01521232,0.22127852],[-1.1201782,1.1519747,0.018877197,-0.84099257,-0.10477958,0.22008999,-0.0178951,0.098986864,-0.25299644,0.25593615,0.013966401,-0.02736472,0.4958138,0.34917468,-0.06082836,-0.18867119,-0.08527511,0.14691037],[-0.011524901,1.2455785,3.091312,0.2794258,0.30048615,-0.25095785,-0.81237376,0.073421545,-0.07831179,0.29788557,-0.48452437,0.3920703,-0.35341492,-0.0816123,-0.2704529,0.057917055,-0.08816406,-0.20087627]],"activation":"σ"},{"dense_2_W":[[-0.16297658,0.03952007,0.017301178,0.11138396,-0.54143757,-0.6359262,-0.48702642],[0.023838406,0.53726286,-0.8185933,0.9541119,-0.21379428,1.0464535,-0.14768387],[-1.4899192,-0.46342307,-0.012913185,0.6559764,-1.133273,0.5413093,-0.4222291],[-1.5246911,-0.19620198,0.47882864,-0.2679241,-1.1384221,-0.3305512,-0.79238653],[-0.67590755,-0.47291875,-0.37138042,-0.867928,-0.3243818,0.35817894,-0.081819],[-0.44167435,0.26642233,-0.7098097,0.98480886,0.2975434,1.3568006,-0.6182568],[0.021911422,0.0072481604,0.80867565,-0.6889035,-0.58101594,-0.28012198,0.083424546],[-0.31145698,-0.15393952,0.88755167,-0.5754666,0.14976555,-0.2653118,-0.24384615],[-0.24493891,-0.06982408,-0.36303687,-0.28657684,-0.14763613,-0.33112663,0.09139967],[-0.3299021,0.33315933,-1.5499225,0.38461637,-0.3175137,1.1142358,0.43303496],[-1.0491866,0.33792546,-0.069094226,-0.509567,-1.1447937,-0.050081585,-1.2587998],[0.19292325,-0.06235127,0.7175149,-0.33345056,-0.8505459,-0.8724147,0.4035013],[-0.26649722,-0.77229846,1.0092193,-0.67018247,-0.044674527,-0.95283824,0.4402431]],"activation":"σ","dense_2_b":[[-0.19604135],[-0.27089414],[-0.061074182],[0.049550105],[-0.17541133],[-0.013591371],[-0.1635722],[-0.110457405],[-0.2914021],[-0.630707],[0.06793911],[-0.19795586],[-0.1507593]]},{"dense_3_W":[[0.20882441,0.32402983,-0.65811265,-1.3424684,0.384235,0.53797245,-0.056847516,-0.7877067,-0.21982256,0.8989965,-0.93191963,-0.13438137,-0.60060513],[-0.26045218,0.37893888,-0.31171417,-0.692449,-0.33556944,0.19751847,-0.22969474,-0.47745273,0.08315438,0.36671123,-0.725029,-0.41554233,-0.31832826],[0.11780495,-0.14251727,-0.22456245,-0.6772515,0.4477451,0.006119811,-0.36196816,-0.3983645,0.06536692,1.012304,-0.91562796,0.46987322,0.039987262]],"activation":"identity","dense_3_b":[[0.07951171],[0.20113988],[0.19002767]]},{"dense_4_W":[[0.76106316,0.6755035,0.4400971]],"dense_4_b":[[0.20939666]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.00 56300-N9100 2228'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.00 56300-N9100 2228'.json deleted file mode 100755 index ae735ba724..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.00 56300-N9100 2228'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.974163],[1.2132347],[0.5706513],[0.0502793],[1.2130301],[1.2128786],[1.2129273],[1.2019379],[1.1921468],[1.1817437],[1.1693443],[0.049872153],[0.050001368],[0.050128575],[0.0504321],[0.050471127],[0.05024059],[0.049630113]],"model_test_loss":0.0027105817571282387,"input_size":18,"current_date_and_time":"2023-08-08_02-17-02","input_mean":[[24.601255],[0.09067642],[0.00598973],[-0.01976689],[0.08466021],[0.085768804],[0.087323815],[0.088206366],[0.08898853],[0.08882811],[0.08783784],[-0.019929642],[-0.019905197],[-0.019887373],[-0.019954689],[-0.02004099],[-0.02029898],[-0.020633632]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.033486906],[-0.9854258],[0.18699676],[0.23900361],[0.066415675],[0.29984745],[-0.8694348]],"dense_1_W":[[-0.017391304,-0.1664158,1.2471004,0.17742877,-0.17622486,-0.07136989,0.17133567,-0.4406301,-0.17438401,0.10146424,0.2975635,-0.1329268,-0.1988518,0.13207461,-0.07052476,-0.57519513,0.1340373,0.2621166],[-0.53872705,-0.23616274,-0.9677832,0.3608879,0.5576081,0.5372162,-0.07011008,-0.33063745,-0.5091716,-0.47236058,0.5879706,-0.025170565,-0.39819354,-0.0017943033,0.23057717,0.32230052,0.053017925,-0.38491854],[-0.007569397,-0.15017577,0.017163722,0.11802223,0.086126305,-0.43940485,0.27736512,-0.08943185,0.12873243,0.42947087,-0.3468891,0.022381762,-0.22449934,-0.0031788715,0.19415219,0.17616823,-0.16482577,-0.6204708],[0.484722,-0.47863308,-0.003916951,-0.14998426,0.27055895,-0.62900317,0.35633156,0.2332263,-0.23696448,0.15093268,-0.056025397,-0.15387145,-0.028749702,-0.114084855,0.43514955,0.20574397,-0.04303955,0.029721491],[-0.0050577456,0.45235983,1.3863038,0.11857966,-1.062984,0.024143053,-0.5049202,0.520871,0.14744748,0.660791,-0.5397323,0.1884993,-0.3807901,-0.26886487,0.04286105,-0.15216194,-0.18675679,0.3220595],[0.3422851,-0.091745734,0.00288963,0.20548403,0.0039008386,0.80896676,-0.24846731,-0.039755683,-0.37319353,0.19646579,0.11100307,0.28086716,0.011461304,-0.20595428,-0.4130035,0.09002887,-0.08794721,-0.04846733],[-0.5121424,-0.10687892,0.97480345,-0.32319045,-0.55000156,0.039779805,-0.23451307,0.39487234,0.677461,0.028733881,-0.3141663,-0.006031874,0.020082282,-0.2869862,0.3214539,0.14777255,-0.032176822,-0.0048443917]],"activation":"σ"},{"dense_2_W":[[0.51288545,0.26980367,0.41815448,0.7882964,-0.01700049,-0.40586126,-0.7246673],[-0.032620583,0.6513666,0.52040267,-0.40663394,-0.97148997,-1.0426518,-0.22752136],[0.16157787,-0.28532407,-0.62873006,0.2976417,-0.2695294,-0.6110988,-0.32099858],[0.288502,0.5002554,0.24604729,0.60736823,-0.52036625,-0.591719,-0.34863025],[-0.49133012,0.13397883,-0.3788907,-0.95399517,0.04031534,0.8688636,0.36374664],[0.57312244,0.38245326,-0.06361987,-0.015409997,-0.4972398,-1.1938152,-0.1887008],[-0.23034595,-0.06613118,-0.42114103,-0.5018989,-0.034961794,0.59000736,0.19794862],[-0.6363575,-0.519735,-1.0045744,-0.11841846,0.09764135,-0.7355506,-0.1620501],[-0.740666,0.07916898,0.051017664,-0.20237261,0.42158294,0.64777046,0.18364593],[-0.3495589,-0.21401046,-0.56614906,-0.9645764,0.23658282,0.30558574,0.44571444],[0.54428804,0.7490656,0.028581897,0.068156295,-0.8264058,-1.1980392,0.34633735],[0.12275982,-0.13522817,0.5264364,0.5047181,-0.529052,-1.3191032,0.2033573],[0.62411124,0.4409063,-0.18518022,0.8019149,-0.49426788,-0.65130705,-0.27399883]],"activation":"σ","dense_2_b":[[-0.110052325],[-0.29302466],[-0.5614016],[-0.07483078],[0.18669383],[-0.20799044],[0.07792293],[-0.3352715],[0.062055763],[0.018744566],[-0.0924943],[-0.23109648],[-0.04416926]]},{"dense_3_W":[[0.50142425,0.10667864,0.4399292,-0.028254379,-0.39511585,-0.5136239,-0.34489322,-0.21440437,-0.5778223,-0.33600324,0.6226011,0.27962455,0.11977961],[-0.043028127,0.52723306,0.20324984,-0.5955265,0.15386851,0.15855698,0.4817966,0.53277177,-0.517283,0.78218174,-0.12013057,0.39024982,-0.7431557],[0.4440453,0.35185146,-0.028372388,0.61086553,-0.9743987,0.5447786,-0.42143017,0.11649257,-0.6926346,-0.6080743,0.47793046,0.5229465,0.56632364]],"activation":"identity","dense_3_b":[[-0.03343789],[0.052187573],[-0.114594795]]},{"dense_4_W":[[-0.18980438,0.15273905,-0.88665426]],"dense_4_b":[[0.09599546]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-CW000 1A15'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-CW000 1A15'.json deleted file mode 100755 index 71720e600d..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-CW000 1A15'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.22473],[0.8251674],[0.55987936],[0.04294055],[0.80855274],[0.8140519],[0.819299],[0.8224256],[0.8223862],[0.8136785],[0.807375],[0.042726606],[0.042794228],[0.042867724],[0.043195076],[0.04336566],[0.043502316],[0.043476745]],"model_test_loss":0.0011282428167760372,"input_size":18,"current_date_and_time":"2023-08-08_02-41-29","input_mean":[[21.709253],[0.02837096],[0.014460302],[-0.004794128],[0.024455145],[0.026277967],[0.028953284],[0.0311847],[0.033131044],[0.030929914],[0.030909915],[-0.0050024847],[-0.004941226],[-0.0048792004],[-0.004936204],[-0.0050907354],[-0.005161467],[-0.005247103]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.20276919],[-0.81567574],[0.17173824],[0.02485116],[-0.16411562],[0.4910318],[-0.05420777]],"dense_1_W":[[-0.0012471483,0.89754707,-0.30605346,0.30311847,-1.4427079,0.6952515,-0.65700763,0.040769663,0.49388984,-0.0077092303,-0.12679042,0.30025703,0.22031534,-0.947996,-0.76274323,0.6916131,0.9007639,0.7855221],[-0.6438617,0.5432943,0.055781104,0.14055097,-0.05817591,0.85594875,-0.63760585,-0.14287747,0.0445909,-0.4966032,0.3642643,0.5872178,-0.43109778,-0.80650455,0.052074146,0.2705149,0.12943903,-0.19362473],[0.003357844,0.31364292,0.22141118,0.98970664,-0.247483,0.6660532,-0.45712006,0.2463237,0.04045275,-0.11441027,-0.20408206,0.25224286,-0.0011789324,-0.36312783,-0.7617343,-0.306311,-0.3153426,-0.5837831],[0.028954435,0.66365343,0.022223057,0.07054718,0.24609722,-1.2109858,-0.4602635,0.3987523,0.01633434,-0.09760745,-0.1753251,-0.49207205,0.0021850022,0.53756136,-0.00042571075,0.009666692,0.042855307,-0.11420329],[-0.03580821,1.9344804,8.167719,-0.66073954,0.7095272,0.1456512,-1.4878063,-1.1827188,-0.20311646,-0.14221944,-0.27837816,0.6607043,0.51872766,-0.2517782,0.24511532,-0.028188378,-0.12866867,-0.06853984],[0.53031373,0.023884322,0.039527502,-0.16327015,-0.037574653,0.8523508,-0.17424065,-0.25996268,-0.031912126,-0.14452986,0.22546388,-0.028659882,-0.0152696865,-0.29828578,0.35591877,0.16280918,-0.16622923,-0.045724925],[-0.0099094855,-0.024337003,-0.90923375,0.33954924,-1.0551822,-1.4047244,3.1376684,-0.67196745,0.21238333,-0.35975868,0.3339244,-0.7338359,-0.37664357,0.6216561,0.230003,0.13399994,0.009667031,-0.18426572]],"activation":"σ"},{"dense_2_W":[[-0.46300676,-0.92880476,-0.6603387,0.18106437,0.6114232,-0.3085461,-0.34915724],[-0.27267945,-0.032490827,-0.19413497,0.67636174,-0.25963235,-1.0346236,0.5159924],[0.10341285,-0.2286906,0.58102465,-0.6124768,0.27501637,0.63732,-0.25335288],[0.47252873,0.15228121,0.15265052,-0.1303907,-0.27630845,0.29428765,0.054996368],[-0.60003024,-1.7184374,-0.3925117,2.1059344,-1.1817226,0.8805947,2.0097177],[-0.5157754,0.2864647,-0.2600413,-0.5098677,-0.8062721,-0.8342195,-0.12589265],[-0.27893555,0.4498806,-0.46256977,-0.34525606,0.16928495,0.57889444,0.1360685],[-0.069990896,-0.033348653,-0.5150556,0.86856264,-0.43608308,0.2634268,0.50319856],[-0.92615515,0.8989689,-1.0192099,1.1630723,-1.5832745,-2.3778448,1.1420947],[0.24078313,-0.059227604,0.52533114,-0.22976397,0.26565957,0.0019856135,-0.37963587],[-0.43368915,-0.19412571,0.030553307,-0.008343276,-0.24855247,-0.38562915,0.028216615],[0.24137807,0.50673467,0.58424366,-0.5623794,-0.4958684,0.043686286,-0.29952815],[-0.53380847,-0.6478634,-0.66525984,-0.09425604,0.30415344,0.033006296,-0.2779725]],"activation":"σ","dense_2_b":[[-0.19925767],[-0.22416385],[-0.024587726],[0.00076841726],[0.9967099],[-0.21401763],[-0.009374596],[0.037712634],[-0.41577217],[-0.08446474],[-0.22238271],[0.029249683],[-0.19375889]]},{"dense_3_W":[[-0.064283945,-0.28218833,0.29587984,0.47048366,0.1037391,-0.34584334,-0.099526614,-0.4141651,-0.71549547,-0.14117901,-0.48195595,0.6179986,-0.056695417],[-0.5290835,-0.5220605,-0.5042605,-0.30072263,0.6284589,-0.45276895,0.028285943,-0.31197917,0.39458558,0.17490475,0.0648546,-0.5194648,-0.4971718],[-0.32037377,-0.016439343,0.07254626,-0.09806289,-0.59013605,0.27251726,0.36449474,-0.557429,0.4412477,0.3926684,0.5275635,0.4008913,-0.14265701]],"activation":"identity","dense_3_b":[[0.004609829],[0.016195556],[0.0031462326]]},{"dense_4_W":[[0.73565596,-0.034537062,0.4909206]],"dense_4_b":[[0.0029074473]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-N9000 0B24'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-N9000 0B24'.json deleted file mode 100755 index df9d5c3321..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-N9000 0B24'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.049927],[0.90012175],[0.48095357],[0.04241544],[0.8875352],[0.8917799],[0.8952688],[0.89421207],[0.88974833],[0.8810388],[0.8717085],[0.04214072],[0.042199083],[0.042250115],[0.04236346],[0.042318553],[0.042197257],[0.04192991]],"model_test_loss":0.0027597311418503523,"input_size":18,"current_date_and_time":"2023-08-08_03-06-21","input_mean":[[24.36531],[-0.12347623],[0.006147819],[-0.016785737],[-0.12271177],[-0.123503655],[-0.12395989],[-0.118791655],[-0.116043516],[-0.107350565],[-0.103384055],[-0.016675012],[-0.0167048],[-0.016730325],[-0.016802218],[-0.016868604],[-0.017092224],[-0.017343003]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.3077128],[-0.053523973],[-0.08867575],[-3.564466],[-0.8363932],[-0.03499285],[-0.9791886]],"dense_1_W":[[-0.657707,-0.40130603,-0.05392449,-0.17988339,0.54668987,-0.46538657,0.57125705,-0.8721553,-0.48437503,-0.3783023,0.20773576,-0.006874521,-0.16955361,0.5569281,0.012815096,-0.24756004,0.13119608,-0.0070960107],[-0.00478684,-0.024804201,-0.7233322,0.07783175,-0.24326427,-0.3535344,0.9700095,-0.7786834,-0.6422574,0.0039578755,1.0983216,-0.08911305,-0.43728283,0.4707163,-0.30569777,0.37014574,0.22817229,-0.17220958],[-0.0018613227,0.18911898,-0.003760839,-0.19434088,-0.11199104,0.8207415,-0.1570958,-0.0013982604,-0.3096825,-0.12772126,0.23146391,0.71790016,-0.23160003,-0.35091403,-0.104312025,-0.04883372,0.24788088,-0.024843656],[-0.6503062,0.4760144,0.05285127,-0.5623532,-0.31313643,0.11321604,-0.39134973,0.48142427,0.8163628,0.24858923,-0.16951846,0.20952548,-0.13689561,0.36601552,-0.25696254,0.21768238,0.08233283,-0.015864879],[-0.9636597,0.40053022,-0.0058141947,-0.33463675,-0.11677622,0.26507962,-0.21261413,-0.79070723,0.18271628,-0.105050296,0.18018496,0.17602134,0.7042138,-0.3778066,-0.45499915,0.03500361,0.11619197,0.020927545],[-0.0077773444,0.5942843,3.5123742,0.106612384,-1.3349271,-0.28774235,-0.8317361,0.39143825,1.498797,0.28138006,-0.60930085,0.0037155056,0.28335968,-0.20002076,-0.15279055,0.09878292,0.17169282,-0.04990126],[-0.9617149,-0.15065387,0.0058096866,-0.28747433,0.38993824,-0.16643299,-0.17986324,0.08583848,0.41806793,-0.09902705,-0.102467,0.09218759,0.28329134,-0.0128028095,-0.28463566,0.009430492,0.3542676,-0.045534987]],"activation":"σ"},{"dense_2_W":[[-0.81077546,-0.10424342,0.6886152,0.848398,0.6319954,-0.058461085,-0.36828956],[0.60984695,0.55423707,-0.42063406,-0.32707918,-0.24104166,-0.48186648,-0.24464516],[0.161898,-0.48786223,-0.41306773,-0.6622412,-0.13313001,0.022441162,-0.036522806],[0.57633585,0.079778,-0.68529695,-0.6923111,-0.63098544,0.06022443,0.58791363],[-1.1134484,-0.025714546,1.190732,1.4953258,1.1254282,-0.68416023,-1.3409424],[0.33615056,-0.18059164,-0.32584703,-0.43712434,0.011917973,-0.38235188,-0.048886925],[0.27672747,0.2700329,-0.5545609,-0.17063317,0.06863414,-0.29364643,-0.068461105],[-0.75640607,-0.67021567,-0.8091184,-0.5977734,-0.33590022,0.33695093,-0.052878845],[-0.29990476,0.07485581,-0.18799536,0.3113804,-0.2548531,0.079891905,0.5823901],[0.7713344,0.40596846,-0.39756826,-0.42803642,-0.12433386,-0.5623329,0.15788138],[0.47727326,0.5254002,-0.44868997,-0.5893729,0.033892345,-0.47418627,0.5335775],[-0.5053448,-1.0315061,0.3315767,1.0608679,0.8883031,0.15161903,-0.40771657],[-1.3299836,-0.099792145,0.9213788,0.5617499,1.2194797,0.03981927,-1.172062]],"activation":"σ","dense_2_b":[[-0.3320475],[0.016477866],[-0.29854566],[0.0858396],[-0.28445113],[0.055967335],[-0.0076928814],[-0.32438016],[-0.011105792],[0.0491247],[-0.061171416],[-0.26423758],[-0.19981484]]},{"dense_3_W":[[0.07605307,-0.5657727,0.21602604,0.33659753,0.061791074,0.16310127,0.0704255,0.33747506,-0.37032503,0.48479742,0.47762752,0.07121615,-0.47501156],[0.60820574,0.17259821,-0.14938714,-0.53478646,0.82433504,-0.56874645,-0.27502382,0.037113808,-0.19531803,-0.52230936,-0.5779869,0.4101667,0.6944722],[-0.07375422,-0.5958687,0.09147497,-0.47058004,-0.16646929,0.12560609,-0.015372727,-0.5500357,0.5909702,-0.19595517,-0.6633332,0.46147022,0.5020841]],"activation":"identity","dense_3_b":[[-0.018324953],[0.00094535865],[0.0076563973]]},{"dense_4_W":[[0.03257061,0.92077035,0.33927587]],"dense_4_b":[[0.0008585189]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN.json deleted file mode 100755 index bebd461c43..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON 4TH GEN.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.8535337],[1.1871091],[0.57845885],[0.049630664],[1.1714827],[1.1759739],[1.1807529],[1.1754702],[1.163419],[1.1391207],[1.1146902],[0.049304288],[0.04938992],[0.04947085],[0.049577486],[0.049585983],[0.049360827],[0.048854783]],"model_test_loss":0.0038447733968496323,"input_size":18,"current_date_and_time":"2023-08-08_01-51-57","input_mean":[[23.75506],[0.019698216],[0.02125942],[-0.012130068],[0.02019723],[0.019409409],[0.020214675],[0.029943746],[0.034989115],[0.04343616],[0.04719076],[-0.012154487],[-0.012135111],[-0.012114784],[-0.012035617],[-0.012112525],[-0.012144607],[-0.012390441]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.2290616],[-0.06566025],[-0.26232734],[-0.014396481],[-0.23760305],[0.014094781],[-0.13057418]],"dense_1_W":[[-0.2349692,-0.0063291234,-0.035249587,0.08617903,-0.365861,1.0055882,0.2188088,0.1449217,-0.24121442,-0.4175699,0.37988308,0.62451494,-0.123622105,-0.09489112,-0.50720054,-0.44936404,0.0527042,0.2325743],[-0.0063050375,0.3207623,-0.0044895783,0.28548434,-0.507397,0.6541944,-0.6847768,0.43596634,0.030897599,0.20960332,-0.057178702,-0.21487401,0.053376693,0.13392489,-0.21650217,-0.109688595,0.039938804,-0.116206385],[0.2708052,0.5528461,-0.03331542,-0.12908351,0.06319576,0.12678441,0.13067268,-0.2470256,0.05019679,0.10845501,-0.038128812,0.35948697,-0.12627743,-0.37605998,0.25131917,0.24767017,-0.49968937,0.09801629],[-2.6202499e-5,0.37221593,2.4131448,-0.299408,-0.6506924,0.47218078,-0.29836714,0.32324246,0.577699,0.008439944,-1.0393782,0.1451764,-0.10641525,0.44623712,-0.0794428,-0.11800355,-0.12773673,0.28916764],[0.0017583282,-0.03781789,-0.21004789,0.41564634,-0.0032608341,0.31357232,-0.6957937,-0.53825456,-0.52614933,-0.6324325,-0.009301665,0.02049273,-0.048440617,-0.4821638,-0.18134792,0.3243188,0.33311984,0.39314845],[0.004920383,-0.533088,0.1415015,-0.13392477,-0.40952107,0.8444377,-0.8526385,0.7274967,0.9084346,0.18900108,-0.6379418,0.19544344,0.42572308,-0.39255446,-0.24895424,-0.019269833,0.0014590932,0.02395835],[0.00041457335,-0.469483,-0.03338856,0.17351627,0.01683441,-0.35584116,0.016615873,0.38706398,0.33813193,-0.23397829,-0.32178026,-0.17345887,-0.10871371,0.21958116,-0.042337235,-0.1781205,0.16341408,0.14160205]],"activation":"σ"},{"dense_2_W":[[0.44592378,0.15143807,-0.009424234,0.35239178,-0.09963268,0.55982405,-1.0174559],[-0.442566,0.29746428,-0.33482108,-0.014999504,-0.6711541,-0.40101603,0.6295242],[0.39900258,0.30389005,-0.26535806,0.3451803,0.120485105,0.536382,-0.30911598],[0.11134723,-0.23925714,0.19048968,-0.7852743,-0.16722661,-0.5444894,0.43297023],[0.07680695,-0.53264195,0.015406939,-0.086414926,-0.002185912,-0.81844103,0.35812145],[-0.40373468,-0.54447883,0.13417311,0.024675215,-0.48897472,-0.30226046,-0.10632472],[0.6465857,-0.38075125,-0.18136446,0.3086386,0.03399703,0.64962906,-0.71223384],[-0.46307555,-0.057900187,-0.23908263,-0.2741226,-0.4267321,-0.24727249,0.78550595],[0.0005410685,0.5130376,0.18730785,0.32222855,-0.16497147,0.5314175,-1.0230789],[0.019229718,0.06334568,-0.5937085,-0.46484637,-0.60105985,-0.21383111,0.51939124],[0.23276499,0.666815,0.71696717,-0.31990758,0.5952141,0.4067587,-1.1618655],[0.1722438,0.71504825,0.46906963,-0.13681711,0.47640622,0.45497712,-1.2770692],[0.3419466,0.85895354,0.057526387,0.11937055,0.3142995,0.68276507,-1.9635502]],"activation":"σ","dense_2_b":[[-0.24404627],[0.09535624],[-0.2836256],[0.032848567],[0.057316262],[0.049310047],[-0.25128764],[0.15491374],[-0.3825811],[0.13178083],[-0.30603507],[-0.29319304],[-0.7450717]]},{"dense_3_W":[[-0.30619392,0.6724943,-0.17787461,0.21804851,0.57443386,0.35076854,-0.5711128,0.59865326,-0.13248625,0.35207286,-0.35570997,-0.6262289,-0.32156947],[0.63655996,-0.082538255,0.31164888,-0.009138885,-0.13852367,-0.18027483,-0.38830742,-0.57337445,0.09914936,-0.7164049,0.45311737,-0.097862616,0.3133059],[0.21028735,0.1864526,0.24931045,0.3717982,0.38209185,-0.06889437,0.4184427,-0.15917623,-0.6388955,0.72339946,-0.59677637,-0.51407987,-0.3791772]],"activation":"identity","dense_3_b":[[0.06066313],[-0.053203672],[0.042732116]]},{"dense_4_W":[[-0.9345688,0.41612437,-0.1675497]],"dense_4_b":[[-0.06134532]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-P0100 2228'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-P0100 2228'.json deleted file mode 100755 index e4a5d71459..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.01 56300-P0100 2228'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.217079],[1.0207418],[0.529568],[0.040043645],[1.0053055],[1.0108265],[1.0154151],[1.0237554],[1.0261607],[1.0251414],[1.0156276],[0.039747525],[0.03984065],[0.0399419],[0.040151272],[0.040166046],[0.040242888],[0.040208846]],"model_test_loss":0.00269640376791358,"input_size":18,"current_date_and_time":"2023-08-08_04-21-19","input_mean":[[23.900599],[-0.008398695],[0.0015282386],[-0.007829772],[-0.009208989],[-0.008911737],[-0.008798698],[-0.005703768],[-0.0035596534],[-0.0031186447],[-0.0031662488],[-0.007885317],[-0.007857131],[-0.007826983],[-0.00763483],[-0.0073542255],[-0.0071039707],[-0.007163035]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-8.591739e-5],[-0.17085157],[-0.12687801],[4.364553],[0.8255702],[-0.8432205],[-4.7023892]],"dense_1_W":[[-0.00036674185,-0.15393308,-0.0043171174,0.52888125,0.19427226,1.0408313,0.117876925,-0.2845569,-0.089497805,-0.29269257,0.46610746,0.038173147,-0.28103483,-0.36340392,0.34743688,0.18314365,-0.16116409,-0.29159978],[-0.0051495107,-0.11477599,-0.15387562,0.12564987,0.4429667,-1.0813134,0.2080362,-0.20897992,0.1524622,0.039019175,0.15941331,-0.51186883,-0.16175619,0.35541835,0.15099002,-0.093263775,0.3209118,0.2376951],[-0.0045729824,0.17833863,-0.13646784,-0.19206388,-0.14445858,0.50118786,-1.1250085,-0.12486535,0.12982805,0.18782985,0.025482606,0.8972726,0.32246736,-0.6113951,-0.66491884,-0.60095704,0.4065867,0.78783005],[0.8883356,-0.004670374,-0.3004736,0.43118215,0.2730039,-0.73936516,-0.18756554,-0.30551004,-0.60160047,-0.4570068,0.42535797,-0.5673324,0.23564544,0.31826892,0.3946162,0.030204464,-0.21274225,-0.18297665],[0.5877724,-0.5607949,-2.7950788,0.3463737,0.3446188,-0.49314648,0.37603086,0.14976244,-0.11499728,-0.20843907,0.7227414,-0.21543501,-0.25004113,0.5456382,-0.35219005,-0.28194588,0.22977184,-0.019029563],[-0.42525807,-0.37978706,-2.812959,-0.20304315,0.23198645,-0.7054526,0.9276223,-0.21462558,-0.45101932,0.18400525,0.6539824,-0.4523719,-0.067426644,0.8022,0.12475116,-0.29360187,0.1820839,-0.08618455],[-0.8887159,-0.47105905,-0.30436194,0.5955465,0.044637978,-0.35214606,0.17866008,-0.38256323,-0.6545903,-0.4565794,0.49180064,-1.1552716,0.23951262,0.5748429,0.9034781,-0.27641115,-0.06816631,-0.3625054]],"activation":"σ"},{"dense_2_W":[[-0.057308674,0.07639922,0.2855919,0.06315537,-0.5223864,-0.32385927,-0.7735022],[-0.88395154,-0.36314768,0.18841538,-0.03785002,-0.5138743,-0.74670565,-0.33253807],[0.12478751,-0.6835147,0.49607527,-0.73937863,0.026476782,0.09121713,-0.42469463],[-0.7171305,0.4833388,-0.5362656,0.599928,-0.14776947,-0.052318748,0.46912462],[0.40110588,-0.31508088,0.4552697,-0.9951328,-0.36453304,0.095689364,-0.25619012],[-0.21850535,0.5483896,-0.102815315,-0.30166072,0.42355484,0.024482686,0.47288817],[-1.2052294,0.0726458,-0.46747494,0.19683914,-0.39607075,0.4458234,1.4317138],[0.19502828,-0.048589204,-0.19319248,-0.6721833,0.011818287,-0.031072982,-0.28005797],[-0.019494833,-0.30039933,-0.5927758,0.06800316,-0.08778525,-0.50062007,0.1897266],[0.15044136,-0.33724236,-0.27866372,0.012466757,0.35915533,-0.41124758,-0.57960784],[0.114993274,-0.24257775,0.6021602,-0.96579486,0.07640555,-0.3595668,-0.405754],[0.5267543,-0.18335517,-0.13551843,0.045388196,-0.58716494,-0.32110387,-0.0056233923],[-0.36361262,0.5996567,-0.4573528,0.7281233,-0.21097347,-0.55819994,1.4120568]],"activation":"σ","dense_2_b":[[-0.10522118],[-0.31128448],[-0.07047554],[0.011506447],[0.010999659],[-0.14467213],[-0.42379537],[-0.1810383],[-0.13019946],[-0.102506414],[-0.04960739],[-0.026930744],[-0.10272136]]},{"dense_3_W":[[-0.5352019,0.019407902,-0.4207235,0.6295458,-0.6254561,0.53919613,0.25542,-0.08012609,-0.44455698,-0.5093523,-0.5136104,-0.34459922,-0.37261885],[0.2026642,0.60963094,0.4016697,0.10310326,0.7051762,0.050026696,-0.55055726,0.1682248,0.48129147,0.19183299,0.45172593,-0.32796833,-0.81298125],[-0.4364362,-0.31193537,-0.17849928,-0.27077642,-0.2368534,-0.31495923,0.20951663,-0.035278384,-0.5224049,-0.42713875,0.56383544,0.28901008,-0.67109203]],"activation":"identity","dense_3_b":[[0.064849064],[-0.06753018],[-0.040117458]]},{"dense_4_W":[[-0.8941895,0.62574023,0.66779023]],"dense_4_b":[[-0.055856243]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-P0000 0B27'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-P0000 0B27'.json deleted file mode 100755 index 363238aa43..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.02 56370-P0000 0B27'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.403178],[0.7899407],[0.46679014],[0.038778264],[0.78739744],[0.78873724],[0.7892707],[0.7664106],[0.7474393],[0.72352415],[0.7035473],[0.038599715],[0.038635705],[0.03867455],[0.038486294],[0.03835014],[0.037975483],[0.037434243]],"model_test_loss":0.0036874583456665277,"input_size":18,"current_date_and_time":"2023-08-08_04-46-00","input_mean":[[21.313442],[-0.007652719],[-0.0010814818],[-0.015364245],[-0.008704642],[-0.0084470315],[-0.008181152],[-0.009390086],[-0.006841837],[-0.005270116],[-0.004453076],[-0.015435301],[-0.015421092],[-0.015408219],[-0.015379849],[-0.015380499],[-0.01542405],[-0.01552717]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.015034866],[-2.333925],[0.07472282],[0.33385256],[-1.7635626],[0.20520012],[1.4994509]],"dense_1_W":[[-0.020420635,0.47671422,-2.2228365,0.061408564,-0.33446848,-0.34008023,0.24743442,-0.049677674,-0.3092543,0.027715717,0.2433644,0.22493373,-0.33363193,-0.21346657,0.053122807,0.13210946,0.15116207,-0.1479962],[-0.7627412,-0.33639726,-0.017733732,-0.26600602,-0.030820448,-0.4295762,0.34820956,0.049817856,-0.08305463,0.0075742602,-0.021596808,-0.45695007,0.3086963,0.84450537,-0.5957173,0.10477459,0.18988973,-0.06328525],[-0.06376427,0.20835318,0.002514508,0.26117352,-0.62271047,-0.19520147,0.32756966,0.06494971,0.0065356204,-0.080957,-0.078121,-0.3372254,-0.0696566,0.28001508,0.14789122,0.07902147,-0.37852517,0.10395386],[-0.023382343,-1.0105892,0.16153766,-0.05629362,0.98606056,-0.38667163,0.120815866,-0.0031459653,-0.0114722485,-0.10742418,0.29860422,0.0918033,-0.18897793,0.8804208,0.28319594,-0.3183279,-0.60766125,-0.98080194],[-0.7378326,0.35443896,-0.0014945221,0.23333554,-0.066297725,0.59670603,-0.48733267,-0.0073978053,-0.15717119,0.0717004,0.048404034,0.22451897,-0.4241085,-0.28380367,-0.052011304,0.5055362,-0.11498784,-0.12756315],[-0.004277259,0.42898464,0.09345899,-0.24447562,-0.45621815,0.31656915,-0.1402948,0.04722811,0.008236777,-0.17245218,0.09979451,0.3201254,0.48197353,0.14734976,-0.1808025,-0.3086107,-0.4733515,-0.280876],[1.5839243,0.048649643,-0.01699404,-0.14009474,-0.11868921,0.5394154,-0.35899943,-0.021968285,-0.117241286,0.027508566,0.05609089,0.72090036,-0.19876392,-0.5080364,0.174731,-0.023319548,-0.32231605,0.2783173]],"activation":"σ"},{"dense_2_W":[[-0.22034773,-0.31270447,0.5831825,-0.3320837,-0.39305016,-0.6177819,0.22597681],[-0.5904076,-0.52282643,-0.20162795,-0.12272505,0.43796244,0.72379744,-1.1039912],[-0.3313703,-0.2817194,-0.5364639,-0.57078487,0.87520176,0.567861,-0.7439988],[-0.78400034,-0.3179023,-0.55988556,0.032341063,1.5522407,0.6788271,-1.6406517],[0.010183664,0.27435702,0.79238176,-0.10173684,0.32933375,-0.51913565,-0.42577544],[-0.69303,-0.39014181,-0.107236296,-0.48264664,1.0204724,0.5373991,-0.97509813],[-0.14288978,0.6519878,0.8277582,-0.12722696,-0.00015177799,-0.6953236,-0.16517387],[-0.3694772,-0.12806806,-0.33594415,-0.653893,0.2182475,-0.26103872,-0.2874901],[-0.07374445,0.19246729,0.5173003,0.61818415,-0.022056762,-0.5472877,-0.58056134],[-1.0251218,-1.2561343,-0.07483788,-0.9255225,0.44686273,1.6848487,2.3562455],[-0.349229,-0.21101256,-0.5525006,-0.7540905,0.49885616,0.4253754,-0.5412813],[-0.12317935,-0.6319155,-0.8908915,0.08234697,0.8512533,0.3687786,-0.09611299],[0.05607153,0.01724528,0.10498003,0.18284152,-0.31280768,-0.2632974,-0.622548]],"activation":"σ","dense_2_b":[[-0.025739571],[-0.23397255],[-0.0609166],[-0.2377031],[-0.022815771],[-0.3112023],[0.03326642],[-0.33141518],[0.0427826],[0.45685703],[-0.23909605],[-0.019891355],[-0.017059732]]},{"dense_3_W":[[0.048393164,0.01459173,0.55632687,0.16953933,-0.6129878,0.27854604,-0.30732617,-0.3395474,-0.6306935,0.41403195,-0.24093059,0.3859709,-0.14472291],[0.6029767,-0.49897185,-0.55901927,-0.5471171,-0.2063777,0.09599516,0.64774793,-0.48304877,0.38883877,0.17090505,-0.65467936,-0.7351466,0.53769803],[-0.08842656,0.06706266,-0.32794118,0.12725264,-0.24223024,-0.19160233,-0.22151925,-0.39071792,0.48049617,-0.7938209,-0.2654298,0.28608698,-0.3520467]],"activation":"identity","dense_3_b":[[-0.05909381],[0.06149542],[0.10376763]]},{"dense_4_W":[[1.2233244,-0.6344225,-0.43675804]],"dense_4_b":[[-0.06323359]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.05 56300-P0000 1514'.json b/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.05 56300-P0000 1514'.json deleted file mode 100755 index 8b65df1a06..0000000000 --- a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN b'xf1x00NX4 MDPS C 1.00 1.05 56300-P0000 1514'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.7955017],[0.89799774],[0.5061451],[0.04870496],[0.897324],[0.89804333],[0.8983218],[0.88777643],[0.8856539],[0.87744457],[0.8659113],[0.048619226],[0.048616584],[0.048609655],[0.048495032],[0.048379052],[0.048049383],[0.047698256]],"model_test_loss":0.0017304600914940238,"input_size":18,"current_date_and_time":"2023-08-08_05-11-25","input_mean":[[23.104206],[-0.034794316],[-0.020573495],[-0.0021940465],[-0.028357053],[-0.030680137],[-0.032690864],[-0.042001907],[-0.0496564],[-0.052361522],[-0.051856462],[-0.0021513677],[-0.0021468238],[-0.0021485426],[-0.002253827],[-0.0023359228],[-0.0024148696],[-0.0024249407]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.08124138],[0.1903408],[-0.013999624],[-0.17143527],[0.1768055],[-0.20094149],[-3.179182]],"dense_1_W":[[0.0024723092,-0.09259051,-0.09757232,-0.12717314,0.25085792,-0.30573526,0.052445546,-0.08738104,-0.29787505,0.27411562,-0.018140156,-0.3799589,0.09386907,0.09939116,0.5356948,0.31420502,-0.38083148,-0.029328207],[-0.15488878,0.20467338,0.35297525,-0.60644305,0.6169192,0.115096435,0.48780584,0.056056496,-0.08405607,-0.23489293,0.92967564,-1.6062328,-1.3127173,0.013400019,-1.0209213,-1.1354511,-0.38825014,-1.3973286],[-0.005542379,0.099915504,-0.03526838,0.2042634,0.01714366,0.5498627,-0.26516965,-0.062147252,-0.019922264,-0.098149635,0.15541059,0.5616284,0.28126147,-0.5231745,-0.4385349,-0.16692646,-0.11820826,0.13180146],[-0.001893487,-0.12823583,-0.057376172,0.4284407,-0.047093183,-0.71953607,0.5155282,0.009202056,0.2418623,-0.21878259,-0.012335793,-0.03496361,-0.45879838,0.49171248,-0.1584971,-0.1781668,0.06704749,0.10256722],[0.08270151,-0.091461316,-2.2379663,-0.0538001,0.56830716,-0.22148854,0.0931062,-0.2950928,-0.50371003,0.100836776,0.6016303,0.26128513,0.41152674,0.28541353,-0.695136,-0.79610765,0.3173571,0.21472184],[0.16334678,-0.5975227,-0.34775907,1.1889083,0.43193462,-0.41070813,0.43282235,-0.7802282,-1.0563897,-0.5516799,0.39116058,0.38568383,0.96553546,1.4799829,0.5509527,0.6597429,1.5476053,0.72938883],[-1.1631825,-0.011732463,-1.3126845,0.18595614,-0.5279944,-0.20657395,0.09089918,-0.21701668,-0.29725736,0.09534146,0.16501014,-0.01930718,0.22282849,-0.078318045,-0.2752747,-0.5757349,0.60279995,-0.0931696]],"activation":"σ"},{"dense_2_W":[[-0.781368,-0.6196695,0.22133054,-0.58676493,-0.6143645,-0.38137332,0.5647905],[-0.28955936,-0.5514581,0.023019072,-0.7495296,-0.008635288,-0.43638018,-0.39646024],[-0.3833366,-0.34759468,-0.06495598,-0.098383896,-0.5783148,-0.16990937,-0.03879645],[-0.70470786,-0.24903737,0.15529387,-0.11518866,-0.5277072,0.20462422,-0.35701025],[0.36111197,0.36466828,-1.0183784,0.010062257,-0.2265021,0.78467375,0.3216761],[0.2558025,0.8101411,-0.42377698,0.6952867,0.50709,0.31241566,-0.44120306],[-0.44082734,-0.80780107,0.7503476,-0.26734918,0.42134613,0.060052637,-0.49203876],[-0.21579593,-0.85413295,0.5198353,-0.04937046,-0.25109845,-0.071964934,-0.1370948],[-0.2127926,0.023194531,-1.0355452,0.80749786,0.2418679,0.07336516,0.5543946],[-0.20147315,0.13373135,0.42837965,-0.2858223,-0.08012954,-0.6707916,-0.3436601],[-0.6738826,0.17187825,-0.07171224,-0.5686729,-0.63062835,-0.11246825,0.1411205],[-1.3131889,-0.8463761,0.691169,-0.7734476,-0.655862,-0.7365177,1.823689],[-0.31629813,-0.037334282,0.023063287,-0.9846409,0.076071545,-0.34590834,-0.38197684]],"activation":"σ","dense_2_b":[[-0.008497481],[-0.0669677],[-0.09891911],[-0.05246839],[-0.18587142],[-0.30422455],[0.1410383],[-0.2284569],[-0.499407],[-0.043939065],[-0.31666586],[0.44777015],[0.034658033]]},{"dense_3_W":[[0.23496294,-0.28386167,0.27681643,0.5520175,-0.75150144,-0.37156543,0.30156407,-0.27607068,0.30984825,0.5151721,0.37007424,-0.33879584,0.4097188],[0.31137607,0.26859313,0.34590572,-0.0062326957,-0.6559486,-0.36561298,0.4681323,0.16856219,-0.8273677,0.40059263,-0.12678978,0.7264656,0.6313906],[0.524701,-0.33622202,0.03420367,-0.34464833,-0.37003994,-0.43387958,0.36096427,-0.07529622,-0.31695953,-0.47834525,0.23216519,0.530552,0.54391605]],"activation":"identity","dense_3_b":[[-0.085940674],[-0.08410808],[0.08695583]]},{"dense_4_W":[[0.3335539,1.011704,0.07253775]],"dense_4_b":[[-0.07161993]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_ELANTRA_2021.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA 2021.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_ELANTRA_2021.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_ELANTRA_HEV_2021.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI ELANTRA HYBRID 2021.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_ELANTRA_HEV_2021.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI GENESIS 2015-2016.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_GENESIS.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI GENESIS 2015-2016.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_GENESIS.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_5.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ 5 2022.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_5.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_EV_LTD.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ ELECTRIC LIMITED 2019.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_EV_LTD.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_PHEV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI IONIQ PHEV 2020.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_IONIQ_PHEV.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_EV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2019.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_EV.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2022.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_EV_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI KONA ELECTRIC 2022.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_EV_2022.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_HEV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI KONA HYBRID 2020.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_KONA_HEV.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_PALISADE.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI PALISADE 2020.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_PALISADE.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2019.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE 2022.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_2022.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_HEV_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE HYBRID 2022.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_HEV_2022.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_PHEV_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SANTA FE PlUG-IN HYBRID 2022.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SANTA_FE_PHEV_2022.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2020.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA_HYBRID.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SONATA HYBRID 2021.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA_HYBRID.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2019.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA_LF.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI SONATA 2019.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_SONATA_LF.json diff --git a/selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN.json b/selfdrive/car/torque_data/lat_models/HYUNDAI_TUCSON_4TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/HYUNDAI TUCSON HYBRID 4TH GEN.json rename to selfdrive/car/torque_data/lat_models/HYUNDAI_TUCSON_4TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68417283AA'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68417283AA'.json deleted file mode 100755 index 4dd26dd5c5..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68417283AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.8728914],[1.2090142],[0.50676817],[0.040933758],[1.2023742],[1.205829],[1.2078925],[1.1974459],[1.1874248],[1.1770345],[1.1642895],[0.040819507],[0.04086639],[0.04089597],[0.040786948],[0.040585384],[0.04012954],[0.039522402]],"model_test_loss":0.006614471320062876,"input_size":18,"current_date_and_time":"2023-08-08_06-01-10","input_mean":[[26.654694],[-0.054407947],[-0.01670446],[0.0044869445],[-0.050178558],[-0.052209977],[-0.05427611],[-0.056261167],[-0.0544454],[-0.055462785],[-0.055245146],[0.004572334],[0.004530314],[0.0044882884],[0.004352177],[0.0042599128],[0.0041515296],[0.0040832255]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.43810543],[-0.49519923],[-2.1822188],[-0.58497167],[0.47684842],[-0.09626731],[-2.2094405]],"dense_1_W":[[0.76050776,0.1499411,0.381249,0.04709322,-0.32396638,0.3491626,-0.782436,0.34238994,-0.08037048,0.6680065,0.33735675,0.22206604,-0.103562996,-0.31060776,-0.43599552,0.16334474,-0.25804174,-0.082635574],[0.0035128025,0.5811635,-0.004408256,-0.37787032,0.03389848,0.4616148,-0.32768515,0.18803275,-0.052016713,-0.3570066,0.24113122,0.42042783,0.2498919,-0.17125513,-0.33577308,-0.14208402,0.236966,0.011127863],[-0.18902422,0.9714371,0.0059900363,-0.38097516,-0.22164193,0.20545805,-0.076091416,0.31648,0.11805389,0.18802157,-0.22251801,0.5153625,-0.05821966,-0.091360226,0.0012999892,-0.16460156,-0.16339059,0.15703438],[-0.03422036,0.92381644,6.921008,0.24507758,-0.7177696,-0.6458995,-0.4362909,0.48058942,1.076679,0.42145476,-0.9482223,0.61656874,0.5209579,0.41245258,-0.7608114,-0.24345283,-0.6975248,0.038341008],[0.07477459,0.78708345,0.004199321,-0.23788536,0.15640183,0.40163487,-0.41976067,0.0005454862,-0.054376323,0.094340526,0.030391933,0.49687427,-0.21395701,-0.09833246,0.019072657,-0.102057405,-0.07488578,0.069800615],[-0.74563086,0.5257453,-0.38915852,-0.014258607,-0.014805873,-0.021846136,-0.42956972,0.027794166,0.47592774,-0.21122316,-0.9867605,0.27827996,0.026848149,0.1879612,-0.11019756,0.01456598,0.033016063,0.34982008],[-1.017594,0.6378586,0.49575526,-0.25753835,-0.713349,-0.26929113,-0.6297332,0.2448187,0.93313706,0.418847,0.17675856,0.16072711,-0.031137649,-0.1681622,-0.18200019,-0.021670578,-0.45446116,0.0076085203]],"activation":"σ"},{"dense_2_W":[[0.7745368,0.0051938873,-0.11890521,0.88995504,0.2751288,0.54162115,0.06283707],[0.54824007,0.6159212,0.62110627,-0.4791488,0.16185509,0.3104695,0.45510858],[0.52840376,0.49313548,0.55167854,-0.34572417,0.9121422,0.53487015,0.17644465],[-0.4247197,-0.5281056,0.21303625,-0.6262236,-0.13522103,-0.26233667,-0.14396249],[-0.508547,-0.39328104,-0.39791986,-0.37415636,-0.91709316,-0.24228512,0.27710044],[-0.3951146,-0.31486347,-1.1718545,0.5269846,-1.1596807,-0.5815726,-0.14178322],[0.5949875,0.6315601,0.40430224,-0.038406808,0.53312445,0.18815556,0.085526235],[-0.29179358,-0.8260168,-0.18030375,0.07779656,-0.5514634,-0.49806046,-0.1366583],[-0.73898417,-0.016584689,-0.3333454,-0.22896339,-0.05116171,-0.1202695,-0.32896835],[-0.15493649,-0.76765895,0.004673897,0.10474267,-0.16431782,-0.014079051,0.23144981],[-0.042101637,-0.17159042,-0.7375734,0.071759894,-1.0362455,-0.43458578,-0.23665032],[0.7093842,0.9741466,-0.3642162,0.9787917,0.6507126,0.5392259,-0.42433175],[0.26979947,-0.52341074,-0.9280764,0.26746207,-0.5718743,-0.6411997,-0.5801518]],"activation":"σ","dense_2_b":[[-0.5332849],[-0.6305155],[-0.58254653],[0.12631744],[0.15982336],[0.32477045],[-0.57614744],[0.058194503],[0.30769274],[-0.14737707],[0.074832365],[-0.38743407],[0.04811002]]},{"dense_3_W":[[-0.55727553,-0.051364966,-0.17064416,0.2017602,0.008057165,0.32420316,-0.6367807,0.18341993,0.56611097,0.17584346,0.7482443,0.2938565,0.06779992],[-0.24583314,-0.08192307,0.26317647,0.64154226,0.37813106,0.21800083,0.3874455,0.1719494,0.24538884,-0.30450168,0.12902369,-0.38736972,0.76431566],[-0.04105808,-0.18581067,-0.69706976,0.6209051,0.670406,0.60423225,-0.6668137,0.18300876,0.7437342,0.09521902,0.0137198325,-0.62237316,0.23223503]],"activation":"identity","dense_3_b":[[0.09012325],[0.0749679],[0.11545244]]},{"dense_4_W":[[-0.48435527,-0.45564538,-1.096167]],"dense_4_b":[[-0.0997911]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68453433AA'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68453433AA'.json deleted file mode 100755 index 9ddff83051..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68453433AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.43866],[0.9594654],[0.3912325],[0.038489565],[0.9550493],[0.9573054],[0.95820725],[0.9453249],[0.93590647],[0.9254975],[0.91544265],[0.03837764],[0.038416598],[0.03845292],[0.038414918],[0.038395535],[0.038228408],[0.0379494]],"model_test_loss":0.005756708327680826,"input_size":18,"current_date_and_time":"2023-08-08_06-49-45","input_mean":[[27.448889],[-0.0067297285],[-0.012206868],[-0.012023059],[0.0005211621],[-0.001140509],[-0.002781004],[-0.0060957638],[-0.008815731],[-0.008225145],[-0.010236002],[-0.011980975],[-0.011978335],[-0.011977974],[-0.012018364],[-0.012198565],[-0.012354674],[-0.01254546]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.26672667],[0.020335548],[-0.3113232],[-1.0529982],[0.40098032],[-0.9344168],[0.20128816]],"dense_1_W":[[0.48369458,-0.3686703,0.0016632332,-0.16971397,0.25181967,-0.46175927,0.4843163,-0.374836,-0.37514406,0.34082055,0.026280358,-0.6478774,0.15835607,0.16001779,0.37194988,0.37345862,0.036551144,-0.28789935],[0.07043975,-0.45260653,-0.00046572334,0.37180796,0.5052569,-0.923053,0.37163734,-0.23138288,0.10260282,0.188695,-0.19567782,0.021202957,-0.079410076,-0.09227521,-0.18622167,0.41924185,-0.40328145,0.18227412],[0.017748738,-0.48881784,0.004065963,-0.21506804,0.54495573,-0.85553426,0.14905618,-0.029548364,-0.5290159,-0.07689605,0.3329747,-0.54319984,0.00667545,0.7586954,0.2262732,0.29633564,0.26088232,-0.29550886],[-0.64260155,0.3662986,3.173239,0.63683313,-0.6430913,0.4424823,-0.16027375,0.084609404,0.03705194,0.081928365,-0.097669385,0.18059629,-0.5149442,0.03890781,-0.11840206,-0.10823692,-0.1191671,0.04037941],[0.10563207,0.49981126,0.0029415153,-0.10415694,-0.18625958,0.90915346,-0.7287493,-0.13796005,-0.015489749,0.38912502,-0.15327297,0.3765297,0.088555075,-0.50586104,-0.13467893,0.12457146,0.046435032,-0.057002276],[-0.5938456,-0.024423348,-3.6706417,0.34764245,-0.1914768,-0.114475735,0.13170964,-0.187258,0.2949009,0.20557038,-0.3126963,-0.4473035,-0.41970354,0.6434845,-0.025949601,-0.27021688,0.10270479,0.02460305],[-0.54888344,-0.6696987,-0.00082320906,0.32633713,0.005453797,-0.47443417,0.67143047,-0.013440813,0.004097872,-0.007966471,0.0029117528,-0.3179762,0.02713174,0.09619391,-0.028661765,-0.37402767,0.26313016,-0.016989414]],"activation":"σ"},{"dense_2_W":[[0.5209726,-0.25359967,0.6619714,0.39587265,-0.35387352,-0.04535335,0.120071486],[0.48709035,0.3180766,0.29595408,0.098535866,-0.2987927,0.057739243,0.22679059],[0.23933189,-0.08163726,-0.9657385,-0.4965831,0.68811953,0.09032152,-0.6589171],[0.57636416,0.39442053,0.18478166,-0.12974693,-0.8272915,-0.29775232,0.20715299],[-0.5449741,-0.9353625,-0.31370834,-0.13274054,0.83518785,0.008355828,0.033751678],[0.35901573,-0.66106963,-0.1888595,0.41194937,1.588338,-0.5385817,-0.740165],[-0.98802006,-0.67757845,-0.0989083,0.26249525,-0.2753127,-0.47687986,0.025367346],[0.2892236,0.35800815,-0.13770878,0.55578154,-0.785857,-0.08480091,0.64590573],[0.09093238,-0.48290733,-0.99116063,0.46500945,0.6056846,-0.012176678,-0.12520207],[-0.9990715,-0.28646934,-0.07094919,0.5173688,0.10600437,0.06450096,-0.5188569],[0.68128484,0.008618474,-0.09483195,-0.17140749,-0.6186476,0.34410867,0.29150036],[0.80427694,0.737846,-0.22390766,-0.50543666,0.05763516,0.29581627,0.14593346],[-0.56531626,-1.014788,-1.0390762,0.37543738,0.08958771,-0.27486435,0.24934056]],"activation":"σ","dense_2_b":[[-0.1413122],[-0.15693974],[0.034285396],[-0.10772752],[0.21373348],[0.5429162],[-0.24522312],[-0.023586268],[0.023880517],[0.17696953],[-0.12841567],[-0.026000533],[0.11256094]]},{"dense_3_W":[[0.02749057,-0.4342947,0.59011424,-0.0131820105,0.4288545,0.41173843,0.3578794,-0.13965432,0.16253465,0.36047092,-0.64697146,-0.6048068,0.70385855],[-0.53569496,0.30542025,0.6883935,-0.63130975,-0.15454243,0.19938475,-0.52876604,-0.5835625,0.46811375,0.43471345,0.46132883,-0.004729517,-0.20376478],[0.23920149,-0.5100696,0.109994635,-0.41538352,0.65883255,0.04808402,0.65057176,-0.26300353,0.67316395,-0.23753574,-0.6068177,-0.36342996,0.5059538]],"activation":"identity","dense_3_b":[[-0.043995153],[-0.035359237],[-0.028157346]]},{"dense_4_W":[[1.0061214,0.5680961,0.2576211]],"dense_4_b":[[-0.04061578]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68499171AB'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68499171AB'.json deleted file mode 100755 index a74e54d2e9..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68499171AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.5967526],[1.0102762],[0.43027443],[0.05251798],[0.999985],[1.0024607],[1.0053881],[1.0012413],[0.98920035],[0.97731537],[0.96259564],[0.052146535],[0.052252885],[0.05235032],[0.05248029],[0.052331988],[0.05202955],[0.05168756]],"model_test_loss":0.009552407078444958,"input_size":18,"current_date_and_time":"2023-08-08_07-40-22","input_mean":[[27.414038],[-0.0075059575],[-0.004310022],[-0.012558367],[-0.005643982],[-0.006085868],[-0.0062815067],[-0.006680969],[-0.006342892],[-0.005391843],[-0.004076586],[-0.012551318],[-0.012558776],[-0.0125591215],[-0.0125386985],[-0.012456482],[-0.012317335],[-0.012218792]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.010202121],[-0.20869955],[-1.2660872],[-0.054420657],[0.055866957],[-1.3448147],[-0.8834831]],"dense_1_W":[[0.0012557846,-0.6672937,0.0010295995,0.32252085,-0.048310652,-0.5376883,0.7697637,0.0823376,-0.30575013,-0.26277706,0.24928996,-0.8753449,-0.5025692,-0.077491626,0.5145067,0.079226255,0.5474699,0.06658418],[0.0039056255,0.9247404,-0.009912007,-0.25928807,0.99379,0.96465033,0.08479168,0.010440816,0.27576396,0.073882826,0.17389007,0.53772444,0.30138925,-0.32761773,0.63664806,0.24958122,-0.05548543,-0.2774185],[-1.1338029,0.7972837,2.7477882,-0.2877902,-1.754552,-0.2689002,-0.63449675,0.42324004,1.8994156,0.73137105,-1.1024318,1.0254707,0.08409975,-0.529214,-0.502221,-0.14801149,-0.4222293,0.6621312],[0.00042969367,-0.8577691,-0.0021418685,0.35081863,0.65922713,-0.6490291,0.2931224,-0.60029286,-0.014103398,0.47114435,-0.123872444,-0.43758586,-0.47995508,0.6163008,0.4267091,0.38276717,-0.47198132,-0.14263928],[0.00044543247,0.36023495,0.0021837356,-0.2779762,0.05987485,0.64892846,-0.517532,0.32271734,-0.18660611,0.28274518,-0.1146797,0.13610251,0.5230807,-0.19606018,-0.39453036,-0.046586644,-0.046734218,0.08382657],[-1.2255402,-0.22072525,-2.8729386,-0.25934264,1.7529143,0.06705062,0.02021511,0.045151696,-1.9299484,-0.7893005,0.9692529,-0.14630248,-0.14744897,0.118275866,0.6106455,0.28660807,-0.06394074,-0.28017327],[0.005199153,-1.1621727,0.00077480485,0.17639922,0.46977073,-0.020649184,0.18502355,0.5452717,-0.090024605,0.017219655,0.016716335,0.6221494,1.1390406,1.5075128,0.48781365,0.17463161,0.10828733,-0.43913674]],"activation":"σ"},{"dense_2_W":[[-0.58769137,0.05236564,0.35124663,0.04817339,0.2898144,0.28079572,-0.00064369116],[0.005263831,0.19137648,-0.48806444,-0.23123759,0.6268823,-0.16993119,0.34425706],[-0.5901436,-0.23695424,0.098380215,-0.17219543,0.48076913,-0.4071234,0.28624105],[0.14382643,0.13441655,0.45674977,-0.027003672,0.56117404,-0.45108694,0.33755574],[-0.2538037,0.45569667,0.27736127,-0.23255807,0.07589655,-0.2602569,-0.5057338],[-0.46332666,-0.13729805,-0.12543498,-0.39890754,0.0796631,0.31270605,-0.31902856],[0.49847755,-0.2749227,0.0026628354,0.55073225,-0.50455254,-0.07015729,0.18485697],[0.16384278,0.4331959,-0.2250921,0.16277151,0.5106723,0.31678322,-0.18506958],[0.2638649,0.3195002,-0.43078262,0.13981557,-0.004984484,-0.5785593,-0.18042926],[0.19678845,0.00667378,-0.30015993,0.36041152,-0.8781901,0.11745428,0.40608066],[0.15176365,-0.2606354,-0.27513868,0.46041733,-0.14977318,0.29587746,0.034236424],[0.5043066,0.046352975,-0.06961968,0.10950722,-1.003576,0.024827112,0.36801037],[-0.18985961,-0.4802785,0.3937008,-0.663785,0.06894842,0.10332041,0.35070738]],"activation":"σ","dense_2_b":[[-0.030413345],[-0.018623633],[0.037994068],[-0.039921794],[0.06337368],[-0.0037913572],[-0.11922998],[-0.01326628],[-0.015669143],[-0.30007255],[-0.0722405],[-0.16496572],[0.00060786883]]},{"dense_3_W":[[0.32435206,0.028846495,-0.13252908,-0.1982058,-0.36715662,-0.30138585,0.46504492,-0.31018558,-0.24452554,-0.29342332,0.51592284,-0.40441313,-0.0497606],[-0.08831045,-0.06720264,-0.1351913,-0.31066024,0.31655452,-0.31953314,-0.49679926,0.38395572,-0.3895881,-0.047352865,0.13741386,-0.31013528,0.3948293],[0.45862782,0.2571993,0.62897617,0.37644735,0.40071562,0.31087562,-0.5142998,-0.41985396,0.27594817,-0.54097104,-0.5071787,-0.6661379,-0.014177239]],"activation":"identity","dense_3_b":[[-0.006262847],[0.010518014],[0.007370069]]},{"dense_4_W":[[-0.95558,0.989042,1.2003003]],"dense_4_b":[[0.007831933]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68501183AA'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68501183AA'.json deleted file mode 100755 index d1a79626db..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019 b'68501183AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.452467],[0.86690396],[0.40215713],[0.040074926],[0.8606064],[0.8630931],[0.8649407],[0.85491246],[0.844539],[0.8305169],[0.81689984],[0.03982056],[0.039912425],[0.039979994],[0.039879803],[0.03978153],[0.039445743],[0.03891937]],"model_test_loss":0.010768964886665344,"input_size":18,"current_date_and_time":"2023-08-08_08-04-56","input_mean":[[27.322044],[-0.024251966],[0.010604335],[-0.013273577],[-0.024150817],[-0.02318872],[-0.022487855],[-0.016739838],[-0.013881857],[-0.01513014],[-0.018847467],[-0.01310166],[-0.0131332185],[-0.013161585],[-0.013236801],[-0.0134922145],[-0.013910382],[-0.0144336065]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.7449901],[0.5293309],[-0.13684131],[-0.012751344],[-0.7529798],[-0.23311737],[0.07853056]],"dense_1_W":[[-0.13072656,0.6283987,0.015078402,-0.054005172,-0.2233314,0.45095843,-0.43263704,0.04728289,0.26050776,-0.021932844,-0.11329059,0.54408914,-0.4077183,-0.18935005,-0.10371036,0.2651148,-0.35418501,0.19614394],[-1.7171507,-0.3317916,0.004072612,-0.15467915,0.41885808,0.92006916,-0.8898168,-0.4614065,0.29903418,0.25961474,-0.05122034,-0.20094745,0.5485216,0.06610662,0.016513953,-0.37984493,-0.1926293,0.29794264],[0.007063484,0.6856636,-0.011413773,-0.72127,-0.20380542,1.0480517,-0.8238829,0.2790337,-0.3606132,0.31933337,-0.07325723,0.5433965,0.121130235,-0.2291283,-0.32528403,0.11580332,0.12170283,0.054295488],[0.12663618,0.91206276,0.004443536,-0.30484363,-0.75032,0.7143595,-0.5558535,0.1742707,0.3093525,-0.26842314,-0.069468714,0.12913592,0.27518988,0.11542955,-0.49559456,0.11280359,-0.117812514,0.20811172],[1.7389579,0.4180518,-0.01172704,0.21032059,0.47659472,-0.032733813,-0.875458,0.10615792,-0.013827842,0.23314281,-0.13350959,0.48809958,0.059256323,-0.3293328,-0.038980376,-0.70255446,-0.111022756,0.4263937],[-0.047828943,0.9741059,1.9788678,0.035556808,-0.33137748,0.06869328,-0.0728806,0.30185872,0.42945105,-0.2668291,-1.0493917,0.75109553,-0.044287033,0.2789782,-0.78056633,-0.5101993,-0.1294507,0.57637715],[0.06523681,-1.1740252,-5.89938,-0.22002901,1.5458798,0.5268267,1.4306431,-0.6207323,-1.5871657,-0.4998738,0.18801236,-0.4513105,-0.568868,-0.10367136,0.37126714,0.53899825,0.38020688,0.17896129]],"activation":"σ"},{"dense_2_W":[[-0.8985011,0.11458038,-0.37006074,-0.9091467,0.08845758,-0.4780092,-0.09387305],[-0.30258346,-0.2478026,-0.138898,-0.72172093,-0.6169151,-0.314319,0.7819804],[-0.7148826,-0.49621424,-0.2916977,-0.6574481,-0.073164396,0.27022183,-0.113334574],[-0.20976768,0.049662825,-1.0442357,-0.4784036,-0.31232062,-0.010284477,0.37272945],[0.11602564,-0.09091442,0.43364218,-0.1808539,0.42867213,0.110103086,-0.30165982],[-0.2179075,-1.046752,-0.68968844,-0.23109698,0.047580823,-0.14457914,-0.8176898],[0.65831876,0.8798172,0.87773097,0.5937055,-0.42482352,-0.15033811,0.6182065],[0.017662104,0.35544062,-0.044278342,0.3860054,0.6023141,0.46972203,-0.08535246],[-0.2605915,0.6408727,0.7716486,-0.15743664,0.6014163,-0.008522242,0.12289313],[-0.77912825,0.11850717,-1.0912898,-0.14447807,-0.4524029,0.21814777,0.4140316],[-0.98378664,-0.28703195,-0.5935176,-0.41121966,-0.10323715,0.25849262,0.59001917],[-0.61543965,0.08229077,-0.11793402,0.059594512,-1.2362256,-0.30034783,0.43083572],[-0.15708973,-0.303757,0.52465874,0.088811316,0.15832427,0.11913656,-0.2735138]],"activation":"σ","dense_2_b":[[0.3555512],[0.1413531],[0.0609361],[-0.0072417697],[-0.06120809],[0.16177845],[0.00092023175],[-0.15782398],[-0.20185831],[-0.07573758],[0.08495398],[-0.36860523],[-0.06752801]]},{"dense_3_W":[[-0.17603812,-0.4140721,-0.62913364,-0.49161103,0.06334394,-0.4608268,0.50220513,0.6482869,0.28214014,-0.30096096,-0.68956196,0.14852367,-0.13984762],[0.70722806,0.81301016,-0.0990699,0.34233677,-0.2081479,0.6863452,-0.40330297,-0.23650733,-0.4555184,0.78053814,0.06477601,0.5426404,-0.3088452],[0.06759314,-0.38149613,0.4649801,-0.024833316,-0.14772557,0.68093634,-0.31712177,-0.31436524,0.021902535,-0.06391409,0.52740633,-0.023403548,-0.30866808]],"activation":"identity","dense_3_b":[[0.040954825],[-0.05325551],[0.009019909]]},{"dense_4_W":[[0.83495075,-0.86214906,-0.13330713]],"dense_4_b":[[0.043454375]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AB'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AB'.json deleted file mode 100755 index b31907e804..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.1622963],[0.9471656],[0.44518656],[0.040083434],[0.9350785],[0.94012755],[0.94425213],[0.93108463],[0.91875947],[0.8984224],[0.87960774],[0.040001612],[0.04003194],[0.04005136],[0.040004794],[0.039946392],[0.039676767],[0.039269198]],"model_test_loss":0.010425965301692486,"input_size":18,"current_date_and_time":"2023-08-08_08-57-13","input_mean":[[23.123226],[0.014666694],[0.0013152711],[-0.015370418],[0.015775913],[0.015918152],[0.015987042],[0.017566826],[0.01997459],[0.024210589],[0.023963585],[-0.01532087],[-0.015298695],[-0.015288566],[-0.01526749],[-0.015188506],[-0.015101968],[-0.0150896525]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.4020265],[-0.38869652],[0.5984056],[-0.40903288],[-0.7209127],[-0.21461262],[-0.022622019]],"dense_1_W":[[-0.48059335,0.3100128,0.0076716603,0.16913813,-0.39116326,0.30901742,0.15213187,0.27245435,0.30929,0.0393514,-0.21169001,0.37455606,-0.0841324,-0.35264006,0.057713106,-0.3693904,-0.043460626,0.16143373],[0.1948784,0.3596294,0.0016701045,0.078808986,-0.031749953,0.5201668,-0.3876555,0.035953883,-0.052751865,0.29071456,-0.11915809,0.18078142,0.2654659,-0.3440918,-0.36261106,-0.04538469,-0.16205196,0.2049061],[0.27058375,0.39068493,0.008152962,-0.46268412,-0.37271506,1.1953743,-0.838863,0.20327426,-0.029140756,0.40090236,-0.25554156,0.1980216,-0.24836442,0.40255845,-0.11239343,0.08096013,0.28145158,-0.1982731],[-0.09668808,0.72334373,4.232626,-0.2011821,-1.4960433,-0.6716198,-0.7842683,0.3259893,1.7003231,1.2187169,-0.7756498,0.0010294656,0.015891263,0.07841224,0.28969085,-0.011956924,-0.21773098,-0.1516659],[-1.0268521,-0.04623315,0.02006263,0.53300685,0.49791265,-0.031559914,-0.06060664,0.40332755,0.24802661,0.4815803,-0.37091663,-0.009678896,-0.12575178,0.25624207,-0.65037,-0.19531684,-0.40527076,0.4080783],[0.06124146,0.33298203,-0.007085769,-0.3564556,-0.62365544,0.39928165,-0.30484197,-0.03956767,0.47177354,-0.32725462,-0.05135365,0.41259632,0.104655325,0.02163898,-0.3252136,0.19845222,-0.34582257,0.3192759],[-0.215077,0.61514986,0.014335081,-0.23261109,0.028965365,0.5105243,-0.8640813,0.41804183,0.06355636,-0.26415628,0.11219327,0.18719119,0.18345302,-0.09234277,-0.21879959,-0.077284895,-0.051544398,0.12303621]],"activation":"σ"},{"dense_2_W":[[-0.047037657,-0.82620645,-1.1012506,-1.5222656,1.2184019,-0.95923287,-0.32852557],[0.6561262,0.5126057,-0.24760722,-0.088599116,0.011952697,0.5099274,0.6522026],[-0.5948736,-0.51518464,-0.31788582,0.50248563,-0.48923284,-0.6654764,-1.0108097],[0.5930829,0.5896004,-0.34024367,0.5411401,-0.23081586,0.025500938,0.018493457],[-0.0699199,0.07561291,-0.099223636,0.2656774,0.12801234,-0.09348627,0.39833513],[0.1711992,0.61261594,0.10941279,0.15368794,-0.016752176,-0.08643972,0.51187015],[0.52641517,0.29478607,0.28599206,0.36893985,-0.012896536,-0.36574146,-0.06489677],[-0.9348127,-0.63718593,-0.9197959,-0.17101024,0.6478388,-0.25748882,-0.6722122],[-0.039446525,-0.17253296,-0.1102254,0.11489417,-0.12034824,-0.64540935,-0.61393607],[-0.018881954,-0.5315948,-0.20833272,-0.026863215,-0.46395144,0.38346213,-0.69737613],[-0.89750475,-0.9264009,-0.50270903,0.38569385,-0.1646158,-0.009521657,-0.2364964],[0.64389735,0.66855454,-0.51955,0.20904338,-0.059642173,-0.34599668,0.3828592],[-0.41403893,-0.23343006,0.27303386,0.32080367,-0.08580585,-0.0022561064,0.5581373]],"activation":"σ","dense_2_b":[[0.1540804],[-0.1450312],[0.42652166],[-0.16428761],[-0.15953712],[-0.17998531],[-0.22780614],[0.16343741],[-0.14679368],[0.12547316],[-0.083877504],[-0.18424872],[-0.14974242]]},{"dense_3_W":[[-0.79740316,0.3058743,-0.88944197,0.25014403,0.06497559,0.17014328,0.27509627,-0.6445844,0.052368652,-0.73738235,-0.5432747,0.4932797,0.065226056],[-1.4201472,0.54557586,-1.273868,0.49129322,-0.29190016,0.4022955,0.20194477,-1.0692892,-0.11673556,-0.22659089,-0.57724833,0.10635412,-0.22017439],[-0.029564494,0.52538013,0.31247225,0.23336294,0.4273138,0.10889286,-0.012862975,-0.57009745,-0.06713728,-0.5318249,0.48261672,-0.479357,0.26141784]],"activation":"identity","dense_3_b":[[0.027114814],[-0.091438465],[0.011498378]]},{"dense_4_W":[[1.1969254,0.4108815,0.4734377]],"dense_4_b":[[0.025864411]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AC'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AC'.json deleted file mode 100755 index 352d7b0341..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321644AC'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.830911],[1.115638],[0.4198547],[0.045398682],[1.1110027],[1.1132046],[1.1144112],[1.0970649],[1.0804734],[1.0600687],[1.0419487],[0.04529199],[0.045321435],[0.045338377],[0.045098767],[0.04478193],[0.044281803],[0.04369981]],"model_test_loss":0.016744062304496765,"input_size":18,"current_date_and_time":"2023-08-08_09-22-33","input_mean":[[25.32558],[0.020876955],[-0.0031986607],[-0.021073462],[0.023825074],[0.023209965],[0.022263236],[0.022898776],[0.022900082],[0.021173751],[0.019993754],[-0.021117106],[-0.021114947],[-0.02110833],[-0.020907117],[-0.020756595],[-0.020630443],[-0.020645482]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.08477574],[-1.1208596],[0.056731466],[-0.13102329],[1.3400327],[-0.21376154],[-0.14902717]],"dense_1_W":[[-0.019731255,0.5049976,-0.036526002,0.011823861,-0.1379057,1.0417687,-0.41630954,-0.28008935,-0.10283441,-0.05499538,0.25074315,0.047100175,-0.29597563,-0.07547027,0.25998276,0.22996715,-0.18355547,-0.08965249],[-0.5427593,-0.20459586,-1.1918509,0.49397376,0.40827742,-0.22497697,0.4398683,-0.36652535,-0.032938156,-0.5691974,0.40494335,-0.31987035,-0.33914092,0.37502846,0.1593614,-0.20469041,-0.11929302,0.08297961],[0.09138077,0.5844746,0.01609009,0.106926106,0.18020171,0.29379869,-0.33216235,0.0700583,-0.16037555,-0.24483693,0.24122177,0.21059227,0.16990502,-0.34959447,-0.22446343,-0.048417874,-0.10075254,0.14260091],[-0.04069323,0.72442687,6.4593797,-0.11315368,-0.64344734,-0.65112764,-0.43653354,0.18658906,1.393825,0.79047185,-1.1749243,0.47932476,-0.05644744,0.082114056,0.06887666,-0.52010685,-0.27435255,0.34667605],[0.5707703,-0.5124983,-1.2294043,-0.03657325,0.3137657,0.1472218,0.2302784,-0.17878631,-0.04963707,-0.4735355,0.3274108,-0.5153868,0.3066991,0.21095222,0.18537575,0.19664803,-0.3297685,0.09996214],[-0.064720176,0.19063953,0.034651436,-0.36256272,-0.21260333,0.6277773,-0.3070442,0.04620047,0.34898838,0.21007203,-0.30331737,0.5204954,0.28685373,-0.061015386,-0.26879862,-0.41823646,-0.34857938,0.550084],[-0.021767776,-0.65322065,1.1321541,0.16613401,0.57740504,-0.3740601,0.65210044,-0.37584355,0.0014690036,-0.06747381,0.32518736,-0.50768954,-0.30564624,0.591422,0.2179493,-0.316548,0.25551757,-0.22068849]],"activation":"σ"},{"dense_2_W":[[0.7023776,-0.5377536,0.447295,0.20259193,0.35656255,0.34270075,0.14764449],[-0.8119403,1.898599,-1.0897249,-0.9444553,-0.95713764,-0.7802652,1.1571481],[-0.41300622,0.5057582,-0.42050916,-0.26921916,0.4071575,-0.72827977,0.6723096],[0.659268,0.41014376,0.7103329,-0.2158735,-0.5761206,0.8324001,-0.6932241],[0.7650227,-0.098119624,-0.13894603,-0.09793376,-0.29583746,0.15023077,-0.18984264],[-0.5645378,0.37838322,-0.25003466,0.30110332,-0.17372216,-0.14515066,-0.2892711],[-0.86647314,-0.6360927,-0.512288,-0.40345564,-0.57944584,-0.10611315,0.3009823],[0.47419962,0.12130229,0.47665277,-0.22477815,-0.6503073,0.7154409,-0.5352525],[-0.33391073,0.19982284,-0.18712083,-0.61583984,0.32468942,-0.30625635,0.5543383],[-0.7848551,0.3256499,-0.20679983,-0.61387134,1.2375975,-0.54205257,0.7628237],[-0.80773836,0.5552902,-0.82975096,0.44044396,0.20548598,-0.41023898,-0.015094675],[-0.0031497905,-0.34568506,0.714917,0.34772903,-0.47651246,0.11289852,0.01636551],[0.26711908,0.18439986,0.6041066,-0.32462585,-0.6204204,0.6425605,-0.3411199]],"activation":"σ","dense_2_b":[[-0.09711639],[-0.08352111],[0.047110736],[-0.097634606],[0.0056070853],[-0.100640625],[-0.27092776],[-0.0012954418],[-0.0036094699],[0.3191952],[0.009079399],[-0.12750977],[-0.056785733]]},{"dense_3_W":[[0.06739133,0.59006786,0.6211502,-0.5984078,-0.32169876,0.3524586,0.24023733,-0.27815732,0.5021664,0.56558025,0.14635971,-0.56661624,0.3526846],[0.40286243,-0.37436473,-0.6752988,0.6229788,0.06661106,0.28863597,0.2982523,0.62539214,-0.2726357,0.0369207,-0.49113652,0.13289927,0.42825526],[-0.5299166,-0.058093112,0.2767313,0.31623214,-0.46782243,-0.02541171,0.52295595,-0.17039666,0.5000973,0.43198228,0.28259963,0.442186,-0.49364412]],"activation":"identity","dense_3_b":[[-0.045575317],[0.01754547],[-0.034936134]]},{"dense_4_W":[[-0.8772865,0.7928133,-0.44498837]],"dense_4_b":[[0.02575194]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321646AC'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321646AC'.json deleted file mode 100755 index 547a4dd4b9..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68321646AC'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.737005],[0.88882256],[0.40919855],[0.039857272],[0.8705369],[0.8758246],[0.8814676],[0.8781675],[0.86962575],[0.85621184],[0.8394485],[0.03945453],[0.03953348],[0.03961019],[0.03977209],[0.039786596],[0.039618857],[0.03923206]],"model_test_loss":0.012028406374156475,"input_size":18,"current_date_and_time":"2023-08-08_09-48-14","input_mean":[[22.945333],[-0.0010462697],[0.0048553967],[-0.0153987445],[-0.0021738543],[-0.0016759728],[-0.0015154154],[-0.001325464],[-0.00038370863],[-0.0006709971],[-0.00058776775],[-0.015591592],[-0.015539771],[-0.01549547],[-0.015391692],[-0.015357372],[-0.01538723],[-0.015529609]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.5486719],[0.2716225],[-1.6157514],[1.1729423],[-1.1907693],[-0.39801067],[-0.121997826]],"dense_1_W":[[-0.46544072,0.7250584,4.8497953,0.14721076,-0.5592774,-0.06463778,-0.64544016,-0.40530452,1.03972,0.39865008,-0.32899725,0.3914242,0.2066326,-0.092136934,-0.25278154,-0.43968657,-0.29141605,0.33539483],[0.020392422,0.024581747,0.0031651654,0.040796407,-0.38519448,-0.8635064,0.37892318,0.102256194,-0.09094794,0.21679239,-0.2812365,-0.15923738,-0.108921684,0.6662101,-0.08453101,-0.07277869,0.05620035,-0.016352834],[-0.3585343,1.2613775,0.0038963037,-0.15068118,-0.13595745,0.22841744,-0.5804063,-0.11421715,0.540371,0.38811037,-0.412488,0.33400613,0.15549748,-0.08101292,-0.13149312,-0.3663767,-0.065549724,0.3084776],[0.23774011,0.95270973,0.0014370019,-0.033368304,-0.42406502,0.77913195,-0.5337653,0.07241031,0.044325322,0.3215471,-0.20761405,0.43413407,0.478264,-0.83566636,-0.32521436,0.21832462,-0.10103389,0.15086488],[-0.8515809,-0.001838693,-3.2252197,0.042975638,0.43727648,-0.22219318,0.35821626,0.15869705,-0.42442384,-0.39166257,0.0048108334,0.078742936,0.040681444,-0.3639781,-0.15564561,-0.12332069,0.5021788,-0.055283524],[0.005189595,-0.8111827,0.0013606233,0.50199807,0.3737952,-1.0003718,0.851964,-0.122223474,-0.3087659,-0.2764092,0.34383842,-0.43569988,-0.20424576,0.35416314,0.2666806,0.2474478,-0.25429338,-0.09367016],[0.012469906,-0.51571983,0.0040051304,0.15235668,0.5664555,-1.1568508,0.97973454,0.22787246,0.12199299,0.16332985,-0.17958714,-0.6260466,0.3168435,0.07752037,-0.16694872,-0.05125427,0.54919314,0.07834808]],"activation":"σ"},{"dense_2_W":[[0.42687958,0.35546088,-0.0835482,-0.16971982,0.44030172,-0.1060948,-0.27846086],[0.3972471,-0.26396534,0.60359323,-0.2778684,-0.5613684,-0.27746892,-0.39469868],[-0.2463116,0.42827067,-0.22504425,-0.59708124,-0.3661039,0.63707,0.15119193],[-0.33165976,0.33214015,-0.6223232,-0.38051826,0.030521309,0.08566356,0.44499964],[-0.19122124,-0.08419296,0.65129405,0.6664746,-0.13785547,-0.83451825,-0.1729238],[0.2925262,-0.8603122,0.49935588,0.41965902,0.0442165,-0.05522488,-0.82031214],[0.1410513,-0.08103695,0.25278136,0.37289864,0.25904986,-0.37102434,0.062144414],[0.29021037,0.3428696,-0.6168156,-0.13681921,0.34707314,0.5923309,-0.08615041],[0.4242105,-0.6498356,-0.19368397,0.86813235,0.12725602,-0.058380764,-0.29565084],[0.3024098,-0.06166411,0.3740148,0.6663715,-0.040609878,-0.41137022,-0.7049944],[-0.18053831,-0.37341672,-0.07160507,0.080549926,0.0789703,0.20618889,-0.40184686],[-0.7074698,-0.29236713,0.28588095,-0.20616542,0.13988344,0.09854203,-0.21226078],[0.3260612,0.23354511,0.35486403,0.6984273,-0.24646878,-0.60650444,-0.46223956]],"activation":"σ","dense_2_b":[[0.031995755],[-0.2639717],[0.0073487367],[0.057454802],[-0.040088877],[-0.07751858],[0.015209585],[-0.004185873],[-0.06493244],[-0.010564818],[-0.065297335],[-0.2724362],[0.016460005]]},{"dense_3_W":[[-0.07241538,0.51749754,-0.66165704,-0.6295341,-0.1707448,-0.43621805,0.18211804,-0.03065691,-0.13813734,0.6441604,-0.30329812,0.54201734,0.55464447],[0.19548033,-0.28439224,0.6228154,0.26898032,-0.5306852,-0.60617685,0.33318204,-0.16073118,-0.37244457,-0.5546019,0.17876261,-0.3419583,-0.09833642],[-0.5292195,-0.26595876,-0.27626458,-0.15267096,0.22562627,0.53073275,-0.20250128,-0.67357546,0.26390368,0.25917968,0.29303232,-0.573905,0.6053267]],"activation":"identity","dense_3_b":[[-0.032989413],[0.044406198],[-0.033128925]]},{"dense_4_W":[[0.5753529,-0.8160843,1.1863258]],"dense_4_b":[[-0.037123773]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68367342AA'.json b/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68367342AA'.json deleted file mode 100755 index 4676ef8177..0000000000 --- a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018 b'68367342AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.3758683],[0.8794069],[0.46141535],[0.037675492],[0.88829136],[0.886115],[0.8817511],[0.84581715],[0.8278533],[0.80277216],[0.7799678],[0.03770945],[0.037679393],[0.037663188],[0.03748336],[0.037227985],[0.03666999],[0.03598855]],"model_test_loss":0.006474275607615709,"input_size":18,"current_date_and_time":"2023-08-08_10-12-47","input_mean":[[26.350012],[-0.09385938],[0.041549694],[-0.0030162074],[-0.09805675],[-0.09651579],[-0.09413497],[-0.07463795],[-0.06469781],[-0.05300219],[-0.045351826],[-0.0031147127],[-0.0030688543],[-0.0030160798],[-0.0029022517],[-0.0028611047],[-0.002841013],[-0.0029479503]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.09162939],[-0.0024971273],[-0.24881262],[-1.32228],[-0.4374819],[-0.9960854],[-0.32367432]],"dense_1_W":[[0.0013978665,0.5157658,0.057618756,-0.4238105,-0.5857702,0.50526756,-0.3266269,0.012936584,0.3625385,0.11991571,0.0066418285,0.40299493,-0.23047242,0.21920505,-0.4174118,-0.089936666,-0.104478516,0.045391113],[0.045715943,0.04829665,0.030840999,-0.24445257,-0.267954,0.2661487,-0.7767349,0.6312683,0.6088808,-0.05871689,-0.37978205,0.4366248,0.22490036,-0.57898104,0.0108244065,0.28357658,-0.55379957,0.32254124],[0.011607531,0.6717766,-0.07031896,-0.20974216,0.22755674,1.115498,-0.24775673,-0.08535654,-0.2567366,0.009943826,0.21396203,0.22771065,0.110520564,-0.5468987,0.0013472787,0.12118877,0.38788018,-0.5846402],[1.2240443,0.36507532,-0.0076892683,0.1908495,0.10025321,0.8377715,-0.829348,0.010610993,-0.34508568,-0.002731332,0.255436,0.22866087,-0.1078464,0.13727446,-0.16703908,-0.24019064,-0.047107916,0.0975457],[-0.049711026,0.4607915,0.015162587,-0.170386,-0.80058587,0.6337767,-0.053720508,0.19613627,0.17618516,-0.047628276,-0.115387514,-0.010986527,0.14302418,0.016793815,-0.2661772,0.047418084,0.41987264,-0.30581895],[1.1685805,0.011218695,0.007829905,-0.68930507,-0.43452054,-0.6339981,0.60769325,0.28270322,0.07532135,-0.04884226,-0.21931998,-0.008426204,0.04834048,-0.06860812,0.38515458,0.122956015,0.4017405,-0.29282153],[-0.020134322,-0.8001443,-4.5559916,0.18659148,0.70608896,-0.2582699,0.20592918,0.049877867,-0.35152316,0.053292986,0.19451627,-0.7794339,-0.2684154,0.07639334,0.6773159,0.5250616,-0.0034250547,-0.43527722]],"activation":"σ"},{"dense_2_W":[[0.21119271,-1.0255879,-0.16154091,-0.4769789,-0.61767894,0.34280777,0.05404951],[-0.02319971,-0.5616842,-0.29918796,-0.4990605,-0.56629777,0.18677638,0.112850465],[-0.3342754,-0.06275528,-0.16850384,-0.0028333499,-0.7661835,-0.41394717,-0.03308939],[-0.4943371,-0.15990037,0.2436778,0.23711683,-0.41802898,0.472897,0.36362448],[-0.5475525,-0.5687474,0.4426769,-0.5622382,-0.11734036,0.46177107,0.16163152],[-0.26939043,-0.84531426,-0.17959583,-0.20131466,-0.16513735,0.46629128,0.11826833],[-0.66524285,-0.62074107,-0.2418173,-0.6427534,-0.16397402,-0.3407568,0.38450608],[-0.72491395,-0.3333499,-0.01070937,0.06758591,-0.3469214,0.58276814,-0.60413307],[-0.7090462,-0.28402704,-0.29168892,-0.97276664,0.17415757,-0.29785421,0.35881364],[-0.053390227,-0.1611089,-0.8964952,0.26221168,-0.58006567,0.667772,-0.67146504],[0.09106713,0.40570852,0.030234145,0.12706229,0.72801465,-0.7008442,0.033457078],[0.64675695,0.34196526,-0.0063973228,-0.15831146,0.3233861,-0.818193,-0.70464826],[-0.43582126,0.39073256,0.6456649,0.5558599,0.7124559,-0.4439334,0.094163485]],"activation":"σ","dense_2_b":[[0.089445606],[-0.12313768],[-0.06173512],[-0.1068826],[-0.07586955],[0.044505995],[0.046850294],[0.107835546],[-0.07275619],[0.1918601],[-0.15383899],[-0.19150755],[-0.17611705]]},{"dense_3_W":[[-0.26096532,-0.30031928,0.18381803,-0.22780605,0.06046405,0.6438302,0.45061895,0.15275083,0.5594882,-0.23233925,-0.0062613282,-0.37721986,-0.3175804],[0.57467216,0.42339224,0.36510932,0.22639248,-0.0027739918,-0.29680425,0.39515868,0.18335965,0.6245671,0.56803894,-0.58078635,-0.732932,-0.5319626],[-0.20106415,-0.45754662,-0.37109572,0.052946024,-0.08164918,-0.5180276,0.24222454,-0.39028975,-0.37767205,-0.3367975,-0.057989135,0.5503922,0.27205816]],"activation":"identity","dense_3_b":[[-0.037949592],[-0.040613495],[0.0736481]]},{"dense_4_W":[[-0.91081345,-1.2000608,0.3280663]],"dense_4_b":[[0.040748246]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018.json b/selfdrive/car/torque_data/lat_models/JEEP_GRAND_CHEROKEE.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE V6 2018.json rename to selfdrive/car/torque_data/lat_models/JEEP_GRAND_CHEROKEE.json diff --git a/selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019.json b/selfdrive/car/torque_data/lat_models/JEEP_GRAND_CHEROKEE_2019.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/JEEP GRAND CHEROKEE 2019.json rename to selfdrive/car/torque_data/lat_models/JEEP_GRAND_CHEROKEE_2019.json diff --git a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.03 57700-CV000 1A19'.json b/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.03 57700-CV000 1A19'.json deleted file mode 100755 index d772752e47..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.03 57700-CV000 1A19'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.6028657],[0.998016],[0.53611773],[0.047976688],[0.9928589],[0.9924185],[0.991688],[0.96648145],[0.9476359],[0.9231466],[0.89530784],[0.047654726],[0.047677517],[0.047703277],[0.04752716],[0.04720977],[0.04657623],[0.045824196]],"model_test_loss":0.0073777767829597,"input_size":18,"current_date_and_time":"2023-08-08_11-03-36","input_mean":[[22.331253],[0.008268598],[-0.0049328315],[-0.016445948],[0.00974977],[0.009845438],[0.008850363],[0.0060875807],[0.005707362],[0.004997126],[0.001550338],[-0.016557517],[-0.016519358],[-0.016480202],[-0.016507305],[-0.016554574],[-0.016674902],[-0.016686343]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.2134058],[-0.4401382],[0.013421209],[-0.34870654],[-0.17111516],[-1.2804115],[1.5166906]],"dense_1_W":[[-0.003492201,-0.7001189,-4.9897428,-0.06689495,0.26876342,0.35482764,0.30641812,-0.21851085,-0.555579,0.24643534,0.8393177,-0.0675409,-0.0201491,-0.020234931,-0.11246266,-0.29563373,0.021233577,0.1581605],[0.01416149,-0.40680584,0.007477288,0.27667442,0.49908307,-0.8357575,0.31320336,0.078352265,-0.120635815,0.19794565,-0.11251097,-0.046342086,-0.14189145,0.031422284,0.12273671,-0.020133087,-0.41442218,0.2202907],[0.006394261,-0.26172528,0.014584929,0.05768383,0.0585847,-0.5514914,0.8517142,-0.24889153,-0.22688049,-0.16613601,0.26893988,-0.74086446,-0.04820193,0.005417286,0.62154377,0.22829771,-0.13376506,-0.03882397],[0.057499748,-0.086839266,-0.0019575898,0.4038879,-0.19230208,0.757238,-0.3092829,0.1257818,0.0051625846,0.057344712,0.007206614,-0.29419062,0.25565282,-0.1575536,-0.10660876,0.022886055,-0.52114695,0.33686352],[-0.04594949,0.0063070045,0.008311233,0.27411845,-0.10505312,0.59662914,-0.1289434,-0.062175047,-0.14703758,0.17578988,0.012138173,0.08942247,0.03361194,-0.5405618,0.01592405,0.21723932,-0.08538327,-0.03150985],[-0.9764623,0.6599259,0.10607622,-0.031322658,-0.25540224,0.593693,-0.8804088,0.257759,0.093271345,-0.016888158,-0.026402805,0.2872013,-0.113752045,-0.52583855,-0.055375155,-0.08507545,-0.29209676,0.3949437],[0.96527904,0.58919865,0.104077555,-0.018589191,-0.21170476,0.5390397,-0.80143183,0.2932772,0.10296324,-0.13822582,0.045123298,0.3152447,0.085109994,-0.72252256,0.008645425,-0.4263549,0.017035658,0.32861862]],"activation":"σ"},{"dense_2_W":[[-0.37199923,-0.12832722,0.1749511,-0.67342365,-0.13077573,0.13716596,-0.31276017],[0.08311641,-0.8226717,-0.732273,0.43065447,0.42091942,-0.23820308,0.46186474],[0.061342355,-0.13367933,0.7275678,-0.5163101,-0.97730047,-0.16040334,-0.39433354],[-0.0016042206,0.23937365,0.7839997,-0.5188498,-0.54760414,-0.75992507,0.20722012],[0.05986252,0.7940592,0.017990412,-0.5053787,0.250168,-0.6725281,-0.35185984],[-0.7115049,-0.0011200714,0.0579297,0.19635859,-0.52030295,-0.37339073,-0.6610869],[-0.18911484,0.5807425,-0.3931502,-0.35992047,0.19167884,0.107894614,-0.35034665],[-0.30906686,0.10427205,-0.1708548,0.64270127,-0.06690356,0.036203638,0.36818498],[-0.43202224,0.11372802,-0.32337222,0.45003918,0.3964415,0.48027653,0.13094209],[-0.19394279,-0.61314553,-0.982793,0.24535689,0.7340253,0.034465324,0.5163571],[-0.08394236,-0.114718884,-1.0960547,-0.13727869,0.5059502,0.4406658,0.71635777],[-0.16832595,-0.03387522,-0.105201766,0.4467705,0.4825295,-0.062805906,-0.23995127],[0.03845694,0.3393674,0.32816932,0.23535535,-0.2891049,-0.26096547,-0.60556257]],"activation":"σ","dense_2_b":[[-0.0046654143],[-0.26616848],[-0.15242769],[0.063154235],[0.06204032],[-0.3036946],[-0.05402751],[-0.11423277],[-0.14205089],[-0.076766774],[-0.13189071],[-0.118149914],[0.022861073]]},{"dense_3_W":[[-0.40607935,-0.36904916,0.37094548,0.46005347,0.35317707,-0.38036,-0.0136696,-0.031072931,-0.4748755,-0.64991397,-0.09883376,-0.51478076,0.4007376],[0.5878066,-0.048418067,0.11663792,0.37321356,0.61102366,0.2959198,0.108360104,-0.11913145,-0.3183053,-0.43023407,-0.4099306,0.11975287,0.29941538],[0.08712033,0.3742091,-0.39980045,-0.22939302,0.5524921,0.33014178,-0.061465893,-0.37761515,0.06954819,-0.040838677,-0.24257697,-0.23456632,0.16012669]],"activation":"identity","dense_3_b":[[0.046470255],[0.030692197],[0.032811448]]},{"dense_4_W":[[-0.89180064,-1.1650615,-0.18752445]],"dense_4_b":[[-0.03583435]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.04 57700-CV000 1B30'.json b/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.04 57700-CV000 1B30'.json deleted file mode 100755 index b17e312325..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.04 57700-CV000 1B30'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.636926],[0.99775106],[0.51730037],[0.04172602],[0.9902031],[0.991702],[0.99406433],[0.98449016],[0.98021054],[0.97221226],[0.9606815],[0.04157153],[0.041613027],[0.04166065],[0.041698292],[0.041637298],[0.04147782],[0.041154478]],"model_test_loss":0.008439864963293076,"input_size":18,"current_date_and_time":"2023-08-08_11-29-58","input_mean":[[23.63399],[-0.070179984],[-0.017329546],[-0.016923679],[-0.06702602],[-0.06750857],[-0.067957565],[-0.07641299],[-0.080450155],[-0.08741072],[-0.08942049],[-0.016724136],[-0.016768401],[-0.01682333],[-0.016932698],[-0.016983371],[-0.017182635],[-0.01732987]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.3281497],[-0.1386229],[0.068819225],[-0.019412158],[-2.451048],[2.45977],[0.072729476]],"dense_1_W":[[-1.0003167,0.059292447,-0.0025035366,-0.07270117,0.03486205,-0.71160764,0.47882712,0.1636013,0.34797484,-0.19271761,-0.08604989,-0.38023552,-0.10472232,-0.03376971,0.4000991,0.3570124,0.33536893,-0.24505846],[0.0052611283,0.84425735,5.585779,-0.021570992,-0.7179723,-0.113942355,-1.1103576,0.15865955,1.2473391,0.06493884,-0.2477255,0.14004384,0.18952657,0.010783735,-0.8468175,0.04784935,0.1129318,0.1958878],[-0.004737935,-0.6588937,0.006123585,0.17500632,0.287176,-0.9833101,0.61836934,-0.025035203,-0.16567795,-0.17453128,0.15334582,-0.41367865,-0.35360122,0.7015716,0.22423786,-0.3394676,-0.035324857,0.023584878],[0.99039614,0.02071242,-0.002529335,0.22897765,0.14088887,-0.9813151,0.72088784,0.18345436,-0.061098445,0.36531118,-0.29483438,-0.48716846,-0.70862526,0.6618173,0.22802202,0.24263938,0.26600027,-0.17759201],[-0.4457454,0.7465454,0.19822481,-0.6893106,-0.33370095,0.08260407,0.112919874,0.64286476,0.47592863,0.36428148,-0.38146886,0.2040808,0.13841604,-0.04391594,0.27622476,-0.19026394,0.16928938,-0.21241508],[0.46304423,0.7735011,0.19910802,-0.52521425,-0.6831936,0.5753077,-0.2356248,0.9027313,0.46573797,0.4141583,-0.48462674,0.341143,0.4956985,-0.6265562,-0.067270085,0.22146614,-0.08455455,-0.10452678],[-0.17997652,-0.048065923,0.0543845,0.7212201,0.35718217,0.16550168,0.57716334,-0.3129087,0.18472067,-0.73616695,-0.7397382,0.020727323,0.18844429,0.37562203,-0.19119298,-0.5826378,-0.62202686,-1.1500102]],"activation":"σ"},{"dense_2_W":[[0.30996957,0.3620612,0.19219857,0.5534441,-1.2349578,-0.41534692,0.35350785],[-0.2175235,-0.029167634,-0.07900721,0.53388363,-0.57290107,0.119387515,-0.16951317],[0.2695079,0.08399006,0.738549,0.2894061,-0.5357801,-0.71563846,0.31262836],[0.38937768,-0.9733951,-0.08894609,-0.013909257,0.24918033,-1.5008242,-0.7839707],[-0.6003588,0.14547037,-0.55455977,-0.48437524,0.39916262,0.56922144,0.22648938],[-0.46998897,0.34172785,-0.30137694,-0.34641954,0.11116893,0.46578008,0.24678849],[-0.78984165,0.46101516,-0.5639303,-1.1220579,1.1517729,-0.4244306,0.31534004],[0.4589919,-0.31986734,0.47596893,0.76536596,-0.051692575,-0.10105569,-0.4216019],[0.0010699058,1.2612101,-1.3807253,-1.1397744,1.6594896,-0.6309603,-0.8039972],[1.2380359,-1.7453684,0.4242525,0.019551069,0.49429622,-1.795323,0.08261984],[0.3972687,-0.8025517,0.60930085,0.07706176,0.076197505,-1.22639,0.18504499],[-0.9094243,-1.7106271,-0.7486791,1.3113708,-1.1184276,0.014299314,-0.34431195],[-0.008385938,0.27393603,0.6410162,0.70163506,-0.66412205,-1.0397469,0.1510303]],"activation":"σ","dense_2_b":[[-0.25120014],[-0.14833862],[-0.2754657],[-0.50557667],[0.13908446],[0.069000565],[-0.07628111],[-0.2187848],[-0.31339166],[-0.4099455],[-0.2503555],[-0.09509195],[-0.39131135]]},{"dense_3_W":[[0.5850583,0.24930371,0.47890794,0.36771303,-0.61603814,-0.48785573,-0.7595788,0.343497,-0.68425894,0.26591393,0.5141339,0.034521252,0.6326022],[-0.15742448,0.05325502,-0.34628916,0.28195977,0.7598076,-0.1799433,0.4802377,-0.044031564,0.3854451,-0.9805936,-0.07348244,0.84516305,-0.49842322],[-0.50455654,0.32130662,0.0916387,-0.09003524,-0.19368353,-0.28112268,0.22840995,0.5315722,0.31819898,-0.25823647,0.23832029,-0.007766277,-0.35535583]],"activation":"identity","dense_3_b":[[-0.10590303],[0.07168751],[-0.014283153]]},{"dense_4_W":[[-0.62888306,0.5515062,0.04721317]],"dense_4_b":[[0.08200853]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.05 57700-CV000 2425'.json b/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.05 57700-CV000 2425'.json deleted file mode 100755 index 5383620d87..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.05 57700-CV000 2425'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.756191],[0.8422167],[0.3935759],[0.03985225],[0.847421],[0.84577143],[0.8438802],[0.8312308],[0.82332045],[0.8139623],[0.8044926],[0.039848723],[0.039851446],[0.039843414],[0.039771948],[0.039651867],[0.03946986],[0.039127663]],"model_test_loss":0.00447295093908906,"input_size":18,"current_date_and_time":"2023-08-08_11-54-31","input_mean":[[21.687302],[0.006407267],[0.018950889],[-0.009187785],[0.005421752],[0.006316563],[0.007847993],[0.013237735],[0.014951903],[0.018369293],[0.020485098],[-0.009148834],[-0.009137076],[-0.009120599],[-0.009176439],[-0.009111171],[-0.008984524],[-0.008785447]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.20498206],[0.14577107],[0.08559532],[-0.36848816],[-0.19730051],[-0.030227017],[-0.2253597]],"dense_1_W":[[2.308543,0.03020248,0.018995002,-0.024404034,0.8007829,-0.5156367,0.10489569,-0.33277398,-0.09787901,0.20294352,0.080392405,-0.31504363,-0.31018522,0.2897744,0.52273995,-0.031090064,0.19173853,-0.22689787],[0.00081780413,0.8643929,3.7596824,0.04694658,-0.97499377,-1.0411439,-1.1665148,0.29043487,1.221662,0.76075923,-0.2100547,0.18282944,0.30418468,-0.4097326,0.0014765597,-0.008321829,0.049456507,-0.028409772],[0.03110457,0.12643631,-0.033637524,0.82713836,0.14466572,-1.1336243,0.21813098,0.0455519,0.22815101,0.16354488,-0.3041193,-0.30829903,-0.19326043,-0.0013841438,-0.11585437,-0.13768283,-0.09550705,0.045170184],[-0.035894755,-0.30930525,-0.024392668,-0.2612936,0.21937297,-0.86915934,0.56173295,0.01745204,0.20141557,-0.32779387,0.061529484,-0.27867725,0.3428134,-0.095910266,0.05310102,0.5960199,0.067442365,-0.3346001],[2.3743505,-0.27000943,-0.024168417,0.15309551,-0.26398262,0.25595742,-0.022308368,-0.039125554,0.19000678,-0.11940631,-0.030037664,0.37605497,-0.33591053,0.050574202,-0.61969125,0.434404,-0.15990326,0.011175081],[-0.0070874724,0.15298845,-0.00084517436,0.2524529,-0.030157164,0.22337195,-0.17864515,0.3122118,0.14113893,-0.0834633,-0.050355904,0.6705104,0.16077328,-0.40681332,-0.06884257,-0.2205331,-0.079806775,-0.28337547],[-0.006012093,0.03713952,0.0051948116,0.14509241,0.31448504,-0.15223765,0.84517163,-0.62974775,-1.0796629,0.020326132,0.12779477,0.07742896,0.16281007,0.89423746,0.21255082,-0.6164101,-0.36238167,0.23721826]],"activation":"σ"},{"dense_2_W":[[-0.08678365,-0.28735358,-0.44816428,-0.67430466,0.49221525,0.5313274,-0.075466506],[0.44214758,0.23506661,-0.07796156,0.14776449,-0.2601569,-0.92744434,0.28036892],[-0.9958226,0.5270989,-0.9116515,-0.4043872,-0.4005815,0.42227224,-0.14791597],[-1.0120796,-0.99568295,0.4510569,0.76626235,-1.3704773,-0.5985419,0.33657166],[-0.1804857,-0.0013589673,-0.24071819,-0.6249834,0.46821326,0.7279164,-0.411145],[0.18040283,0.0071279733,0.62853,0.6653126,0.1514985,-0.036630243,0.4138839],[0.23634094,-0.45010313,0.83803207,0.14591682,-0.47077256,-0.18304086,-0.05127678],[0.4930245,0.24832006,-0.14192279,0.6992845,-0.36574662,-1.0204111,0.3912414],[-0.011458314,0.35960925,0.000741611,-0.6913261,-0.5707353,0.49046513,-0.6306739],[-0.6022925,-0.35062015,-0.29702994,-0.16955367,-0.76008457,-0.11612536,-0.7346027],[-0.52043587,-0.17739458,-0.53521717,-0.75561386,-0.29444557,0.084623955,-0.4924554],[-0.40299603,-0.39608985,0.59452647,0.39619842,-0.681544,-0.9410745,0.25125793],[-0.19426703,0.17029157,-0.7068769,-0.0753074,0.5027616,0.4312823,-0.6993899]],"activation":"σ","dense_2_b":[[0.01738418],[-0.055564888],[-0.11172867],[-0.517177],[0.10449031],[-0.16354589],[-0.02996434],[-0.39060414],[-0.075024545],[-0.30811903],[0.040471796],[-0.15641882],[0.08672954]]},{"dense_3_W":[[-0.35984564,0.46071008,-0.39839146,-0.3249784,-0.0111061195,0.3353518,-0.18329817,0.11267565,-0.12863319,-0.6369906,0.1716676,0.09197707,-0.45575505],[-0.21391304,0.47215983,0.8454924,-0.6340474,0.14945674,0.42495897,-0.47129405,-0.44493976,0.017284637,-0.17222904,0.61577874,-0.025167221,0.5150705],[-0.2882089,0.1130023,-0.5851863,0.5870541,-0.6550108,0.37209293,0.4928965,0.19859159,-0.32288226,0.39181784,-0.39298615,0.5562495,-0.19359553]],"activation":"identity","dense_3_b":[[0.061583135],[0.027594171],[0.048770953]]},{"dense_4_W":[[-0.88079363,0.123071805,-1.1413969]],"dense_4_b":[[-0.05361239]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.06 57700-CV000 2607'.json b/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.06 57700-CV000 2607'.json deleted file mode 100755 index 15385f410f..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA EV6 2022 b'xf1x00CV1 MDPS R 1.00 1.06 57700-CV000 2607'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.371664],[0.8660402],[0.44205353],[0.04006577],[0.8695941],[0.86906177],[0.86788267],[0.8551706],[0.8498503],[0.8475595],[0.84451574],[0.039957225],[0.0399996],[0.040031727],[0.039957136],[0.039866317],[0.039591454],[0.039338887]],"model_test_loss":0.003942334558814764,"input_size":18,"current_date_and_time":"2023-08-08_12-18-48","input_mean":[[24.679834],[-0.0610162],[-0.030723063],[-0.011534694],[-0.052937914],[-0.05447521],[-0.05660855],[-0.067540534],[-0.074050665],[-0.079697154],[-0.08435825],[-0.0114096245],[-0.011442526],[-0.011459501],[-0.011501318],[-0.011486345],[-0.011416641],[-0.011339719]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.0816141],[-0.18171957],[0.44719312],[-0.09176599],[0.3736729],[-0.1810884],[0.12800315]],"dense_1_W":[[-0.0047654295,0.43260875,0.026083717,-0.13993602,-0.56262296,0.23557863,0.2347399,0.2155446,-0.100177564,0.57063645,0.0511386,0.58946824,0.12326792,-0.27978677,-0.34483367,-0.39934745,0.037110258,0.14460585],[0.008695711,-0.11661433,0.063519776,0.11895952,-0.31001577,0.2511811,-0.21447526,0.5321257,0.5065731,-0.103904374,-0.21310645,-0.20680007,0.5116181,0.0080869775,-0.708677,0.11794399,-0.0753133,0.11726266],[0.01728632,-0.5147893,-3.7443237,-0.008262636,0.52203393,0.429946,0.37147424,-0.5823051,-0.6834975,0.38940904,0.3236906,-0.0104796365,-0.044810288,0.52437323,-0.52473974,-0.32590485,0.10339124,0.09157462],[-0.002603426,-0.17195284,0.10924778,-0.077441126,-0.25571346,-1.384354,1.4639283,0.087904915,2.1046076,1.8955059,-1.0389798,-0.030392189,0.28473544,0.12830776,-0.5015701,-0.2827064,0.22205079,-0.32293126],[0.471999,-0.33321312,0.014776426,0.3969741,0.06666081,-0.69879496,0.47338915,0.020157907,-0.435533,0.15537709,-0.08532591,-0.33910295,-0.31417578,0.3437639,0.1030388,-0.1870897,-0.12972718,0.11436254],[0.000637897,0.12112293,0.015960619,-0.32365808,-0.09766896,-0.090567514,0.3855356,-0.2726324,-0.49548095,-0.20762078,0.41708624,0.0070781377,-0.10015481,0.17304403,0.37958065,0.46784183,0.3907835,-0.2139301],[0.44996986,0.1220842,-0.01267547,-0.09012574,-0.17965375,0.73542017,-0.15659401,0.04869948,0.14307545,0.11160313,0.010984089,0.21072775,-0.04606061,0.05491384,-0.4440439,0.32647374,0.19412273,-0.18947527]],"activation":"σ"},{"dense_2_W":[[0.7131255,0.56979114,-0.20163262,-0.76048356,-0.8553241,-0.08986244,0.09411956],[-0.5182983,-0.42607206,-0.1451523,-0.10615285,0.032286465,0.35113242,-0.66459066],[-0.42765474,-0.7001917,0.66741145,-0.17573306,0.3278255,-0.850597,0.24560727],[-0.5889132,-0.8559872,-0.14758717,0.6270137,0.8541969,-0.11721104,-0.7477589],[-0.684439,-0.4758031,-0.026908234,0.817481,0.5295401,0.8627598,-0.7020077],[0.13727106,0.6912117,0.15914854,-0.09929708,-0.47058728,0.41985986,0.46591565],[-0.77461493,-0.48245478,-0.078716494,0.26805362,0.06693142,0.52222615,-0.3683436],[-0.7610143,-0.53920734,1.1778057,0.17035471,1.7079359,0.060867958,0.65265995],[0.5485359,0.21809472,0.089422144,0.18732184,0.13284095,-0.5967669,-0.057103433],[0.5938206,-0.058559667,0.3107985,0.29578283,-0.08403785,-0.4867308,-0.3937628],[0.043648288,0.17193118,0.14474227,-0.38408777,-0.49636945,-0.62368274,0.54162353],[0.44284257,-0.29537362,-0.64413524,-0.2906911,-0.9059539,-0.3265376,-0.47823036],[-1.0017595,-0.69023037,1.7603761,0.15749584,-1.549278,-0.037252687,-2.2732258]],"activation":"σ","dense_2_b":[[0.020199465],[-0.04349766],[-0.35098335],[-0.07552022],[-0.32699242],[0.013798403],[-0.06263833],[0.15603606],[-0.024233129],[-0.0554949],[0.02559489],[0.01943721],[0.043122534]]},{"dense_3_W":[[0.36593956,0.2853892,-0.54242194,-0.042743444,-0.49066496,-0.2595811,-0.05406562,0.006202219,0.27496532,0.35713604,-0.39133155,0.37615958,-0.43270436],[-0.023188023,-0.50453436,0.055650853,-0.14124836,-0.25217998,0.28775543,-0.5941702,-0.69895655,0.12989889,-0.23987368,0.7094374,0.4217381,-0.7861608],[-0.551317,0.49120143,-0.2342702,0.61732894,-0.022938209,-0.44924045,0.13548025,0.32949445,-0.5254622,-0.33368072,-0.47489953,-0.29117772,0.09898376]],"activation":"identity","dense_3_b":[[0.047230996],[0.068798855],[-0.031155106]]},{"dense_4_W":[[0.20761946,0.83402395,-0.8194524]],"dense_4_b":[[0.0384233]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA K5 2021 b'xf1x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101'.json b/selfdrive/car/torque_data/lat_models/KIA K5 2021 b'xf1x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101'.json deleted file mode 100755 index f2947b26a6..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA K5 2021 b'xf1x00DL3 MDPS C 1.00 1.01 56310-L3220 4DLAC101'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.854484],[1.1301922],[0.52762777],[0.03877506],[1.1222172],[1.1249937],[1.1272055],[1.1161014],[1.0981379],[1.0717709],[1.0430657],[0.038641475],[0.038688984],[0.038735364],[0.03873086],[0.03864822],[0.038562547],[0.03838567]],"model_test_loss":0.012177987955510616,"input_size":18,"current_date_and_time":"2023-08-08_13-33-06","input_mean":[[21.915575],[-0.06991629],[0.008433489],[0.007756771],[-0.071591675],[-0.07195356],[-0.07209177],[-0.06747005],[-0.06206288],[-0.055634778],[-0.04844025],[0.0078251595],[0.007823075],[0.007812319],[0.0076907766],[0.00752464],[0.0073143714],[0.007158594]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.6469083],[0.78235936],[0.08529988],[0.17299432],[-0.5838562],[0.1480536],[-2.9458652]],"dense_1_W":[[0.6887408,0.7862894,0.46915615,-0.7615858,0.18839829,0.28929535,-0.49877065,0.5568004,0.91740584,0.35415035,-0.18235375,0.013719181,0.5743932,0.19287096,-0.3434696,-0.024053648,0.064986974,-0.055624507],[0.7481552,0.44785875,-0.39244938,-0.5366956,-0.46786323,-0.1834816,-0.9788827,0.03859454,-0.30279753,-0.08496807,-0.3507284,0.19772953,0.36484724,-0.31819546,0.22478342,0.37129864,-0.10703407,0.08960236],[-0.0018834132,-0.78730613,0.00020844977,0.13114999,-0.22980459,-0.8770316,0.9075459,0.038643394,-0.19233434,0.0454518,-0.097979,-0.58106935,0.1089662,0.51069635,-0.056984548,0.02036188,0.28987607,-0.26365396],[0.8899782,-0.058186773,-0.002375113,-0.22645739,0.46521798,-0.80593467,0.43126416,-0.41846383,0.24639922,0.16433802,-0.10675408,-0.23226354,0.006861831,0.14686735,0.547673,0.004610249,-0.090327084,-0.08441118],[1.2577723,0.41239512,-0.0039192457,0.039716844,-0.14862831,0.2655834,-0.34833747,-0.019234447,-0.16249205,0.07985215,-0.018647766,0.07292356,-0.3869771,0.3235518,-0.2897348,-0.10409623,0.37779024,-0.16593073],[-0.08166623,-1.599451,-5.784969,0.3708807,0.18732668,-0.1005467,0.7795171,-0.76319546,-0.52485704,0.82277596,1.2727301,-0.9839783,-0.13048978,0.18545102,0.13665888,0.013392682,0.037149593,0.32225874],[-0.8011789,1.2479645,0.45739445,-1.1320211,0.014393064,0.8998146,-1.3779738,0.7481604,0.5442367,0.41216576,-0.12928943,0.5111585,0.6192922,-0.19101119,-0.14709279,0.099627435,-0.20379099,0.1167656]],"activation":"σ"},{"dense_2_W":[[-0.39168912,0.12821183,-0.5745629,-0.2955745,-0.32214537,-0.48573247,-0.0049454668],[0.045028664,0.24872321,0.86677504,0.6680555,-0.5444451,-0.44519505,-1.0166295],[-0.6287411,-1.0502021,-0.37122965,-0.1330107,-0.16224831,-0.016187359,-0.22554144],[0.14796557,-0.2989984,-0.99244916,0.122506104,-0.020859987,-0.22429037,-0.38963094],[-0.3986394,0.42711204,-0.84266853,-0.03070883,-0.33096692,-0.56852376,0.6374697],[0.41194984,-0.27822644,-0.97238785,-0.66755277,0.60301566,0.10326954,0.7110429],[-0.43703943,-0.066251904,0.36446202,-0.4253811,0.092789024,0.01931588,-0.1531331],[-2.0546894,-2.0581992,0.060728226,-1.9572034,-1.0979232,1.7699203,-0.25269505],[-0.6677076,-0.65859634,-0.6190105,-0.66367626,0.07593136,-0.723147,-0.792268],[0.11594589,0.028933136,-0.51343495,-0.74736786,0.6151048,-0.40659943,0.320618],[-0.8179273,-0.39457303,0.65922356,0.2230339,-0.1805746,0.24354604,-0.45367607],[0.13779806,0.3070163,-0.083634906,-0.6793103,-0.31604096,-0.2882177,-0.05156203],[-0.5967588,-0.3445199,0.49922496,0.72002596,-0.2383223,-0.07767089,-0.014663982]],"activation":"σ","dense_2_b":[[-0.020715965],[-0.1509274],[-0.22611032],[-0.23432997],[-0.08001996],[0.011014631],[-0.13749276],[-0.13827106],[-0.27956584],[0.020674339],[-0.114044055],[-0.033070605],[-0.067024864]]},{"dense_3_W":[[-0.56229556,0.37780973,-0.28346238,0.006381281,-0.427774,-0.63294375,0.19204108,0.59055233,-0.13668692,-0.71561706,0.49993688,0.2800797,0.37756824],[0.45251364,0.53362393,0.4679781,-0.29337665,-0.3235545,-0.07848005,0.058482118,0.10375023,0.27879906,-0.3273172,0.57563937,-0.4281684,0.54832417],[-0.07654791,0.19594347,0.14752778,0.0811722,0.35966474,-0.45563278,-0.40835533,0.9917353,-0.05505701,-0.18214287,0.28810912,-0.64292353,0.5321835]],"activation":"identity","dense_3_b":[[-0.027110294],[-0.04791606],[-0.03029678]]},{"dense_4_W":[[-0.9615104,-0.5668664,-0.5576843]],"dense_4_b":[[0.032777302]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4000x00 4DEEC105'.json b/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4000x00 4DEEC105'.json deleted file mode 100755 index 31b7512c4b..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4000x00 4DEEC105'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.385439],[1.5132291],[0.5865538],[0.05131345],[1.5001018],[1.504909],[1.5081477],[1.4920704],[1.4653914],[1.4241073],[1.3771554],[0.051144965],[0.051199757],[0.051243976],[0.051260624],[0.051153995],[0.050753817],[0.050118044]],"model_test_loss":0.009958313778042793,"input_size":18,"current_date_and_time":"2023-08-08_14-53-23","input_mean":[[20.6522],[0.019880848],[-0.0015674612],[-0.009201578],[0.020643277],[0.020050274],[0.019826038],[0.018546505],[0.019691756],[0.02080321],[0.01971522],[-0.009233499],[-0.009218388],[-0.00920795],[-0.009186053],[-0.009161949],[-0.009261446],[-0.00937544]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.0022040606],[-0.45466518],[3.0495393],[0.1841935],[-0.07598528],[-0.049344935],[-2.8103917]],"dense_1_W":[[-0.043426234,-0.47749293,-0.02466255,0.26999012,0.29533443,-0.85174936,0.46759945,-0.18788536,-0.0090048555,-0.02694799,0.074940585,-0.17094204,0.2226856,-0.06197424,-0.06083671,0.5117093,0.3611478,-0.38309807],[0.0601729,-0.32238936,-0.0061821314,0.048993003,-0.119464226,-1.3493574,1.2128321,-0.24819785,0.09360174,0.017154751,-0.0945332,-0.31525713,-0.2354354,0.57461387,0.36087188,0.13730818,-0.27768645,0.046786904],[1.042279,1.1418763,0.38546368,0.38151142,-0.26414976,0.71848893,-1.2714393,0.41527608,0.8832226,-0.2916028,-0.11199533,0.6145823,-0.26009154,-1.2898295,0.5483713,0.22604805,-0.12541296,-0.10260658],[0.028834756,-0.7402766,0.042994425,0.13127239,0.82102907,-0.27223384,1.2230023,0.047152817,-0.7632143,0.07432769,0.35270634,-0.6807149,-0.39266413,-0.19658811,0.21255049,-0.20994696,0.0052200574,-0.28414842],[-0.03333096,-0.6419931,0.027721735,0.36765352,0.11669098,-1.0186125,0.45446727,0.2501265,0.030704029,-0.33163616,0.05462923,-0.61002415,0.079051115,0.4292307,-0.07177714,-0.19314681,0.12356582,-0.008606654],[0.015638076,-1.2189353,-4.177184,-0.15027538,0.59214276,-0.23344256,0.7318988,0.45370457,-0.88853407,-0.5243129,0.94887865,-0.35619122,-0.30369094,0.002676145,0.34892917,0.4637993,-0.02337859,-0.06700445],[-1.0455103,0.6458623,0.38122165,0.5683208,0.20575817,0.32748055,-0.7285804,0.36887115,0.49960437,-0.09581171,-0.014829534,0.14658736,-0.017480083,-0.75519586,-0.19585466,0.30125234,0.086563274,-0.15215997]],"activation":"σ"},{"dense_2_W":[[0.35791105,-0.14427873,-0.5609901,-0.12562588,0.58622676,-0.07395914,0.06280237],[0.29988632,0.0102157295,-0.4695938,0.1638178,-0.4523483,-0.34046823,-0.16422306],[-0.51069945,-0.63829863,0.4701338,0.068921834,0.11567098,-0.69826823,0.54002196],[-0.79609793,-0.9238868,-0.09042327,-0.31421772,-0.79002506,0.6459851,-1.3542271],[0.22355427,0.4964034,0.26008382,0.16483073,0.51995987,0.2259448,-0.6673576],[0.55433714,0.53631747,-0.24075024,0.49828082,0.21127781,-0.020997947,-0.054750577],[-0.5900872,-0.21735254,-0.0059305774,-0.6136997,-0.5256363,-0.2422479,0.9974833],[-0.16341521,-0.93104196,0.9141925,-0.5388812,-1.0119808,0.5274667,0.69387174],[-0.5459448,-0.6007257,0.129759,0.08534032,-0.6757581,0.08227118,-0.34070605],[-0.7405544,-0.68379045,0.5396067,0.05680183,-0.7028731,0.2363397,0.033819582],[0.6035027,0.40737432,-0.60496193,0.078725085,-0.14720674,0.38410118,-0.4465598],[0.63455087,-0.0047353907,-0.31880525,0.14844397,0.070003085,0.56770957,-0.025018206],[0.44256854,-0.6075469,0.81187916,-0.13535014,-0.39242724,-0.65649754,-0.16534975]],"activation":"σ","dense_2_b":[[-0.09462253],[-0.12638599],[0.058491252],[-0.14447154],[-0.13812666],[-0.1805173],[0.123461604],[0.089515485],[-0.19189687],[0.06357807],[-0.111211635],[-0.15331227],[0.31715086]]},{"dense_3_W":[[0.20542404,0.28171518,-0.15866286,0.11350425,0.4895743,0.3516957,-0.48876178,-0.7698101,-0.42093396,-0.25786847,-0.09865759,0.4434046,0.0078012934],[-0.21756878,0.12013417,0.38058028,0.51441383,-0.5845196,-0.095519304,0.5266495,-0.03282074,-0.25921062,0.4537682,-0.58191466,-0.35777017,0.61608887],[0.5017704,0.21205097,-0.3583318,-0.32390872,0.2300428,-0.023676097,0.39568096,-0.45662916,-0.34641036,0.13468637,0.2221489,-0.5345382,0.43819726]],"activation":"identity","dense_3_b":[[-0.069445506],[0.069069415],[-0.08497246]]},{"dense_4_W":[[-0.87340665,0.89448696,-0.035979144]],"dense_4_b":[[0.06572075]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4100x00 4DEEC105'.json b/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4100x00 4DEEC105'.json deleted file mode 100755 index 825d921373..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020 b'xf1x00DE MDPS C 1.00 1.05 56310Q4100x00 4DEEC105'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.397211],[1.1705283],[0.5805502],[0.03463821],[1.170059],[1.1703928],[1.1692861],[1.1415536],[1.1109211],[1.0685993],[1.0272604],[0.034454443],[0.034516428],[0.034570444],[0.03471502],[0.034645453],[0.034350075],[0.03395382]],"model_test_loss":0.00880099181085825,"input_size":18,"current_date_and_time":"2023-08-08_15-18-22","input_mean":[[18.077564],[-0.0021696435],[-0.009493895],[-0.00854008],[0.0008538185],[0.0005043035],[-0.0007781019],[-0.0034785918],[-0.0073397853],[-0.013359681],[-0.020281872],[-0.008589204],[-0.008590469],[-0.008597665],[-0.008717762],[-0.008793198],[-0.008924687],[-0.0091278395]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.14579934],[-0.14519477],[-3.863266],[3.8427587],[0.04578299],[0.26524872],[0.043028243]],"dense_1_W":[[-0.0036881375,-0.7376499,0.04573843,0.29232818,0.15998328,-1.1800053,0.7352752,0.4613827,-0.3654027,-0.05274166,0.008809302,-0.61651105,-0.19563314,0.30206302,0.48970523,0.70374197,-0.13464865,-0.34472147],[0.0448257,0.74444777,3.2913778,-0.3223886,-0.6795882,-0.048044868,-1.4441773,-0.44268838,1.1609985,1.1341279,-0.6441928,0.8005167,-0.016733218,-0.2582139,0.16986738,-0.40873948,-0.0124958,0.2744736],[-1.4770237,1.2707175,0.45410442,0.4337624,-0.21555193,0.30369025,-0.48256037,0.6929506,0.1363345,0.21567695,0.062066473,0.29594067,-0.016186427,-0.10937184,-0.69198745,0.013495664,-0.49616784,0.4540782],[1.4769372,1.6837573,0.44657153,0.3844198,0.055160612,0.5586182,-1.2392403,0.45482898,0.2477672,-0.08027943,0.28896198,0.13463345,-0.13796607,0.4082866,-1.1263032,0.29988325,-0.50733644,0.42053643],[-0.18178491,-0.9996767,0.046967883,-0.20623134,-0.1303795,-1.4485639,1.2343187,-0.1420455,0.15228446,0.3398408,-0.43701938,-0.09172013,0.17285657,-0.29155666,0.23236762,-0.0009749657,0.069472015,0.017742855],[1.9397535,-0.1242461,-0.09390661,0.22746196,0.65666324,-0.017458677,1.3508519,0.7675915,-0.09389921,0.36527961,-0.014139866,-0.10747237,0.61991864,0.2315784,-0.45759675,-0.15266441,-0.6211227,0.3915748],[-0.018558232,0.32297674,0.12868294,-0.767525,0.06287016,-0.07393509,-0.90018725,0.67280954,0.26545826,-0.15014802,-0.2787869,0.10362763,0.010670472,-0.5394097,0.79302734,0.7212029,-0.006213169,-0.43942323]],"activation":"σ"},{"dense_2_W":[[-0.9424259,0.5383402,0.90808415,-0.23045784,-0.757859,-0.16473587,0.23173162],[-0.15289421,0.38641956,-0.17613852,0.17639944,0.20112754,-0.08048493,0.6478715],[-0.3414318,0.026470331,0.50385565,-0.69266576,0.21662991,-0.18625331,-0.6141596],[-0.64374024,0.15664189,0.7064422,0.40667814,-1.746435,-1.2451849,0.22172058],[0.19559817,0.20769882,0.0077794413,-0.63236123,0.5809092,0.55333596,-0.22226444],[-0.06922767,-0.40762365,0.13696685,-0.70997673,0.5166103,0.19697687,-0.35657585],[0.62951344,-0.5005433,-0.6374106,-0.37252572,0.27152944,0.120718695,0.22742479],[-0.6968117,-0.07335819,0.61275095,0.35386997,-0.4375137,0.3337331,0.14570476],[-0.4349244,-0.14802983,0.19549963,0.40037483,-0.7249839,0.20111199,0.65657336],[0.62348944,-0.4536519,-0.17162655,-0.8989549,0.3261032,-0.54278314,-0.5373072],[-0.560637,-0.25253636,-0.021217873,0.12173196,-0.5342579,0.10775077,0.17879365],[-0.13053471,-0.44042438,-0.16759785,0.37813523,-0.47821322,0.32358372,-0.85976815],[0.71070844,-0.48786935,-0.80289835,0.453067,0.36268723,0.4134905,-0.7282149]],"activation":"σ","dense_2_b":[[-0.35494593],[-0.07334628],[-0.24927561],[-0.2947056],[-0.008191638],[0.014220917],[0.045416523],[-0.05121714],[-0.049447175],[-0.03848008],[-0.05180068],[-0.05216243],[0.12374667]]},{"dense_3_W":[[0.047790118,0.27769247,0.5402979,0.43852547,-0.1079715,0.5151454,-0.28413603,0.36645323,0.54276174,0.2656338,-0.01668038,0.35102823,-0.39181972],[-0.29544407,-0.32329983,-0.4288008,-0.20716709,-0.46158203,0.183949,0.49660423,-0.11650807,-0.65825564,0.3827715,-0.5592475,-0.30018342,-0.18621238],[-0.21135932,-0.095152944,0.2985688,-0.35737342,0.48794743,0.52512395,0.48139963,-0.43845367,-0.67661566,0.5103034,0.08317309,0.37826058,0.3123688]],"activation":"identity","dense_3_b":[[-0.020624995],[0.021909116],[-0.0076635494]]},{"dense_4_W":[[0.28056747,-0.27962217,-1.0827732]],"dense_4_b":[[0.0051891515]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2019.json deleted file mode 100755 index 38e5fcf3bd..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.316835],[1.3095051],[1.0337898],[0.036481883],[1.4656641],[1.4189432],[1.3673624],[1.186987],[1.1331091],[1.0980399],[1.0884928],[0.03714614],[0.03689554],[0.03668804],[0.03629855],[0.036578406],[0.036640365],[0.036640473]],"model_test_loss":0.010191518813371658,"input_size":18,"current_date_and_time":"2023-09-02_05-46-53","input_mean":[[15.765028],[0.016704094],[0.8253681],[-0.018551834],[0.0161312],[0.018667452],[0.018879415],[0.011466884],[0.024275666],[0.019936267],[0.025728673],[-0.018568791],[-0.018556552],[-0.018561324],[-0.01832107],[-0.01819993],[-0.018170435],[-0.017576592]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.32030553],[-0.44030616],[-0.148952],[-0.02167373],[-0.19297738],[-0.5169743],[-0.1770638]],"dense_1_W":[[-0.007737738,-0.99422234,-0.034771074,0.12463431,-0.44775382,-0.82441384,0.8120246,0.39558184,-0.08208208,-0.23790717,0.13854492,-0.35261232,0.2457002,0.28888467,0.06925625,0.06105845,-0.14821048,0.107533954],[1.3339429,-0.13082603,-0.019043105,-0.023946976,-0.8637906,-0.60042715,0.86515206,-0.14659251,0.42036998,0.22912209,-0.41044295,-0.3358372,-0.27527428,0.66332656,0.40219405,-0.32527128,-0.013785728,0.036081836],[0.038707253,-0.5486137,-0.020425517,-0.1048983,0.76533777,-0.12729818,-0.39131224,0.1432435,-0.2479908,0.09698657,0.059673753,0.37905008,0.22068103,-0.5984838,-0.021788964,-0.20137078,0.19989464,0.011386371],[-0.0005377785,-1.626023,0.014272335,0.35176843,2.007245,2.9080265,2.833754,-3.6938229,-1.5402598,-0.2808591,0.53739095,-0.05241689,-0.37616622,-0.22666292,0.34943548,-0.22642688,0.671277,-0.53848034],[-0.060603973,-1.7406929,0.044681583,0.30462697,0.81336474,0.3294149,0.94690406,-0.7220944,0.038787086,-0.110932425,0.29978025,0.3340294,0.097162254,-0.65183747,-0.14593266,0.18223895,-0.41430587,0.27231583],[0.6866103,-0.20675205,-0.008971864,-0.08271559,0.51373845,-0.59504503,-0.028739108,-0.01990747,-0.023005802,-0.23189393,0.16085576,-0.050083302,0.2854166,-0.17596366,-0.16408251,0.23354928,0.27060062,-0.20318592],[1.1686878,0.124509655,0.020137059,-0.0041627684,0.70473355,0.21293509,-0.2924701,-0.11603153,-0.26426125,0.0057812296,0.20993786,0.2904828,0.12312651,-0.4460388,-0.06700564,-0.17043492,0.16500446,-0.016062014]],"activation":"σ"},{"dense_2_W":[[-0.4900633,-0.54592615,-0.527382,0.12028304,-0.54894257,0.27355847,0.31364885],[-0.32254124,0.08293343,0.35285667,0.554822,0.10410332,0.5597751,-0.2383367],[-0.24240835,-0.2615861,-0.4423311,-0.5210761,-0.64304876,0.05002648,-0.30079335],[0.3660343,0.25507227,0.2009346,0.20860061,0.50754935,-0.17693439,-0.75036037],[0.017052304,0.2941397,0.48104966,-0.15767454,0.09076614,0.4001092,-0.383107],[0.5902993,0.07642233,0.042343333,0.3176652,0.051399287,0.06696487,-0.8254014],[0.5891686,-0.1186497,0.3283763,-0.2719375,0.4032117,0.4197208,-0.3724789],[-0.68634295,-0.52495784,0.17351876,-0.35263985,0.06430874,0.027971778,0.6754105],[0.20389055,-1.0025079,-0.5531749,-0.13745287,-1.0573874,-0.75676477,-0.5205683],[0.20552444,0.012774647,-0.54596126,-0.8671801,0.06615193,-0.75334895,0.015773846],[-0.33991626,-0.42872685,0.20969433,-0.02223333,-0.8523562,-0.26464137,0.6920498],[0.20529774,0.58902216,0.031505145,-0.1747456,0.41559178,0.5189576,-0.7233773],[-0.009052229,-0.5893052,0.17319442,-0.64532185,-0.79119825,-0.11295332,1.4095422]],"activation":"σ","dense_2_b":[[0.12995131],[-0.034807533],[-0.13722797],[-0.16153306],[-0.04602981],[-0.083130985],[-0.08390648],[0.071044385],[0.08433932],[0.04963225],[0.21911931],[-0.17281601],[0.68126506]]},{"dense_3_W":[[0.5093516,-0.5465462,0.15503123,-0.35234037,0.49185485,0.30204552,-0.5992861,0.0021642335,-0.05107888,0.26263082,-0.18888572,0.12664975,0.13551807],[-0.5860282,-0.09242898,0.1262402,0.32523513,0.379274,0.6664111,-0.3863529,-0.53702825,-0.08325101,-0.26101434,-0.31930283,0.4272874,-0.026482869],[-0.3292326,0.3132907,-0.25563857,0.3411082,0.20792365,0.07308729,0.4294356,-0.6729368,-0.48279455,-0.4198804,-0.2859276,0.60702205,-0.5340056]],"activation":"identity","dense_3_b":[[-0.0040983167],[0.007357109],[0.007665874]]},{"dense_4_W":[[0.24334429,-0.71678704,-1.1551462]],"dense_4_b":[[-0.0067243]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA SELTOS 2021 b'xf1x00SP2 MDPS C 1.00 1.04 56300Q5200 '.json b/selfdrive/car/torque_data/lat_models/KIA SELTOS 2021 b'xf1x00SP2 MDPS C 1.00 1.04 56300Q5200 '.json deleted file mode 100755 index 7a38f06d90..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA SELTOS 2021 b'xf1x00SP2 MDPS C 1.00 1.04 56300Q5200 '.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.5049157],[1.2475282],[0.53859144],[0.048527],[1.2465597],[1.247301],[1.2471614],[1.2284999],[1.2013417],[1.1699766],[1.1366358],[0.04837552],[0.04840895],[0.048440192],[0.0483831],[0.048159745],[0.047685053],[0.047009286]],"model_test_loss":0.0057355728931725025,"input_size":18,"current_date_and_time":"2023-08-08_16-34-39","input_mean":[[22.57612],[0.051288225],[-0.016445091],[-0.009996599],[0.056181632],[0.055123083],[0.054446794],[0.046347804],[0.039804146],[0.03435145],[0.029239772],[-0.010040664],[-0.009997898],[-0.009956628],[-0.009932108],[-0.009981547],[-0.010063302],[-0.0102707045]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0029297848],[1.8960894],[-0.7305671],[-0.6444308],[0.08400337],[-0.044434916],[-2.0828273]],"dense_1_W":[[-0.013393204,-1.2459188,-5.89612,0.48348445,0.71024114,0.761591,0.62751406,-0.5100544,-1.1702846,-0.5760703,0.9551647,-0.38647708,0.02746218,0.30091053,-0.4128432,0.65483654,-0.22607383,-0.17742366],[0.88628805,-0.8472278,-0.16042891,0.12056248,0.8128825,-0.3501976,-0.112867065,-0.14086482,0.22233468,0.18555838,-0.11159323,-0.56888944,-0.008235887,0.28833345,0.2616878,-0.03133189,-0.023425877,-0.10819697],[0.55932784,-0.50783956,0.016862486,0.021586508,-0.052158702,-0.2640505,0.36748064,-0.10141347,0.11880612,-0.01899467,-0.04536525,-0.03297897,-0.48517683,0.29445776,0.30262306,0.15327907,0.21546906,-0.23894748],[0.57508934,0.10616214,-0.02150118,0.15490909,-0.22505246,0.33355552,0.17564031,-0.078227825,0.33327138,-0.21566688,0.049708415,0.46191642,0.18780328,-0.89038825,-0.059960928,-0.12284671,-0.03831184,0.07615082],[0.006142582,-0.41586003,0.28906634,-0.39670786,-0.15463385,0.5797065,-0.07188739,0.0075380234,0.42778745,0.18411557,-0.22944504,-0.24470419,0.035731394,-0.13284975,-0.056895383,0.2658999,0.09685396,-0.004589674],[0.00045123146,-0.30300197,0.024411071,-0.32110432,0.007924963,-0.95534456,0.3975994,0.30021676,0.20445354,-0.2845605,-0.024686944,-0.15269357,0.010459293,0.06211917,-0.14940602,0.09413633,0.12700596,0.20926088],[-0.8864738,-0.91397375,-0.17195456,-0.099857494,0.64577985,-0.28100497,0.023341348,-0.11484865,0.3246616,-0.009700837,-0.04576229,-0.20125109,0.07292384,0.11487104,-0.019341417,0.3695137,-0.4571989,0.14654264]],"activation":"σ"},{"dense_2_W":[[0.16676657,0.044276875,-0.42283165,0.71878445,0.40764466,-1.0148888,-0.33971024],[0.69733125,-0.44017676,0.32185918,-1.5657734,-1.1737024,0.6366674,0.6671088],[-0.022854185,-0.71255684,0.2196965,-0.3687845,0.040978383,0.062146485,-0.22804913],[-0.28942934,-0.23564734,-0.42564517,-0.039671488,0.365399,0.20703237,-0.597828],[0.0347196,-0.07633118,0.58261573,-0.15203993,-0.91041917,0.7339944,0.48777974],[-0.32692164,-0.6838728,-0.25992492,0.6972931,0.53116393,-0.5526861,-0.030371524],[-0.2410249,-0.45013347,0.20631957,-0.15482004,-0.44667387,-0.76256126,-0.19490236],[0.3978247,-0.10121961,-0.5776459,0.7954871,0.22263652,-1.0624558,-0.46528906],[0.2895336,0.9195127,1.048547,-0.32349822,-0.8403002,0.08939599,0.22750446],[-0.41278213,-0.17696421,1.0299006,-0.5467821,-0.47607332,0.9951936,0.687682],[-0.009069157,-0.6828468,-0.22575156,0.52762353,0.37542656,-0.6015784,-0.07695309],[1.2645018,1.0877368,1.2602909,0.12577315,-0.3815145,0.06697079,-0.4439591],[0.28825867,-0.43880102,0.0008854993,-0.21242517,0.37472376,-0.21022174,-0.71526283]],"activation":"σ","dense_2_b":[[-0.0043339795],[-0.7411984],[-0.3235559],[-0.0028266062],[-0.30525705],[0.09933733],[-0.28506866],[-0.12051076],[-0.2798327],[-0.34464663],[0.04831867],[-0.31347185],[-0.0137135675]]},{"dense_3_W":[[0.48027906,-0.34028012,-0.5646587,0.106692836,-0.03532492,0.63961244,0.66511965,0.54406637,0.21516123,-0.17382753,0.376983,-0.55481,-0.113014586],[-0.6947742,0.5437955,-0.26280165,-0.6517489,-0.17782186,-0.09640967,0.45545045,0.11279408,0.322814,-0.40994444,-0.68243754,-0.049466625,0.17386594],[-0.2016882,0.33245435,-0.22961138,-0.045353495,0.5742978,-0.75247186,0.120317265,-0.09858627,0.5166808,0.6125953,-0.088035,0.14460035,-0.23711456]],"activation":"identity","dense_3_b":[[0.04315742],[-0.025058303],[-0.06259806]]},{"dense_4_W":[[0.5995295,-0.25079918,-1.226213]],"dense_4_b":[[0.054296162]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.04 56310R5030x00 4MQDC104'.json b/selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.04 56310R5030x00 4MQDC104'.json deleted file mode 100755 index e58a0a3add..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.04 56310R5030x00 4MQDC104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.828237],[0.97600704],[0.4089475],[0.035214473],[0.9679743],[0.970265],[0.9714391],[0.9529998],[0.93442535],[0.907574],[0.87835944],[0.035107806],[0.035135653],[0.035162415],[0.03512646],[0.0350294],[0.03484094],[0.034691963]],"model_test_loss":0.010908995755016804,"input_size":18,"current_date_and_time":"2023-08-08_17-24-46","input_mean":[[23.668701],[0.043239903],[-0.008454303],[-0.0006616455],[0.05023332],[0.0483886],[0.046359282],[0.042707],[0.038750947],[0.031606093],[0.023638321],[-0.0005428065],[-0.00058967434],[-0.00064167456],[-0.0007974575],[-0.0008222639],[-0.0008730811],[-0.0009429487]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.07139598],[2.2307112],[-0.22793715],[0.028497862],[-1.4758755],[-2.2683609],[1.7139114]],"dense_1_W":[[0.05402334,0.7879195,4.0841537,-0.56412846,-0.06755307,0.16052529,-0.98961514,0.082657665,-0.29167134,0.3808659,-0.24588543,0.27139375,-0.021965634,0.08988655,0.5314556,0.022917956,-0.28474882,0.16892314],[0.040134925,0.9678868,0.2435498,-0.22607546,0.26583675,0.16535611,-0.29292968,-0.06048666,0.3677877,0.12361147,-0.06213637,0.23552014,0.001912692,-0.086550094,-0.35551274,-0.057126056,0.035038613,0.025732724],[-1.2022591,-0.2863651,0.33088538,0.5872443,0.15807754,-0.37816197,0.79342896,-0.52512366,-0.14498816,-0.047592632,0.23991925,-0.3639295,-0.25689954,-0.12431776,0.17954038,0.04690324,0.27545586,-0.3235991],[-0.0032510161,-0.90251637,0.0055037816,-0.046377614,-0.15268828,-0.56092745,0.54981595,0.039801016,-0.04936413,-0.0055981306,-0.071823165,-0.70809287,0.013437283,0.69162565,0.26313534,-0.058428794,0.08031778,-0.09614916],[-1.5630318,0.17789239,0.4537161,-0.0041152863,-0.39420608,-0.15796205,-0.7327813,0.66765463,0.4993053,0.405701,-0.65776676,0.3633854,-0.38824862,-0.53840584,0.27669683,0.48978165,-0.033090215,-0.2082885],[-0.029351536,0.9172641,0.2475216,-0.3134773,0.17839907,0.2644386,-0.063878715,-0.15182072,0.32643992,0.184796,-0.05073872,0.13546649,0.33546865,-0.20729195,-0.36180612,-0.11467291,-0.092137635,0.1431712],[-2.7309752,0.47239518,-0.8031595,-0.45335308,-0.5626998,0.3833318,-0.09541673,-0.21970436,-0.67134327,-0.43375826,0.4113513,0.43214273,0.17258164,0.00038695108,-0.27933037,0.2652092,-0.11726535,0.14931515]],"activation":"σ"},{"dense_2_W":[[0.18113254,0.2362841,0.23913723,0.4250595,0.41874975,-0.14176264,0.07982823],[1.2559026,-0.04362239,-1.9165045,-3.4750113,2.4915068,3.245088,0.7472181],[0.21553496,-0.15909076,0.1990112,0.06815371,0.40578955,-0.74799186,-0.40865952],[-1.270139,-0.5704174,0.013024697,-0.17953704,-0.36550337,-0.51389843,-1.1189383],[-0.4607257,-0.24294525,0.30119574,0.51511997,-0.5896765,-0.38873392,0.4903248],[0.27587494,1.3980604,0.41343182,-0.55864316,0.13226879,0.41889343,-0.025503036],[-0.11382582,-0.72006303,0.31443623,0.47339836,-0.05456861,-0.45569026,-0.44168296],[-0.14633095,-0.86015487,0.18689813,-0.007913177,-0.68155503,0.0981196,-0.20697698],[0.21121454,0.07270005,-0.47414,0.14561962,-0.47502828,-0.058896564,-0.30503902],[1.5235077,4.3672147,-1.9797657,-2.1577153,0.08651692,0.56285816,0.7441386],[-0.35447982,-0.2280675,0.2248906,0.69576144,-0.19720139,-0.035972144,0.23887096],[0.5307749,0.8708496,-0.9982855,0.06719293,0.5508931,-0.3601659,1.1098136],[0.41608205,-0.9552457,-0.7181348,0.54820853,-0.20942546,-0.0229672,-0.61255497]],"activation":"σ","dense_2_b":[[-0.09698142],[-1.4033747],[-0.07078607],[-0.105896965],[-0.032276735],[0.039644904],[-0.049273986],[-0.123684354],[-0.19865851],[-1.3548915],[-0.040826697],[-0.2473369],[-0.1898357]]},{"dense_3_W":[[-0.07364597,-0.28819343,0.33614686,-0.11555612,0.54371834,0.06078414,0.25967473,0.16326325,0.052277688,-0.2328434,-0.1264749,-0.36707604,0.6011789],[-0.4987282,0.21116212,-0.041836318,-0.45521593,-0.2570767,0.5502648,-0.13099706,-0.33858767,-0.0388845,0.24381347,-0.45033324,-0.28740764,0.032078497],[-0.360317,0.73834044,-0.30889666,0.7047129,0.37393212,0.31944397,-0.13176474,0.18058318,-0.22899523,0.7277826,-0.43414494,-0.6223405,0.1327134]],"activation":"identity","dense_3_b":[[-0.07107471],[0.075273246],[0.038589373]]},{"dense_4_W":[[-0.73965013,0.41693646,0.8098712]],"dense_4_b":[[0.070436954]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.05 56310P4030x00 4MQHC105'.json b/selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.05 56310P4030x00 4MQHC105'.json deleted file mode 100755 index da245a1a09..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN b'xf1x00MQ4 MDPS C 1.00 1.05 56310P4030x00 4MQHC105'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.360649],[0.8416322],[0.33437338],[0.04986401],[0.8348178],[0.83668405],[0.8381006],[0.8281648],[0.8175133],[0.80145794],[0.7849904],[0.04949942],[0.0495519],[0.04959984],[0.049575604],[0.049440794],[0.049178783],[0.048773665]],"model_test_loss":0.011909223161637783,"input_size":18,"current_date_and_time":"2023-08-08_19-02-44","input_mean":[[18.798538],[0.060060456],[0.0042254925],[-0.01005732],[0.061129835],[0.06208465],[0.06287847],[0.05924524],[0.053896163],[0.050247815],[0.048835788],[-0.010078115],[-0.010027372],[-0.009984768],[-0.010235178],[-0.010460788],[-0.010615164],[-0.010720316]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.3711772],[4.0384655],[-0.60371107],[-0.021517932],[0.059795618],[0.014027763],[0.6545455]],"dense_1_W":[[-1.7019469,0.01004788,1.2882278,-0.38348064,0.12244237,1.0539651,0.010641099,0.41091317,0.3839485,0.36134282,-0.18248878,0.036194474,0.5019625,-0.4913562,-0.25413185,-0.011724185,0.1496672,0.11843239],[1.7626301,0.23605797,1.3201638,-1.0663824,0.2729441,0.6596989,-0.081463575,0.61732155,0.33063596,0.53841823,-0.3461883,0.6325652,0.09249081,-0.21124457,-0.2544897,0.28014565,-0.013723431,0.19491264],[0.27358976,-0.88453114,-0.03890136,0.48175734,-0.016419638,-0.97174513,0.2863007,0.3938403,0.11718968,0.18793224,-0.29152203,-0.6642347,0.14523181,0.30439466,0.17772515,0.17078802,-0.075555354,0.038167004],[0.04198796,-0.43382403,1.6559426,0.09345928,0.6753657,-0.4891842,0.44554886,0.011966843,-0.26713324,-0.09224718,0.20697893,-0.8472049,0.14456306,0.44531605,0.005752212,0.19066374,0.34522521,-0.41704535],[-0.3430911,-0.33624044,-0.03918591,0.4145386,-0.37784162,-0.32403097,-0.3204265,0.19870447,0.10699937,0.0043252283,-0.15599932,0.11689893,-0.06691096,2.8774783e-5,0.07241905,-0.3570826,0.23487402,0.17241248],[0.02902531,0.22444873,2.0474432,-0.046874467,-0.318975,0.12265587,-0.33706895,0.3610506,0.22912423,0.44967905,-0.6113972,0.63183457,-0.12738343,-0.534021,-0.06903115,0.026587073,0.024522554,0.063068636],[0.0050931163,-0.5446937,0.1994072,-0.9001721,1.0302886,0.49093354,1.1983348,1.1123027,0.4812851,0.057845764,-0.39551273,-0.40197656,0.018871471,0.021246241,0.06228036,-0.3096515,-0.12146903,-0.37020501]],"activation":"σ"},{"dense_2_W":[[-0.35032728,-0.5031512,0.20565645,0.5048391,0.5721213,-0.75960577,0.41200778],[-0.083224565,-0.4266255,0.3613455,-0.31832695,0.7508301,-0.42364982,-0.041131567],[-0.19479334,0.13154602,-0.49550515,-0.057689346,0.25966644,0.019963862,-0.30955124],[0.56296927,-0.2241234,-0.74579465,-0.19006501,-0.5774306,0.5061718,-0.4157748],[-0.18207398,0.74063724,-0.43985197,-0.60961854,-0.63657373,0.98453957,-0.2611528],[-0.08481909,-0.17079473,-0.9215012,-0.28457326,-0.108750716,0.5557871,-0.24374656],[0.28946897,-0.2658649,-0.17986174,0.7817012,-0.03662516,-0.15243457,0.65582645],[0.06432835,0.035722017,0.24966948,0.1820806,-0.34214944,0.04920283,0.10240223],[-0.106335714,-0.43905434,-0.99428046,-0.5975757,-0.6509662,0.8275932,0.12634481],[1.0581882,-0.3677934,-0.9597405,-1.0668633,-0.7719651,1.0440427,0.07109511],[0.57484365,-0.48430628,0.32345054,0.79538834,0.54478437,0.47041076,-0.14143173],[-0.35414475,-0.41750684,0.8834586,0.2510105,0.15189533,-0.17024374,0.30005693],[0.45395577,0.93997616,-0.9476304,-0.6193973,-0.8066399,0.6195946,-0.048480663]],"activation":"σ","dense_2_b":[[-0.10116813],[-0.14295042],[-0.0813808],[-0.002537517],[0.23133247],[-0.06090244],[-0.012912041],[-0.31398782],[0.026570017],[0.100405954],[0.024308678],[0.013686816],[0.16338688]]},{"dense_3_W":[[0.67018026,0.45342138,0.2517602,-0.7161156,-0.45907423,-0.30567223,0.6014191,-0.2725562,-0.45720404,-0.52766263,0.22907431,0.38704422,-0.6652359],[-0.43428063,0.278939,0.07284501,0.58099675,0.534265,0.408692,0.2663524,-0.13852553,0.70378095,0.12224407,-0.06698436,-0.7304552,0.043905403],[0.49885213,0.35949433,-0.28865784,-0.4043822,-0.032159276,-0.4398066,-0.1666352,0.3646978,0.109651156,-0.052056532,0.2463666,0.16612957,0.099209264]],"activation":"identity","dense_3_b":[[0.0218462],[-0.042534254],[0.01341708]]},{"dense_4_W":[[-0.94743174,0.5062643,-0.579337]],"dense_4_b":[[-0.02170465]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA SPORTAGE 5TH GEN.json b/selfdrive/car/torque_data/lat_models/KIA SPORTAGE 5TH GEN.json deleted file mode 100755 index 69e710e228..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA SPORTAGE 5TH GEN.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.271582],[1.2324897],[0.6433989],[0.04141489],[1.2489065],[1.2435695],[1.2356619],[1.172688],[1.1162171],[1.0433639],[0.9707198],[0.04149849],[0.041483577],[0.04144006],[0.041163605],[0.04088149],[0.040357973],[0.039594423]],"model_test_loss":0.008056153543293476,"input_size":18,"current_date_and_time":"2023-09-02_08-29-22","input_mean":[[18.359726],[-0.037949927],[0.5234115],[-0.008337179],[-0.04552693],[-0.04569026],[-0.04552523],[-0.039857816],[-0.033734176],[-0.024680167],[-0.015604315],[-0.008196234],[-0.008305338],[-0.00844266],[-0.0089836335],[-0.009296811],[-0.009439258],[-0.009452471]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.94973767],[-2.433663],[-0.034619235],[-0.077283],[-2.7017562],[-0.09339245],[-0.6244862]],"dense_1_W":[[0.80034006,1.0705961,0.000825829,-0.09964225,0.40290698,0.47271788,-0.30613136,0.9018622,0.00026438956,0.09919525,-2.150913,0.49553874,-0.3608581,-0.1313319,-0.4082762,0.09144183,0.0788233,0.34741214],[-2.3832078,0.71298873,-0.005020484,-0.17478089,1.0590492,-0.31795993,-1.1199154,-0.5731978,-0.0998752,-0.25876248,0.21498705,-0.14916337,0.33611503,0.25201452,-0.13425598,-0.23907493,0.0071402895,0.17116584],[-0.07616245,-0.34612796,-0.011475999,-0.072679855,0.58056265,-0.395393,-0.27633327,-1.8887899,-0.6015088,0.49371734,1.9656835,0.19998965,0.0057602297,0.13962367,0.12470687,-0.18640584,-0.023864588,-0.19377947],[0.010883457,0.6855033,-0.0010638234,-0.24550597,0.015826495,-0.35939503,0.53073984,0.3727611,-0.5348426,-0.44873196,0.39434654,-0.17992191,0.4207321,-0.22305717,0.23088501,-0.09521394,-0.11022331,0.06272074],[-2.3750079,0.02318054,0.005723935,0.4172705,-0.6483569,0.11516915,0.21627235,0.8689977,-0.097739585,-0.17518516,0.080854654,-0.5044023,-0.23945011,0.5778991,-0.19969985,-0.05412506,-0.018118298,-0.047388777],[0.034274723,-0.57860583,-0.0072152913,0.24105103,-2.9188197,-2.175338,-1.1614898,3.7702558,2.6517565,0.844019,-0.7422007,0.3744097,0.13847013,-0.2812754,-0.75471646,0.14402452,0.31923193,-0.22577274],[0.6020792,-0.93845457,0.0032515822,0.29181626,-0.71029466,-0.23251307,0.4013084,-0.9979102,0.07712134,0.010485791,1.9087931,-0.24826817,0.05725912,0.07313231,0.22776487,-0.03669609,-0.074751236,-0.3001132]],"activation":"σ"},{"dense_2_W":[[0.41379273,-1.5534699,-0.061251666,0.9784582,-0.31017292,0.5312373,-0.30788672],[-0.8307559,-0.5997123,-0.10822264,-0.16534962,-0.92172116,-1.0821096,0.27836254],[-0.04996724,0.016284576,0.15466881,-1.2067809,-1.0948375,-0.033628576,0.46014366],[-0.23169208,0.75857294,-0.95120645,-0.9115383,0.30752045,-0.28777564,0.08635593],[-0.39187977,0.5864086,-0.6104791,-0.4405727,-0.5313213,0.30406076,0.062464662],[0.34800822,0.8006306,-0.2674241,0.30921367,1.2659222,0.5549054,-0.80455273],[0.52084416,0.28339612,0.35776538,0.61953413,0.5954671,0.35080484,-0.4923708],[0.6637605,-0.90991306,1.2823876,-0.31609806,-0.17648666,0.84696317,0.4531972],[0.18129082,-0.1456923,0.860548,0.9921053,0.10297215,-0.23329806,-0.703881],[-0.6871936,-0.35452083,0.16561241,0.52725476,0.30145702,0.095435195,-0.031700533],[-1.037031,-0.12172777,-0.37805697,0.9377832,1.6396,1.0745027,-0.81819445],[0.4548168,-0.14163275,0.34056768,0.24697062,0.20977701,-0.09230414,-0.4355987],[-0.4384788,0.08605435,-0.4810871,-0.79529417,-0.68544877,0.46262282,0.39435223]],"activation":"σ","dense_2_b":[[-0.48680034],[0.068014495],[0.04869933],[0.2673811],[0.15607266],[-0.048658077],[-0.26778942],[-0.18545923],[-0.28900617],[-0.2309299],[-0.33494246],[-0.16927081],[0.20434596]]},{"dense_3_W":[[0.3822013,-0.4389438,-0.41882336,-1.0697446,-0.36492467,0.11356586,0.35364708,0.65464646,0.21121821,0.11611892,0.44234788,0.32605755,-0.81655335],[-0.4098758,0.73658663,-0.137919,0.9484474,0.6109782,-0.055106185,-0.0077281683,0.19195211,-0.24094999,0.010442004,-0.6749704,0.28052664,0.024752859],[-0.25375482,-0.2737522,0.2542901,-0.19734219,0.17325146,0.15619496,-0.18796492,-0.107151814,0.055576775,0.52131623,-0.14911918,0.16789204,-0.67280823]],"activation":"identity","dense_3_b":[[-0.123436764],[0.06764906],[-0.048735052]]},{"dense_4_W":[[1.3109156,-0.35272652,0.104447454]],"dense_4_b":[[-0.1077713]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503'.json b/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503'.json deleted file mode 100755 index 2dc670357d..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5300 4C2CL503'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.1329846],[1.0240825],[0.55357367],[0.032864623],[1.0280122],[1.0259764],[1.0244912],[1.0091227],[0.99859416],[0.99492943],[0.99062693],[0.03290333],[0.03287097],[0.03284539],[0.03274356],[0.03259516],[0.03226275],[0.031924404]],"model_test_loss":0.0039173574186861515,"input_size":18,"current_date_and_time":"2023-08-08_21-06-15","input_mean":[[17.373055],[-0.121487565],[0.004857097],[-0.0043323576],[-0.122308314],[-0.12176135],[-0.12166673],[-0.12044618],[-0.11866407],[-0.11413705],[-0.11999074],[-0.0043443115],[-0.0043463064],[-0.0043407544],[-0.0043205405],[-0.004334937],[-0.004431707],[-0.0045705433]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.15578866],[-0.121010795],[2.607187],[0.024626328],[-0.2870057],[-1.3427569],[-0.17659523]],"dense_1_W":[[-0.0033034484,-0.052573163,0.22313437,-0.4994298,0.23290847,0.23589677,0.24603657,-0.08493268,-0.17096585,0.21070172,0.14998867,-0.12246095,-0.27713594,0.266521,0.15202883,-0.5736784,-0.7178588,-0.22354351],[-0.033423953,0.48308042,4.3161335,-0.13211238,-0.22973481,-0.2271183,-0.17018077,-0.080117166,0.23103811,-0.06745466,-0.22646382,-0.14490494,-0.44278416,0.23661947,0.76887465,-0.16852573,-0.29098848,0.19946156],[0.8961271,-0.47064975,0.49676007,-0.5249683,0.1959607,0.82731485,-0.08854316,0.487867,-0.09237197,0.09834567,0.050139025,0.031087723,-0.018046698,0.23961507,0.48042274,-0.050623044,-0.061986376,-0.09952346],[-0.0008700511,-0.16591707,0.14862742,-0.07141854,-0.5259756,0.843034,-0.30464283,0.47228673,0.47462964,-0.019866813,-0.20559688,-0.12733686,-0.3478062,0.6510686,-0.49144772,-0.57306224,-0.30681828,-0.07526166],[-0.871296,-0.1437896,0.5101226,0.24243414,0.23617809,-0.778845,0.66372377,0.8925617,0.811687,-0.4287381,-0.18957064,0.00992578,-0.08970741,0.320578,-0.4153779,-0.30179247,0.32845688,-0.09843358],[-0.56676364,0.10569009,0.32999828,0.031681255,0.019788198,0.49837622,-0.1160794,0.06925489,0.10766315,-0.06880369,0.07340804,0.4267022,-0.24849682,-0.16590549,-0.19864106,0.101786755,0.19663657,-0.15131107],[0.016626861,-0.24604829,-0.008103917,0.4317491,0.09287087,0.963533,-0.42994773,0.15286058,-0.10805577,-0.01726937,0.1516635,0.12822759,-0.06660257,-0.07250721,-0.49660203,0.03619374,-0.09870995,0.12891567]],"activation":"σ"},{"dense_2_W":[[0.35354838,0.08248845,-0.2643721,0.028969606,-0.16676016,-0.8305304,-0.3016516],[-0.22521318,0.3866312,0.4977837,0.076887876,-0.71179044,0.6780423,0.50716233],[0.46899542,-0.24904732,0.14908811,-0.89964503,0.46441752,-0.70685565,-0.22258599],[0.11673758,-0.67375845,-0.84481615,-0.048750993,0.20950693,-0.4879097,0.16695245],[0.13204935,-0.24652998,-0.33666334,0.89801437,0.33655748,0.5779938,-0.14154734],[-0.5384168,0.014923374,0.29242253,0.00864887,-0.09533511,0.30288514,0.830687],[-0.5773432,-0.32536963,-0.42681998,-0.23757271,-0.17945053,0.15035582,0.0041262284],[0.34518933,-0.32978058,-0.21651018,-0.5379371,0.34204122,-0.32106385,-0.6527221],[-0.42277348,0.16665061,0.3108687,-0.28702435,-0.5732586,0.75958574,0.86309266],[0.015375347,0.19915505,-0.42266467,-1.0245055,-0.05351699,-0.6963474,0.14833081],[0.23518765,0.3833349,0.13227822,-0.584967,0.30398777,-0.93099904,-0.5175701],[0.06394686,-0.43986523,-0.12684605,-0.8447283,0.6266354,0.04569117,-0.8361707],[0.49337465,0.33293915,-0.96844876,-0.4276928,-0.6929566,-0.28569952,-0.14265089]],"activation":"σ","dense_2_b":[[-0.024476556],[-0.11499582],[0.022631852],[-0.009896085],[-0.014204676],[-0.043049544],[-0.30805475],[0.025720058],[-0.107878506],[0.009352697],[-0.04004397],[-0.022493577],[-0.01955864]]},{"dense_3_W":[[-0.57439166,0.5246423,-0.19036132,-0.40068084,0.5114071,0.46818924,0.3444213,-0.7027561,0.40878892,-0.3749757,-0.6299576,0.32576016,-0.16117278],[0.4093721,-0.3366498,-0.52919716,-0.008743298,-0.08526943,0.6047717,-0.1464253,-0.6356685,0.27361497,-0.6559057,-0.636247,-0.10396182,-0.087822154],[-0.0016937943,-0.6977227,0.6259379,0.64517385,-0.23953342,-0.55496264,0.22454576,-0.4191411,0.0044411933,0.005649371,0.58461046,0.60280037,0.57034343]],"activation":"identity","dense_3_b":[[0.011864344],[0.06484405],[-0.028621858]]},{"dense_4_W":[[0.63415956,0.3032611,-1.0295273]],"dense_4_b":[[0.026569296]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503'.json b/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503'.json deleted file mode 100755 index 8d8208b0f0..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA STINGER 2022 b'xf1x00CK MDPS R 1.00 5.03 57700-J5380 4C2VR503'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.766022],[0.5533229],[0.2856296],[0.033792395],[0.5389918],[0.54306436],[0.54760325],[0.55337805],[0.55737114],[0.5617065],[0.5625296],[0.03348953],[0.033542342],[0.033610392],[0.033808257],[0.033930898],[0.034050055],[0.034098357]],"model_test_loss":0.0027918475680053234,"input_size":18,"current_date_and_time":"2023-08-08_21-31-03","input_mean":[[21.389719],[0.0015681498],[-0.0053915554],[-0.002413832],[0.0013884547],[0.0015199955],[0.0016545503],[-0.0005008584],[-2.2193064e-5],[0.003740185],[0.0043427483],[-0.0020289146],[-0.0020741888],[-0.0021126948],[-0.0021486785],[-0.0021773984],[-0.0021409069],[-0.002074085]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.005023801],[-0.11859596],[-0.083387464],[2.9536428],[-3.17796],[0.013405252],[0.29147854]],"dense_1_W":[[-0.0033325052,0.6876983,-0.07805519,-0.19289164,0.65789926,-1.3244646,-0.020963509,-0.37362412,0.13077013,-0.40126017,0.35083288,-0.46714717,-0.6626373,-0.3469128,1.4830853,0.5011229,0.28441152,-0.4636832],[0.3598699,-0.64306945,2.2225964,0.4161311,0.41669363,-1.0839597,0.92909795,-0.95103395,-0.5053492,0.12075414,1.4680102,-0.2333293,-0.24382429,0.008533065,-0.19225878,0.18216391,0.11589113,-0.20803492],[0.20756045,2.033753,2.1817362,-0.9258632,-0.0874673,-0.5312963,-2.7698588,-0.14382717,0.5049645,0.37967896,0.4239767,0.7745002,-0.13785833,-0.38348323,0.5186508,-0.078807354,0.21235526,-0.11610479],[1.4961438,-0.3139877,0.28255,0.26589444,-0.61779964,1.0510086,-0.6857809,0.25174332,0.8591813,0.0057339612,0.012607628,0.16490415,-0.06531447,-0.11422419,-0.04204824,-0.2578638,-0.073865555,0.12349488],[-1.5165002,-0.0548487,0.28816897,-0.44763196,-0.85135686,1.1610124,-0.761776,0.5293456,0.32867563,0.25241977,-0.027216699,0.032018177,0.37777507,0.1571353,-0.21763782,0.32281792,-0.48416787,0.24708028],[-0.0059207403,0.75648165,0.00349558,-0.6363216,-0.2229793,-1.8046044,-0.11476358,0.26718977,0.025075352,0.8795477,-0.95764613,1.086634,0.044866603,-0.14078698,-0.16995233,-0.6281635,-0.20085551,0.6414435],[-0.003071575,0.12751202,-0.011326043,-0.020205589,-0.36886206,0.30381098,-0.34500697,0.18834841,-0.24861936,-1.2992047,0.863031,-1.9390234,-1.3683192,-0.63276744,-1.2014979,9.656866e-5,0.09690952,-1.0078585]],"activation":"σ"},{"dense_2_W":[[0.39662704,0.48374733,-0.29005706,0.07393947,-0.42477635,0.2564262,-0.42727342],[0.21152999,0.061012335,-0.7423783,-0.5523955,-0.39889368,0.38016352,0.54106915],[0.68259335,0.47207102,-0.8016757,-0.12860833,-0.49738726,0.6516305,0.014673964],[0.47920755,-0.107558385,0.04683691,-0.006397021,-0.44672456,-0.18994014,-0.46220642],[-0.30933115,-0.46241206,-0.063971646,-0.63298374,0.16368231,0.45431167,0.069120824],[0.13341828,0.12734184,0.23883563,-0.30482867,0.6489039,0.54735976,0.3412583],[0.12302853,0.066058725,-0.73864675,-1.1300348,0.62163764,0.53437996,-0.48281124],[0.20568475,-0.00066856324,-0.23245256,-0.07801379,-0.051070046,0.18588813,-0.42292082],[-0.75646293,-0.43007204,-0.013988241,0.65225786,0.47503433,-0.5898269,0.097233206],[0.4212197,0.27158758,-0.03540538,-0.8047878,0.059127036,0.35010928,-0.7840495],[-0.74006635,-0.7154454,0.26572984,0.67159295,0.33328587,-0.29086044,0.44390428],[-0.26889247,-0.01841652,-0.12786053,0.7110297,0.9222276,-0.13066176,-0.4141216],[-0.13986242,-0.16117467,0.5941917,-0.43290535,0.29161388,-0.7472561,-0.6601617]],"activation":"σ","dense_2_b":[[-0.10558703],[-0.086225174],[-0.024091406],[-0.06185179],[-0.1395063],[0.0145245325],[-0.14875814],[-0.06766006],[0.15597098],[-0.31839365],[0.027026298],[0.028820656],[-0.21016255]]},{"dense_3_W":[[-0.231988,-0.5889274,-0.1283931,0.20118165,-0.3871818,0.6120688,-0.5323036,0.09410525,-0.37467438,-0.33146307,0.18340798,0.30552286,0.5499228],[0.38446704,0.16326652,0.51952577,-0.2927903,0.28178582,-0.28718108,-0.019530099,0.15835221,0.12750727,0.4528022,-0.37826803,-0.32343772,0.41362897],[-0.07056111,-0.5892277,-0.6703741,-0.48694804,0.19810483,0.2863676,-0.40396088,-0.33865243,0.5503839,0.37918863,0.62173796,0.26518953,0.3827839]],"activation":"identity","dense_3_b":[[0.068464704],[-0.059921235],[0.04597432]]},{"dense_4_W":[[0.1415478,-0.47448632,0.58617306]],"dense_4_b":[[0.04461211]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104'.json b/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104'.json deleted file mode 100755 index d83cf8beb0..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.04 57700-J5420 4C4VL104'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.1246],[0.9034975],[0.48962846],[0.03529078],[0.8946102],[0.8961149],[0.89784646],[0.8950175],[0.88876706],[0.87975305],[0.86753106],[0.035175696],[0.035196],[0.03522797],[0.035351437],[0.035319105],[0.035140432],[0.034972258]],"model_test_loss":0.00436203321442008,"input_size":18,"current_date_and_time":"2023-08-08_22-21-02","input_mean":[[23.931408],[-0.13063739],[-0.0062418687],[-0.010867324],[-0.13015318],[-0.13073899],[-0.13138658],[-0.12890545],[-0.126041],[-0.12821095],[-0.12799272],[-0.010868597],[-0.010878354],[-0.010887906],[-0.010903779],[-0.010916722],[-0.011080605],[-0.011242595]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.1994641],[-0.07004483],[0.04915275],[0.83877975],[0.13017571],[-1.118901],[-2.8877945]],"dense_1_W":[[0.7289999,-0.5943847,-2.0439968,0.1408729,0.014804936,-0.33637556,0.6747208,-0.031742137,-0.1290714,-0.25518748,0.66278976,-0.9197349,0.2682647,0.546328,0.183721,0.025967568,-0.26059458,-0.0011381623],[1.41076,-0.98072547,-0.009269284,0.10443673,0.2938804,0.11221869,0.023663813,-0.06939159,-0.12669353,0.1424146,0.008126474,0.2754397,0.27598444,-0.34879938,-0.3349643,-0.2994688,0.12687577,0.18874463],[-0.027532505,-0.13840102,-0.00062686426,0.08105477,0.09020943,0.84446275,-0.33102164,0.1570382,-0.040472265,-0.041165356,0.11451907,-0.17574714,0.45523196,-0.45946833,-0.24832533,0.28354466,-0.39972436,0.14596395],[0.66988164,-0.24064808,1.7260609e-5,-0.26275954,0.17384419,-0.66181016,0.7648268,-0.19273083,-0.16069436,0.009835958,0.0616284,-0.6692072,0.19462675,0.5278246,0.2114967,0.26900306,-0.14592189,-0.11368748],[0.11565289,-0.0024831272,-0.0010179644,-0.14267418,0.16810471,-0.91123056,0.27969635,-8.086505e-5,-0.17184173,0.050572287,-0.026562115,0.06282069,-0.10155926,0.18597111,-0.29300997,0.30992374,-0.074498996,0.022345124],[-0.5783355,-0.5027382,-1.9156728,0.34726906,-0.037399657,-0.6643333,1.2222189,-0.09885066,-0.38930404,-0.31581903,0.7669719,-0.7148593,-0.22047392,0.79417294,0.10776789,-0.27856073,-0.040653545,-0.017878184],[-1.0912887,-1.4251192,-0.0131444745,0.22531693,0.86903757,-0.95501935,0.8628306,0.45285952,-0.35062796,-0.31220162,0.3204548,-0.38606355,-0.23453595,0.6793242,0.079120405,-0.5386359,0.07823436,0.10280147]],"activation":"σ"},{"dense_2_W":[[-0.25574526,-0.3905968,-0.12767315,0.63553566,0.47872183,0.3867656,-0.10150367],[-0.473101,-0.020838056,-0.07608826,-0.56385255,-0.42035136,-0.4738983,0.13273646],[-0.6361896,-0.44256058,0.04147736,0.18567401,-0.7560507,0.050679706,-0.29739967],[0.20478374,0.4391665,0.79290694,-0.77543974,-1.0579494,0.37044573,-0.8896225],[-0.24755138,0.51200044,0.3236799,-0.7383176,-0.9946837,0.61080724,-0.7761964],[-0.13916887,0.51012295,0.66491944,-0.13200557,-0.38854194,-0.084789805,-0.5896282],[0.8047527,-0.44165358,-0.54248846,-0.17254305,0.20149636,-0.100210406,0.2344219],[0.14421801,0.559272,0.97542876,-0.56136894,-0.044083755,-0.3763456,-1.0293499],[-0.3186897,0.246195,-0.54825604,0.7406943,0.06757733,0.32055023,0.5683255],[-0.6583612,0.06683394,0.36377707,-0.8377172,-0.20560446,0.017155979,0.25158632],[-0.2456164,0.44221503,0.3131527,-0.74782497,-0.2063776,-0.65555835,0.4115904],[-0.012511154,-0.41900334,0.076221436,-0.30040342,-0.14252718,-0.6142689,-0.06536472],[-0.25791836,0.03984432,-0.79253113,-0.08203707,0.73551714,0.45526472,0.046143852]],"activation":"σ","dense_2_b":[[-0.05287782],[0.014592212],[-0.2794043],[-0.146621],[-0.024146877],[-0.08312265],[0.0064267763],[-0.028975371],[-0.06253404],[-0.07943845],[-0.15185589],[-0.1090268],[-0.09112515]]},{"dense_3_W":[[0.27280647,-0.35127035,0.3050531,-0.7444606,-0.48179445,0.3789633,-0.25849003,-0.7030355,0.39771867,-0.39718223,0.3331106,0.47105515,0.47934374],[0.6726295,0.0630439,0.33165845,0.23258673,-0.7143303,-0.5131551,-0.27799842,-0.20236474,0.49068013,-0.21187434,-0.18124661,0.3935689,0.58411384],[0.08724511,-0.577467,-0.12056874,-0.40466517,-0.2821864,-0.29668784,0.5748119,-0.19402814,0.33314952,-0.35929132,-0.119962655,-0.44145095,0.39621937]],"activation":"identity","dense_3_b":[[-0.034004413],[0.04665063],[0.09105554]]},{"dense_4_W":[[-0.16068545,-0.31246737,-1.0885646]],"dense_4_b":[[-0.084667206]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106'.json b/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106'.json deleted file mode 100755 index d092bd2a9a..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5220 4C2VL106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.5646715],[0.6694641],[0.44737],[0.026886152],[0.6618878],[0.663675],[0.6667225],[0.66845155],[0.66961575],[0.6750626],[0.67718285],[0.02651441],[0.026632387],[0.026751718],[0.027223678],[0.027500574],[0.027766436],[0.027753508]],"model_test_loss":0.0021724598482251167,"input_size":18,"current_date_and_time":"2023-08-08_22-46-54","input_mean":[[26.029737],[-0.12229291],[-0.00878866],[-0.017934654],[-0.11821583],[-0.11995477],[-0.12079329],[-0.1245332],[-0.12938891],[-0.1290596],[-0.12787117],[-0.017873093],[-0.017926747],[-0.017972697],[-0.018089544],[-0.018230878],[-0.018407188],[-0.018459646]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.36057478],[-0.16445863],[3.0447748],[-0.022469003],[-0.6659535],[0.22373353],[-3.3467278]],"dense_1_W":[[-0.2376849,0.38567924,-0.38532612,-0.36708954,0.5690472,-0.2458212,0.07751702,0.2212711,-0.46712497,-0.6651113,0.29152408,-0.08464707,-0.018103926,-0.24177329,0.7310908,-0.058990337,-0.030694641,-0.11854629],[-0.0009913361,-0.077025376,-0.0065500247,0.046067335,-0.049254794,-0.9076616,-0.0003211376,0.14927548,0.15986459,0.24684179,-0.38523427,-0.22149515,0.0073642987,0.11100769,-0.09587406,0.30423173,0.025807435,0.13052529],[0.4883289,0.30375436,-0.3209597,0.13514149,0.10009362,-0.5936262,-0.22444941,-0.5819263,-0.34365678,0.076933436,0.21189494,-0.28389084,0.15581718,0.038204152,0.13983965,-0.040451385,0.29750612,-0.2481491],[-0.0014382814,-0.13296318,2.1798,0.10981343,0.6367385,-0.13009104,-0.9085796,0.6248629,0.5663407,-0.34945607,-0.026286183,-0.09252589,0.32709804,-0.5283437,0.06888198,0.34782213,-0.0396639,-0.15430778],[-0.9994939,0.6315036,-0.39675602,0.10514331,0.31768408,-0.28510046,-0.07353569,0.50522256,-0.25331956,0.31126252,0.05213495,-0.62016946,-0.14337428,-0.5253215,0.36232558,-0.39571983,-0.51797396,-1.1316494],[0.22178838,0.65085924,0.38133407,0.45604607,-0.14068341,-1.0306925,0.30833307,-0.18152203,-0.11089663,0.14951013,0.20940769,-0.18067391,-0.058062352,-0.21344402,0.2434591,0.2801642,-0.2628211,-0.070006035],[-0.5233583,0.20665656,-0.3384473,0.57583076,0.21660234,-0.94515306,0.1279248,-0.9392442,-0.08341735,0.21010256,0.09249825,-0.3514638,-0.11611042,-0.052045938,0.30880475,0.03110251,-0.06850783,-0.12792635]],"activation":"σ"},{"dense_2_W":[[0.6317959,0.6705066,0.20417199,0.21395814,0.10470223,0.14087297,-0.12592584],[0.08588891,-0.081240855,0.5760022,-0.22544949,-0.54510444,0.23245768,0.046276238],[-0.23795508,0.006579916,-0.9301286,-0.43157038,-0.09368898,-0.5191553,-1.0032965],[0.19750868,-0.0020027894,-0.33918998,0.1652486,0.17350669,-0.22918618,-0.3234288],[-0.40517142,-0.044377446,-0.7739969,-0.5347441,0.010773094,0.4562043,-0.7532082],[-0.04751407,0.86060613,-0.27241683,-0.10298587,-0.272535,0.35024813,0.59923714],[-0.010178873,-0.37041524,0.23013395,-0.109916255,0.29119843,0.0144743025,-0.61659116],[-0.40173405,-0.7648917,-0.6105268,0.308084,0.3153847,-0.49524066,0.04767403],[0.34532696,-0.43309987,-0.3433278,-0.1705872,-0.14465691,-0.22976112,-0.2721868],[-0.2980317,0.22856045,-0.27896377,0.14522254,-0.23149188,-0.20256028,-0.7814072],[-0.42373073,0.24569665,-0.9021987,0.44055524,0.0935608,-0.39574504,-0.36532554],[0.4243805,0.6297723,-0.28280917,-0.7076218,0.3524698,-0.013303791,0.6177503],[0.2468454,0.41776308,0.8151066,-0.42162442,0.018570265,-0.22239894,0.3231103]],"activation":"σ","dense_2_b":[[-0.026862532],[-0.14978711],[-0.005214749],[-0.07263994],[-0.08199721],[-0.045804795],[-0.0866205],[-0.06230838],[-0.07474814],[-0.05142401],[-0.07595316],[-0.18088594],[-0.2217942]]},{"dense_3_W":[[0.4388805,0.08923334,0.15111509,-0.17938077,-0.47965288,0.3093158,-0.08968161,-0.30242828,-0.5312799,-0.31545746,-0.6203474,0.31204218,0.09222002],[0.6803294,0.07273466,-0.66237503,-0.3718425,0.5460477,0.036861733,-0.56628793,-0.24408782,-0.33143753,-0.58106333,-0.13587737,0.29482222,0.0920682],[0.13532409,0.10077603,0.13572003,0.31044018,0.5533716,-0.27005956,-0.5925635,-0.2709091,0.1561405,0.20917125,0.27186853,0.25998002,-0.21802285]],"activation":"identity","dense_3_b":[[0.048612285],[0.05009564],[-0.057215467]]},{"dense_4_W":[[-1.0191514,-0.7887438,0.3675588]],"dense_4_b":[[-0.044860546]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106'.json b/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106'.json deleted file mode 100755 index 1fecceac92..0000000000 --- a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018 b'xf1x00CK MDPS R 1.00 1.06 57700-J5420 4C4VL106'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.501248],[0.66097784],[0.39463165],[0.033822067],[0.6530338],[0.6543088],[0.65753746],[0.6521385],[0.65343094],[0.6497655],[0.64884734],[0.033726152],[0.03373755],[0.033731945],[0.03357754],[0.033446345],[0.033136833],[0.033040747]],"model_test_loss":0.005525775719434023,"input_size":18,"current_date_and_time":"2023-08-08_23-11-12","input_mean":[[29.792126],[-0.04522217],[0.021310413],[-0.0061475663],[-0.042909686],[-0.04259835],[-0.041554518],[-0.03512602],[-0.022554956],[-0.014822821],[-0.010136456],[-0.006064173],[-0.0060414663],[-0.006004127],[-0.005759402],[-0.005674136],[-0.005454047],[-0.0052154707]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.22852585],[1.3894823],[0.122581],[1.568894],[-0.24534363],[-0.081348546],[-0.062656134]],"dense_1_W":[[0.013982386,0.33132157,-2.8375375,-0.2577825,1.5605328,-0.44175422,1.4673861,0.30788234,-0.8293273,-0.35149613,-0.20746693,-0.2756051,0.19700375,0.56104803,-0.22943902,-0.9442609,0.29700294,0.33738524],[-0.7498267,-0.6624498,-0.04035213,0.64772356,0.22239381,0.752236,0.7376311,0.22121955,-0.68275774,-0.31479657,0.5766379,1.1977735,0.23543899,-0.03235867,-1.2889259,-0.5574388,-0.38497743,0.22112268],[0.0009815576,-0.42306572,0.3711868,0.32548174,-0.6101839,-0.07870281,-0.6290229,1.9477028,1.6681696,-0.12739149,-0.51679254,0.08266713,-0.13435598,-0.860949,0.19675814,-0.040138233,-0.25093862,-0.4040983],[-0.6976788,0.25720024,0.0430806,0.3727656,-0.017078696,-0.7331152,-0.580502,0.19809097,0.21536557,0.19312605,-0.34806177,-0.7567413,-0.37611556,-0.52824664,0.42451826,0.5508943,0.23928273,0.03949534],[-0.0014112287,0.0859497,-0.6420441,0.250335,-0.79082257,0.26661268,-0.060180947,0.01820874,-0.537458,-0.52666235,-0.65162635,0.5239975,0.1635141,-0.46365562,-0.10242774,0.7817764,0.06101124,0.6259446],[0.00052573474,0.8818668,0.010850059,0.47755244,-0.89471304,0.77187765,0.29030934,-0.61783034,-0.51367205,0.24970502,0.19460167,0.5136466,0.047820516,-0.5154373,-0.59959394,-0.4312206,0.19824192,0.24100806],[0.0010626772,2.6087165,-0.4629497,0.6686539,-1.1897037,-0.84694195,0.7046186,-1.2559808,-0.6581498,-0.23632167,0.63437265,-0.9454196,0.3392225,0.8520271,-0.0974469,-0.7927253,-0.193067,0.31566033]],"activation":"σ"},{"dense_2_W":[[-0.1513031,-0.93051434,-0.44909996,0.3317688,-0.4884435,-0.67838585,0.36971784],[0.35191703,-0.048789192,0.450275,-0.039996978,-0.20984387,0.5479376,-0.6852263],[-0.12902059,0.37265527,0.117599756,-0.5375113,0.20516054,0.87671304,-1.022533],[0.2674715,-0.007845689,-0.46048212,0.40396458,-0.2595625,-1.1184877,0.9535189],[-0.09281683,-0.718375,-0.5129304,0.29733542,-0.34454262,-0.65599316,0.31568497],[-0.40095973,0.17952402,-0.92779064,-0.5870983,-0.632861,-0.69213766,0.52468324],[-0.040474832,0.059520535,-1.0331043,0.04681406,-0.19046701,-0.5846261,0.25040108],[-0.27255413,0.27288094,-0.50989443,-0.3859617,-0.533083,-1.1661375,0.29892063],[-0.3460965,0.14177947,0.19027938,-0.369559,0.14183414,1.0526645,-0.33656517],[-0.17344117,-0.5123712,0.048518293,-0.69904965,-0.5825566,-0.75061584,0.3186972],[-0.6285899,-0.07304559,0.1665746,-0.12463482,-0.07659766,-0.5974891,-0.490175],[0.58759695,-0.7291639,-0.010515633,0.49339303,-0.17044984,-1.4153128,0.3785607],[0.44372615,0.21508391,-0.5312156,0.004264401,-0.71482986,-1.0418825,0.7020857]],"activation":"σ","dense_2_b":[[0.08850905],[-0.24293129],[-0.15789112],[0.17704202],[0.24606779],[-0.11684559],[0.029992603],[-0.024114225],[-0.09106879],[-0.3028866],[-0.14801322],[0.24917996],[-0.050585084]]},{"dense_3_W":[[0.21220079,0.05355472,-0.63798493,0.04563667,0.4423918,0.0664141,0.6139182,0.38336623,-0.76794696,-0.22829553,0.27020785,0.57621443,-0.1627959],[-0.16809194,0.27078873,-0.5811216,0.09835563,0.20550297,0.42691118,-0.17207801,0.2604539,-0.49177387,0.26957557,-0.43846667,0.29487315,0.57365525],[0.26274177,-0.48716888,-0.8324663,0.5967428,0.5331667,0.0806274,0.32409737,0.18292934,-0.39461344,-0.02578827,0.13157013,0.17259999,0.15921797]],"activation":"identity","dense_3_b":[[-0.101195484],[-0.051826347],[-0.04482993]]},{"dense_4_W":[[-0.1355761,-0.1400903,-0.5103199]],"dense_4_b":[[0.037658684]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/KIA CEED INTRO ED 2019.json b/selfdrive/car/torque_data/lat_models/KIA_CEED.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA CEED INTRO ED 2019.json rename to selfdrive/car/torque_data/lat_models/KIA_CEED.json diff --git a/selfdrive/car/torque_data/lat_models/KIA EV6 2022.json b/selfdrive/car/torque_data/lat_models/KIA_EV6.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA EV6 2022.json rename to selfdrive/car/torque_data/lat_models/KIA_EV6.json diff --git a/selfdrive/car/torque_data/lat_models/KIA K5 2021.json b/selfdrive/car/torque_data/lat_models/KIA_K5_2021.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA K5 2021.json rename to selfdrive/car/torque_data/lat_models/KIA_K5_2021.json diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020.json b/selfdrive/car/torque_data/lat_models/KIA_NIRO_EV.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA NIRO EV 2020.json rename to selfdrive/car/torque_data/lat_models/KIA_NIRO_EV.json diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2021.json b/selfdrive/car/torque_data/lat_models/KIA_NIRO_HEV_2021.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2021.json rename to selfdrive/car/torque_data/lat_models/KIA_NIRO_HEV_2021.json diff --git a/selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2ND GEN.json b/selfdrive/car/torque_data/lat_models/KIA_NIRO_HEV_2ND_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA NIRO HYBRID 2ND GEN.json rename to selfdrive/car/torque_data/lat_models/KIA_NIRO_HEV_2ND_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/KIA OPTIMA 4TH GEN FACELIFT.json b/selfdrive/car/torque_data/lat_models/KIA_OPTIMA_G4_FL.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA OPTIMA 4TH GEN FACELIFT.json rename to selfdrive/car/torque_data/lat_models/KIA_OPTIMA_G4_FL.json diff --git a/selfdrive/car/torque_data/lat_models/KIA SELTOS 2021.json b/selfdrive/car/torque_data/lat_models/KIA_SELTOS.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA SELTOS 2021.json rename to selfdrive/car/torque_data/lat_models/KIA_SELTOS.json diff --git a/selfdrive/car/torque_data/lat_models/KIA SORENTO GT LINE 2018.json b/selfdrive/car/torque_data/lat_models/KIA_SORENTO.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA SORENTO GT LINE 2018.json rename to selfdrive/car/torque_data/lat_models/KIA_SORENTO.json diff --git a/selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN.json b/selfdrive/car/torque_data/lat_models/KIA_SORENTO_4TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA SORENTO 4TH GEN.json rename to selfdrive/car/torque_data/lat_models/KIA_SORENTO_4TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN.json b/selfdrive/car/torque_data/lat_models/KIA_SORENTO_HEV_4TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA SORENTO PLUG-IN HYBRID 4TH GEN.json rename to selfdrive/car/torque_data/lat_models/KIA_SORENTO_HEV_4TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/KIA SPORTAGE HYBRID 5TH GEN.json b/selfdrive/car/torque_data/lat_models/KIA_SPORTAGE_5TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA SPORTAGE HYBRID 5TH GEN.json rename to selfdrive/car/torque_data/lat_models/KIA_SPORTAGE_5TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018.json b/selfdrive/car/torque_data/lat_models/KIA_STINGER.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA STINGER GT2 2018.json rename to selfdrive/car/torque_data/lat_models/KIA_STINGER.json diff --git a/selfdrive/car/torque_data/lat_models/KIA STINGER 2022.json b/selfdrive/car/torque_data/lat_models/KIA_STINGER_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/KIA STINGER 2022.json rename to selfdrive/car/torque_data/lat_models/KIA_STINGER_2022.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33252x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33252x00x00x00x00x00x00'.json deleted file mode 100755 index e26a3cc055..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33252x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.4440565],[1.0028862],[0.36267638],[0.043678306],[0.99411225],[0.9974919],[0.99982977],[0.99254435],[0.979976],[0.95886236],[0.93553513],[0.043576345],[0.043595448],[0.043623183],[0.04364424],[0.043546103],[0.0433696],[0.0430985]],"model_test_loss":0.008524268865585327,"input_size":18,"current_date_and_time":"2023-08-09_00-29-37","input_mean":[[24.4086],[-0.0049972953],[0.0014472222],[-0.011187174],[-0.0048188227],[-0.0048300573],[-0.004904814],[-0.0039606136],[-0.0010262493],[0.0019202619],[0.004503857],[-0.011211575],[-0.011217863],[-0.011226438],[-0.011296215],[-0.011372426],[-0.011467264],[-0.011505676]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.9125192],[-0.13636686],[0.03213368],[-0.31655693],[0.113999754],[2.0803509],[-0.14560352]],"dense_1_W":[[-0.95836014,0.21151903,0.22434151,-0.002453981,0.13014187,0.5596393,-0.16869491,0.077085264,0.14677656,0.18345413,0.3242226,0.081019655,0.31809556,-0.38337004,-0.1310791,0.091724716,-0.5161398,0.25401837],[-0.14619967,0.5092507,0.0018193424,-0.21825372,-0.6449165,0.92955756,-0.13284698,0.06275948,-0.08579267,0.35583824,-0.18346414,0.69240427,-0.16283554,-0.18422249,-0.4282623,-0.027244156,0.02582024,0.1427941],[1.0047165,0.015293248,-0.02223404,0.052268773,-0.41808492,0.386935,-0.42386678,-0.5135216,-0.24958232,-0.5126944,0.43498564,0.06511655,0.37023535,-0.114505425,-0.434018,0.116916806,0.0014085828,0.17056656],[-0.06596466,1.2519224,4.74866,0.11355789,-0.51302266,0.28445745,-0.3053417,0.36204198,0.647499,-0.60584915,-1.0571691,0.32952857,-0.0777627,0.3500026,-0.4212409,0.12553304,-0.213272,-0.122726746],[0.03182641,-0.04754851,0.0029030219,0.11716655,-0.2078027,1.1533194,-0.8695852,0.119884744,-0.13354245,0.10176885,-0.00028662398,0.17332709,0.30320284,-0.038923513,-0.54227114,-0.296703,-0.06784862,0.34063476],[0.79970616,0.43940097,0.1962523,-0.118129455,-0.41660714,0.8126276,-0.6059025,0.39716172,0.52851135,0.2263594,-0.08056667,0.2966726,-0.277799,-0.5333231,0.38141567,0.33619776,-0.037727766,-0.2941527],[-0.10851895,0.8244319,0.011763683,-0.3026351,-0.49091163,0.84520894,-0.45440027,0.18291348,0.3710321,-0.5599674,0.15607528,0.6427925,0.29607928,-0.6419731,-0.39483508,0.15418234,0.043094926,0.031589415]],"activation":"σ"},{"dense_2_W":[[0.090692595,-0.4490544,0.24625836,-0.28497836,-0.109338924,-0.17009985,-0.4655793],[-0.669885,-0.61082786,-0.7925282,-0.20993824,-0.09015391,-0.2284157,0.15029445],[-0.44977325,-0.7235435,-0.36254668,-0.009851951,-0.1750803,-0.81676334,-0.23792371],[-0.2912695,-0.7815833,0.59908646,-0.25272,0.3039248,0.45951632,-0.4202785],[-0.38828993,-0.35401246,0.038314883,-0.47171852,0.44466084,0.3610528,0.35880306],[-0.054223396,-0.16728099,-1.057462,-0.61807907,-0.5963022,-0.87659144,-0.45062214],[-0.71182984,0.4919117,0.7364119,0.81453204,0.5218261,0.27536118,0.6695429],[-0.29577672,-0.26198146,-0.54313695,0.18035722,0.05070786,-0.31965226,0.13927855],[0.21813929,0.77980363,-0.26194462,-0.55060804,-0.27208176,0.4345995,0.8768538],[0.020967001,0.74533176,-0.30123144,-0.015122309,0.6550382,-0.28115028,0.10651019],[-0.16647351,-0.4178918,0.0001960198,-0.22321661,-0.60688865,0.119590364,-0.3315932],[-0.35213155,-0.464748,0.48835987,-0.05246687,-0.2060589,0.046264112,-0.5531751],[-0.2018665,-0.063097775,-0.8816539,-0.6065871,-0.92965955,-0.6128336,0.014582347]],"activation":"σ","dense_2_b":[[-0.06833847],[0.012058566],[0.1310296],[0.107997425],[-0.09987967],[0.143086],[-0.116671406],[-0.290171],[0.030431822],[-0.029693417],[0.08782878],[0.045630615],[-0.1426334]]},{"dense_3_W":[[-0.328282,0.23894995,0.5074013,0.16549413,0.1285143,-0.13915035,-0.42390114,-0.55725336,-0.66650647,-0.22075084,0.6307297,-0.21100862,0.16000639],[0.13250639,0.52014196,-0.043805785,0.3813022,0.5189094,0.79271615,0.17715289,0.54481244,-0.60536987,-0.60951567,0.16811334,0.21930675,0.5196005],[0.12788317,0.67415655,0.75158405,0.47136194,-0.47586355,0.5831669,-0.61521083,0.016530482,-0.19323698,-0.15085855,0.6299936,0.32262608,-0.11284211]],"activation":"identity","dense_3_b":[[-0.00085244136],[-0.018760033],[-0.008874107]]},{"dense_4_W":[[-0.7199532,-0.7991476,-1.1705709]],"dense_4_b":[[0.008561696]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33690x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33690x00x00x00x00x00x00'.json deleted file mode 100755 index 51117292a5..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33690x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.680412],[0.85285246],[0.3884425],[0.03205119],[0.8500491],[0.85049105],[0.8514502],[0.8458795],[0.8377078],[0.82015127],[0.8038297],[0.031919472],[0.03195958],[0.03199403],[0.03202506],[0.03193417],[0.03161889],[0.031273898]],"model_test_loss":0.009339340031147003,"input_size":18,"current_date_and_time":"2023-08-09_01-20-38","input_mean":[[24.875648],[0.0041736388],[0.010556495],[-0.0046896804],[-0.0006003252],[0.0007327586],[0.0016012463],[0.0060975295],[0.006737074],[0.0062413993],[0.0063207992],[-0.0047094855],[-0.004715502],[-0.0047238604],[-0.004803993],[-0.0049048723],[-0.005078436],[-0.0051641]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.17949091],[-3.3968902],[-0.07593549],[0.5466097],[0.03951519],[-0.00081275025],[-0.2818511]],"dense_1_W":[[0.03091709,-1.3157804,-5.490474,0.2759644,1.2174463,0.13602142,0.30531374,-0.5896565,-1.0454189,0.024137963,1.2799596,-0.5758251,-0.67036736,-0.10264167,1.023584,-0.022457464,0.0423572,-0.072023876],[-1.5988137,-0.4146702,-0.038053937,0.63521147,0.58526903,-0.3437994,0.22620016,0.08106555,-0.7296988,-0.448912,-0.47618243,-0.71913254,0.12589867,0.8123822,-0.8396519,-0.6090673,-0.2687799,0.8079711],[-0.017673936,-0.20331055,-0.0016520993,-0.20215373,0.5373215,-0.8593722,0.20908187,0.03162978,-0.35333672,0.28399038,-0.056258224,-0.83239245,0.2361236,0.645981,0.21572426,0.23369376,0.030962478,-0.20426486],[0.6789347,-0.81145126,-0.007111559,0.050477408,0.7655705,-0.961523,0.547529,0.29283896,0.11744454,-0.23781727,-0.49012998,-0.77257276,0.14991538,0.8663245,-0.47725388,-0.17021804,0.22196974,0.09640378],[-0.023541855,-0.037035666,0.55035615,-0.4223085,-0.3162554,1.0634682,-0.31260857,0.38816622,0.5183418,0.00963337,-0.9862806,0.35859644,-0.107738346,-0.23407808,-0.29413855,-0.43096134,0.33290064,0.27480224],[-0.008280398,0.5080252,-0.0030781063,-0.24516527,-0.076359816,1.3229189,-0.40155405,-0.6557982,-0.084914856,0.34833226,0.048928127,0.06514959,0.33998683,-0.17689575,0.01783814,0.2977825,-0.10754876,-0.10063827],[1.4288968,0.108082466,-0.031209342,-0.06544005,-0.39778545,0.56522495,0.20475589,0.061119992,-1.1141357,-0.5437865,-0.2889625,0.3729891,0.55635136,-0.78631455,-0.120706834,-0.44492543,-0.4325845,0.863979]],"activation":"σ"},{"dense_2_W":[[-0.30310643,-0.12873378,0.39852074,0.46089283,-0.061163615,-0.47244763,0.08307709],[0.063253105,-0.0028390735,0.6435178,0.021038773,-0.24314678,-0.30235827,0.201086],[-0.4110213,-0.15217133,-0.47424644,-0.5498248,-0.40863478,-0.03644606,-0.165162],[-1.0989958,1.0549769,-0.81128615,-0.29547232,-0.11975506,0.7134397,-0.58516175],[-0.19868451,0.50366116,0.31972986,0.55210483,-0.34068644,0.11577465,0.32061067],[-0.22519416,0.26882055,0.6880949,0.3129291,0.34909117,-0.63557214,-0.45552465],[-0.90025496,0.63476175,-0.5909716,-0.7426136,0.48243678,0.16065429,-0.2919061],[-0.40407148,-0.5999356,-0.45084292,-0.50555605,0.49569342,0.78641695,0.6107878],[0.19533251,-0.18449633,-1.2098444,-1.1110471,0.83463633,0.6744162,0.47429064],[0.2519356,-0.2709652,-0.43452793,0.16501693,-0.1434805,-0.164745,-0.55715173],[0.5556845,-0.7147965,-0.7962351,-0.9492054,0.45981735,0.48979762,0.5166068],[-0.81657475,-0.76384026,-0.46112433,-0.4948062,0.8747664,0.9776133,0.7079956],[-0.20226195,-0.2591615,0.63573545,-0.01795919,-0.082302935,-0.42891976,0.26436207]],"activation":"σ","dense_2_b":[[-0.047301266],[-0.016725123],[-0.049676552],[-0.07829081],[-0.08770606],[0.0036026512],[0.084506735],[0.109670915],[0.11299696],[-0.022765491],[-0.008457604],[0.32036614],[0.0072946316]]},{"dense_3_W":[[-0.31729496,0.12889174,0.4225155,0.31061146,0.24402286,-0.10446856,-0.48671034,0.3845978,0.2660345,0.3093137,0.44116616,0.38984168,-0.3460159],[0.0358234,0.31940135,-0.21071792,-0.5266989,0.4593207,0.17332634,-0.66819376,-0.58671886,0.024372714,0.10640016,0.038679607,-0.11834236,0.5630265],[0.10535604,0.40837932,0.53625077,0.50682795,-0.11473014,0.5603721,0.14725567,0.080817915,-0.60673153,0.3120416,-0.47885686,-0.3498024,-0.46723753]],"activation":"identity","dense_3_b":[[-0.09867763],[0.05700437],[0.053955115]]},{"dense_4_W":[[0.45426035,-1.1652403,-0.79250604]],"dense_4_b":[[-0.060487706]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33721x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33721x00x00x00x00x00x00'.json deleted file mode 100755 index c2836f44b7..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019 b'8965B33721x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.344813],[1.0432545],[0.40825117],[0.03865216],[1.0351241],[1.0378826],[1.0401973],[1.0332909],[1.0210356],[0.99993485],[0.97768444],[0.03855244],[0.0385832],[0.038604163],[0.038570847],[0.038460117],[0.038177595],[0.037886962]],"model_test_loss":0.007136368192732334,"input_size":18,"current_date_and_time":"2023-08-09_01-47-26","input_mean":[[23.442703],[0.0035179595],[0.00408823],[0.012855675],[0.0033001432],[0.0034371077],[0.0034639447],[0.0074803857],[0.012283631],[0.018361822],[0.021030566],[0.01292293],[0.012896148],[0.012869411],[0.012853285],[0.012912567],[0.013085337],[0.013110078]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.9161396],[-0.22788599],[2.968902],[-0.009821155],[-0.18505585],[0.32007432],[-0.014948483]],"dense_1_W":[[-1.0511566,-0.29206184,0.8199831,-0.15576178,-0.38916576,1.1162808,-0.5011398,1.0977064,-0.5836164,0.16133548,-0.053778384,0.4155293,0.19529353,-1.2087135,0.5919332,0.53749675,-0.08758931,-0.2511601],[-0.09181765,0.33316463,-0.78092057,0.0865392,0.3381008,-0.6151113,0.3660635,-0.72633314,-0.6142182,0.0048095123,0.37035215,0.12880829,-0.23413754,0.5010518,-0.5957484,-0.16287656,-0.04932468,0.26007095],[1.0044367,0.35445923,0.78647244,-0.32049915,0.06494051,0.12055531,-0.22746965,0.26814324,0.05199458,-0.037158065,-0.03201108,-0.14750965,0.3159122,-0.053600136,0.2906058,0.037501868,-0.01485947,-0.0680036],[-0.0018256758,-0.39913148,-0.0054692593,-0.47800386,0.4134914,-1.2333674,0.23680426,0.23282804,0.3836774,-0.06254318,-0.22074893,-0.4077003,0.09583857,0.025910378,0.62602794,0.43462366,-0.12558399,-0.17822921],[-0.0047321627,0.55899805,-0.00081870187,-0.25419536,-0.3257252,1.1633046,-0.39042598,-0.20668344,-0.21059605,-0.006790498,0.18107124,0.15924998,0.02389586,-0.06371585,-0.44330505,0.36899558,-0.3173842,0.09592921],[0.095295206,-0.08933727,0.59179264,0.40638387,0.5824425,-0.25730613,0.7851391,-0.4444533,-0.6680196,-0.08562278,0.53340226,-0.57082343,-0.17787477,0.7951686,-0.13043731,-0.13890404,-0.28527093,0.17461915],[0.034483686,-0.7067752,-4.019811,0.037841592,1.0770723,-0.28922594,0.22808869,-0.094380274,-0.6669433,-0.2657373,0.5791061,-0.7896833,-0.3886935,-0.19634429,0.7110262,0.7885148,-0.027897676,-0.19876951]],"activation":"σ"},{"dense_2_W":[[-0.20400774,-0.22307488,0.83168095,-0.99375516,1.4662783,-0.54265076,-0.15802172],[-0.12194149,0.3057387,-0.25224084,0.86720455,-0.6698733,0.3360012,-0.292734],[0.37222654,0.122192845,-0.57808757,0.31621838,-1.051521,-0.18741105,0.18480313],[0.41065305,0.56189334,-0.65107477,0.33912212,-1.1690532,0.32877356,0.27887678],[0.58805436,-0.3522203,-0.8155676,-0.47617933,-0.42864746,-1.1024536,-0.7342275],[-0.28316686,0.42155153,0.1351553,0.00020168634,-0.39858565,-0.038997397,-0.0620207],[-0.2676193,0.5867359,0.34214348,0.46678424,-0.9861758,0.19793625,0.35967037],[0.26571375,0.49524286,-0.6020044,-0.31548288,0.0521101,-0.50098413,0.02061019],[-0.35134986,0.5898171,-0.8887333,0.49588937,-0.2849531,-0.15621391,0.39262283],[0.11367938,-0.035091795,0.20310073,-0.29153082,0.5581006,-0.1919044,-0.28208742],[2.092034,-0.5602147,-0.42445743,-1.403385,0.8866187,-1.2998788,-0.3509462],[-0.010185507,-0.2035467,0.33422557,0.7748165,-0.65113765,0.4648428,0.25325134],[-0.07438275,-0.06233438,1.0291604,-0.95668316,1.2571595,-0.65489537,-0.20861064]],"activation":"σ","dense_2_b":[[0.09113021],[0.04578328],[-0.29403162],[-0.2192368],[-0.28878424],[-0.11772192],[0.008928186],[-0.10850013],[-0.18696937],[-0.114522],[0.1894073],[-0.0047073704],[0.20806429]]},{"dense_3_W":[[0.69607276,-0.25463992,0.19224781,-0.64511865,0.27775756,0.4589496,-0.7449188,0.41997963,-0.12018125,0.4897476,0.9306085,-0.10257274,0.84184134],[-0.64124787,0.752149,-0.2837551,0.29449946,0.26526523,0.30954522,0.2830915,0.5043165,-0.16997944,-0.43304175,-0.694841,0.057517774,0.09658051],[-0.03208746,-0.26029688,-0.74573,-0.1032463,0.13831443,-0.64660555,-0.21513747,-0.40704614,-0.48390958,-0.06794522,0.12341715,-0.26635003,0.78502613]],"activation":"identity","dense_3_b":[[-0.09851486],[0.03344719],[-0.047249585]]},{"dense_4_W":[[0.797171,-0.25833753,0.61133206]],"dense_4_b":[[-0.06307325]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33252x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33252x00x00x00x00x00x00'.json deleted file mode 100755 index 0a80cfd0df..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33252x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.8285],[1.1188737],[0.47342262],[0.05126763],[1.1050262],[1.1092741],[1.1127472],[1.0983341],[1.0797789],[1.0525575],[1.0272892],[0.050943088],[0.05100398],[0.051071826],[0.050979707],[0.050723284],[0.050214104],[0.049760416]],"model_test_loss":0.008092939853668213,"input_size":18,"current_date_and_time":"2023-08-09_03-05-40","input_mean":[[22.832628],[-0.048477665],[-0.0015699231],[-0.010172784],[-0.044837113],[-0.045658123],[-0.04680434],[-0.045073368],[-0.043960348],[-0.039256155],[-0.03613124],[-0.01008188],[-0.010097768],[-0.010119672],[-0.01006197],[-0.009999101],[-0.009887467],[-0.0099477405]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.15260588],[-3.2536018],[0.043962248],[-0.090603456],[3.5123594],[0.029381314],[0.24542183]],"dense_1_W":[[-0.018435279,1.2527711,4.230789,0.018031234,-1.4346001,-0.15953755,0.061720558,0.35755047,0.37375236,0.58350205,-0.88426137,0.59743536,-0.10547891,-0.33643883,0.21758044,-0.13492396,-0.36006564,0.20787364],[-1.5682247,-0.035563767,0.19118826,-0.43019408,0.14057355,1.0501944,-0.82073975,-0.14322114,-0.08808569,-0.013670676,0.67794806,0.5938818,-0.4189539,-0.5114651,0.5719749,0.39641926,-0.06207111,-0.38755944],[0.18513687,-0.71987325,-0.011965726,0.018532543,0.258614,-0.97279245,0.59959203,-0.22303152,-0.17081428,0.23112038,-0.04976506,-0.05941518,-0.5961051,0.20494816,0.33866015,0.023431057,-0.02673853,-0.027390076],[-0.0032866031,-0.46916834,-0.03375909,0.22316715,0.33248055,-1.0202448,0.7034391,-0.2351044,-0.13222691,-0.14861125,0.23242648,-0.035604436,-0.32533994,0.19433749,0.29952523,0.31940687,0.045100812,-0.16624303],[1.7107601,0.027855793,0.2056705,-0.48186287,-0.19466202,1.5228227,-1.2701944,0.4916286,-0.15901598,-0.4066886,0.8435757,0.29054174,-0.1801262,-0.5044365,0.6704808,0.3633137,0.21051206,-0.6159748],[-0.031839076,0.52859527,0.016463235,-0.66599137,-0.79132366,1.1579964,-0.58045477,0.13249406,0.4277288,-0.09080096,-0.18318327,1.2263923,0.5539931,-0.8813475,-0.576685,-0.13317113,0.06021947,0.3146238],[0.9673127,0.39608166,-0.02511569,-0.0046267007,-0.64154017,0.57387704,-0.346695,-0.9827318,-0.61006016,-0.05364682,0.4217874,0.039297163,0.57102877,-0.43577328,-0.42087564,-0.10482892,-0.18938681,0.42926088]],"activation":"σ"},{"dense_2_W":[[0.41543797,1.1738479,-1.0748413,-0.68251723,-0.23535445,-0.014745399,-0.074383706],[0.42731732,-0.5514982,0.074961975,0.59009844,-0.3027509,-0.5616325,-0.28420764],[0.11749416,0.3126048,-0.5657671,-0.26303276,0.39180964,0.77518344,0.33590633],[-0.14604264,-0.6352743,0.2253331,0.58631027,-0.3192098,0.20994529,0.007633578],[0.3937283,-0.078028925,-0.5664736,-0.124979004,0.48761243,0.3210194,0.07755378],[0.27684122,0.7713517,-0.31364554,-0.5921977,-0.18462463,0.47987497,-0.61615944],[0.29768473,0.41583326,-0.9713817,-0.35854688,0.09248492,0.31493294,0.040650316],[-0.112342775,-0.1878338,0.5448513,0.7486996,-0.56119305,-0.5220495,-0.5096629],[0.19718203,0.4135663,-0.28367767,-0.1573982,-0.19590908,0.104961894,-0.49705368],[0.77046275,-0.19075769,-0.46065587,-0.13512029,0.47356725,0.38181776,0.71995],[-0.18105839,-0.55663234,0.33512706,0.016357377,-0.55092573,-0.17190884,0.08964193],[0.31455922,0.20463717,0.033571117,0.43436614,-0.41633865,0.19258104,0.33313715],[0.08064332,-0.68228775,0.7010398,0.24371538,0.22882102,-0.54400474,-0.08356227]],"activation":"σ","dense_2_b":[[-0.43676507],[-0.006130799],[-0.15402001],[0.026011059],[-0.12692562],[-0.43001604],[-0.33370367],[0.05327725],[-0.13920946],[-0.041543793],[0.06294844],[0.038047582],[-0.014338484]]},{"dense_3_W":[[-0.5613603,-0.17332096,-0.1882884,0.18131785,0.23258103,-0.44985455,0.1740991,-0.45171297,0.35409343,0.20938201,0.22257555,-0.12860954,0.31328893],[-0.2600292,0.064422175,-0.56568885,0.34872493,-0.014263635,-0.0898774,0.34932417,-0.04355818,0.33161792,-0.4384388,0.21339151,0.4251023,0.3974905],[-0.6470215,0.23639736,-0.59931415,0.20245089,-0.12388959,-0.57567924,-0.40078935,0.7244318,-0.4283423,-0.62795776,0.66424334,0.4475859,0.5476653]],"activation":"identity","dense_3_b":[[-0.025201272],[0.023392009],[0.030334707]]},{"dense_4_W":[[0.7327956,-0.77316505,-1.070442]],"dense_4_b":[[-0.028413372]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33590x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33590x00x00x00x00x00x00'.json deleted file mode 100755 index 3d325cc48d..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33590x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.4012003],[0.9084744],[0.3989995],[0.04316203],[0.9050049],[0.9055595],[0.90684354],[0.90098166],[0.89330155],[0.8834002],[0.872413],[0.04302624],[0.0430567],[0.04308886],[0.043104757],[0.043008905],[0.042880133],[0.042604897]],"model_test_loss":0.008806328289210796,"input_size":18,"current_date_and_time":"2023-08-09_03-30-27","input_mean":[[21.916237],[0.0112053035],[0.010207012],[-0.0057604206],[0.008076623],[0.008825207],[0.009262305],[0.015784515],[0.02193309],[0.029440241],[0.03471279],[-0.0059500956],[-0.0059324577],[-0.0059074587],[-0.005736568],[-0.005659438],[-0.005594903],[-0.005524908]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.113812774],[0.3718239],[-0.35734212],[-0.06904639],[1.668204],[-0.10319402],[1.6449547]],"dense_1_W":[[0.0018752348,1.2200488,-0.0005085679,-0.23384064,-0.9084212,1.2045864,-0.25443128,-0.13910054,-0.11256105,0.2179745,-0.08867826,0.16488013,0.35168028,-0.41050524,-0.1787089,0.43994418,-0.023817252,-0.08793733],[-0.04312678,0.43942824,0.11929371,-0.043850373,0.66910386,0.82385707,-1.033506,-0.08680779,0.37272778,0.28918013,0.2645954,-0.54255456,-0.44501963,-0.69097805,-0.45430678,-0.16467454,-1.2062163,-0.99093336],[0.06042321,1.267067,-0.12690838,-0.019565715,-0.8008834,1.6967841,-2.0936992,-0.73309845,-0.57475215,-0.97032815,0.53988296,0.0694317,0.19901374,-0.14523467,2.1987944,1.229183,0.41753313,0.53431153],[-0.005792214,1.6355677,3.5869675,-0.10959287,-2.1918557,-0.3136515,0.09652676,0.25249338,1.2399355,0.40560603,-1.0075005,0.6674059,0.023685906,-0.21504764,-0.5677693,-0.24701545,0.07742603,0.32459712],[0.9218543,-0.52115893,0.6683122,-0.49547228,-0.24380639,2.4874837,-1.3078512,0.50638986,-0.0022452448,0.18564974,-0.75149935,0.63630646,0.5417998,-0.47571868,-0.15869981,-0.19382617,-0.10689215,0.2615386],[0.0010884085,-0.07797116,-0.0022833152,-0.39120084,-0.54005134,2.2633855,-1.2395691,0.12394578,0.00030362024,0.113682985,-9.3380804e-5,0.9033568,0.15587245,-0.3935733,-0.43733695,-0.7241415,0.28267393,0.3301238],[0.8352049,-0.1388708,-0.62930346,0.028555281,0.0054504126,-1.2476301,0.70772225,-0.15140262,-0.14464574,0.05757089,0.6135008,-0.12531146,-0.37553704,0.107572205,0.24616258,0.23056793,-0.0013457185,-0.12736495]],"activation":"σ"},{"dense_2_W":[[0.08851535,0.6167409,0.05891007,0.5029618,-0.24713053,0.92836577,0.004156225],[-0.52199286,-0.36050865,-0.34034714,0.061794642,-0.109552786,-0.6266087,-0.31169102],[-0.7092186,-0.6801971,-0.26420647,0.39295742,0.05788309,-0.20119189,0.14084439],[-0.913237,-0.04797298,-0.48572946,-0.4032914,-0.7313818,0.1410581,-0.65766007],[0.6392394,0.24680118,-0.33827496,0.19102065,-0.08179918,0.7670678,-0.85375905],[0.8877098,-0.51691145,0.18935633,0.81099534,-0.6835733,0.80652905,-1.7127429],[0.26195377,-0.3456285,-0.71416736,-0.26705638,0.22344078,-0.27062252,-0.74219775],[0.1864041,-0.4139672,0.72243375,0.9860188,0.8927306,0.20730978,-0.0032860562],[0.029019173,0.7799921,-0.2924467,0.3229736,0.47412586,0.4905737,-0.71431655],[-0.9057719,-0.34483552,-0.6339002,0.44039795,-0.0815456,-0.6209059,-0.35469422],[-0.7642978,-0.21761882,-0.520907,0.38787058,-0.4754871,-0.47818175,0.5515306],[-0.45161492,-0.341044,-0.13645881,-0.65541065,-0.56910133,-0.19134521,-0.15136522],[0.8295409,0.03669771,0.38553452,0.446268,-0.31960988,0.7838232,0.068201065]],"activation":"σ","dense_2_b":[[-0.26521447],[0.122462295],[0.078140855],[-0.01945191],[-0.5003525],[-0.746069],[-0.45675567],[-0.3471183],[-0.29891852],[-0.21655038],[0.10162625],[0.14103983],[-0.29887974]]},{"dense_3_W":[[0.33197686,0.62199056,0.4247967,0.44158882,-0.12146235,-0.3375973,-0.44318354,0.0066761184,-0.13157894,-0.3443774,-0.44290087,-0.4360939,-0.33858845],[-0.4692612,0.46826863,0.054673724,0.283901,-0.01885255,0.2757358,0.31324366,0.4469478,0.3509845,-0.09880974,0.26294768,0.55622286,0.2389067],[-0.18467896,0.5184241,0.67473835,0.17306642,-0.28510845,-0.4426461,-0.046053376,-0.4500548,-0.50170314,0.26636368,0.60352683,0.80709,-0.5185129]],"activation":"identity","dense_3_b":[[0.08293219],[0.03822249],[0.060750734]]},{"dense_4_W":[[-0.12425623,-0.45378837,-1.2967176]],"dense_4_b":[[-0.056304324]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33690x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33690x00x00x00x00x00x00'.json deleted file mode 100755 index d6d0089b3b..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33690x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.15974],[1.045871],[0.3754209],[0.049849007],[1.0412234],[1.042158],[1.0431666],[1.0308688],[1.0145941],[0.9937998],[0.9695306],[0.049699858],[0.049720936],[0.049743976],[0.049645588],[0.049436506],[0.04910737],[0.048739962]],"model_test_loss":0.007239425089210272,"input_size":18,"current_date_and_time":"2023-08-09_03-55-25","input_mean":[[24.619316],[0.008315056],[-0.002209118],[-0.0009603967],[0.009455924],[0.009065263],[0.008578662],[0.008924362],[0.010585633],[0.012140301],[0.013719992],[-0.0010016458],[-0.000992241],[-0.0009847628],[-0.0009990969],[-0.0010099016],[-0.001055779],[-0.0010218886]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.01751012],[-2.792658],[-0.0036304477],[0.23906733],[-0.67204577],[2.824586],[0.020084955]],"dense_1_W":[[-0.0013722869,0.22783591,-0.010999781,-0.7420795,-0.5004164,0.8528246,-0.40537062,-0.3579778,0.20538606,-0.06207938,0.037892103,0.16028564,0.39440292,-0.47795537,-0.4981077,0.40456992,0.21351387,0.69398695],[-1.0907546,-0.37810156,0.5256466,-0.06323017,-0.28386277,0.40039942,-0.5656102,0.8704236,0.7594878,0.08758965,-0.2850435,-0.19939376,0.24667862,-0.5915887,0.7124935,0.33228317,0.40017298,-0.76232785],[-0.0022229636,-0.3566666,-0.0003173761,-0.2331804,0.32406712,-1.133683,0.29599214,0.07946594,0.19223347,0.10109193,-0.21318913,-0.4314191,-0.42940962,-0.059293773,0.96213984,0.3274362,-0.051667612,-0.10392697],[-0.17001934,0.31136727,0.00019800797,-0.39408368,-0.3893838,0.79402786,-0.490016,0.24215008,0.092356876,0.15550926,-0.18264957,0.2104772,0.2055425,-0.6079279,-0.100256115,0.35539958,-0.22659436,0.038026005],[0.5023145,0.415188,0.00086236314,-0.12141318,-0.3487774,0.5604944,0.29927528,-0.12137407,-0.20653158,-0.15300342,0.23502706,0.29839256,-0.15043968,-0.32693824,-0.2807662,0.010725707,-0.37295666,0.29116592],[1.1302519,0.29944658,0.5366313,-0.11482564,-0.48424527,-0.06633996,-0.12468005,0.48905316,0.53044945,0.3081709,-0.33819312,-0.054454595,-0.13536377,-0.1478465,0.49783385,0.4558332,0.22333856,-0.6476589],[0.019672142,-1.1385515,-2.8618698,0.5519799,0.5598079,-0.19218405,0.6098082,-0.34360152,-0.7758295,0.28531215,0.9757375,-0.13217533,-0.31033158,0.45779207,-0.3197823,-0.21947153,-0.24169978,0.12113089]],"activation":"σ"},{"dense_2_W":[[0.55490434,-0.06586316,-1.7488526,1.0742077,-0.26382893,0.5936367,-0.048338335],[0.22041039,-0.07157286,-1.3535683,0.9498899,0.59100443,0.13426219,0.1314393],[0.060050584,-0.37686986,0.93393904,-0.8473732,-0.8137314,0.3513347,0.13401532],[0.031560004,-0.67102486,-0.4638209,-0.16865264,0.19910118,-0.0022606154,0.014461398],[-0.26292112,-0.8773706,-0.27558997,-0.98985237,0.115747504,0.15425104,-0.32170153],[0.3645839,0.23929603,-1.0847621,0.7692537,0.053893678,0.29140672,-0.55564046],[-0.29527074,-0.8282215,0.6947013,-0.34474802,0.33731544,-0.47208363,-0.2703771],[0.10967559,-0.45384485,1.1605363,-1.1405638,-0.16794126,0.009725002,0.25623515],[-0.47460532,0.014810191,-0.049116056,-0.103007615,-0.7748003,0.020772532,0.164838],[-0.23443891,0.22693226,0.8323869,-0.5907415,-0.18859898,-0.5243307,0.024510408],[0.35138795,-0.71696883,0.6208494,-0.21413626,-0.30234987,-0.19566858,0.203605],[0.29550865,-0.5253764,0.44364005,-0.15027097,-0.52989537,-0.6267321,0.56808716],[-0.16024043,0.7365189,-0.48886365,-0.01982367,0.4768797,-0.4950252,-0.5998298]],"activation":"σ","dense_2_b":[[-0.28562254],[-0.28906816],[-0.004571446],[-0.16752788],[-0.11627307],[-0.17883891],[-0.08537872],[0.15237623],[-0.16480568],[-0.032770704],[0.038674396],[0.07090385],[-0.14601162]]},{"dense_3_W":[[0.6690154,0.071317546,-0.10587343,0.4107949,-0.19921759,0.026011487,0.083912425,-0.68911606,0.29841265,0.040238436,-0.19996041,-0.055458866,0.08188202],[0.8015601,0.021846859,-0.5534128,0.6944063,0.11055347,-0.0645739,-0.38998172,0.34884468,-0.06341523,-0.43967232,-0.49337965,-0.21307902,-0.22756565],[0.45879635,0.8307091,-0.22719614,-0.40354267,-0.23650342,0.8461611,-0.037451327,-0.43379617,-0.20254998,-0.5837768,-0.53370506,-0.6808303,0.31557706]],"activation":"identity","dense_3_b":[[-0.057544097],[0.14032708],[0.144235]]},{"dense_4_W":[[0.14295731,0.35312867,0.8483934]],"dense_4_b":[[0.13570417]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33721x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33721x00x00x00x00x00x00'.json deleted file mode 100755 index 8ad70e4908..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019 b'8965B33721x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.935237],[1.1821631],[0.40853298],[0.042256694],[1.1741917],[1.1772016],[1.179894],[1.1685648],[1.1510983],[1.1243435],[1.0962706],[0.042120658],[0.042167474],[0.04220416],[0.04219818],[0.042086348],[0.04190632],[0.041555516]],"model_test_loss":0.00865387637168169,"input_size":18,"current_date_and_time":"2023-08-09_04-21-28","input_mean":[[23.898808],[-0.061529078],[-0.0012386319],[-0.0038458514],[-0.05761159],[-0.058545504],[-0.058786135],[-0.0583106],[-0.05796732],[-0.055892948],[-0.055688474],[-0.0037394448],[-0.003766136],[-0.0037952624],[-0.004012165],[-0.0041559814],[-0.004327924],[-0.004494689]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.04631648],[-0.06555636],[-0.27339923],[1.8481191],[-1.92371],[-0.07156656],[-0.097226106]],"dense_1_W":[[0.007923849,-0.33078587,0.032207586,0.18164907,0.23387666,-0.6738162,0.24611568,-0.37660727,0.110470906,-0.2237764,0.11238094,-0.31033733,0.20521657,0.43043175,0.14618683,0.4109157,-0.045097392,-0.018656284],[0.0059264796,-1.4818896,-3.214948,0.72709614,1.4496776,-0.11549172,0.05585469,0.067367174,-0.5819717,-0.3143236,0.77938473,0.07448307,-0.5458307,-0.06897672,-0.307255,0.16108052,0.27242532,-0.31170502],[-0.029176371,-0.20550303,-0.011238303,0.40422836,0.651665,-1.205251,0.51314026,-0.06254734,-0.11725389,-0.004469061,0.057605438,-0.16204368,-0.20271099,-0.023192484,-0.09425388,0.12548377,0.16910473,-0.18110643],[0.913644,-0.22446877,-0.21192145,-0.35401252,0.32936195,-0.61308485,0.41242036,-0.054412857,-0.02144861,-0.7086938,0.46699503,-0.004493464,0.0013601056,0.81566185,-0.3642738,-0.123768955,-0.16624025,0.25355738],[-0.8782031,-0.4412915,-0.21091951,0.22394417,0.46380237,-0.52400494,0.51977473,-0.3934778,-0.035707317,-0.24971296,0.28146827,-0.033155452,-0.19057514,0.6566132,-0.22685449,-0.43057168,-0.40194762,0.46104968],[-0.009924806,0.34001565,0.008358892,0.17911334,-0.2556001,1.0795789,-0.789162,0.09035937,0.12697068,-0.20735092,0.08643546,0.22710793,0.63394094,-0.51461715,-0.55570894,-0.44454226,0.11515733,0.27629676],[-0.010439776,0.4010142,-0.008085905,0.10725627,-0.02110396,1.1806133,-0.8606922,-0.046847433,0.20864236,-0.11985588,0.0857068,0.15260428,0.2444861,-0.03642649,-0.59779644,0.32445312,-0.30190656,0.18685275]],"activation":"σ"},{"dense_2_W":[[-0.52392507,-0.053534046,-0.13596098,0.18724343,-0.7713173,0.71427715,0.7350986],[0.103605255,0.41991144,0.39895838,0.5297367,0.19954357,-0.07358835,-0.3800046],[-0.13534087,-0.07954504,-0.7891074,-1.04155,0.031840924,0.41851434,0.057672217],[0.18972358,0.53236634,0.6439358,0.110999696,-0.29787117,-0.5545026,-0.57896006],[0.46418715,0.073028445,0.16890584,0.31551063,0.44200546,-0.26141322,-0.8365631],[0.12976393,-0.42719504,-0.051802225,-0.9134454,-0.3056411,0.13355789,0.07198249],[-0.63852465,0.2367602,-0.17162862,0.09097974,-0.52287674,-0.110359624,0.25404847],[0.5456408,0.06541811,0.044041876,-0.079029,-0.19681188,-0.21370907,-0.32052663],[0.09726532,-0.21465707,0.609168,0.0588532,0.20782056,-0.029063694,-0.6592013],[0.014375357,-0.883838,0.1768969,-0.9506456,0.25958836,-0.26901084,-0.1747859],[-0.35349178,-0.045510672,-0.17568451,-0.18829311,-0.38173485,0.728441,0.254347],[0.10186036,-0.28966042,-0.20384645,-0.1784742,-0.72974414,0.7239003,0.84594786],[-0.13665237,-0.15572082,-0.23385355,0.24481148,-0.43725377,-0.0049998006,-0.47707897]],"activation":"σ","dense_2_b":[[0.058335815],[-0.08154515],[-0.10210349],[-0.017691245],[-0.09656311],[-0.11049739],[-0.0880714],[-0.0022098408],[0.0071529862],[-0.1155999],[0.015483792],[0.025640251],[-0.042404395]]},{"dense_3_W":[[-0.12712753,0.21623728,0.28793716,0.1288633,0.64396095,0.3019295,0.46078098,0.57720184,0.17094983,-0.29401407,-0.25292718,-0.6778351,-0.41588908],[-0.22999658,0.09658766,-0.6467794,0.43180892,0.09925922,-0.5388918,-0.21273088,0.39167225,0.42423695,-0.09006673,-0.5738687,-0.0685332,0.021032669],[-0.32774815,0.556063,0.13476838,0.33248642,0.581253,-0.13394178,-0.5767492,-0.31769308,0.14392637,-0.24081674,-0.4971341,-0.698404,0.42863867]],"activation":"identity","dense_3_b":[[0.012507354],[0.022687975],[0.023133183]]},{"dense_4_W":[[-0.598664,-0.94400805,-0.8493222]],"dense_4_b":[[-0.019668857]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019.json deleted file mode 100755 index 1f72524957..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS ES HYBRID 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.264645],[1.3075382],[0.44552016],[0.05060625],[1.2979935],[1.3015733],[1.3041736],[1.2848994],[1.2584554],[1.2216989],[1.1856711],[0.0503414],[0.050400995],[0.050465323],[0.050478272],[0.050248075],[0.04985913],[0.049460884]],"model_test_loss":0.0099137919023633,"input_size":18,"current_date_and_time":"2023-08-09_02-40-24","input_mean":[[23.043215],[-0.03371662],[0.0018890268],[-0.0067125894],[-0.031319],[-0.031593338],[-0.031663474],[-0.028725801],[-0.027785186],[-0.025144741],[-0.02163734],[-0.0065818275],[-0.0066027185],[-0.0066283992],[-0.0066961027],[-0.0067884526],[-0.006846654],[-0.006944263]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.22580747],[-0.259433],[0.15566492],[0.089529224],[-2.3941963],[1.9521749],[0.06790461]],"dense_1_W":[[0.077735715,0.5491028,0.031780783,0.061651852,-0.069661885,0.5064926,-0.63392377,-0.0062182117,0.39679298,-0.26671922,0.048575882,0.5175869,0.57268655,-0.72039944,-0.31672445,-0.682284,0.17552397,0.30148625],[-0.0033005108,1.3755544,2.9333427,-0.05311045,-1.6043663,0.119831525,-0.5092124,0.2000376,0.7576132,0.73848486,-0.8814628,0.3480808,0.3585077,-0.4351482,-0.43040854,0.005097866,0.15632282,0.105506845],[-0.12613682,0.053123258,-0.011962454,-0.31154743,-0.2879405,0.78129184,-0.3477709,0.11016321,-0.397643,0.29684106,-0.08335899,0.0011086084,0.101133905,0.14986652,0.10471807,0.088165864,-0.22822371,0.123035155],[-0.005890634,-0.5132265,0.02232674,0.038106803,0.26947373,-1.2872188,0.6846012,-0.06600805,0.23923853,-0.29101142,0.04426992,-0.41297558,0.27426517,0.054011345,0.22521552,-0.360118,0.13597938,0.0095917815],[-1.3102455,0.18389338,0.037292566,-0.4504437,-0.38227966,0.32267326,-0.41582158,0.34839186,0.41863716,-0.19948383,0.033166535,0.11101668,-0.17950892,0.03513152,0.5583567,-0.21783155,0.24341545,-0.21313481],[1.28462,-0.29303363,0.03239438,-0.07798496,0.47706926,0.26473632,-0.61586124,-0.015281519,0.34897882,-0.07400412,0.17125309,-0.11961657,-0.23919915,-0.15667392,0.09201665,0.82350713,0.0330319,-0.45983887],[0.008501559,0.4151316,0.24970283,-0.1932585,-0.3999573,0.7981322,0.08446922,0.43549573,0.42775178,-0.35798648,-0.25701943,0.6345054,-0.10344621,-0.4299825,-0.776323,-0.3758547,-0.5269095,0.2744096]],"activation":"σ"},{"dense_2_W":[[-0.42842335,0.05620099,-0.41398174,0.0075187576,-0.65040445,0.043987595,-0.7884258],[-0.21810047,-0.52364224,-0.24926645,1.5748769,-1.0048369,0.6784754,-0.17087893],[-1.0974892,-1.1205297,-0.52288646,-0.4585741,0.8355013,-0.86901873,0.08091025],[0.19924684,-1.6000783,-0.5017675,-0.6335594,0.81060636,-1.6753666,0.0042119725],[-0.6766826,0.035237,-0.5353934,0.8407999,-0.06624779,-0.5392324,-0.3999412],[0.83403057,-0.38959885,0.15132989,-0.74285805,0.81045157,0.045238588,0.057127055],[0.95894325,0.36917272,0.7675816,-0.8249631,-0.34739387,0.8758971,-0.17811485],[0.44207436,-0.13875146,-0.17526102,-0.48803738,0.8165408,-0.08225913,0.5292656],[-0.28129107,0.20525171,-0.7332951,-0.1858197,-1.0882939,-0.50657177,-0.48805308],[-0.7845191,-0.29932752,-0.3210797,0.7842274,0.120213665,-0.36830777,-0.4480391],[-0.4418548,-1.008012,-0.7143584,-0.03555356,0.6086784,-0.7865452,-0.24040942],[-0.14839058,-0.32335532,-0.67143065,0.41939855,-0.535096,-0.68048733,0.21396716],[-0.76420903,0.36155707,-0.16971277,0.82980686,-0.45884535,-0.16401686,-0.6478219]],"activation":"σ","dense_2_b":[[0.12145026],[0.4703432],[-0.17840025],[-0.04283482],[-0.062148705],[-0.016880652],[-0.028769262],[-0.25934026],[-0.3588194],[0.076413475],[-0.092342615],[0.0006822613],[-0.045883182]]},{"dense_3_W":[[-0.45874047,-0.6988261,-0.31221494,-0.6035287,-0.28207257,0.38988772,0.83404875,0.6202294,0.09104912,-0.2267445,-0.38150835,-0.57334363,-0.1794997],[-0.40566936,-0.5168596,-0.5243848,-0.11845207,0.35303384,-0.10472868,0.7140052,0.47152635,0.16413036,0.1380713,-0.43810734,-0.47773978,-0.4005078],[-0.44185263,-0.6747273,0.061594818,-0.0121055255,-0.28526518,0.7952212,0.69975144,-0.06553925,-0.3437621,-0.53210264,-0.114378266,-0.53271616,-0.10757975]],"activation":"identity","dense_3_b":[[0.09586072],[0.047312237],[0.13191016]]},{"dense_4_W":[[0.9993152,0.24272008,0.6070091]],"dense_4_b":[[0.08831376]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53271x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53271x00x00x00x00x00x00'.json deleted file mode 100755 index 2754e4d694..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53271x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.653599],[1.0475699],[0.507353],[0.0511427],[1.0465056],[1.0461539],[1.0466276],[1.0435494],[1.0403829],[1.034095],[1.0267593],[0.05091882],[0.050985433],[0.05104327],[0.051194124],[0.051185224],[0.050950732],[0.0506017]],"model_test_loss":0.002317079808562994,"input_size":18,"current_date_and_time":"2023-08-09_05-35-31","input_mean":[[24.87495],[-0.022877222],[0.03129203],[-0.005471257],[-0.033396523],[-0.030427122],[-0.026651071],[-0.015034059],[-0.0059272125],[0.004262375],[0.010118156],[-0.0058831],[-0.005736906],[-0.005597743],[-0.0052517094],[-0.0050170966],[-0.004636833],[-0.0044273734]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0750014],[-0.69738495],[-0.057568032],[-0.8138096],[0.8422802],[0.00422568],[-0.025037726]],"dense_1_W":[[-0.92567337,-0.4179756,-2.364189,-0.37799117,0.359521,-0.23128231,0.16912965,0.15324992,-0.29314092,0.35514003,0.1113519,0.18702953,-0.22939733,0.39211923,-0.19355458,-0.14666928,0.2541103,-0.015037065],[-0.26681975,0.19461927,-0.02443796,-0.19870783,0.015366757,-0.83895224,0.50951827,-0.046161894,-0.26054674,-0.10241932,0.09262357,0.32455042,-0.35291085,0.4337215,-0.047874916,-0.070374765,-0.19080578,0.16888785],[-0.0450405,0.3024657,-0.020173237,-0.18040816,-0.6210729,0.668985,-0.1294948,0.102294534,0.027441807,0.19392844,-0.15024275,0.2724876,0.30017278,-0.8359932,-0.09295618,0.5128679,-0.025930675,-0.08442807],[-0.9385832,0.38830346,2.4171264,-0.072888754,-0.6450525,-0.0052705472,-0.2073176,0.37481403,0.5322297,-0.016934434,-0.6272646,-0.011407112,0.2999659,-0.056183133,-0.17157498,0.16704822,-0.00995726,-0.016760994],[0.41495678,-0.36016837,-0.044468425,0.699604,0.12629355,-0.9168069,0.42850283,0.077245876,0.3887621,0.0388322,-0.26400945,-0.4751828,-0.018784745,-0.17013955,0.21044336,0.14742237,-0.257179,-0.07762288],[-0.0029706263,-0.27664563,0.20847207,0.26354775,0.20674135,1.0040307,0.04915213,-0.13483308,-0.15825804,-0.057579137,-0.0058719614,0.7015616,0.5505965,-0.08130265,-1.0528653,-0.55547035,-0.94390494,0.61734366],[0.017797226,-0.38827214,0.011275224,0.4138954,0.15614575,-0.6526553,0.3634799,0.23701335,-0.198492,0.14194344,-0.071847096,-0.3582882,-0.39685383,0.5765013,-0.12813473,0.23526756,-0.30017313,0.05643834]],"activation":"σ"},{"dense_2_W":[[0.11522227,-0.50041586,0.7625706,0.12953083,-0.84721595,0.26854208,-0.78707874],[-0.26998946,0.9135468,-0.5267852,-0.47694728,0.26567996,-0.4057614,0.44248503],[0.3397881,0.241825,-0.22745344,-0.43884552,-0.31017342,-0.48791227,0.624083],[-0.23961566,-0.61447287,0.7523344,-0.1524797,-0.034522954,0.80298376,-0.74258584],[-0.20403866,-0.45207465,0.2864171,0.585039,-0.43790713,0.049314383,-0.691187],[-0.37280735,-0.9096017,0.79407877,0.06587302,0.13932212,0.7276438,-0.16217615],[0.042196184,0.80028385,-0.6367271,-0.046625376,0.25419405,-0.8610059,0.36960703],[0.09347458,0.43240634,-0.8759679,0.1721286,0.5472644,-0.0896131,0.6584737],[0.34702182,-0.17617214,-0.37235767,-0.0058014165,0.6870974,-0.38691258,0.28578055],[0.027087606,-0.38712898,-0.5076633,-0.047688764,0.16426884,-0.32992855,-0.16210902],[0.05157716,-0.47973877,0.12872508,0.22652198,0.093843356,0.47721627,-0.70800775],[0.13196792,0.70168835,-0.728704,-0.507929,-0.3850781,-0.2150298,0.13088666],[-0.12113243,-0.341827,0.24893352,-0.064033784,-0.024845326,-0.21256083,-0.37305534]],"activation":"σ","dense_2_b":[[-0.040676095],[-0.04934049],[-0.13523409],[0.032700114],[0.04797525],[0.012522698],[-0.053262446],[-0.14503641],[-0.07796666],[-0.3327117],[-0.06517155],[-0.29661015],[-0.043684535]]},{"dense_3_W":[[-0.39554232,0.50275403,0.46011072,-0.26603845,-0.6258986,-0.18898715,0.350607,0.6611593,0.36714667,-0.03429704,-0.38445738,-0.42724767,-0.415385],[-0.12109516,-0.0026784122,-0.33396584,-0.4921449,0.025638519,-0.26242292,0.57392186,0.6282738,-0.31419235,-0.15783457,0.29055953,-0.11300429,-0.31670427],[-0.27667677,0.12075474,-0.13275498,-0.71421945,-0.30053577,-0.46803996,0.68881786,0.33228284,0.24152169,0.09559637,-0.0023924343,0.56565654,0.16803065]],"activation":"identity","dense_3_b":[[-0.027746597],[0.20316003],[-0.029442076]]},{"dense_4_W":[[-0.45957002,-0.04833828,-0.58646995]],"dense_4_b":[[0.02725393]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53280x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53280x00x00x00x00x00x00'.json deleted file mode 100755 index a54f55a3cc..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53280x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.5803027],[0.8603793],[0.4513569],[0.029105911],[0.8487619],[0.8510528],[0.8550627],[0.8484798],[0.83925754],[0.832451],[0.8223531],[0.028991073],[0.02902925],[0.029061288],[0.029074881],[0.02896926],[0.028916502],[0.02890444]],"model_test_loss":0.0030515140388160944,"input_size":18,"current_date_and_time":"2023-08-09_06-00-13","input_mean":[[30.979578],[0.022293376],[0.02019513],[0.016653037],[0.016664432],[0.017896485],[0.020654846],[0.027760973],[0.031163529],[0.030931678],[0.0288627],[0.01662461],[0.016658263],[0.016681287],[0.01674288],[0.016692968],[0.016676333],[0.016725713]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.024255],[-0.25703537],[0.066896215],[-0.077876054],[-1.1755685],[0.053735092],[-1.813157]],"dense_1_W":[[-0.27897373,0.6238509,-0.20489661,0.1433003,-0.44274482,-0.46238834,0.08278444,-0.12610668,-0.28404528,-0.08119373,0.11206268,-0.011977598,-0.08802816,0.35872343,-0.44637114,0.09940686,-0.098998114,0.087747104],[-0.077062964,0.3174407,0.08627412,-0.2621875,-0.39889467,0.75071305,-0.02536695,-0.11606417,-0.44491976,0.27360457,0.01498593,0.5227387,0.3463404,-0.38459015,-0.5227802,0.03605743,0.0087138405,0.20318434],[-0.04407056,0.6402981,2.5346818,-0.0052747075,-0.51173216,0.33047506,-0.53520495,0.59467864,-0.2947999,-0.36928508,-0.72547835,0.23617381,0.28750753,-0.41744986,0.010572497,0.10425088,0.1149194,-0.28841314],[-0.0036573706,0.22945316,-0.0073808106,0.06309982,-0.40813765,1.0437207,-0.39680403,-0.092092186,0.14273745,-0.1925738,0.11202375,0.5490815,0.34099597,-0.39302826,-0.64261353,-0.06269388,-0.08197236,0.13292448],[-0.42824522,-0.25304925,-0.16903412,-0.23054327,0.46596405,-0.5538919,0.0059226677,-0.4401322,0.076376624,0.08189739,0.06873566,-0.26616675,-0.16517103,0.4085307,0.3613046,0.17234507,-0.08328618,-0.148345],[0.011475744,-0.28661492,0.033517,-0.1035912,0.32961515,-0.2715907,-0.105986364,0.09126555,-0.22195859,-0.2122366,0.19187194,0.29742795,-0.20964493,0.0700461,0.13138907,-0.2559807,0.38601238,-0.18372318],[-0.5847607,0.0017109648,0.25774232,-0.2373588,-0.2924784,0.9778526,-0.45161787,0.49743965,0.23385304,0.0501783,-0.2576654,0.08772852,0.2509274,-0.3904387,-0.055983637,0.24153244,0.21497074,-0.16889808]],"activation":"σ"},{"dense_2_W":[[0.2696645,0.09097578,0.2661085,0.008203172,0.58712953,0.008232839,-0.38130957],[-0.44034633,0.2513559,0.05034199,-0.7566649,-0.5055022,0.28274307,-0.18962547],[0.35309595,-0.52410984,-0.2166621,-0.51837164,0.51281035,0.6052604,-0.13995785],[-0.37981346,0.28354916,-0.22428422,0.09537504,-0.6703727,0.09452615,0.34979334],[-0.1286504,0.4058662,0.06990852,0.2916711,-0.2246424,-0.031917993,0.05038822],[0.11269455,0.27946022,-0.013186193,0.57915336,-0.779333,0.11132818,-0.08520752],[-0.5124887,-0.39176804,0.32016045,0.38343418,0.072306104,-0.21488254,0.15051393],[-0.25066197,-0.099142715,0.3025643,0.1498029,-0.22075655,0.08285247,0.16742654],[-0.0027565423,-0.54777265,-0.33877024,-0.45952037,-0.17979734,-0.24340412,-0.24863824],[-0.39911193,0.0050099217,-0.21278913,0.64141303,0.24979603,-0.12581906,0.60516745],[-0.1935344,-0.11531806,-0.5091185,0.23634945,0.17247137,0.32147193,-0.16084859],[-0.118722916,0.26619238,-0.45988715,0.38617563,0.24613833,0.50531286,-0.6070944],[-0.31973958,0.569741,0.28206736,0.307348,-0.2108575,-0.49773324,-0.17307866]],"activation":"σ","dense_2_b":[[-0.0266998],[-0.030578468],[0.010926638],[-0.12699191],[-0.18184385],[-0.09752178],[-0.01733428],[-0.027403263],[0.02766463],[-0.06362805],[0.004015615],[-0.04242502],[-0.022493202]]},{"dense_3_W":[[-0.12600064,-0.633004,0.16414349,-0.04648247,-0.20951967,-0.12900907,0.45063862,0.103525355,-0.68074024,0.55499035,0.41209528,-0.42067012,0.39265448],[0.3260821,0.57643926,0.61910576,-9.839889e-6,-0.01744337,-0.48366365,0.29486895,0.09513366,0.1914889,-0.5954007,0.3020512,-0.16881369,-0.49208182],[0.10530183,0.49050504,-0.5989605,0.26496586,0.1901535,-0.4129085,0.31638667,0.10397078,-0.11685577,0.56756043,-0.17770557,-0.29197764,0.2562083]],"activation":"identity","dense_3_b":[[-0.123790324],[0.014918573],[-0.018756263]]},{"dense_4_W":[[0.02038734,-1.2047465,0.8046749]],"dense_4_b":[[-0.016778698]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53281x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53281x00x00x00x00x00x00'.json deleted file mode 100755 index c94650159d..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018 b'8965B53281x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.684907],[0.9460035],[0.33342025],[0.043801006],[0.943236],[0.9438911],[0.9439055],[0.9338765],[0.9230702],[0.90794885],[0.8921319],[0.04381569],[0.043804597],[0.043778293],[0.04356958],[0.043327603],[0.042924862],[0.042455677]],"model_test_loss":0.00282586133107543,"input_size":18,"current_date_and_time":"2023-08-09_06-25-49","input_mean":[[29.41278],[-0.009032724],[-0.0021492816],[0.004332889],[-0.00860808],[-0.00887388],[-0.010132152],[-0.0102206785],[-0.00937236],[-0.0074595967],[-0.005152443],[0.004347949],[0.004330746],[0.0043104156],[0.0040981416],[0.0039356602],[0.0037958957],[0.0036709488]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.09501388],[0.8404856],[0.7934484],[-0.066568784],[-0.31608787],[-0.109698914],[-0.12751737]],"dense_1_W":[[0.0011169801,-0.018726321,0.0015862584,0.17112947,-0.5446971,0.5853068,-0.3039678,0.4737596,0.21017975,-0.23414794,-0.07348194,0.98195386,-0.14195174,-0.10654367,-0.34493265,0.20805775,-0.4868443,-0.23417883],[0.9548257,-0.46348402,-0.29633194,0.18528488,0.40596813,-0.824306,0.30642077,-0.007846376,0.033617396,-0.23929001,0.1453222,-0.35812417,-0.22854868,0.39195415,0.49922717,0.7028648,0.50149786,-0.86416316],[0.97592115,0.007649104,0.3003986,-0.33777642,-0.13973069,0.46592122,0.03299811,0.19446975,0.067927755,0.1478205,-0.13307863,-0.11891002,-0.47453943,-0.19565998,0.54486775,-0.04400889,-0.35464677,0.13683307],[0.0047029937,0.14668527,-0.005069146,0.24684682,-0.614384,1.0910827,-0.094034076,-0.19462726,0.28000307,-0.42661187,0.2321289,-0.064942434,-0.42558447,-0.39662802,-1.0747879,0.06939005,0.2870679,1.3147138],[0.016900972,0.39719796,-0.0023543735,-0.0913586,-0.27493247,0.90382856,-0.43656674,0.011338879,-0.26157647,0.2745171,-0.04499426,0.9156245,0.18295021,-0.9320426,-0.07365104,-0.19892058,0.16344132,-0.0042856243],[-0.011051511,-0.78559583,-3.1862526,-0.13295761,0.65890294,-0.68599087,-0.12433693,0.08657334,-0.41985497,0.47015917,0.5829991,-0.71003574,-0.34596688,-0.17925437,0.41965798,0.31952843,0.61812705,0.09319992],[0.014576556,-0.18765137,-0.001399782,-0.12696555,0.0890215,-0.64548665,0.17923205,0.14201109,-0.30869052,0.19999632,-0.092428885,-0.6353419,0.07439351,0.80051905,0.04906582,-0.1398521,-0.2728979,0.2945558]],"activation":"σ"},{"dense_2_W":[[-0.6210588,0.45552707,-0.25218815,-0.17052735,-0.28304043,-0.3500373,0.014205802],[0.33707482,-1.3240942,-0.6408793,0.8307369,-0.10797842,-1.2964274,-1.3836163],[-0.33217075,-0.43026388,-0.12341792,-0.41299066,0.2880537,0.083734885,0.1641773],[0.35629743,-0.4401899,0.1567848,0.30102292,1.318357,0.048755936,-1.2286369],[-0.12527834,-0.23215155,0.56640136,0.3483607,0.8943009,-0.039557446,-0.9478881],[-0.57511246,-0.2275013,0.23487775,0.46695858,0.37859124,-0.17711872,0.26375052],[0.63963145,-0.45322925,-0.54017925,-0.3060082,0.12730126,-0.6374732,-0.018194102],[-0.5951409,-0.08423941,-0.0051530325,-0.53952223,-0.6064661,0.23082048,0.39190525],[-0.3667256,0.008534655,0.4268871,0.34291455,-0.6101535,0.21997947,0.25764218],[-0.11584076,0.5873763,-0.63031334,0.2047302,-0.08922794,-0.18342617,0.6476465],[0.07069251,-0.45771497,0.12435426,0.04750334,1.8602587,0.24760254,-1.2554413],[0.33669302,0.4188555,-0.46464103,-0.048415337,0.05759297,0.3541,-0.13896422],[0.511148,0.23681977,0.36551967,0.35152832,0.792135,-0.31216228,-0.83162516]],"activation":"σ","dense_2_b":[[0.08171513],[-0.1163031],[-0.0041464856],[-0.21284437],[-0.06291548],[-0.047316123],[-0.13749899],[0.047459695],[-0.03701015],[0.045251872],[-0.29556692],[-0.00961862],[-0.029000068]]},{"dense_3_W":[[0.12327876,-0.048812684,0.6152893,0.21222751,0.18817006,-0.3728164,0.270455,0.4454563,-0.11968707,0.59693485,-0.06342227,0.34730113,-0.57901394],[-0.4065829,-0.04221764,0.020975756,0.42464995,0.34640458,0.4587765,0.20783032,-0.86228454,-0.72097176,0.101609,0.16048418,0.48934665,0.49102414],[-0.29578757,0.22049302,-0.14916682,0.33021316,0.40887907,-0.35374218,0.4427254,-0.24567138,0.15444578,-0.63093376,0.25220618,-0.3500056,0.50111896]],"activation":"identity","dense_3_b":[[0.016075611],[-0.12729394],[-0.029249111]]},{"dense_4_W":[[-0.2641593,0.3333745,0.8707298]],"dense_4_b":[[-0.031108981]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78060x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78060x00x00x00x00x00x00'.json deleted file mode 100755 index 4f170fb088..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78060x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.5523615],[0.9379796],[0.45997825],[0.04207175],[0.93919086],[0.93780416],[0.93652314],[0.91719604],[0.9034866],[0.88726455],[0.87291807],[0.041934993],[0.04192026],[0.04190248],[0.04164398],[0.04141029],[0.04100794],[0.040568497]],"model_test_loss":0.009954309090971947,"input_size":18,"current_date_and_time":"2023-08-09_07-16-58","input_mean":[[23.397924],[-0.035182085],[-0.008444157],[-0.009997125],[-0.033629764],[-0.035007965],[-0.036390144],[-0.03466254],[-0.03890593],[-0.043926965],[-0.046389326],[-0.0101134945],[-0.010121674],[-0.010125806],[-0.010022554],[-0.010067445],[-0.01014944],[-0.01027719]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.11680644],[-0.051436793],[0.113495305],[-0.01763076],[-0.2807573],[-0.120603226],[-0.2764257]],"dense_1_W":[[-0.0065118936,0.56794316,-0.032589998,-0.50918645,-0.060956616,0.9810513,-0.4785043,-0.008406265,-0.25840858,-0.030046064,0.2434936,0.28673422,0.075997785,-0.024465384,0.08006076,0.0716426,0.28245556,-0.24962135],[-0.023541331,0.8734935,5.699426,0.19145805,-0.5681911,0.014759005,-0.56469446,0.1186507,1.0214005,0.043286715,-0.4702243,1.222705,0.19846615,-0.15771359,-0.5883803,-0.39430845,-1.0096143,0.27339858],[0.45483243,-0.49536738,0.072315626,-0.011725951,0.086452276,-0.66168356,0.45572364,-0.23768657,-0.18117812,0.05266754,-0.04890949,-0.38048756,0.16300593,0.13775355,-0.15970619,-0.3038916,0.6219313,0.1968499],[0.0054552057,-0.093241274,-0.34040582,0.12216264,0.037718106,-0.46982464,1.1711069,-0.35518944,-0.51062614,-0.24715386,0.38451096,-0.40132213,-0.30608684,0.052601833,0.74853015,0.23053922,-0.2007082,-0.23960419],[-0.8520971,0.24116111,-0.089963615,0.15706292,0.20338425,-0.37373862,0.75903034,0.090791985,0.17018794,0.37343842,-0.17452653,-0.66951627,0.18461663,0.5859271,0.29183576,-0.0037389225,-0.4057764,-0.47674724],[0.012710134,0.435232,0.03543807,-0.036046702,-0.75405264,1.3212848,-0.5093719,-0.08682382,0.04233904,0.07034154,-0.097755805,0.7234229,-0.13957694,-0.57484436,-0.054068033,0.07991787,-0.05443112,0.05077546],[0.0065418757,-0.6116693,0.025854474,-0.16136944,-0.16720891,-1.043264,0.4933813,0.224038,-0.3168288,-0.026011353,-0.05957108,0.23472212,0.37794927,0.2708049,0.15880762,0.61977124,0.012229787,-0.19856346]],"activation":"σ"},{"dense_2_W":[[0.03146408,-0.13779452,0.75000536,-0.11498503,0.039698552,-0.40190673,0.7709186],[0.37171277,0.22650109,-0.19030742,-0.073141806,-0.20702402,0.33066395,-0.45444292],[-1.1190504,0.69764763,0.5377285,0.8013254,-0.18115376,-1.2980549,0.25413626],[0.5416716,-0.31991583,0.14092752,-0.44703355,-0.55331653,0.51895857,-0.710503],[0.49094778,0.14815535,-0.32600418,-0.63197994,-0.5370441,-0.083100855,-0.49352166],[-0.23559721,-0.54140323,0.78799313,0.8764922,0.39852077,-0.28144458,-0.1821518],[0.1500585,-0.32034987,-0.84529537,-0.41722593,-0.05029655,0.6604846,0.10658351],[-0.42256495,-0.089720786,0.876472,-0.08991852,0.4667296,-0.97803175,0.5145723],[-0.27449653,-0.47807348,0.61057085,0.6598581,0.28521484,-0.8254127,0.06432298],[-0.382518,-0.21356484,0.25773606,0.5809972,-0.015983999,-0.84368616,0.5800405],[0.5958008,0.37813,-0.42608508,-0.27179977,-0.4507597,0.28317532,-0.16438048],[-1.1322341,-0.49540442,0.17639433,0.08400206,0.59758526,-1.2232964,0.34022707],[0.018905511,0.3392843,-0.59598386,-0.44822788,-0.29109383,0.74419224,0.015790993]],"activation":"σ","dense_2_b":[[-0.025122445],[-0.08817167],[-0.18689576],[-0.15509543],[0.008846949],[-0.18207294],[-0.09901433],[-0.17813578],[-0.14573547],[-0.19155172],[-0.052382644],[-0.32253534],[-0.07473206]]},{"dense_3_W":[[-0.68304485,0.5767948,-0.17764251,0.33225822,0.2699078,-0.49734563,0.49882662,0.18162656,-0.21204075,0.08684376,0.52946407,-0.059715066,0.45340413],[-0.07762768,-0.11692675,0.5170938,0.048767503,-0.60837173,-0.004813306,0.16917212,0.70467114,-0.026616994,0.24883772,-0.50158614,0.36716226,-0.30068868],[0.10084016,-0.039664295,-0.31447792,-0.15362875,0.42048535,-0.38715878,0.07678511,-0.1563305,0.6452277,0.7573569,-0.5292506,0.28040695,-0.584425]],"activation":"identity","dense_3_b":[[-0.06316189],[0.050863322],[0.07035302]]},{"dense_4_W":[[0.79278344,-0.8832224,-0.20445246]],"dense_4_b":[[-0.054674253]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78080x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78080x00x00x00x00x00x00'.json deleted file mode 100755 index 309a6385f1..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX 2018 b'8965B78080x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.7839713],[1.01453],[0.37487027],[0.036252256],[1.0074129],[1.0092586],[1.0114115],[1.0015283],[0.98707575],[0.9704761],[0.950582],[0.036038164],[0.036066703],[0.036101792],[0.036004264],[0.03577164],[0.03552027],[0.035136368]],"model_test_loss":0.005577164702117443,"input_size":18,"current_date_and_time":"2023-08-09_07-41-58","input_mean":[[26.561443],[-0.023815667],[0.010739189],[-0.013143686],[-0.026596677],[-0.024625478],[-0.023937158],[-0.020562654],[-0.018135259],[-0.018355336],[-0.021212468],[-0.013303214],[-0.013247967],[-0.013189033],[-0.013033623],[-0.012982845],[-0.012978024],[-0.0131039135]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.13472757],[-0.15373966],[-0.7054918],[0.0122620305],[-0.012871696],[-0.6218862],[0.036611043]],"dense_1_W":[[0.0034895893,-0.47329506,0.048285536,-0.074473254,0.3115557,-0.3702869,-0.22337489,-0.13975431,0.07517197,-0.24788152,0.01133247,0.096064724,0.07818763,0.2744151,0.1163445,0.08449597,0.11816498,-0.26796773],[-0.004053826,-0.2886099,0.007515931,-0.025261926,0.32493144,-0.54980326,-0.07815613,0.15308669,0.061913893,-0.0115428185,-0.104860805,-0.057970896,-0.102305494,0.38515946,-0.1713107,-0.03404761,-0.03721952,0.12314234],[0.32897007,0.02719031,0.006045787,-0.08623162,0.13007438,-0.5118012,0.48433113,-0.41582802,-0.120004706,-0.059094574,0.19850364,-0.72324777,0.09925934,0.13738394,0.55857325,-0.26578882,0.49354708,-0.24867299],[-0.0038880499,0.5191673,0.03414573,-0.25369272,-0.09369488,0.24986927,-0.44367638,0.24794495,0.10878251,-0.20875268,-0.00077913585,-0.00861606,0.2156449,0.116771065,-0.34864375,-0.025460653,0.20020796,0.0094880555],[0.03297434,0.026964193,-0.0009992104,0.16138399,0.23900521,-0.6232881,0.46326053,-0.27336964,0.074755706,-0.32827288,0.19562325,-0.47716168,-0.28450158,0.20518361,0.31182727,0.0014464655,0.114448994,-0.046351667],[0.29541498,-0.29648054,-0.00310848,0.52299774,-0.23534268,0.5741889,-0.123190366,0.26139322,0.10665974,0.1556051,-0.21010089,0.54775834,-0.3700308,-0.11212184,-0.4132441,-0.10879409,-0.008064727,-0.016256012],[0.0030948827,0.79608256,2.278605,0.073915124,-0.66955596,0.36016646,-0.2946711,-0.103818454,0.2748215,-0.3307413,-0.17108576,0.1856803,-0.14653331,-0.020247102,-0.4317631,0.20638601,0.020172743,0.16087113]],"activation":"σ"},{"dense_2_W":[[0.2784572,0.69297725,0.057563815,-0.71975124,0.6817395,0.30981833,-0.65247726],[0.49075776,0.42235997,-0.52229685,-0.7887346,0.51224124,-0.8081051,-0.5901962],[-0.5116851,-0.43084118,-0.255523,0.55842716,-0.73646706,-0.16906197,0.2810972],[0.4290504,0.11835542,0.09274147,-0.1294142,0.1156738,-0.5795711,-0.5911007],[0.52670825,0.17968906,0.5746221,-0.73111415,0.027278474,-0.71742743,0.10865298],[-0.63077503,-0.62192583,0.07450403,0.5630963,-0.4184549,0.6239278,-0.24081348],[-0.18570104,-0.09546027,-0.23013546,0.7691375,-0.7116309,0.59218144,0.51251227],[0.43361178,0.27859798,0.024286874,-0.40649956,0.13969101,-0.1732319,-0.20539345],[-0.31913874,-0.5736788,-1.0150186,0.61656374,-0.11421175,-0.05631541,0.41142127],[0.14283133,0.002449735,0.32700986,-1.0358429,0.54168445,-0.84849554,0.20175509],[-0.09336197,0.516962,0.6102334,-0.6526487,0.6995893,-0.43362787,-0.16046062],[-0.44804078,-0.5110132,-0.7325886,0.0035943415,-0.2756613,-0.2935251,0.20282711],[-0.086241946,-0.7803644,-0.51779443,0.59950584,-0.25105664,0.49625984,-0.13718586]],"activation":"σ","dense_2_b":[[-0.046400562],[-0.2743444],[0.101535104],[-0.12776503],[-0.18889363],[0.18883984],[-0.035363212],[-0.32065263],[-0.1838859],[-0.17174399],[-0.12857278],[-0.15375665],[0.13183501]]},{"dense_3_W":[[-0.51021737,-0.011125954,0.22268747,0.62723666,0.5020427,0.2123506,-0.44933605,-0.49467763,0.67046887,-0.21754947,-0.15336846,-0.4072764,0.040200777],[-0.64956605,-0.24969986,0.34987608,-0.56477535,-0.3730418,0.5834431,0.3829126,-0.09269529,0.22655901,-0.17133151,-0.56455123,0.23502398,0.81564665],[0.35202488,0.2378389,-0.59673995,-0.6565647,0.26492116,-0.07214567,0.33713487,-0.1934846,0.13139229,0.6117809,-0.5184132,0.45279473,0.10368968]],"activation":"identity","dense_3_b":[[0.071363665],[0.0600199],[-0.092375375]]},{"dense_4_W":[[0.006432696,1.1171645,-0.07490736]],"dense_4_b":[[0.05727158]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX 2020 b'8965B78120x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX 2020 b'8965B78120x00x00x00x00x00x00'.json deleted file mode 100755 index bf661cf881..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX 2020 b'8965B78120x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.146646],[1.0861496],[0.37736702],[0.041793752],[1.0729182],[1.0773717],[1.0815437],[1.0802093],[1.0698869],[1.0521225],[1.033094],[0.041741546],[0.04175913],[0.04176615],[0.04171372],[0.041648354],[0.041466083],[0.041214902]],"model_test_loss":0.007158362772315741,"input_size":18,"current_date_and_time":"2023-08-09_08-32-56","input_mean":[[24.87129],[0.0040199133],[-0.012174124],[-0.007803845],[0.008421226],[0.007382176],[0.0064237905],[0.0022175014],[0.0023437915],[0.00084140577],[0.0007466427],[-0.0077374396],[-0.0077325962],[-0.0077279285],[-0.0077621834],[-0.0077370647],[-0.0077854996],[-0.00790058]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.02440857],[0.30775324],[-0.38804558],[1.3022306],[-0.083552],[0.017909346],[1.0338217]],"dense_1_W":[[-0.018503293,-0.58764344,0.02424212,0.29838094,0.07453753,-0.31939444,0.71456915,-0.57316875,0.28442377,0.045891594,-0.09102808,-0.3166445,-0.21457,0.15771346,0.21041498,0.014606669,0.09654,-0.20440961],[0.11308228,0.36093086,0.0081503345,-0.15093833,-0.40928927,0.5281348,-0.3136049,-0.01366254,0.32156047,-0.01478815,-0.09433961,0.0589882,0.46570504,-0.08343458,-0.4513174,-0.23909375,0.32555535,0.03498277],[0.012934308,-0.807455,-5.4857802,-0.22414753,0.739661,0.35657424,0.100581415,-0.54639435,-0.54661614,-0.44405246,1.0174531,-0.23915811,0.018980676,0.3152944,0.16779307,0.06588091,-0.15882106,0.0069539533],[0.43364748,0.21731022,0.1509351,0.24937709,-0.266339,0.93301386,-0.77076274,0.03864835,0.16453606,-0.049564537,0.042268448,0.26538175,-0.3747379,-0.26633552,-0.1627539,0.4571696,-0.15453127,-0.052892048],[0.003844223,-0.30206564,0.007838732,0.44173336,0.16904438,-0.8539721,0.24912493,0.23093201,-0.30098426,-0.053782903,0.19755876,-0.8577459,0.08343516,0.19395697,0.13223626,0.15016438,-0.1095013,0.23785642],[0.13072594,-0.5031704,-0.008023158,-0.082815915,0.23274036,-0.3975246,0.06762822,0.28228945,-0.088360794,0.13266067,-0.15510467,0.14137018,-0.36540613,0.122993015,0.1820403,0.043875482,0.1807256,-0.17738947],[0.4567794,-0.4016854,-0.14515655,0.11580799,0.37104917,-0.80235296,0.84958047,-0.40907645,0.22014396,-0.29004142,0.14125343,-0.4521938,0.25444683,0.05556736,0.05717658,-0.0057016616,0.2562742,-0.2375869]],"activation":"σ"},{"dense_2_W":[[-0.48313946,-0.39628115,-0.11249228,0.2369702,-0.95594436,-0.016989736,-0.24979061],[-0.04802805,0.23703022,-0.2522654,0.8781721,-0.27487224,-0.32336324,-0.84614146],[-0.75498384,-0.02555702,-0.26924992,0.3685581,0.17157069,-1.1919085,-1.3296491],[0.24518122,-0.41801304,-1.3408265,-0.3844284,-0.43864518,-0.68599224,-1.1400452],[-0.7564912,0.5270413,0.5286734,0.07109369,-0.96531475,-0.43521672,-0.09374951],[-0.84034276,0.22120611,-0.4787729,-0.106007226,-0.423205,-0.35648152,-0.9256408],[0.12945794,-0.29220057,-0.1778261,-0.2368211,0.97371066,0.4675753,-0.24584447],[-0.3716841,0.90940213,0.02815187,0.45479253,-0.27149537,-0.50198483,-0.22473548],[-0.66260093,0.75476915,-0.03105298,0.57964265,-0.81710166,-0.061508402,0.17633282],[1.0140518,-0.72448766,-2.0274432,-0.70543754,0.20180465,-0.8068022,-1.4245642],[0.7672933,-0.52256364,0.1798329,-0.08854827,0.09783098,0.5402585,0.5772625],[0.6664194,-0.0006749223,-0.30461577,-1.0251858,0.48331183,-0.11165713,0.72331625],[0.94857574,-1.0158324,0.27272424,-1.608812,0.12564772,0.20672992,-0.026206829]],"activation":"σ","dense_2_b":[[-0.21546994],[0.036408603],[-0.099371314],[-0.22597122],[-0.15818553],[-0.13797529],[-0.049458597],[0.04860044],[0.277023],[0.074395016],[-0.16951285],[-0.06529862],[-0.2778253]]},{"dense_3_W":[[-0.18387982,0.8886978,0.66043097,0.7504068,0.36590803,0.12719806,-0.71894497,0.5354477,0.77389723,0.69074714,-0.70785916,-0.18604858,-0.7207551],[0.33382007,0.50233775,0.79906523,-0.17690791,0.2123564,0.48021612,-0.28027645,0.6302492,0.70902044,0.4347561,-0.8021013,-0.728156,-0.61748165],[-0.5456827,-0.0074385586,0.27454564,0.19413206,0.2291002,0.30727038,-0.49753815,0.2708291,-0.55447114,0.14861229,0.24177633,0.45634028,-0.15501119]],"activation":"identity","dense_3_b":[[-0.20096046],[-0.16594656],[0.02119976]]},{"dense_4_W":[[0.65935874,0.49205348,0.008652598]],"dense_4_b":[[-0.14721861]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78060x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78060x00x00x00x00x00x00'.json deleted file mode 100755 index 43c8600aff..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78060x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.571262],[0.9866572],[0.44786832],[0.030994067],[0.98464835],[0.98554516],[0.9865821],[0.96593],[0.9504797],[0.92728204],[0.904809],[0.03096524],[0.030987293],[0.03100753],[0.030929225],[0.030893764],[0.030828128],[0.030683307]],"model_test_loss":0.007625925354659557,"input_size":18,"current_date_and_time":"2023-08-09_09-24-50","input_mean":[[21.981443],[-0.03410452],[-0.0042907107],[-0.010875239],[-0.034431927],[-0.034863934],[-0.034671817],[-0.035121698],[-0.034416344],[-0.033750016],[-0.03282395],[-0.011034662],[-0.010998612],[-0.01096597],[-0.01084258],[-0.010833595],[-0.010883476],[-0.010945559]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.75581545],[0.11879905],[-0.6501629],[-0.022731934],[-0.0029385677],[0.26847437],[-0.0017951597]],"dense_1_W":[[0.2516616,0.39057118,0.00022413803,0.063490085,-0.42193273,1.2512321,-0.600658,-0.10923261,0.31011167,-0.16468239,0.044944312,-0.11299465,0.09586187,-0.100811586,0.20447883,-0.23340297,0.096681945,-0.039790932],[0.021704927,-0.20683353,-0.03011313,-0.15637654,0.15294304,-0.49757507,0.28674713,-0.023688028,-0.3239314,0.10428786,0.053708497,-0.42767534,-0.24340263,0.6549382,0.066411644,0.34770808,0.13055065,-0.306452],[-0.22692491,0.3703906,-0.0047728727,-0.3158897,-0.3546027,0.7207767,-0.24876097,0.27380067,-0.24621023,0.24137513,-0.1049461,-0.13480167,0.72030693,-0.4477213,-0.017713917,0.39679456,-0.254984,0.04286245],[1.057311,0.04657839,-0.056031335,-0.098100096,0.04250412,-0.36376515,0.7487397,0.15540043,0.18684135,-0.09664429,-0.05738495,-0.17933905,0.3892038,-0.05849292,0.41884843,-0.11726217,-0.16056898,0.086423434],[-0.012506045,-0.59728193,0.045439012,0.2765916,-0.23399554,-0.46535358,0.2761762,-0.1671016,0.07206194,0.28501,-0.26103756,-0.21281493,-0.080912635,0.2563691,-0.07951293,-0.12668297,-0.11916628,0.13779652],[1.0182611,0.027373608,0.05301419,-0.2813371,-0.39408943,0.3335591,-0.24602611,-0.68556553,0.085850835,0.47405693,-0.23440285,0.4555455,0.31906822,-0.8772108,-0.119383216,0.02932853,0.36750838,-0.16070719],[-0.004662744,-1.1186787,-3.4395354,0.24383633,0.50660896,0.01470808,0.7312308,0.3490615,-0.53634375,-0.56201684,0.45341375,-0.64736515,-0.83393633,0.5130379,0.6360629,-0.013693679,0.14626765,-0.010980777]],"activation":"σ"},{"dense_2_W":[[-0.9355151,-0.023498436,-0.7968888,0.31088433,0.7671889,-0.9731516,0.41286936],[0.52685624,-0.8809834,0.80358076,-0.8165037,-0.896308,0.29132918,0.23919983],[-0.46378753,0.1493763,-0.8195766,-0.80706054,0.2181272,0.08533837,-0.47286823],[-0.929153,0.6981678,-0.7250342,-0.21020086,0.57452005,-0.7235436,0.05653503],[0.18721063,-0.921323,0.9797812,-0.8922341,-0.38992167,-0.42454776,-0.8229087],[-0.80549794,0.48562962,-0.67541397,0.33862114,0.67381793,-0.24850826,-0.030231507],[-1.2585708,1.0969089,-0.8206399,0.19675127,0.14951561,-1.1598734,0.3381644],[0.1852816,-1.1352712,0.8965919,-0.97538066,-0.94872093,0.31611708,-0.38623008],[0.17095518,-0.9345781,0.8144248,-0.068343334,-1.051506,-0.70048666,0.13564703],[0.7746455,-0.26728967,0.53744304,-0.11955244,-0.53616977,0.46801162,-0.38597685],[-1.4234841,0.045931406,-0.7355768,-0.37909967,0.10869067,-0.44514802,0.63276064],[-0.9319143,0.24633782,-0.652142,0.048897915,0.03313439,-0.6740785,0.42693377],[-0.13351214,-1.0613108,-1.04803,-0.58857614,-0.7700214,-0.926666,-0.035181627]],"activation":"σ","dense_2_b":[[-0.3801605],[-0.13295135],[-0.39476892],[-0.17900646],[-0.10525445],[-0.27975556],[-0.22018868],[-0.02276822],[-0.21814801],[-0.048818234],[-0.32378197],[-0.34881616],[-0.5472454]]},{"dense_3_W":[[0.15212612,-0.7641529,0.084815554,0.03359007,-0.21354504,0.12747967,0.4120128,-0.21778765,-0.04332278,0.13283496,-0.25436175,0.38143668,-0.021156475],[-0.29871544,0.06072304,-0.18974409,-0.787422,0.5630134,-0.3311209,-0.38903987,0.6408349,0.36237547,0.66097933,-0.5393427,0.12618305,-0.01849426],[-0.27246246,0.47302738,0.31806195,-0.094901696,0.6957061,-0.47511533,-0.95053864,1.0960633,0.36602244,-0.18240735,-0.64022654,-0.38033855,0.034928925]],"activation":"identity","dense_3_b":[[0.04440576],[-0.04094681],[0.07032833]]},{"dense_4_W":[[-0.38054875,0.8218665,0.48242453]],"dense_4_b":[[-0.029091563]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78080x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78080x00x00x00x00x00x00'.json deleted file mode 100755 index 0d1263e2f9..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78080x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.765739],[0.94667494],[0.3616158],[0.03295844],[0.94349825],[0.94473606],[0.9459934],[0.93809646],[0.9294505],[0.9191347],[0.909892],[0.032861285],[0.032873545],[0.032887414],[0.03284168],[0.03278519],[0.032662667],[0.032455098]],"model_test_loss":0.00579620897769928,"input_size":18,"current_date_and_time":"2023-08-09_09-50-03","input_mean":[[26.929195],[0.025196731],[-0.012881554],[-0.010710338],[0.026543096],[0.026043745],[0.024963912],[0.020803003],[0.02182621],[0.021567121],[0.021462854],[-0.01068755],[-0.010679269],[-0.010679149],[-0.010794701],[-0.010869973],[-0.011037343],[-0.0112071205]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.44354764],[-0.7657953],[0.018021787],[-1.0539906],[-0.009620201],[0.6071759],[-1.4219347]],"dense_1_W":[[-0.14379139,-0.30779734,-0.011025622,0.052611172,0.557827,-0.4541853,0.054443758,-0.43811756,0.04116236,-0.065442,0.17522809,0.28900382,-0.30594754,0.03927426,0.10508941,-0.28021297,0.257097,-0.036213793],[0.9893257,-0.5675847,-0.014914029,-0.17742264,0.32900116,-0.73124397,0.13309838,0.13541694,0.116568185,0.20272915,-0.20234105,-0.17204566,-0.38287598,0.6434185,0.0064828196,0.1567134,-0.17254141,0.04431351],[0.17694262,0.110742696,-0.0072636493,-0.30341333,0.75194615,-0.3262881,-0.03383622,-0.6425869,-0.3143724,-0.1566403,0.4531637,-0.5161109,0.3051894,0.06773472,0.57514226,0.38881442,-0.24892426,-0.15087128],[0.6424904,0.08595462,0.017552882,-0.11244444,-0.0012405494,0.7457563,-0.16368888,-0.036026936,0.0022191536,0.013409932,0.04517947,0.5781084,-0.040897,-0.3180909,-0.26591027,0.22652127,-0.15628065,0.10445975],[-0.0072668577,0.8202856,2.617024,-0.2824348,-0.97013533,0.60666716,-0.6603529,0.07703543,0.7071423,0.31937075,-0.6525571,0.18346174,0.41531911,-0.38626656,-0.22641395,-0.33223557,-0.057725884,0.37739605],[-1.0272679,-0.3728853,-0.010129326,-0.12533276,-0.037398476,-0.42292497,0.38740557,0.026151482,0.066494055,-0.20116358,0.08494257,-0.56133485,-0.23647791,0.46512464,0.4194588,0.00095449237,0.40787858,-0.43964177],[0.47435406,-0.3580759,-0.016430117,0.4333006,-0.03563075,-0.3228895,0.2759132,-0.2764072,-0.08593015,0.08139821,0.03733085,-0.49198797,-0.3483896,0.08270213,0.55244505,0.034020998,-0.19379029,-0.08319991]],"activation":"σ"},{"dense_2_W":[[0.62931764,0.5971392,-0.27920744,-0.09625446,-0.2520517,0.15220097,0.4757284],[-0.06810498,-0.16192971,-0.67571473,0.77427846,0.7111675,-0.5092023,-0.5899211],[-0.12662062,-0.43264922,-0.42270333,1.0279697,0.9585099,-0.2272264,-0.8349456],[0.6851959,0.3806427,0.23734182,-0.32216796,-0.031175314,-0.31848902,0.7827528],[0.7574823,-0.016572893,0.13931036,-0.058099292,-0.27628875,0.32055375,0.8826999],[-0.44577265,-0.51336366,-0.17647457,-0.29222834,-0.403649,-0.5358206,-0.22588949],[0.8276441,0.69618565,0.28485808,-0.66541606,-0.55220205,-0.09244421,0.22509284],[-0.017253404,-0.61689866,-0.43271235,0.9186229,-0.06328271,-0.62504864,-0.02206981],[-0.24327579,-0.2601557,-0.7008787,0.5407824,-0.07432113,-0.6142975,-0.14885205],[0.2805065,0.4750363,-0.51714677,-0.8662437,-0.5432591,0.17315364,0.2283728],[0.07518284,-0.06419793,-0.058394507,0.0030758125,-0.45961043,0.096795864,-0.88641495],[0.40107206,0.83659804,0.60401416,-0.17886135,-0.18380448,0.026554653,0.42531914],[-0.5561093,-0.81054825,0.02538599,0.37181157,0.11950624,-0.48669273,-0.1697464]],"activation":"σ","dense_2_b":[[-0.15892611],[0.25231406],[0.21843024],[-0.11113979],[-0.32132435],[-0.13616537],[-0.033621266],[0.121211156],[0.11654428],[-0.2573873],[-0.17534298],[-0.35013044],[-0.10002702]]},{"dense_3_W":[[0.38975736,0.95184344,0.46049997,-0.036776196,-0.59762466,0.77046573,-0.6417351,0.2455277,0.38605514,-0.22826484,0.4754016,-0.20180263,0.72369117],[-0.34123415,0.52516204,-0.39218587,-0.2495947,-0.49277434,-0.24826856,0.08814419,0.57656366,-0.027706323,0.70304173,-0.46806642,-0.3219581,0.3978641],[0.6244901,-0.03226933,-0.593904,0.34863296,-0.08907449,-0.01563905,0.0118533475,-0.57811826,-0.56102645,0.41259542,0.020354345,0.6811666,0.4265405]],"activation":"identity","dense_3_b":[[-0.07089868],[-0.011698629],[0.01570641]]},{"dense_4_W":[[0.491706,0.3488659,-0.4674428]],"dense_4_b":[[-0.02980553]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78100x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78100x00x00x00x00x00x00'.json deleted file mode 100755 index 8b5278a2f4..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018 b'8965B78100x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.339225],[0.66194373],[0.31205928],[0.024341436],[0.6674081],[0.66513306],[0.66231716],[0.63895327],[0.6226761],[0.6013514],[0.58303964],[0.024373248],[0.024379227],[0.0243759],[0.024252327],[0.024022032],[0.023766125],[0.023506766]],"model_test_loss":0.0085480697453022,"input_size":18,"current_date_and_time":"2023-08-09_10-15-22","input_mean":[[15.308053],[0.026956981],[0.012521076],[0.008223056],[0.022762844],[0.024105612],[0.025292715],[0.029286988],[0.03120046],[0.03498811],[0.03913229],[0.0080815395],[0.008096857],[0.008109519],[0.008077261],[0.008023134],[0.007986101],[0.007946235]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.5486839],[-0.004182566],[0.70444334],[-1.2786864],[1.4237925],[-2.3157184],[-0.19027016]],"dense_1_W":[[2.3501394,-0.25705758,-0.07988189,-0.4290957,0.4012017,-0.49507633,0.68234736,0.19331971,-0.17918207,-0.2851441,0.014464558,-0.27997214,0.057441402,0.21785,0.4626131,0.25091216,-0.14428633,-0.11459715],[0.003891034,0.4025592,2.048489,0.2223581,-0.3264602,0.2324849,-0.31729513,0.026396394,0.39784166,0.28578123,-0.6775234,0.5099526,0.19664104,-0.78575885,-0.31198698,0.06568886,-0.11406481,0.18468915],[-0.029596832,0.37486562,0.0014446818,-0.018797278,-0.18172906,0.00620379,0.24613884,-0.0092346985,0.3056447,-0.2428616,-0.5551724,0.26058063,0.3762853,-0.10942015,0.62718093,0.25591257,0.54290694,0.44276074],[-0.04114054,-0.20652032,0.0009401521,0.14549057,0.18316638,-1.1457938,0.16571473,-0.040683154,0.01334905,-0.018335016,-0.076690406,-0.6794025,0.07434657,0.50387204,0.17088206,-0.09142393,-0.020549657,-0.07973338],[2.3122618,0.0072796457,0.07924426,0.55116,-0.27173284,-0.21541947,0.10083326,-0.17866814,0.34227166,0.083340704,0.03105569,-0.12183439,-0.2974347,-0.19256411,0.279966,0.003367294,-0.2737957,0.04101335],[-0.07023867,0.57056046,-2.7999631e-5,-0.164115,-0.2467486,1.2809415,-0.2786617,-0.043639272,0.18761483,-0.088788636,0.08548801,0.5136481,-0.2621358,-0.25907272,-0.018350206,0.2105986,-0.08260793,0.031995647],[0.0007746239,0.57527333,-0.0020729017,-0.49926147,-0.33753145,0.5631315,-0.70021117,-0.113007955,0.029500647,-0.06764356,0.15615635,0.0883909,0.25133765,-0.19060083,0.016509565,-0.061984852,-0.073395506,-0.1258471]],"activation":"σ"},{"dense_2_W":[[-0.28617162,-0.8748424,-0.3045525,1.0268904,-0.692021,0.54420674,-0.5599996],[0.08057282,0.21628964,-0.4089967,-0.18864584,0.47374418,0.4785689,0.5501896],[-0.48260906,0.24998908,-0.40376288,-0.8485313,0.76005214,0.18822819,0.6730072],[-0.5493484,0.74067533,0.5290222,-0.74589324,0.21366102,0.9318854,-0.32034856],[-0.37596846,-0.13169625,0.46739164,-0.86299413,0.24203786,0.5865028,0.42028916],[2.4739633,-0.036862414,-0.65760493,2.6289167,1.6200708,-1.7124206,-1.2274244],[0.51397264,-0.8629164,0.085178815,1.0408322,-0.055253804,-0.6733212,-0.20133649],[-0.69732106,0.12842987,0.41530445,-0.387307,-0.089540526,0.19835305,0.81477255],[-0.20419389,0.3284613,-0.09723707,0.5140212,-1.157376,-0.84693354,-0.74240136],[0.8758132,-0.15793347,-0.09718561,0.8709293,0.040350463,-1.1266917,-0.5584791],[-1.6498971,0.27860475,-0.44611832,2.437586,-2.1081448,-2.2837684,-0.871032],[-0.78162026,-0.79014534,-0.5790472,2.1518378,-1.4926344,-0.24358809,-0.6452897],[-0.46411687,0.6652152,-0.44766068,-0.18919358,0.32152855,0.16063835,0.5126533]],"activation":"σ","dense_2_b":[[-0.075753756],[-0.14393337],[-0.138848],[-0.06541741],[-0.08361248],[0.9521424],[0.19756864],[-0.17231311],[0.12727004],[0.23659523],[-0.27445894],[0.07138053],[-0.083465844]]},{"dense_3_W":[[0.4272615,-0.49210763,0.38295087,-0.41412348,0.2860867,-0.4020542,0.4103019,0.41672885,0.21858406,0.3664715,-0.13791886,0.3195822,-0.22315404],[0.27507186,0.4673776,-0.42973244,0.44775274,-0.1259053,-0.2956321,-0.009527084,-0.08753577,-0.109627016,-0.08309372,-0.027477503,0.13203609,-0.26320615],[-0.20693302,0.15525103,0.5645003,0.18120688,0.6252794,-0.7330898,-0.26089343,0.61918086,-0.43114677,-0.6229183,-0.7104607,-0.4226231,0.54074675]],"activation":"identity","dense_3_b":[[-0.087035514],[0.0670505],[0.079935245]]},{"dense_4_W":[[0.0027248666,0.14787766,1.2931683]],"dense_4_b":[[0.07440508]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018.json b/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018.json deleted file mode 100755 index 16bd3503fd..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS NX HYBRID 2018.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.585601],[1.0769356],[0.4152277],[0.032089308],[1.0751251],[1.0764067],[1.076593],[1.0550125],[1.0351758],[1.0109047],[0.9867031],[0.032038312],[0.032060873],[0.03208132],[0.031983834],[0.03192507],[0.031825032],[0.03163297]],"model_test_loss":0.009431030601263046,"input_size":18,"current_date_and_time":"2023-08-09_08-59-32","input_mean":[[23.35191],[0.014709264],[-0.007846618],[-0.0073924493],[0.015706308],[0.01488224],[0.014164865],[0.01273958],[0.011578967],[0.010703318],[0.011319831],[-0.0074810195],[-0.0074531967],[-0.0074234046],[-0.0073149926],[-0.0072922925],[-0.0073944805],[-0.007550104]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.010489621],[-3.390052],[-0.27632216],[0.06388101],[-0.0023289998],[-0.5310449],[-3.7337463]],"dense_1_W":[[0.044022243,-0.9602262,0.023165302,0.23139995,0.40745816,-1.3215717,1.0053997,0.00058070425,-0.18163256,-0.11781253,0.109620206,-0.12967418,-0.5115588,0.37036052,0.051331975,0.19479781,-0.042822767,-0.08214719],[-1.3167536,0.9873784,0.12040588,0.1293769,-0.2311463,0.4298457,-0.42706266,0.021210633,0.3404923,0.21219859,0.22471832,0.08838383,0.29760027,-0.88747275,-0.0634611,0.10965482,0.47251707,-0.43532783],[-0.39206186,-0.13839394,0.0042735203,-0.32981926,0.20854518,0.60123193,0.06244858,0.075630054,-0.19788578,-0.0059076576,0.21052705,-0.005142829,0.37731835,-0.00039926043,0.029549208,0.1704483,0.040654548,-0.09829513],[0.033498857,-1.03267,-3.2917075,0.1436397,0.40437415,-0.07208642,0.4386376,-0.016019847,-0.41353783,-0.27417776,0.8748351,-0.8393321,-0.08226523,0.15535136,0.46795392,0.21382397,-0.14780073,0.08567079],[0.0075990325,0.3534574,0.017199304,0.1619128,-0.69365615,1.2924689,-0.63552207,0.10506459,0.12512617,-0.0582667,-0.06807627,0.43178403,0.4894852,-0.95637363,-0.25379786,-0.043963056,-0.3546822,0.3529367],[-1.0046507,-0.16842256,0.0057131224,0.04903764,0.66925514,-0.5714975,0.6537934,-0.19450375,0.62123895,0.15355848,-0.16622919,-0.10328739,-0.1587315,0.50108814,0.16457188,-0.16681637,-0.098925866,0.036512375],[-1.3783246,-0.82125074,-0.12702073,0.13462974,0.22287484,-0.4129491,0.21670008,0.12311822,-0.4235394,-0.3596955,-0.1640687,-0.28299794,-0.16758752,0.8536019,-0.066162966,-0.194256,-0.39008158,0.4202336]],"activation":"σ"},{"dense_2_W":[[-0.5063604,-0.4741062,-0.5781108,-0.5322161,-0.59136206,0.16058896,0.058547825],[0.8868212,-0.45694777,-0.20642655,-0.3002692,-0.58157927,0.25157875,0.6711802],[0.795214,-0.86609215,-0.3717794,-0.069523655,-1.109417,0.53392845,0.6741648],[-0.03295086,0.33387217,-0.09837575,-0.2690749,0.4300655,0.030849602,-0.69364756],[-0.054043226,-0.055589274,0.45605162,-0.6619817,0.1327919,-0.11879317,-0.048832323],[0.74532807,-0.4380021,-0.4157702,0.5167606,-0.2990743,0.2512731,-0.18856232],[0.05154261,0.456311,0.4568838,-0.0567244,-0.2747546,0.36871868,-0.062383007],[1.1826025,-0.92312306,-0.4721928,-0.1572826,-1.11019,0.43225694,1.1563685],[-0.108299814,0.027349837,-0.7674503,0.5352721,-0.89908135,0.3278036,0.7806216],[-0.5583551,0.2056205,0.08362692,-0.5434645,0.5470751,-0.3124283,0.08043123],[0.45070142,-0.57115096,-0.2245427,-0.045519225,-0.6893506,0.037161164,-0.23384157],[0.1461993,0.41832474,0.4386533,-0.20438145,0.48432893,-0.052871887,-0.021635566],[-0.6163875,0.38114646,-0.23866823,0.25583425,0.60170585,-0.25978467,-0.12486062]],"activation":"σ","dense_2_b":[[-0.2458712],[-0.06637249],[-0.013759815],[0.03347602],[0.018802742],[-0.08192537],[-0.010520929],[-0.037358187],[-0.13399647],[0.06693022],[-0.26994675],[-0.093340464],[-0.041655704]]},{"dense_3_W":[[0.49996868,-0.373681,-0.51962894,0.62675476,-0.31773674,-0.59978634,0.6219736,0.050350633,0.33989727,0.5896998,0.3858415,-0.5429359,0.4819143],[-0.12461631,-0.17281315,-0.3340952,0.4874769,0.0636714,-0.042632986,0.44136724,0.02729029,-0.454583,0.48858696,-0.10563923,-0.28252137,-0.075173035],[-0.23492163,-0.40539813,-0.23685107,0.21184611,0.55601394,-0.3081886,0.2426802,-0.6480087,-0.5652243,-0.013350206,-0.33100715,0.58174974,0.016825484]],"activation":"identity","dense_3_b":[[0.038624156],[0.041515328],[0.04800828]]},{"dense_4_W":[[0.6152052,0.6204614,1.1353754]],"dense_4_b":[[0.04677127]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E011x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E011x00x00x00x00x00x00'.json deleted file mode 100755 index 5595dd0b52..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E011x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.497126],[0.7899638],[0.44968936],[0.040003814],[0.790069],[0.78973264],[0.7899307],[0.7765341],[0.7670328],[0.758676],[0.7496478],[0.039959125],[0.03996849],[0.039961126],[0.039813876],[0.039652888],[0.03946854],[0.039514165]],"model_test_loss":0.019624391570687294,"input_size":18,"current_date_and_time":"2023-08-09_11-08-09","input_mean":[[24.399408],[0.032711282],[0.0115032485],[-0.00525594],[0.030166635],[0.029666992],[0.029536955],[0.035590276],[0.03622483],[0.039915655],[0.042751476],[-0.005364839],[-0.005367187],[-0.0053584483],[-0.0053036655],[-0.0054080314],[-0.0055061234],[-0.00556505]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.6610016],[0.151701],[0.009707743],[-0.26353267],[-2.1897213],[-0.07288661],[-0.11378308]],"dense_1_W":[[0.7202683,-1.4521006,-0.36892205,-0.27287668,0.5218362,-0.9888661,0.7682538,-0.22947517,-0.0722589,0.04581978,0.17252716,0.20101401,0.2203343,0.5318873,0.16461913,-0.10408441,-0.046259586,-0.0836677],[0.0017382947,0.73556834,1.6531876,-0.23093462,0.20005266,0.42430395,-0.5890132,0.49725816,0.5355405,-0.10126484,-1.4101623,0.7921084,0.1510884,-0.73259395,0.084286,-0.4520055,0.11672066,0.25221756],[-0.015996123,0.6276854,0.052092206,-0.36424366,-0.07230438,-1.2923295,0.7504581,0.09663407,-0.18611723,-0.120635055,0.015938537,-0.37530875,0.2885642,-0.059331078,0.08137963,0.20130512,-0.021207044,0.046624325],[-0.012034361,-1.4192638,-5.2265596,0.2612958,4.1413407,2.314966,2.3661003,-1.5783347,-5.9282966,-2.0653381,1.9981527,-2.0700922,-0.5770653,0.38979787,1.1890407,0.48308054,1.4855419,-1.1318967],[-0.7691148,-1.4111314,-0.36992973,-0.56459725,0.38714254,-0.3826238,0.5399009,-0.63972545,0.04428801,-0.21149153,0.40715024,-0.2787244,0.7013386,0.6029106,0.50310415,-0.23025295,0.11826784,-0.23212224],[-0.006358524,0.69335353,0.02794763,0.3399404,-0.59244144,0.7978909,-0.6742573,0.063028805,-0.1886972,-0.104276046,0.08210134,0.7829205,-0.17847379,-0.42135885,-1.1342844,0.29648486,-0.25651482,0.43940562],[0.006844428,0.990331,0.011878585,0.54291165,-0.19225447,-1.9755626,0.30564827,-0.07925933,0.31555137,-0.15508366,-0.27373806,-0.18496017,-0.4336757,0.18401355,-0.26887777,-0.010644886,-0.10060476,0.2263297]],"activation":"σ"},{"dense_2_W":[[0.36306933,0.3977938,0.22641855,0.7298922,-0.27546063,-0.10226779,0.034273352],[0.08656265,-0.48553008,0.55096817,-0.048100367,0.53174394,-0.83036834,0.56428534],[-0.24495511,0.33051565,-0.12894641,-0.26901788,0.3568392,-0.52020496,-0.11631975],[0.37262198,-1.0897073,-0.45251986,0.30015078,-0.5788583,-0.06598383,-0.6937122],[-0.4771023,-0.2963909,0.20836869,-0.4795101,0.028140526,0.91956437,-0.6256226],[-0.035516877,0.4190135,-0.27137184,-0.76606,-0.10609275,1.59395,-0.753493],[-0.47961858,0.030423556,-0.071964465,0.21260998,0.027962271,0.08736105,0.0015122219],[0.44915485,-0.49171802,0.5426616,0.38728034,-0.04750208,-0.24676758,0.32686082],[0.014905465,-0.09540689,-0.39694756,-0.07622363,0.43361604,0.061137225,0.7645907],[0.2848,-0.07338248,-0.6300479,0.32704386,-0.45459402,-0.4455886,-0.20302792],[-0.14017946,0.19692336,-0.5500081,0.43361938,-0.79839504,0.14536503,-0.5962689],[-0.35142824,0.22747609,-0.5308471,-0.3816653,-0.14133443,0.7790726,-0.46167746],[0.033977807,-0.47663027,0.21505095,0.060140327,0.50756395,-0.46516722,0.5984394]],"activation":"σ","dense_2_b":[[-0.08834933],[-0.17998597],[-0.098719954],[-0.07162819],[0.18823287],[0.25482836],[-0.23286653],[-0.13847035],[-0.1420269],[-0.16621625],[0.107665256],[0.27800032],[-0.2690747]]},{"dense_3_W":[[0.31680772,-0.04880554,0.41232827,-0.5364121,-0.18391071,-0.19796918,0.4786881,0.3846168,0.53205895,0.21274851,-0.69326276,-0.359501,-0.47516134],[-0.21317686,0.22660097,-0.36739162,0.16952656,-0.485056,-0.033075597,0.113461725,0.47104463,-0.29169482,-0.12948655,0.38925797,-0.826083,0.6325188],[0.34189993,0.43732288,0.26165158,-0.18155214,-0.54409766,-0.19873665,-0.28346628,0.5721446,0.5639601,-0.036017355,-0.4653392,-0.79315287,0.1872007]],"activation":"identity","dense_3_b":[[-0.064026974],[-0.056641966],[-0.060960032]]},{"dense_4_W":[[-0.5811463,-0.62689096,-1.1673242]],"dense_4_b":[[0.05718782]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E012x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E012x00x00x00x00x00x00'.json deleted file mode 100755 index be3b6fb7c3..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B0E012x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.178389],[1.1035752],[0.4662704],[0.046207998],[1.1074592],[1.1067053],[1.1053001],[1.0732423],[1.0499698],[1.0244768],[1.0014167],[0.046057243],[0.04609966],[0.046142098],[0.04609972],[0.04592567],[0.045645263],[0.04529655]],"model_test_loss":0.01661650463938713,"input_size":18,"current_date_and_time":"2023-08-09_11-33-54","input_mean":[[24.113503],[0.026555553],[0.007805312],[0.0024834524],[0.025088156],[0.025798468],[0.026386062],[0.029757109],[0.030439591],[0.031094952],[0.03309283],[0.0025249124],[0.0025172262],[0.0025013706],[0.0023470775],[0.0021061723],[0.0018476403],[0.0016275451]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.04851935],[0.18912777],[-1.3116255],[-0.7472734],[1.5802238],[0.0032274537],[0.9271875]],"dense_1_W":[[-0.013812765,0.23587815,-0.88323635,0.4553478,-0.10918498,-1.4469972,1.0692941,-0.79699284,-0.6479312,0.06861249,1.1115149,-1.0295787,0.39040166,0.82937765,-0.28262046,-0.2515571,-0.27617222,0.80472493],[0.025999622,0.5356352,5.958624,-0.7345606,-2.8084228,-1.6167558,-2.1773086,0.74087584,4.05941,2.2720666,-0.5007629,1.8292586,0.73168993,-0.13792978,-1.0049746,-0.78412616,-0.32696438,0.1599063],[-0.68668175,1.2465404,0.0007119129,0.18416734,-0.17395344,1.1581551,0.3491509,0.015340899,-0.243164,0.3337365,0.0059605897,0.25817114,-0.012701957,-0.54250956,0.06875178,0.047875002,0.03650471,-0.042195074],[-1.4012998,0.15385582,0.00326918,0.23495099,1.1849846,-0.16899009,1.0280719,0.93690526,-0.14206767,-0.20286582,0.26880294,-0.5328709,-0.18946564,0.41029063,0.27763805,-0.22111964,0.04954255,-0.10736989],[0.7175712,1.2868648,-0.0006277978,0.26892963,0.06477711,0.9932033,0.34392086,-0.009526572,-0.22756432,0.25638282,0.08036479,0.50691277,-0.3837951,-0.49345502,0.054468766,0.033681694,0.08291686,-0.058626775],[-0.0014453949,0.14246415,-0.0014614231,0.21303391,-0.21408749,-1.5569146,1.0463302,-0.008707946,0.012354692,0.32674435,-0.3785094,-0.749308,-0.17875636,0.80370486,0.19241858,0.15964696,0.4008355,-0.4595413],[1.471798,0.053307597,0.0039579137,0.09766114,1.1792371,-0.15318848,1.1508945,0.9567271,-0.14996085,-0.31087992,0.346843,-0.35862166,0.021058438,0.12184848,0.20475146,0.04533049,-0.30174068,0.07555196]],"activation":"σ"},{"dense_2_W":[[-0.23688912,-0.29926342,-0.4236539,0.58860856,-0.35607925,0.62337095,-0.15733019],[-0.7429034,0.5418817,0.3976327,0.45379984,0.050487727,-0.19394211,-1.0679561],[-0.009215472,0.29501885,-0.70378315,0.044839945,-0.49085298,0.20003374,-0.35764387],[-0.19541922,-0.11391505,-0.20030189,0.0048329923,0.02828999,0.42400816,0.6403727],[0.08312188,0.31799898,-0.69704294,0.20299889,-0.2131362,0.44351074,0.098965526],[-0.3986167,0.18717383,0.62129164,-0.094000615,0.41735825,-0.50520986,-0.9462763],[0.19806273,-0.06787933,-0.59105605,0.36845544,-0.6435648,0.73989093,0.32647932],[-0.2055667,0.1422158,-0.43421987,0.20636247,-0.23087944,0.31787756,0.51859593],[-0.31988147,-1.4222198,-0.24275048,-1.1502436,-0.3906249,-0.6949595,0.47081533],[-0.32937595,0.38923815,0.8274464,-0.7638735,0.61449593,-0.20162378,0.33241272],[0.29764244,-0.8901207,-0.13424192,0.5848652,-0.61154383,-0.24175633,-0.35554945],[-0.4612609,0.10317978,0.24854125,0.13317706,0.54670334,-0.4810212,-0.74941343],[0.3080491,0.65429133,0.38162977,-0.8621924,0.78468126,0.30853254,0.40593398]],"activation":"σ","dense_2_b":[[-0.02144118],[-0.09335769],[-0.007059764],[-0.033586107],[-0.030305251],[-0.08470452],[-0.024528615],[-0.006754011],[-0.14906617],[0.07473883],[-0.25525466],[-0.049658544],[0.023403395]]},{"dense_3_W":[[0.6513854,-0.2971271,-0.10133595,0.06157518,0.5964825,-0.29642156,0.7061594,0.4733872,0.32888836,-0.55521995,0.50460774,-0.52282894,-0.6185102],[-0.23496525,0.37275878,-0.6667091,-0.39924023,-0.48301923,0.67697704,-0.6308714,-0.21922909,0.6176243,0.618389,0.0014676229,0.6497615,0.38443524],[-0.46734017,0.14557028,-0.28965655,0.39367342,0.04646032,-0.04165071,0.31603992,0.060060974,0.45381856,0.088807814,0.39907733,0.529591,-0.50600004]],"activation":"identity","dense_3_b":[[0.011306823],[-0.013359737],[-0.020531746]]},{"dense_4_W":[[-1.1962153,1.1962668,0.4678314]],"dense_4_b":[[-0.013093974]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48111x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48111x00x00x00x00x00x00'.json deleted file mode 100755 index 048b08551b..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48111x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.985375],[0.8484357],[0.40301353],[0.04616213],[0.84518045],[0.8455486],[0.8450366],[0.8306985],[0.8178662],[0.80961376],[0.7968393],[0.046044145],[0.046038657],[0.046025593],[0.045820486],[0.045615625],[0.045437485],[0.045231733]],"model_test_loss":0.011326421983540058,"input_size":18,"current_date_and_time":"2023-08-09_12-24-28","input_mean":[[22.471128],[-0.018951578],[0.010878803],[-0.0010533921],[-0.023024717],[-0.022267114],[-0.021230936],[-0.016909447],[-0.015211554],[-0.015772311],[-0.016099963],[-0.0011461969],[-0.0011510055],[-0.0011510034],[-0.0011011333],[-0.001083126],[-0.0011312175],[-0.0012207358]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.19449084],[0.23200378],[-2.1795752],[-0.06908683],[0.5561456],[0.74490666],[-1.4101259]],"dense_1_W":[[-0.03025444,-0.037244402,0.005869636,-0.11142137,0.30302644,1.9381279,-0.8191624,0.022108948,0.8009985,0.029354382,-0.08832442,0.72894895,0.3668595,-0.9385649,-0.2852418,-0.09583186,0.5544937,-0.21227281],[0.034946375,1.0261317,7.126802,-0.2404806,-1.1685041,-0.83051986,-0.4426787,0.6152297,1.1656748,0.80329746,-0.77668273,1.9598135,1.321885,-0.57261515,-1.2246871,-0.99875146,-0.9846027,0.7683447],[-0.42501846,0.98335177,0.0086295735,-0.38849956,-0.34183657,0.78103524,-0.3070697,0.041614834,0.010777993,0.16069779,-0.06382278,0.45972434,0.47352612,-0.8080994,-0.014047953,0.2616601,0.027314788,-0.023172976],[-0.002096383,0.42063478,-0.36391065,0.6753022,-0.427858,-1.5044448,1.4863667,-0.71073186,-0.30100074,0.20311977,0.043464664,-0.9429159,0.0748356,0.59035534,0.45266464,0.36573637,0.05602837,0.03608384],[1.132687,-1.1144317,0.022769302,-0.08955206,1.1042536,-0.5798501,0.5345062,1.2229115,1.1052201,0.23315747,-0.6132077,-0.11451021,-0.14781699,0.7205005,-0.5105502,-0.1375905,0.41816053,-0.13178313],[1.3072513,0.8143477,-0.02883156,0.032059945,-0.65769833,0.49218857,-1.0619043,-1.3068818,-0.7583709,-0.18983535,0.5098667,0.04548321,0.37096432,-0.49653402,-0.043797195,0.09462603,-0.117622316,0.09393342],[-0.36528334,-0.94333136,-0.00709332,0.11895063,0.4062324,-1.077606,0.63532376,-0.055628367,0.052410383,-0.17590849,0.052673202,-0.49115044,-0.166243,0.67629623,0.12474157,-0.26558882,-0.013086577,0.016891709]],"activation":"σ"},{"dense_2_W":[[-0.90425926,-0.3100587,-0.15216517,0.27145946,0.23597465,-0.330885,0.64773345],[0.98487633,1.1788161,1.4274528,-0.13287292,-1.942367,-1.2299767,-1.614185],[-0.23527108,-0.52527946,-0.22783957,0.94517636,0.804941,-0.40320855,0.18958431],[0.12163566,0.02718684,0.47783875,-0.95925164,-0.94627064,0.6247853,-0.8608685],[-0.94498646,-0.5125671,-0.29173845,-0.15166761,-0.8053367,-0.99756163,1.0966812],[-0.5952867,-1.0380365,-0.10330609,0.035324153,-1.1042368,-0.7014133,0.9698015],[-0.21240786,-0.23053433,-0.6369077,0.33950132,0.5255738,0.096905194,0.30876234],[0.5140029,-0.5269255,0.64448845,-0.7638766,0.0040237093,-0.020735802,-0.6104091],[1.2667329,0.045856774,0.7070585,-0.61856055,0.13016993,0.6576462,-0.6267828],[-0.17739317,0.37307802,-0.8725243,0.771662,0.049805034,-0.42982677,0.11095653],[-0.90507495,-0.25394666,-0.58229274,0.2684394,-0.50432193,-0.4329303,0.6245469],[0.77078027,-0.15400788,0.24913049,-0.8615302,-0.69670194,0.18226497,-0.8975012],[0.02397529,0.2646033,0.4380282,-0.15443936,-0.5261358,-0.52393633,-0.07421209]],"activation":"σ","dense_2_b":[[-0.09594069],[-0.6905126],[-0.074888185],[-0.037054244],[-0.12587616],[-0.27787346],[-0.057617527],[-0.01407181],[0.06147024],[-0.1516328],[-0.23781396],[0.075564094],[-0.19739097]]},{"dense_3_W":[[-0.36719826,0.2605464,-0.2282825,-0.15726866,-0.12012483,-0.31160554,0.17342465,0.33086634,0.38206747,0.18828884,-0.18907732,-0.01786273,-0.20533668],[-0.3468706,0.04522057,-0.072850615,0.605361,-0.6474378,-0.20503408,-0.0733508,0.12105218,-0.1717388,0.40598574,-0.18865044,0.4131868,0.19802985],[-0.6461299,0.69321644,-0.33386546,0.07647153,-0.42154786,-0.29778567,-0.3956274,0.23928347,0.59340984,-0.42163405,-0.052262533,0.2998,0.020345777]],"activation":"identity","dense_3_b":[[-0.0809652],[0.059218273],[0.06971658]]},{"dense_4_W":[[0.0938981,0.6363041,1.3952843]],"dense_4_b":[[0.06310906]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48112x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48112x00x00x00x00x00x00'.json deleted file mode 100755 index aca9bda063..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016 b'8965B48112x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.513149],[0.9541818],[0.39656356],[0.046623718],[0.95074844],[0.950698],[0.95102835],[0.93498194],[0.92150253],[0.903537],[0.8869439],[0.046458315],[0.04645999],[0.046444196],[0.046160106],[0.04587233],[0.045259684],[0.044569284]],"model_test_loss":0.01733686961233616,"input_size":18,"current_date_and_time":"2023-08-09_12-49-35","input_mean":[[26.078451],[0.027438534],[0.0011958503],[-0.009430026],[0.024858253],[0.025092505],[0.025384951],[0.025721082],[0.027182773],[0.029522264],[0.029206349],[-0.009677318],[-0.009641802],[-0.009610473],[-0.009555977],[-0.009597703],[-0.00965417],[-0.009817797]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.1336756],[0.10344256],[0.30574226],[-1.0487646],[-0.14843734],[-0.028830774],[-0.43900487]],"dense_1_W":[[0.43604448,-0.5605264,0.012901217,0.022648716,-0.05411717,-0.52825683,0.976321,0.11842187,-0.5259775,-0.37925148,0.42006952,-0.84167475,-0.055660117,0.1304136,0.6104034,0.28378442,0.6410333,-0.76094],[0.4276094,0.15709533,-0.0169772,0.3044572,0.3100376,1.003849,-1.018638,0.02647807,0.1272281,-0.00826707,0.0850446,0.4799849,0.019232752,-0.39135626,-0.3757945,-0.61405283,-0.018439129,0.32969815],[0.007824015,-0.058601394,-0.105257824,-0.1341512,0.3888203,-0.28831708,0.48457155,-0.3913913,-0.40673906,-0.28273785,0.5328434,-0.33710465,0.0991382,0.6627208,-0.25941357,-0.16797468,0.1989,-0.016353317],[-0.21427123,0.86771905,6.534022,-0.6548552,-1.5710703,-1.0742532,-1.4654069,0.8514165,1.9961716,1.223437,-0.7285998,1.2758242,0.9320656,0.30135366,-0.34027484,-0.70199484,-0.7621133,-0.16112399],[0.085645236,0.7888055,0.00027891068,-0.39420474,-0.06814435,0.8111238,-0.8712305,-0.176747,0.01755771,-0.16584563,0.15874274,0.7242339,0.42814922,-0.7291331,-0.23838085,-0.005654039,0.31353015,-0.056190874],[0.695166,0.49490714,3.372351,-0.13590972,-0.9212608,-0.3051697,-0.50663286,0.20426105,0.7320531,0.55699635,-0.14507566,0.92698795,0.23466231,0.1211082,-0.4500127,-0.08752919,-0.47848958,-0.068858966],[-0.41407767,0.60256696,-0.012946635,-0.32264197,0.19446182,0.36647174,-0.5412527,0.036333155,-0.060324162,0.0108162025,0.08161502,0.40417644,-0.037009377,-0.21295482,-0.41150248,0.4401551,-0.18975988,0.027621428]],"activation":"σ"},{"dense_2_W":[[0.19137855,-0.59557676,0.28804228,0.32442906,-0.5375224,-0.20337382,-0.6008916],[-0.11394542,-2.0737066,-0.5354913,-1.3426789,-0.6801209,-0.27107587,-0.15083465],[0.29361624,0.1699438,0.7419668,-0.36620173,-0.8206793,0.00073572167,-0.4464687],[0.6434301,-0.4445039,-0.14719622,0.23853825,-0.286252,-0.24195918,-0.83651835],[-0.012359924,0.43869573,0.06229189,0.60834336,0.32198146,-0.24622436,-0.06080808],[-0.6786453,-0.13937657,-0.19309613,0.013606689,0.5540887,0.5298669,-0.05196762],[-0.013185264,0.5033074,0.31203073,0.047127012,-0.2498416,0.50795144,0.5977538],[0.8437041,-0.44398957,0.7342129,-0.45426455,-0.2659502,-0.31482774,-0.16570877],[0.34602955,-0.7132226,0.38534385,0.6092949,-1.3994591,1.1248631,-1.353814],[-0.08515577,0.5915542,-0.25632793,0.4754705,0.7452592,-0.18179281,0.12182859],[-0.049042016,-0.110786006,0.64409393,0.14546494,-0.9643141,0.29006732,-0.72953105],[-0.59469205,0.6471949,-0.26527888,0.23997271,-0.09655182,0.0051637134,0.52177334],[-1.4906286,-1.1227882,0.56706303,-2.809029,-0.85157853,-1.0621608,0.9694465]],"activation":"σ","dense_2_b":[[0.008693504],[0.15823685],[0.0637331],[-0.013258514],[0.0015104315],[-0.018139329],[-0.027512403],[0.10828464],[0.017622454],[-0.06617764],[-0.046749223],[-0.070872046],[0.3779424]]},{"dense_3_W":[[0.65443593,0.3343104,0.012527355,0.36417776,-0.28863862,-0.5988752,0.23106381,0.004670684,-0.122015595,0.28513318,0.60385746,-0.5160076,0.67743444],[0.627146,0.32316205,0.38000792,-0.027986798,0.116916984,-0.61325556,-0.4528739,0.25507253,-0.13200486,-0.60309863,0.20832081,0.25238237,0.15479685],[0.28230017,0.1581272,0.5597084,0.41742852,-0.5948192,-0.03049473,-0.3455425,0.30141747,0.7191692,-0.5980131,0.36263385,-0.5719517,0.45230243]],"activation":"identity","dense_3_b":[[-0.047069583],[-0.02659484],[-0.031588677]]},{"dense_4_W":[[-0.54359066,-0.6082866,-1.0533628]],"dense_4_b":[[0.03228879]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2016.json deleted file mode 100755 index 8121234c29..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2016.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.430978],[1.1379495],[0.45858315],[0.048554417],[1.1417856],[1.1416621],[1.1402241],[1.103209],[1.0752802],[1.0438159],[1.015414],[0.048459742],[0.048481967],[0.048495647],[0.048316676],[0.048084732],[0.0477648],[0.047343533]],"model_test_loss":0.017764510586857796,"input_size":18,"current_date_and_time":"2023-08-09_10-41-53","input_mean":[[24.381577],[0.05514361],[0.013313259],[0.0006179983],[0.051813576],[0.05245275],[0.05269495],[0.057216838],[0.0603638],[0.0627208],[0.06460416],[0.00054358447],[0.00054860266],[0.0005474048],[0.00047689374],[0.00043869138],[0.00029944416],[8.212836e-5]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.26622558],[2.9497008],[1.813058],[-0.025023121],[-2.0630577],[-0.10530793],[-1.0611445]],"dense_1_W":[[0.025534231,-1.1805913,-6.9120297,0.4762668,1.141532,1.194718,0.6604293,-0.30574933,-2.2145832,-1.1851851,1.0677514,-2.5831132,-0.71438986,0.58066684,0.89023423,1.3890202,0.6341061,-0.24130233],[1.2830616,1.4180796,0.013817758,-0.66995686,0.36852577,0.42192948,-0.13681625,0.50336146,0.33836475,0.33387825,-0.03252644,0.36973232,0.3118444,-0.560369,-0.010612995,0.080320194,-0.013821916,0.09603328],[1.6039705,-1.0465006,-0.021859074,0.4317561,-0.3821928,-0.9248917,0.1911275,-1.008013,-0.21806867,-0.30369827,-0.012168507,-0.2818822,0.308418,-0.016223406,0.421061,-0.42053384,0.026600147,0.016264306],[-0.14462262,-0.7510906,0.0010378277,0.6862586,0.075593695,-1.3630501,0.78086907,-0.21945457,-0.29287562,0.12408464,-0.20034757,-0.6130181,-0.15015851,0.22744867,0.22026828,0.18415438,-0.18599446,-0.15435989],[-0.17025296,-3.2277153,0.028557282,-0.73297334,-0.56138515,-0.84773684,-0.0022175754,-0.58208245,-1.1386961,-1.4433861,-2.14009,0.19586197,0.39540797,-0.052566983,0.20787114,0.28620672,-1.2643102,0.7919278],[-0.0032478468,-0.5915213,-0.09130981,-0.15959802,-0.07250981,-1.233284,1.4387474,-0.018223405,0.01532253,-0.12527408,0.120767094,-0.48614782,-0.20340073,0.60070837,0.51384115,0.028175151,0.28134152,-0.22379196],[-1.2310994,0.35107216,-0.009768715,0.108554766,-1.4150821,0.24119836,-0.5592179,-0.3124385,-0.37922817,-0.35682285,-0.040580634,0.032491393,-0.24726222,-0.29392195,0.278081,0.7974623,0.24596404,-0.6094582]],"activation":"σ"},{"dense_2_W":[[-0.26285568,-1.1060537,-2.942825,-0.67371356,-3.5155258,0.46508044,0.39250213],[0.040603336,-0.4580863,-0.05867417,-0.17467877,-0.12807631,-0.16877379,-0.6004097],[-0.21166655,-0.5113058,0.65276754,-0.4754752,-0.13656586,-1.194988,0.8539784],[-0.15373452,-0.6933606,-0.7155214,-0.5996274,-1.0520024,-0.60170096,0.32668498],[0.6738468,-0.15951255,-0.17071065,0.041958928,-0.11103761,0.902966,-0.58521444],[0.8874169,-1.2575809,-0.82644594,0.67518294,-0.18607567,0.31737596,-0.23714398],[-0.3840576,0.024641534,-0.7565307,-0.88211155,-0.28571716,-0.29910767,0.24023683],[-0.058167692,0.17876865,0.4777526,-0.94331837,0.4652216,-0.43854114,-0.53990954],[0.23073974,-2.1207473,-0.6605163,-0.2945441,-4.001501,-0.2752776,1.7681032],[-0.70948744,-0.7407854,0.42118362,0.6708104,0.32626638,1.098384,0.24783559],[0.043585002,0.27145508,0.6032944,-0.8032509,-0.06791304,-0.73068494,0.27683318],[-0.6658628,0.7501746,-0.3240815,-1.147417,0.3406268,-0.6849644,0.568758],[-0.1976796,-0.02303728,-0.765593,-0.41832325,-0.46337137,-0.65529525,0.04229715]],"activation":"σ","dense_2_b":[[-0.079793036],[-0.2289362],[-0.090767354],[-0.23192126],[-0.066803485],[-0.2459263],[-0.112346604],[-0.05293226],[-0.35880116],[0.007642163],[-0.040404778],[-0.03216628],[-0.21668698]]},{"dense_3_W":[[-1.3067548,0.53903705,-1.0720602,0.45293874,0.44038934,0.445163,-0.057403624,-0.12081309,-0.8046321,0.2472878,-0.6329288,-0.80141,0.25300354],[-0.7013012,-0.33519942,-0.22784245,-0.31578028,0.35543197,0.58259434,-0.18224044,-0.19449191,-0.00866361,0.76322716,-0.5559447,-0.5042247,-0.082718976],[-0.2083438,-0.3291305,0.049302626,0.35232225,-0.56150305,-0.15463752,0.2730324,0.19683221,0.6830847,-0.035634395,-0.005636273,-0.06266247,0.16106449]],"activation":"identity","dense_3_b":[[-0.049557555],[0.068597704],[-0.039742917]]},{"dense_4_W":[[-0.55702186,-1.4275403,0.36695966]],"dense_4_b":[[-0.06800569]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2020 b'8965B48271x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2020 b'8965B48271x00x00x00x00x00x00'.json deleted file mode 100755 index 9acad7b27f..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2020 b'8965B48271x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.790511],[1.2051258],[0.486362],[0.046329346],[1.2025905],[1.2045679],[1.2048204],[1.1782552],[1.1522838],[1.114516],[1.0752699],[0.046031546],[0.0461143],[0.04619555],[0.0463639],[0.046436474],[0.046342947],[0.046053313]],"model_test_loss":0.01846417412161827,"input_size":18,"current_date_and_time":"2023-08-09_14-07-28","input_mean":[[23.297014],[-0.07091814],[-0.006433463],[-0.015964804],[-0.06944786],[-0.07049861],[-0.07169086],[-0.0725157],[-0.07295393],[-0.07059761],[-0.06671325],[-0.015837615],[-0.015886428],[-0.015935564],[-0.016081078],[-0.016197832],[-0.016277002],[-0.016316837]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.8718482],[0.043485954],[0.1334148],[0.04062672],[0.1371059],[0.47959167],[0.41457915]],"dense_1_W":[[0.302712,-0.64061826,0.00021023012,0.1270872,0.47509173,-0.88803416,0.07212928,0.042023487,-0.2701141,-0.11028586,0.14805569,-0.3301233,-0.030141128,0.110137366,0.24910642,0.022822332,-0.13628617,-0.02734447],[-0.0112305805,-0.062110696,0.9048815,-0.30518687,0.37704608,0.54086095,-0.36482716,0.78454524,0.09202176,0.124826275,-0.60082704,0.23958081,0.013718426,-0.59773356,-0.04289131,0.24219033,0.07552512,-0.14155541],[0.0095520355,-1.5135527,-7.146096,0.046556793,1.0016626,0.26657087,0.49129936,0.1192361,-1.3478962,-0.57923305,0.8990769,-1.2713641,-0.1449253,0.33309865,0.29299238,0.8477045,0.34352547,-0.26439115],[1.3360776,0.43069306,0.0033850432,0.13868013,0.12317294,-0.71958536,0.09370431,0.69450635,0.7858797,-0.061516054,-0.44013515,-0.36443138,-0.11492549,0.2905127,0.29464763,0.27047387,-0.009484421,-0.16326639],[-0.072193325,0.6810033,-0.0006428534,-0.17535646,-0.3925088,0.9478185,-0.4810887,0.14695391,0.22799563,-0.0067853555,-0.09267938,0.15300772,0.25419602,-0.25394833,-0.25696975,0.27363688,0.04384659,-0.047923796],[0.31465146,0.3511552,0.0015588161,0.2902856,-0.19568959,1.1875578,-0.8330673,0.016947713,0.26301575,-0.019239245,-0.031921107,0.33852276,-0.28278407,0.082128964,-0.28737378,-0.18144135,-0.28193912,0.35517663],[1.4577928,0.18897557,-0.0022648247,-0.5178223,-0.29067862,0.51650524,-0.51629674,-0.7847042,-0.3747238,0.10482232,0.20073019,0.57185805,0.13230741,-0.48319355,-0.041621983,-0.16511591,0.05802408,0.06077849]],"activation":"σ"},{"dense_2_W":[[0.09112419,0.3933311,-0.07912346,-0.16376911,-1.3840766,-1.13499,0.39429682],[-0.25075546,-0.139813,-0.10178927,-0.5902748,-0.03242446,0.10067222,0.17554912],[0.32162717,-0.26907963,0.4562144,-0.17545085,-0.8203269,-0.3948726,-0.48715237],[0.2058124,-0.26949823,-0.26260903,0.66973966,-0.8223285,-0.43544468,-0.20690836],[0.0921255,0.6398792,-0.4644536,0.43992248,0.66456866,-0.29228744,0.681274],[-0.701462,0.3418935,-0.30925137,-0.4308913,0.61918205,0.41725752,0.19738914],[1.0032815,-0.1373689,0.13509746,0.55519915,-0.66466725,-1.5082299,-0.6796551],[0.9098266,-0.6253603,0.9275299,1.3693849,-0.7913963,-0.12439643,0.2529121],[0.14551386,-0.302949,-0.6236385,0.38303864,-0.2522383,-1.0035355,0.37006238],[-0.6432663,0.26386604,0.11475341,-0.24213178,0.4122344,0.568145,-0.18189429],[-0.07105171,-0.6555986,0.7464795,-0.31800714,-0.6183989,-0.829439,-0.80282366],[-0.11153934,-0.00981713,-0.027943783,-0.25458655,0.29322457,-0.07820042,-0.009418274],[-0.08382857,-0.53568757,0.30139825,0.19761209,-0.21205801,0.19351888,-0.18371148]],"activation":"σ","dense_2_b":[[-0.1493231],[-0.00402506],[-0.037446134],[0.063946806],[0.047605712],[-0.063797615],[0.22099188],[0.028348964],[-0.08109348],[-0.016280346],[-0.046104338],[-0.038503833],[-0.014590311]]},{"dense_3_W":[[-0.23360372,-0.4386488,0.5417654,0.6029812,-0.102774434,-0.533376,-0.10394323,-0.3564222,0.6374826,-0.4906818,0.459046,0.38168675,-0.19220887],[-0.25327396,0.34030682,-0.5780689,-0.10341296,0.44794607,0.15350609,-0.51224583,-0.5694763,-0.3856984,0.60207605,0.124467865,0.37996173,0.4741996],[-0.65099394,-0.1436866,-0.34031066,-0.44880912,0.5899,0.31723353,-0.23588851,-0.50561076,0.28370628,-0.30152458,-0.38816845,0.047665782,-0.070512585]],"activation":"identity","dense_3_b":[[-0.023715347],[0.026487991],[0.03818343]]},{"dense_4_W":[[-0.68857694,1.0650787,0.9217563]],"dense_4_b":[[0.029519804]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX 2020.json b/selfdrive/car/torque_data/lat_models/LEXUS RX 2020.json deleted file mode 100755 index 554ac5ac3d..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX 2020.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.812706],[1.2046702],[0.48371235],[0.046686843],[1.1999358],[1.2024622],[1.2033786],[1.181801],[1.1561146],[1.1195389],[1.0815737],[0.04636314],[0.04644517],[0.046534877],[0.04676031],[0.046842918],[0.046764217],[0.04643078]],"model_test_loss":0.019136762246489525,"input_size":18,"current_date_and_time":"2023-08-09_13-16-19","input_mean":[[23.225687],[-0.071597725],[-0.006403737],[-0.014869247],[-0.07103227],[-0.07217188],[-0.07275048],[-0.074461505],[-0.07488792],[-0.07229588],[-0.068321556],[-0.01480668],[-0.014833956],[-0.014870731],[-0.0150201935],[-0.015132994],[-0.0152152665],[-0.015241827]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.1922611],[0.94190425],[-1.8803643],[1.8052227],[-0.0708761],[-0.15278636],[0.03023423]],"dense_1_W":[[1.552201,-0.3393357,-0.27431434,-0.43802527,-0.3741866,-0.08110382,-0.6744256,-0.32662967,0.117568575,-0.07447189,0.0011381231,0.0149186775,-0.026234545,0.27035344,-0.22903343,0.21218765,-0.13117951,0.1787165],[1.5157571,-0.01751974,0.2628785,0.10242989,0.8160844,0.033813257,0.5027697,0.25837898,0.026799573,0.033179637,0.04939591,-0.1756206,0.17158255,0.082036525,0.26975772,-0.24218568,0.03992314,-0.101497844],[-0.6898828,0.3296126,0.2381383,0.38712546,0.0020844117,0.3836064,0.045370143,0.13722278,0.10226575,0.38099837,-0.24260375,0.29536518,-0.25331467,-0.46099368,0.0860768,0.3208733,-0.048293054,-0.1899293],[0.72579914,0.0024951876,0.24405375,0.072388135,0.5108625,0.6879625,-0.768285,0.4665226,0.40248188,-0.088189945,-0.03153826,-0.12015286,-0.12880835,0.038919933,0.18531369,0.19858767,0.4032525,-0.49639243],[-0.006907261,1.1555037,5.512076,0.011916408,-1.3611755,0.047472972,0.4679199,0.18809648,0.8807568,0.79814273,-1.2557139,0.693036,-0.17998734,0.17353718,-0.72927487,-0.6196344,-0.10912921,0.36026958],[-0.0008086146,-0.6703738,-0.04672321,0.051983077,0.5071199,-1.3758855,1.051845,-0.13139765,0.10653976,0.16576192,-0.11845737,-0.29320416,-0.44305497,0.47334316,0.6171071,0.13699032,-0.11988301,-0.15529875],[-0.010062327,-0.4213587,-0.033820994,0.24619605,-0.107379094,-0.7219596,0.05261352,0.16658644,-0.5604586,-0.06510145,0.1325112,-0.3156187,-0.45383725,0.44158942,-0.100481614,0.15328817,0.27649054,-0.21409012]],"activation":"σ"},{"dense_2_W":[[0.09448425,0.3760177,-0.15260221,-0.40807378,-0.43990996,0.5492166,0.721128],[-0.72103924,-0.54227215,0.037051897,-0.30457422,-0.89297354,0.68800735,0.22008589],[0.28751957,-0.72327036,0.58277506,0.28192317,-0.026689565,-0.9505252,-0.50040275],[0.4725355,-0.62869906,-0.034366626,-0.08867052,0.33788702,-0.9937069,-0.8205744],[0.70781505,-0.1194498,0.69015354,0.60684264,-0.15911719,-1.1402134,-0.77705395],[-0.11801999,-0.90623593,-0.35348848,-0.13936913,0.27008694,-0.6951836,-0.85475653],[0.053964566,0.19979686,-0.6263667,-0.6289394,-0.1642748,0.97348315,0.6938839],[-0.057833552,0.25785288,0.33920816,-0.40871015,-0.19964917,-0.35569403,0.08428918],[-0.35905418,-1.1179031,1.069501,0.20561393,0.34141743,-0.50298977,-1.1658801],[0.5924804,0.05359343,-0.74364394,-0.542707,-0.7528103,-0.89056516,-0.49965763],[-0.17235844,0.009363647,0.14541583,-0.6132933,-0.4071755,0.72789896,0.4605604],[-0.037599627,-0.65237206,0.21704821,0.6360923,0.31922218,-1.1261895,-0.5370619],[-1.4063736,-0.410196,-0.4618791,-0.8892677,-0.7377025,0.60982996,1.0650238]],"activation":"σ","dense_2_b":[[-0.05620989],[-0.060037877],[-0.04623755],[0.015519294],[0.0995001],[-0.3057865],[-0.029583905],[-0.18218923],[-0.09876781],[-0.36697587],[-0.078949876],[-0.047403064],[0.027366562]]},{"dense_3_W":[[0.35254586,0.089774035,-0.44079193,-0.56373316,-0.6380692,0.019918533,0.78052264,-0.3596739,-0.64493376,-0.09652632,0.17468911,-0.6748918,0.8599969],[-0.5039963,-0.54529995,0.42020872,0.42345285,0.77461576,-0.18526357,-0.66473806,-0.3536843,0.8206677,0.08182418,-0.13014542,-0.14203,0.34024766],[0.24226099,-0.58680654,0.10851144,-0.08556077,0.54436725,0.29506567,-0.5938133,-0.20851049,0.33693817,0.085123494,-0.47413915,0.37861294,-0.23017392]],"activation":"identity","dense_3_b":[[0.06330438],[-0.025818001],[-0.030472636]]},{"dense_4_W":[[-0.7522928,0.38205072,0.60193]],"dense_4_b":[[-0.038911503]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B0E012x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B0E012x00x00x00x00x00x00'.json deleted file mode 100755 index ffbba4f215..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B0E012x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.858131],[1.0081798],[0.42891374],[0.04033326],[1.0039434],[1.0047058],[1.0057864],[0.9871899],[0.96912324],[0.9463845],[0.91797376],[0.040223543],[0.040249895],[0.040269017],[0.040249255],[0.040179927],[0.039965343],[0.039587643]],"model_test_loss":0.012978884391486645,"input_size":18,"current_date_and_time":"2023-08-09_15-22-40","input_mean":[[25.53512],[-0.057664793],[0.006972764],[0.0020606092],[-0.057454415],[-0.057828046],[-0.058313288],[-0.05210109],[-0.04723263],[-0.04305777],[-0.037324708],[0.0020332797],[0.0020444782],[0.0020467127],[0.0020990318],[0.0021205018],[0.0021155798],[0.002061087]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.9451743],[-2.0738995],[-0.061819293],[-1.8539776],[0.11293126],[0.8801313],[-0.34697428]],"dense_1_W":[[-1.3579488,-0.14123936,-0.018169187,0.2567915,0.2472419,-0.407651,0.44249314,0.404622,0.041434586,0.16605115,-0.18061078,-0.18744762,-0.007931179,0.06848994,0.23897268,-0.12570733,0.15255798,-0.054657888],[-0.5138878,0.7540569,0.01823065,-0.30429357,0.105593584,0.6283228,-0.88449097,0.35527444,0.34103888,-0.08124087,-0.12751521,-0.12272718,0.40023044,0.078568466,0.094270095,-0.24328744,0.22644232,-0.02296254],[0.01880253,0.041950032,0.025469717,0.41977495,-0.01845549,0.7469875,-0.5836401,-0.0023528198,0.06800503,0.048917662,-0.033807367,0.3940383,-0.3420582,0.048574876,-0.73250633,-0.3168187,0.19207624,0.14923036],[-0.5069683,-0.7299225,-0.017133389,0.27239755,0.09518913,-0.6464978,0.5669755,-0.22607638,-0.22541493,-0.05590562,0.15980408,-0.26756075,-0.22189523,0.26979044,-0.19004701,0.08372643,0.042589996,-0.106104],[0.003376271,0.99690795,5.194685,-0.08252821,-1.2339424,-1.278542,-0.95400864,0.22764781,2.1331182,1.0682175,-0.5518043,1.1603253,0.1512765,0.09291671,0.060322978,-0.39886457,-0.8555216,-0.31327197],[1.3195114,0.097568,-0.016457167,0.18425311,0.22003257,-0.49077654,0.6284053,-0.02067786,0.18970595,-0.003833334,-0.053493172,-0.3488455,-0.04374197,0.48894325,0.33779547,-0.61585546,0.335012,-0.015417546],[-0.05744463,1.1883487,-0.20707692,-0.32463714,0.8947988,0.5895385,0.09502346,0.2980289,-0.086293384,0.6502581,0.027666133,0.28947368,0.13124675,-0.7183947,0.23811169,0.54866403,-0.09458978,-0.1836273]],"activation":"σ"},{"dense_2_W":[[0.61253756,-1.1365101,-0.29902524,0.9798833,-0.2917683,0.59114116,-0.4712067],[0.52844095,-0.86928684,-0.78100795,0.8103875,-0.41248968,0.6061389,0.095086515],[-1.1287509,-1.1174941,-0.2299692,-0.5305931,-1.6240323,0.899128,-0.95204324],[-0.17106694,-0.65125066,-1.1487548,1.3049239,-0.03965821,0.7915052,0.23665957],[-0.1951633,0.736451,-0.018969562,-0.54605484,0.40702567,-0.7090892,0.14927544],[-0.43511096,1.3270646,0.090805426,-1.0105572,-0.117792316,-0.44068936,0.6473223],[0.52573407,-0.4151988,-0.7318552,1.1034199,-0.35240525,-0.29688236,-0.5681273],[0.8565392,-0.28433335,-0.68133914,1.1850481,-1.0075815,-0.13676727,-0.12454539],[-0.42941204,1.0876211,0.8470857,-0.7139818,0.4409865,-0.8451851,-0.2075387],[-0.58658993,1.1041594,0.80485415,-0.3956205,0.23861384,-0.6500841,-0.012711808],[-0.44264716,1.2002516,0.9671141,-0.777456,0.17264067,-0.8688163,-0.12924784],[0.83560413,-0.37854236,-0.9930072,0.970375,-0.09642324,-0.28791323,-1.1921409],[0.2517275,-0.98617977,-0.6023062,1.2428936,0.12169115,0.42175332,-0.4277408]],"activation":"σ","dense_2_b":[[-0.00045856892],[-0.13278121],[-0.38624468],[-0.009671737],[-0.11906116],[-0.098297276],[-0.10887506],[-0.17448516],[-0.11598807],[-0.1596173],[-0.09860622],[-0.26982278],[0.063321225]]},{"dense_3_W":[[-0.59850806,-0.55752456,0.21218449,-0.6224379,0.31959382,0.70844734,-0.67447245,-0.53966963,0.8812389,0.6643036,0.88396746,-0.3286644,-0.46220767],[-0.6034193,-0.5671035,0.73748684,-0.51771855,0.25666666,0.5623304,-0.5781052,0.20079169,-0.14487052,0.38135555,0.48326564,-0.115334585,0.1118099],[-0.3604728,-0.15291758,0.09415789,-0.1948471,0.6609959,0.6682593,-0.5599815,0.018269831,0.07930072,-0.060835414,0.57257175,-0.2622459,-0.668998]],"activation":"identity","dense_3_b":[[0.034600537],[0.1429371],[0.05962403]]},{"dense_4_W":[[0.8548602,0.121467695,0.28002813]],"dense_4_b":[[0.009385257]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48102x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48102x00x00x00x00x00x00'.json deleted file mode 100755 index 2986dbb0f5..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48102x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.8977513],[0.68954486],[0.4139147],[0.030382803],[0.69193476],[0.69048476],[0.68913734],[0.6806858],[0.6777796],[0.67110157],[0.6681313],[0.030303426],[0.030323956],[0.030338047],[0.030418577],[0.030385923],[0.030345106],[0.030242294]],"model_test_loss":0.012908237986266613,"input_size":18,"current_date_and_time":"2023-08-09_15-48-43","input_mean":[[23.19783],[0.03271446],[0.025837483],[-0.011847352],[0.026097897],[0.02815446],[0.03049293],[0.041018687],[0.044047516],[0.044604685],[0.0430235],[-0.01190559],[-0.011907151],[-0.011900433],[-0.011840576],[-0.011839805],[-0.011870837],[-0.011916283]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.070281],[-2.4973028],[1.3214084],[-2.4905453],[-0.052674435],[-1.0832871],[0.5832555]],"dense_1_W":[[-1.782736,0.38585284,-0.08545495,0.4048967,-0.2801542,-0.13097851,-1.0943906,-0.27965558,0.29071763,-0.1403219,-0.10031121,0.19426891,-0.5468137,-0.5553437,0.3665551,0.53392786,-0.272529,-0.12062517],[-1.217346,1.0300412,0.00075295696,0.22974275,-0.012137472,0.65442824,-0.40739405,-0.16076401,0.26733837,-0.05870503,0.14761084,0.053736396,0.095834024,-0.21273386,-0.33324143,0.12504764,-0.15672976,0.07386392],[1.0505023,2.1441545,6.541688,-0.21625133,-1.9480888,-0.570705,-1.6117417,0.95555365,1.6392485,-0.043550003,-0.036482707,0.42250034,0.20424727,-0.1673073,0.22605596,-0.013399118,-1.0146956,0.16446613],[-1.2516127,-1.0277461,-0.0049578804,0.030769175,0.043333333,-0.8858235,0.54669535,0.13188538,-0.095215924,0.012589365,-0.18010837,-0.30505812,0.5021825,-0.31425828,0.38749072,-0.22350626,-0.05114633,0.08698958],[0.0035146833,0.3828884,0.055803537,-0.2754486,-0.3728101,1.3081414,-1.0317568,0.29426,0.10069639,0.089421265,-0.16310905,0.4280105,0.44955868,-0.30968818,-0.6182345,0.111985266,0.117390126,0.0961805],[-1.0358554,1.2746156,7.393638,-1.1811066,-1.6412053,-0.5476179,-1.172681,0.36368853,1.9390265,0.47966236,-0.11466104,0.56276196,0.5378139,-0.06509055,0.35610762,0.26768783,-1.025618,0.03889093],[1.7004466,0.20178793,-0.087380014,0.27393892,-0.51528084,0.27506933,-0.92300934,-0.37298542,0.03233947,0.030535467,-0.07243149,-0.23616593,0.1807038,-0.07146105,-0.17994934,0.1573161,-0.3682807,0.24465875]],"activation":"σ"},{"dense_2_W":[[-1.0014797,0.13553746,0.22278486,-0.399194,-0.527964,0.115432225,-0.60008395],[0.24153942,-0.031119501,-0.51762193,0.6818596,-0.97653997,-0.52417797,-0.25938374],[-0.5205759,-0.63843703,0.18108721,0.5189804,-0.839813,0.10334479,-0.100626364],[0.525222,0.54790866,0.33529684,-0.8107151,0.20456313,-0.30038992,0.41534916],[-0.35009837,-0.37109253,0.34654424,-0.23345965,-0.90483,-0.12241629,-0.3237933],[-0.28656074,0.5365135,-0.19887519,-0.4632808,0.5597225,0.58351445,0.5293639],[-0.06900586,-0.63779444,1.5707409,-1.1598672,0.1615726,1.5663954,1.0012243],[0.5492712,0.70519316,-0.4818449,-0.7936975,0.98074996,0.12498996,-0.13810375],[0.0056431335,-0.43114427,-0.09032395,0.506023,-0.7993859,-0.21588661,-0.07299588],[0.67064244,0.49529698,0.18830942,-0.7618566,0.73772794,-0.3761758,-0.46270788],[0.5728761,-0.06610756,-0.2067,0.24439229,1.0658774,0.022089032,-0.10871751],[-0.3089939,-0.46645024,-0.06367501,-0.6681549,-1.2519213,0.6221667,0.10172743],[0.09857253,-1.1578652,0.08043016,0.43568343,-0.8444561,0.28122354,-0.16943873]],"activation":"σ","dense_2_b":[[-0.09551276],[0.26105896],[0.22863466],[-0.23741141],[0.17701647],[-0.17702891],[-0.25717747],[-0.36781237],[0.19594961],[-0.14985447],[-0.24570842],[-0.05177276],[0.061600402]]},{"dense_3_W":[[-0.22265823,-0.45556778,0.17281826,-0.14696541,-0.5590243,-0.42801765,-0.17338079,-0.10080969,0.36018917,0.17413813,0.06440728,0.56492454,0.22878975],[0.16702455,0.83242625,0.3850462,-0.33998582,0.5892735,-0.33413044,-0.55653554,-0.54551136,0.60024905,-0.15473615,-0.633992,0.31632444,0.7458124],[0.30883184,-0.23770918,-0.17857468,-0.58323413,-0.5130921,-0.059556685,0.38129666,0.58364826,0.1521082,-0.17372313,0.2868733,-0.23405342,-0.07776656]],"activation":"identity","dense_3_b":[[0.055418704],[0.0787763],[0.036709785]]},{"dense_4_W":[[0.005051283,-1.2674674,0.09997759]],"dense_4_b":[[-0.07513949]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48112x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48112x00x00x00x00x00x00'.json deleted file mode 100755 index bd2c176bb7..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017 b'8965B48112x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.672505],[0.97997594],[0.48896867],[0.036406606],[0.9879945],[0.98470104],[0.9816876],[0.9598457],[0.9478727],[0.9382326],[0.9277363],[0.036488507],[0.036457427],[0.036408816],[0.036040876],[0.035670046],[0.035212148],[0.034712877]],"model_test_loss":0.013047197833657265,"input_size":18,"current_date_and_time":"2023-08-09_16-38-38","input_mean":[[26.06892],[-0.032476645],[0.01847185],[0.008156076],[-0.03514416],[-0.03364282],[-0.03196355],[-0.0248437],[-0.023279596],[-0.017502444],[-0.018172378],[0.008091517],[0.008101025],[0.008103796],[0.00808531],[0.008018075],[0.0077868756],[0.007642417]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.0938547],[-1.5377342],[0.11164253],[-1.3607982],[-0.001633297],[0.28943086],[-0.017152473]],"dense_1_W":[[-2.6134133,0.1072478,-0.038407013,-0.55906427,-0.54777765,0.53895926,-0.26524103,0.15754877,0.0075992765,0.11399316,0.060622185,0.04282183,-0.9743834,-1.0467935,-0.030679928,0.2015473,-0.170534,0.72894627],[-0.4446471,-0.6120142,0.0009793217,0.28336817,0.028145306,-1.2111511,0.52227914,-0.02825454,-0.021248085,-0.09601412,-0.050700705,0.004752271,-0.20404592,0.27143523,-0.5377922,-0.22390097,0.28489593,0.043314826],[-0.013865213,-0.42944995,0.0024095853,0.33657116,-0.17577003,-1.3745159,0.96880376,0.08447174,-0.18238825,-0.11932599,-0.00020815701,-0.72243226,0.27775034,0.31180686,-0.02206438,0.043953754,0.0844208,0.16568054],[-0.37105855,0.68786305,-0.00039992417,0.18125659,-0.23189458,1.2473199,-0.55478483,0.04226533,0.08798957,-0.0069234855,0.058259994,0.7714291,-0.383511,-0.9248507,0.36679336,0.15952906,0.12819786,-0.2177665],[0.013770035,0.33806401,0.00094282354,0.17861775,-0.23762894,1.1728739,-1.2293357,0.07470985,-0.08396865,0.14319621,-0.040008016,0.5050906,0.26662126,-0.6125382,-0.6498126,-0.17428778,-0.17383261,0.46036986],[0.0077164564,1.5451698,7.429268,0.31939277,-2.2427018,-1.5543389,-2.5262957,1.1669385,3.063373,1.1486622,-0.49699086,1.9423336,1.13846,-0.5957547,-1.5996556,-0.34185794,-0.6949594,0.12978563],[-0.042126972,-0.29461217,-1.4955524,0.45490184,-0.033281934,-0.6029691,0.3394342,-0.30512628,-0.15046905,-0.14568257,0.8093577,-0.8086997,-0.15785371,0.51180923,0.26197797,-0.17697093,0.12429469,-0.21264184]],"activation":"σ"},{"dense_2_W":[[-0.5995437,-0.3603585,-0.20216258,0.08936401,-0.49370512,-0.54119444,0.28133863],[-0.58552414,0.81165653,0.91113776,-0.79454756,0.22261482,-0.21558377,0.10684496],[-0.4171185,-0.568881,0.43534383,0.0026570433,0.21137409,0.25033414,-0.29121745],[-0.36481413,-0.9939236,0.05604151,-0.35338676,0.9317966,1.4149865,-0.54362875],[0.54199463,-0.6108903,-1.0630567,0.39385843,0.7272977,0.33584854,-0.31977272],[0.24222183,-0.15256006,0.60300756,-0.4242564,-0.46528172,-0.34210142,-0.3140277],[0.09832237,-0.16391051,-1.2382702,1.0045747,0.8160615,0.110929355,0.02551595],[0.02746031,-0.19373654,-0.2355057,0.24359266,0.5353504,-0.22755131,0.2656299],[-1.1224236,-0.3300643,-0.407043,-0.353378,0.65846336,-1.0422004,0.09945112],[-0.18847044,-0.886505,-0.16673878,0.5101195,1.0061107,0.11062626,-0.050155606],[0.3335287,0.11981937,0.29632357,-0.13577487,-0.0740185,-0.02512637,0.44026503],[-0.10581189,0.38680208,0.5723,-0.26251873,-0.27632186,-0.5749631,0.35630655],[-0.16280471,-0.25712195,0.53059477,-0.66531825,-0.66056573,0.0900753,0.48065072]],"activation":"σ","dense_2_b":[[-0.2385691],[0.12793182],[-0.10159543],[0.25047785],[-0.23729679],[0.024322221],[-0.18446803],[-0.07810453],[-0.41927636],[-0.016799252],[-0.053551592],[0.055111423],[0.04165242]]},{"dense_3_W":[[-0.059520952,-0.5622691,0.45825937,0.39820474,0.13583045,-0.32961982,0.015958305,0.3244693,0.4253685,0.23013696,-0.54041684,-0.40731147,-0.30158764],[0.09375583,-0.0017320638,-0.39634547,0.24657139,0.5715864,-0.140639,0.52030236,0.553719,-0.18884522,0.516919,-0.1633942,-0.6434239,-0.5723449],[0.029367253,-0.6095855,-0.5169094,0.41468775,0.1923313,0.57539755,0.39066675,0.48482603,-0.5734151,-0.060352806,0.33851054,-0.28380212,-0.28927657]],"activation":"identity","dense_3_b":[[-0.022509072],[-0.026452657],[-0.0094871335]]},{"dense_4_W":[[0.83508223,0.90878975,0.025333464]],"dense_4_b":[[-0.026976062]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020 b'8965B48271x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020 b'8965B48271x00x00x00x00x00x00'.json deleted file mode 100755 index 3f7bdb166c..0000000000 --- a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020 b'8965B48271x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.316072],[0.9590723],[0.36351156],[0.0441653],[0.9523992],[0.954041],[0.9552573],[0.9414871],[0.92725456],[0.9035007],[0.8794774],[0.044077154],[0.044106334],[0.044123128],[0.04409188],[0.04404384],[0.04385866],[0.043682296]],"model_test_loss":0.01662302203476429,"input_size":18,"current_date_and_time":"2023-08-09_17-54-54","input_mean":[[24.043165],[0.030592984],[0.008662194],[-0.009329172],[0.030800642],[0.030898405],[0.031143442],[0.032330383],[0.031538412],[0.030825427],[0.032572977],[-0.00929861],[-0.00929033],[-0.009281115],[-0.009265514],[-0.009250021],[-0.009282802],[-0.009329454]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.026120635],[1.9416399],[0.60815054],[0.25644714],[0.3952565],[0.17582616],[-0.19558431]],"dense_1_W":[[3.335223,-0.14903972,0.017792625,0.44585547,-0.17456532,-0.3629251,0.34922808,0.67767817,0.15890893,0.31689033,-0.45744747,-0.78738886,-0.15512607,0.31531373,0.13215774,0.08615877,0.7029011,-0.66872466],[0.33444184,0.3865422,0.033097874,-0.10416669,-0.13609071,0.37232438,0.041280344,0.3434424,-0.06693412,0.37225628,-0.31096882,0.6194188,0.019381195,-0.81112,-0.11371732,0.12016824,0.15621446,-0.051286366],[0.32034597,-0.5460983,-0.022756906,0.24789928,0.08965753,-0.78998137,0.8077627,-0.25334057,0.30262712,-0.57730323,0.31271738,-0.413183,0.26481584,0.20591393,-0.2825443,0.048321266,0.037722778,-0.02604145],[-0.001096885,0.877505,4.375584,-0.21056944,-1.4921321,0.30686256,-0.07281465,-0.23879132,1.7749463,0.65912414,-1.1899405,0.7710069,0.51181823,-0.3327569,-0.69171345,-0.14890115,-0.16795291,-0.058986213],[3.0410533,0.37130952,-0.014436474,2.9947143e-5,-0.20359561,0.08057991,-0.4799077,-0.21630915,0.02990563,0.44693226,-0.31517798,0.34675393,-0.35125488,0.04655145,0.0073511093,-0.02863017,-0.3938378,0.28197953],[-0.02691242,-0.27878886,-0.025484474,0.11147362,0.010308179,-0.70408285,0.24386121,-0.26564816,-0.09767933,0.54513925,-0.30042544,-0.70545626,0.19622594,0.4065873,0.2987727,0.13130112,-0.16078812,-0.09777715],[-0.045214858,-0.3631571,-0.036500983,-0.11810798,0.45778593,-1.060346,1.0526772,0.031578775,-0.59605724,-0.36440456,0.511626,-0.73647,0.015697645,0.37303218,0.7600099,-0.21960646,0.16917647,-0.29108718]],"activation":"σ"},{"dense_2_W":[[-0.35218585,0.14308812,-0.57519746,0.31768999,0.17070374,-0.3732793,-0.48790818],[-0.34943467,-0.60227203,-0.4166511,-0.112191014,-0.04813801,-0.32272428,-0.032062355],[0.16224292,0.1755412,-0.6478811,-0.387053,0.63158387,-0.72614723,-0.8409673],[0.03339276,0.5439781,-0.7387804,-0.08449288,0.11998959,-0.18540213,-0.2549742],[-0.27214608,0.19542813,-0.13491894,-0.38912305,0.19247393,-0.8167929,-0.35544467],[-1.5148702,-0.19982053,-0.4914989,1.1792556,-0.88855046,-1.1474198,-0.6109534],[0.43902197,-0.2789942,-0.12047118,-0.30758274,-0.41768637,0.5652369,-0.0692086],[0.41314223,-0.50518227,0.5529299,-0.5850712,-0.14101315,0.15159719,0.4114286],[-0.013627578,-0.103289954,-0.45013615,0.4243168,-0.04401468,-0.6160927,-0.43941525],[-0.11910079,-0.30987215,0.2152533,0.38692838,-0.30739278,0.0892118,-0.04579046],[-0.44247296,1.0036645,0.045824107,0.4684638,0.7781144,-0.6853828,-0.62459666],[0.10554759,-0.05212664,0.4570351,-0.031150939,0.12591816,0.81590295,0.060838416],[0.4397581,-0.34536296,0.10181044,-0.39205134,-0.38584864,0.4655003,0.29053125]],"activation":"σ","dense_2_b":[[0.056989435],[-0.06921607],[0.05528886],[-0.010666541],[-0.2541545],[-0.019204568],[-0.021566926],[-0.043972496],[0.023812661],[-0.0577136],[0.13183823],[-0.033985566],[-0.05114418]]},{"dense_3_W":[[0.53362375,-0.31393358,0.77158445,0.42364752,0.27630767,0.6144512,-0.45349428,-0.63806015,0.28949618,-0.34986678,0.30039573,-0.56956017,-0.5325901],[0.25773355,-0.5742002,-0.18550177,-0.2709638,-0.43932548,0.4737292,0.486204,-0.49685073,0.22938772,0.07413067,0.3179722,-0.38822258,-0.021123026],[0.2324419,-0.27651238,-0.7168737,-0.4830318,0.29606512,0.303249,-0.074232936,0.09739446,-0.6291083,-0.49824134,-0.56967014,0.36437067,0.6702277]],"activation":"identity","dense_3_b":[[0.008113352],[0.044839732],[0.00069537724]]},{"dense_4_W":[[1.2693222,0.03663439,-0.6965769]],"dense_4_b":[[0.0059736283]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/LEXUS ES 2019.json b/selfdrive/car/torque_data/lat_models/LEXUS_ES_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS ES 2019.json rename to selfdrive/car/torque_data/lat_models/LEXUS_ES_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS IS 2018.json b/selfdrive/car/torque_data/lat_models/LEXUS_IS.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS IS 2018.json rename to selfdrive/car/torque_data/lat_models/LEXUS_IS.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX 2018.json b/selfdrive/car/torque_data/lat_models/LEXUS_NX.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS NX 2018.json rename to selfdrive/car/torque_data/lat_models/LEXUS_NX.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS NX 2020.json b/selfdrive/car/torque_data/lat_models/LEXUS_NX_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS NX 2020.json rename to selfdrive/car/torque_data/lat_models/LEXUS_NX_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017.json b/selfdrive/car/torque_data/lat_models/LEXUS_RX.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2017.json rename to selfdrive/car/torque_data/lat_models/LEXUS_RX.json diff --git a/selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020.json b/selfdrive/car/torque_data/lat_models/LEXUS_RX_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/LEXUS RX HYBRID 2020.json rename to selfdrive/car/torque_data/lat_models/LEXUS_RX_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022 b'KSD5-3210X-C-00x00x00x00x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022 b'KSD5-3210X-C-00x00x00x00x00x00x00x00x00x00'.json deleted file mode 100755 index 7e79feb6d1..0000000000 --- a/selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022 b'KSD5-3210X-C-00x00x00x00x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.853387],[1.1592323],[0.5035471],[0.04757312],[1.1533973],[1.1566302],[1.1592906],[1.124919],[1.097695],[1.0662291],[1.031133],[0.04736746],[0.04742848],[0.047484897],[0.047564015],[0.047558986],[0.047428854],[0.04712477]],"model_test_loss":0.01737847924232483,"input_size":18,"current_date_and_time":"2023-08-09_18-49-11","input_mean":[[23.514374],[0.01205051],[-0.007076305],[-0.010646906],[0.013812598],[0.013436532],[0.01327746],[0.010840775],[0.010276086],[0.008101413],[0.0081624],[-0.010648332],[-0.010639621],[-0.010631156],[-0.010660867],[-0.0107276775],[-0.01080371],[-0.010883885]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.44225207],[-0.08251625],[-0.09139792],[-0.17654161],[-1.2058073],[-0.18010782],[-1.0617452]],"dense_1_W":[[0.81515855,0.19847405,-0.16027977,0.2605701,0.5020647,0.6416506,-0.74194986,0.2395706,0.008035103,-0.54028624,-0.68319666,-0.11733088,0.30929378,-0.57654405,-0.11921764,-0.07856754,0.36212778,-0.21245824],[-0.003413831,-0.88659906,-1.5215017e-5,0.2659344,0.66569483,-1.4612998,0.502116,-0.023383126,0.27923653,0.22036943,-0.24609998,-0.16959597,0.047625005,-0.4744547,0.54592556,-0.07476282,-0.057982,-0.0049017775],[-0.0071781585,1.3938068,5.4535723,-0.42513278,-1.0321593,-0.9752934,-0.7584714,0.67374307,1.2021991,0.6324794,-0.48040524,0.6027366,0.034736745,0.218859,0.021496648,-0.23673749,-0.3517566,0.1679437],[-0.7695569,0.26124287,-0.15884998,-0.08147379,-0.10981094,0.6529741,-0.19342661,0.43262586,-0.26433924,-0.30309507,-0.86631536,0.13160278,-0.033320703,-0.14629383,-0.047781195,0.07316912,-0.17327231,0.101880364],[-0.5631856,-0.42516446,0.13529952,-0.18435624,-0.1343596,0.2858478,-1.1791672,0.07787927,0.9311218,0.68779874,0.080623545,0.085128896,-0.26469198,0.19951835,0.5323622,-0.09537051,-0.2584652,0.101225466],[0.0015933844,-0.159882,0.00029708236,-0.26148286,-0.43383598,-0.5543793,0.9337357,-0.36895335,0.39094746,0.05787086,-0.24165697,-0.2886184,0.3548747,-0.29055887,0.74826497,0.10615606,0.20682812,-0.32921875],[-0.5261344,0.52323943,-0.13088919,-0.008910816,-0.21776229,-0.46300754,1.8696176,-0.20582403,-1.1688477,-0.6119323,-0.04257218,0.013339775,-0.043501914,0.2700189,-0.39648747,-0.0074166763,-0.10004616,0.16081381]],"activation":"σ"},{"dense_2_W":[[-0.5157362,0.9631259,-0.6171437,-0.63063097,-0.4735463,0.3908077,1.1676315],[-0.17338198,-0.23641111,-0.47618997,-0.8813003,0.06709429,0.39402965,-0.4519197],[0.059771042,-0.5551666,-0.1077192,0.09842683,-0.42055693,-1.128195,-0.056298535],[0.54656047,-1.1881918,-0.06123479,0.3539518,0.86083883,-0.22125135,-0.7932267],[0.43361214,-0.8142263,0.23757508,0.094281524,0.57598335,-0.29057238,-0.61107886],[-0.41463575,1.0157188,0.028030625,-0.78584176,-0.49250048,0.8294643,0.7266427],[-0.9193553,0.7055807,-0.585519,-0.31935224,-0.3264894,0.4916916,1.2605145],[0.22281124,-0.9272137,0.3690255,0.1680717,0.87741905,-1.0792515,0.07280114],[-0.0030278699,-1.4448571,0.16294147,0.63729775,0.4577902,-0.3729355,-0.14417095],[-0.7692859,0.9571105,-0.05139316,-0.5226682,-0.9362267,0.6496911,1.0343727],[-0.17001544,-0.5700911,0.4439341,0.087172486,0.5646342,-1.0282485,-0.018494168],[0.41095787,-0.8497653,-0.5612039,0.3726814,0.65113074,-0.5311523,-0.5471418],[-0.45295602,0.33931798,0.095446564,-0.54154277,-1.0325888,0.38092053,1.145116]],"activation":"σ","dense_2_b":[[-0.3186452],[-0.288119],[-0.38380378],[0.12766144],[-0.10716348],[-0.14310987],[-0.34722012],[-0.018767025],[-0.2038077],[-0.18889567],[0.07034628],[0.012997789],[-0.1260928]]},{"dense_3_W":[[-0.6318957,0.48257327,0.1136089,0.51249325,-0.49085104,-0.46579233,-0.32575548,0.69841176,-0.13590871,-0.48699,0.39608002,0.74255526,-0.28925848],[0.0032501454,0.12569621,-0.004480495,-0.45128265,-0.2787252,0.55744016,0.7084973,-0.52268666,-0.20164965,0.6661134,-0.37891406,-0.20163451,0.32705396],[0.5388942,-0.22452125,-0.35520035,0.22645302,-0.40178102,0.70361614,-0.22213759,-0.8835455,-0.56852955,0.671603,-0.407134,-0.011616957,0.27316284]],"activation":"identity","dense_3_b":[[-0.002264159],[-0.1245649],[-0.077148765]]},{"dense_4_W":[[0.3225791,-0.9383285,-0.49840775]],"dense_4_b":[[0.11291003]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021 b'TC3M-3210X-A-00x00x00x00x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021 b'TC3M-3210X-A-00x00x00x00x00x00x00x00x00x00'.json deleted file mode 100755 index 3c68fce4ea..0000000000 --- a/selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021 b'TC3M-3210X-A-00x00x00x00x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.1361938],[1.0207393],[0.46784142],[0.044281065],[1.0135106],[1.0156862],[1.0179193],[0.99846673],[0.9808455],[0.95554197],[0.93192744],[0.044129286],[0.044156313],[0.044183984],[0.044230428],[0.044231635],[0.04403099],[0.043691065]],"model_test_loss":0.015346277505159378,"input_size":18,"current_date_and_time":"2023-08-09_19-39-22","input_mean":[[26.720535],[0.05398475],[0.018588284],[-0.0071310536],[0.04973699],[0.051148783],[0.05272367],[0.059138265],[0.05985436],[0.061450966],[0.061546516],[-0.007231824],[-0.00721414],[-0.007194777],[-0.0072021107],[-0.007212742],[-0.007267123],[-0.007447193]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.07717255],[0.27171892],[-1.2506876],[-0.016007472],[-0.015063482],[-0.040170796],[-1.3193151]],"dense_1_W":[[-0.00046635105,0.23848942,0.0075265327,0.63944364,0.1347048,0.47492328,-0.37915337,0.41173533,-0.12487092,-0.29509735,0.12250014,0.45845526,-0.054787334,-0.5933447,-0.42548034,-0.45802563,-0.43666455,0.4965784],[0.0028189807,0.9642001,6.3449173,0.27022457,-1.2672639,-0.31867704,-1.0117996,0.016185766,1.29451,1.0355864,-0.5214663,0.12862188,0.3666462,-0.44845012,0.0503311,-0.55411357,-0.0335223,0.22428314],[-0.47832125,1.0210371,0.0025497465,-0.37653345,-0.3742908,0.41137654,-0.88231635,0.07470647,-0.13826749,0.077677675,0.14215057,0.4993727,0.23369971,-0.41651008,-0.20243475,0.10337624,0.048701506,0.0058387266],[-0.010898832,0.9759092,0.78411144,0.13314718,0.7009455,-0.24671309,1.0518397,-0.8327215,-1.1135107,-0.9663988,0.37700438,0.242799,0.26452747,0.23343697,-0.0026173661,-0.60242945,-0.27355608,-0.0491],[-0.010772643,-0.5600224,0.763155,0.30147272,0.78109336,0.837608,-1.0615004,0.5927615,0.50307256,-0.23107275,-0.9367593,0.56559885,0.300443,-0.50897396,-0.2478554,-0.058721192,-0.103559576,-0.29454744],[-0.0016055347,-0.30018213,0.007459824,0.09456597,-0.24748099,-1.0068074,0.22400783,0.22705272,0.46885622,0.7039897,-0.7698514,-0.67375356,0.1720363,0.25146246,0.05736602,0.07285658,-0.13567634,0.09812689],[-0.4724937,-1.0677936,-0.0013191341,0.3016288,0.3043617,-0.546663,0.9942631,0.047015384,0.33232743,-0.22391738,-0.16955799,-0.44435427,0.088968895,0.2033616,-0.024262402,-0.21804309,0.2939665,-0.10468075]],"activation":"σ"},{"dense_2_W":[[-0.02815128,-0.15404527,0.48134676,-0.2045751,0.45873386,-0.9992201,-0.4732975],[-0.81980515,-0.14103535,-0.7424751,0.32967785,-0.43455988,0.42265758,1.1696832],[0.17993073,0.36625385,1.2360194,-0.7851182,0.58637094,-0.9563679,-0.6327467],[-0.80701834,-0.46103284,-0.38886464,0.26659998,-0.25459498,0.27860713,1.0151616],[-0.26352298,-0.27474797,-0.71573704,0.5585518,-0.2905977,0.35913047,0.5679929],[-0.040301513,-0.41732746,0.12182226,0.23108034,-0.84193206,-0.024594149,-0.28726375],[-0.37716445,-0.017540926,-0.7418782,0.67433614,-0.4516054,0.43178025,-0.06261839],[-0.14396086,0.20600641,-0.6750777,0.64446765,-0.9558452,0.41428146,0.09141522],[0.8223245,-0.051082235,0.52545285,-0.6711533,0.26996845,-0.093948975,-1.0486971],[-0.30826652,-0.180534,-0.19349286,-0.20159452,-0.15312585,0.3642725,0.52487767],[0.75069547,0.0020414179,0.33697206,-0.7357639,0.5642956,-0.73201805,-0.15238681],[0.7387959,-0.04430659,0.5192625,-0.5607489,0.7265771,-0.6451385,-0.68313706],[0.017428305,-0.34786505,-0.16648427,0.16268884,-0.6232374,0.32126054,0.8016188]],"activation":"σ","dense_2_b":[[-0.009145167],[0.07557344],[-0.19250816],[-0.049706537],[-0.10579298],[-0.23372805],[-0.22532278],[-0.12664817],[-0.03729099],[-0.123311765],[0.025257772],[-0.1679509],[-0.08767181]]},{"dense_3_W":[[-0.71948236,0.20356402,0.3145974,0.13516659,0.52638,-0.29817042,0.498107,-0.010514032,0.18771078,0.013163666,-0.7712328,-0.4116291,0.3748885],[-0.64847153,0.23644143,-0.4865116,0.47148782,0.41150305,-0.12364886,-0.3837079,0.32072318,-0.022468964,0.55944085,-0.6452794,0.29679397,-0.124723144],[0.32205322,0.8586511,-0.8641501,0.16287574,0.18229792,0.4021785,-0.042451933,0.47848225,-0.5249389,0.13250944,-0.4461431,-0.25520405,0.1984305]],"activation":"identity","dense_3_b":[[-0.07424013],[-0.058659244],[-0.08360579]]},{"dense_4_W":[[-0.8438062,-0.24870598,-1.0960536]],"dense_4_b":[[0.073657714]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022.json b/selfdrive/car/torque_data/lat_models/MAZDA_CX5_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/MAZDA CX-5 2022.json rename to selfdrive/car/torque_data/lat_models/MAZDA_CX5_2022.json diff --git a/selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021.json b/selfdrive/car/torque_data/lat_models/MAZDA_CX9 2021.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/MAZDA CX-9 2021.json rename to selfdrive/car/torque_data/lat_models/MAZDA_CX9 2021.json diff --git a/selfdrive/car/torque_data/lat_models/MAZDA CX-9.json b/selfdrive/car/torque_data/lat_models/MAZDA_CX9.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/MAZDA CX-9.json rename to selfdrive/car/torque_data/lat_models/MAZDA_CX9.json diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68273275AG'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68273275AG'.json deleted file mode 100755 index 376ff90932..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68273275AG'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.9210873],[1.1622182],[0.43444356],[0.05239421],[1.162601],[1.1617966],[1.1600338],[1.1373105],[1.1218978],[1.1002257],[1.0747715],[0.052226104],[0.052260432],[0.052283283],[0.052092496],[0.051803872],[0.051247757],[0.050530057]],"model_test_loss":0.013745146803557873,"input_size":18,"current_date_and_time":"2023-08-10_01-43-24","input_mean":[[23.540874],[0.039472643],[0.019381158],[0.010939346],[0.032198854],[0.03392217],[0.035938434],[0.04118405],[0.046537373],[0.049447913],[0.051183026],[0.010808573],[0.010828554],[0.010842155],[0.010789978],[0.01078458],[0.010702423],[0.010645217]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.3592632],[0.24013901],[0.02950762],[0.007981313],[0.16977344],[1.0341699],[0.067953564]],"dense_1_W":[[-0.29443944,-0.86964434,-0.0030668834,0.34641737,-0.052413613,0.25383303,0.39592203,-0.37595648,-0.09712996,-0.067028016,-0.15717228,-0.30866244,-0.31660882,0.03619487,0.36077827,0.14766766,-0.08112562,-0.16371004],[-1.0683546,-0.4225962,-0.0066022496,-0.4033901,0.46962708,-0.44821528,0.38007107,-0.35131562,-0.19155227,0.32398295,0.044747997,-0.17824192,0.5510669,-0.0595588,0.35617167,0.4413747,-0.034901265,0.04095095],[0.0008612147,0.3940898,-0.006288894,-0.55062485,0.5392667,0.33954364,-0.48541492,-0.16118298,-0.09376398,0.10986033,0.12394796,0.9228157,-0.45805627,0.11727515,-0.022528082,0.06427372,-0.0030711165,0.04155096],[1.0198417,-0.35909548,-0.006616111,-0.59779114,-0.31270605,-0.14032304,0.9551273,-0.2675044,-0.24046354,0.032812644,0.16535293,0.012905942,-0.11244921,0.6141845,0.098029315,0.584352,0.23467723,-0.16135265],[-0.0028723876,0.29212356,3.77251,-0.04027425,-0.7930384,-0.98414063,-1.0553377,-0.016249495,0.87524354,1.4566501,0.4455834,0.31893766,0.3175888,-0.23782718,0.70991355,-0.03134838,-0.38082367,-0.7664585],[0.23746029,-0.524643,-0.0032641755,0.016509473,0.14262381,-0.52993554,0.7516659,-0.27583307,-0.28979933,-0.025237296,-0.11929308,-0.61843383,-0.04413926,0.3603565,0.9432264,-0.51941097,-0.17327741,0.033388518],[0.022823358,0.3032578,0.0024921081,-0.1483726,0.3248898,0.11600146,-0.2852234,-0.16650069,0.113197386,0.11354485,0.004953061,0.29692334,0.16251172,-0.60039353,0.059377182,0.0968991,-0.17315012,0.034780342]],"activation":"σ"},{"dense_2_W":[[-0.10226482,-0.4129552,-0.011484651,-0.8094231,-0.007036115,0.068016745,0.30800965],[0.51679516,-0.0140688205,-0.85121125,-0.09242818,0.41688886,0.7517409,-0.64519745],[0.35164565,0.392633,-0.101708815,0.6600604,-0.51135594,-0.24759813,-0.7536511],[-0.46807855,0.22016473,0.8009246,-1.2497194,0.8632494,-1.2237775,0.2705352],[0.12294014,0.28189301,-0.82049996,0.42017826,0.31424674,0.5031236,-1.0273964],[0.031432822,-0.62932956,0.22953837,-0.49194145,0.15946166,-0.07545127,0.25037768],[-0.36138535,-1.1441826,0.8748997,0.30837125,1.1008774,-0.039432786,0.5913679],[0.6354077,0.27034265,-0.8441376,-0.3852919,-0.7068959,0.5080131,-0.106792346],[-0.1320543,-0.8137172,0.9680676,-1.2771759,0.39580464,-0.6290615,1.3455303],[-0.50728315,0.35654846,0.08924023,-0.60484344,0.574961,-1.1762985,-0.0043168655],[0.14633264,-0.041424304,-1.0337647,-0.3997866,-0.016652329,0.07367241,-0.07422297],[0.4978552,0.4680909,-0.8531208,-0.009683,0.09626235,0.60354567,-0.8143497],[-0.7302568,-0.7541932,1.0414218,-0.31683722,0.71962583,-0.09527239,0.5987053]],"activation":"σ","dense_2_b":[[-0.08878189],[0.012890921],[0.044211157],[-0.4465577],[-0.062322337],[-0.0074243415],[0.15457644],[-0.07897435],[-0.08090508],[-0.22858685],[-0.27673057],[-0.07622174],[0.058422644]]},{"dense_3_W":[[0.050709836,-0.03184132,0.44536084,0.092137754,0.3236647,0.18253805,-0.07791841,-0.20872086,0.09598713,-0.2740574,0.10335441,-0.28594363,-0.25284308],[-0.39783764,0.72701114,0.3897124,-0.78861535,0.6352359,0.42759028,-0.2990431,0.056067392,-1.2246326,0.31149596,0.4554911,0.13868588,-0.4529365],[0.027524881,-0.48940495,-0.44448495,0.46868488,-0.57126254,0.57925117,0.31945515,-0.66192514,0.5332039,0.21860516,0.000447623,-0.37591594,0.49015212]],"activation":"identity","dense_3_b":[[0.0158691],[0.023787307],[-0.030451657]]},{"dense_4_W":[[-0.11161881,-0.3257279,1.0980971]],"dense_4_b":[[-0.03284489]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68466110AB'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68466110AB'.json deleted file mode 100755 index cc62373968..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68466110AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.0463657],[0.9747688],[0.3453712],[0.03803554],[0.9690691],[0.97106147],[0.97251296],[0.9614686],[0.94826],[0.92959803],[0.9101179],[0.037928607],[0.037951168],[0.03796943],[0.03788738],[0.03772722],[0.03745093],[0.037048396]],"model_test_loss":0.017076648771762848,"input_size":18,"current_date_and_time":"2023-08-10_02-58-26","input_mean":[[27.871407],[-0.025981303],[-0.0066066827],[-0.005477946],[-0.021529026],[-0.021929484],[-0.022823982],[-0.023858318],[-0.025280826],[-0.029299965],[-0.032219402],[-0.005470874],[-0.0054753814],[-0.0054821577],[-0.0055401647],[-0.0056055295],[-0.0057070768],[-0.0058246236]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.4266238],[-0.3416357],[2.5780525],[-2.5398123],[-1.5365838],[-0.15346667],[0.017754281]],"dense_1_W":[[-1.0982449,0.20722441,0.013749752,0.07489929,0.41551197,0.004341639,0.0048132003,0.00025495235,-0.18475117,0.08220013,0.0560664,0.82137764,0.495301,-0.63355666,-0.47019786,-0.04666432,-0.25567988,0.04631287],[-0.012575525,1.013855,6.6538153,0.0006221404,-1.0208796,-0.513264,-1.0584702,0.4347041,0.50328493,0.99720603,-0.41704744,0.9781865,0.078827344,-0.22583015,0.3788141,0.114769615,-0.8264082,-0.4377368],[0.82146376,-1.1214737,-0.038538903,0.129783,0.16356055,0.04583769,0.09611903,-0.25096208,-0.45288768,0.033663888,0.2989499,-0.27392572,0.05673563,0.29652318,-0.17211635,0.37968886,-0.0377033,-0.17876798],[-0.78663635,-1.252811,-0.03569057,-0.024772601,0.1393824,-0.16137758,0.63462764,-0.56116915,-0.25827187,-0.035541687,0.32233778,-0.49389195,0.107298866,0.5767397,0.15331157,-0.009262639,0.056745403,-0.17108874],[1.075038,0.63599974,0.013103103,-0.13239852,0.2721682,0.215895,-0.43340504,-0.2561609,0.08369225,0.09600925,-0.031108124,0.9223862,0.037735846,-0.24475971,-0.11832876,-0.24068235,-0.2104002,0.018788245],[-0.012586371,0.8092677,-0.005002185,-0.0010346456,-0.19357827,0.4030301,-0.41376656,-0.014812962,-0.14178266,-0.15467277,0.16577497,0.46197078,0.28108403,-0.72031033,-0.2485265,0.044038273,0.20874186,-0.06851787],[-0.01091231,0.993412,0.026124477,0.3239028,0.502026,0.68568456,1.7555947,0.8855259,-1.2782414,-2.011024,-1.1780066,-0.7251421,0.3048075,0.79791856,0.25945005,-0.80709416,-0.24202144,0.24123403]],"activation":"σ"},{"dense_2_W":[[0.8615375,-0.37836078,0.059902865,-0.610202,0.60982454,-0.05805709,0.3699734],[0.11572612,0.48987415,0.2018818,-1.1636332,0.5043109,0.53963894,0.019587068],[-0.82412773,-0.5432425,0.86591834,1.4440024,-0.50299263,0.0073020295,0.33265102],[-0.937952,0.34060618,0.28250477,1.2533687,-0.24819559,-1.102934,0.4194565],[0.0850848,-1.4026527,0.18256377,1.2569317,-1.3412946,-0.51787454,0.60327196],[-0.49207494,0.006521548,-0.84601384,-0.063308366,-0.2913924,-0.5534405,-0.36416996],[-1.1227055,0.6364929,0.40246958,0.3539726,-0.71709025,-0.5450521,0.116008334],[-0.3193431,-0.12110501,0.44127515,0.29223323,-0.5647738,-0.5818968,0.104559764],[0.19634451,-0.11687351,-0.52581316,0.14469767,0.26439536,-0.25766855,-0.5510215],[-0.05923424,0.28980356,-0.14158152,0.43791518,-0.732061,-1.0311065,0.41942894],[0.7570111,0.53114414,-1.135714,-0.26154417,-0.21490821,0.23511015,-0.73162705],[-0.060524873,0.09525046,-0.9220807,-0.09318619,0.486466,0.85145307,-0.22442955],[-0.5580914,-0.055617023,1.4159099,0.7312611,-0.9474024,-0.42224932,0.1571235]],"activation":"σ","dense_2_b":[[-0.051363647],[-0.12564756],[0.057266533],[-0.20513932],[-0.5409964],[-0.26110366],[-0.17036414],[0.04884298],[-0.2544224],[-0.0654127],[-0.11066689],[0.043957688],[0.111824796]]},{"dense_3_W":[[0.4754135,-0.13027504,-0.70067513,-0.68032104,-0.2434314,-0.49364966,0.0809345,0.3409165,-0.35128537,0.5138682,0.24348976,0.12398042,0.07979309],[-0.3433468,0.24112704,-0.5154696,-0.14498284,-0.22987618,0.22425546,-0.03564995,-0.48462275,0.40817538,-0.0020781446,0.6011458,0.6723392,-0.47040144],[0.5232041,0.45503825,0.087453336,-0.20923337,-0.4118531,0.15931882,-0.49080586,-0.22813377,0.13799725,-0.5762673,0.56595653,0.68413365,-0.7339804]],"activation":"identity","dense_3_b":[[0.04150388],[0.051177654],[0.041261487]]},{"dense_4_W":[[0.5853262,0.47804958,0.9168704]],"dense_4_b":[[0.043468688]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469901AA'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469901AA'.json deleted file mode 100755 index 6e24c14c4d..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469901AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.33825],[1.1453629],[0.43486407],[0.046197876],[1.1367582],[1.1400605],[1.1420996],[1.1326395],[1.1184355],[1.1011796],[1.079299],[0.045960896],[0.046014525],[0.046063952],[0.046127878],[0.0460219],[0.045729626],[0.045291778]],"model_test_loss":0.021876206621527672,"input_size":18,"current_date_and_time":"2023-08-10_03-24-19","input_mean":[[27.181211],[-0.033823926],[0.008755515],[-0.0075790784],[-0.032792553],[-0.032709006],[-0.032333635],[-0.02890779],[-0.02326324],[-0.016518341],[-0.010042243],[-0.007586642],[-0.00755887],[-0.0075379773],[-0.007499133],[-0.0074144034],[-0.0072887978],[-0.007148881]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.046337597],[0.050293937],[1.8881503],[0.59185153],[0.8542854],[0.19480373],[1.5334643]],"dense_1_W":[[-0.008669442,-0.50197583,0.0013483413,0.07478634,-0.12987828,-0.42372242,0.451127,-0.21957916,-0.17928472,-0.0133529585,0.06471939,-0.61344665,-0.28108978,0.61214054,0.25012782,0.10078239,0.11161439,-0.16625455],[0.019537883,-0.25616175,0.0026798896,-0.47914556,-0.117883034,-0.5943702,0.47449878,0.02374437,-0.25907964,0.0004787899,0.041058734,-0.62058383,0.37889734,0.56780803,-0.12320269,0.24227172,0.05977054,-0.088733785],[0.9617319,0.5921454,0.08454962,-0.024177684,-0.33587864,0.7352508,-0.7387421,0.39873427,0.21945651,0.05807639,-0.2851063,0.16848388,-0.5095711,-0.648206,0.22489141,0.2630374,-0.10781773,0.05692585],[0.6508581,-0.034968324,-0.0046116984,0.042830404,0.2208985,-0.25876033,0.70590264,0.11468684,1.3392336,-0.462859,-0.19124633,-0.49964252,-0.112543315,0.23059364,0.22540659,0.8281614,-0.30613214,-0.41558707],[0.630478,0.72845036,-0.0040414827,-0.42815435,0.09451815,0.98280245,-0.5989212,0.11570024,0.012325331,-0.067932405,0.11440747,0.027836803,0.35311875,0.12638386,-0.23782413,0.35590366,-0.07542629,-0.12907898],[0.02959114,0.17071922,4.48706,-0.005770228,-1.3331827,-1.5406686,-1.4772613,-0.8343799,2.3675978,2.120532,0.66988176,0.90546036,0.2781295,-0.40613997,0.25572512,0.8060402,-0.9505193,-0.8492369],[0.9206642,-0.5364798,-0.08010512,0.04452516,0.0843251,-0.4182482,0.5212545,-0.20747036,-0.2660874,-0.06005273,0.2478061,-0.095565975,0.18786341,0.72273916,-0.19318765,0.028641535,-0.036184557,-0.10096181]],"activation":"σ"},{"dense_2_W":[[0.38142607,0.042492785,-0.77607405,-0.52826,-0.8402416,-0.63555807,0.26845828],[-0.36448377,0.013470403,-0.7751532,-0.62089664,-0.0025020323,-0.43518564,-0.032616902],[-0.51269734,-0.90651554,0.15344314,-0.97433233,0.13745055,0.95539695,-1.3348669],[-0.29381657,-0.72915894,0.1849723,-0.6422532,0.6542673,-0.23613134,-0.41772324],[0.98330545,0.1279324,0.07058928,-0.120830305,-0.6904588,0.43327442,-0.01615229],[-1.1281452,-0.7857186,0.7657339,-0.6405541,0.15110444,0.3140745,-0.77677655],[-0.10084952,-0.22716746,1.1716565,-0.091143146,1.0249162,1.0087454,-0.28616652],[-1.1938478,-0.12939769,-0.26710513,-0.8057877,0.28079078,0.6419189,-0.73595464],[-1.1646985,-0.43413186,0.16684091,-0.72566366,0.39882493,0.5024153,-0.07758079],[-1.0085496,-0.07076024,-0.20896135,-0.65417224,-0.2732086,-0.113864146,-0.6265197],[-1.1994962,-0.8906176,-0.33401784,-1.0209608,0.37494394,0.8777499,0.0017000877],[0.64241505,0.62737906,-0.6886972,-0.18807864,-0.07910444,0.48681334,-0.09631596],[0.8916427,0.6068368,-0.7540836,0.6216169,-0.3300996,-0.31663188,0.3107477]],"activation":"σ","dense_2_b":[[-0.13178545],[-0.15170422],[0.16972616],[0.02054858],[-0.06958599],[0.123835176],[0.06601367],[0.0011560497],[-0.0824041],[-0.1551787],[-0.07204721],[-0.0050074253],[-0.13309194]]},{"dense_3_W":[[-0.26774383,0.069543615,0.6138564,-0.19084257,-0.054911274,0.68343407,0.6239501,0.41537902,0.5271345,0.11967227,0.032000795,-0.057378754,-0.49043247],[-0.06432742,-0.7016147,0.10944263,-0.1354464,-0.13193382,-0.070864916,0.037493527,-0.88318646,0.12056807,0.35320503,-0.6730902,0.5864121,0.25374225],[-0.7003238,-0.21708901,0.26239115,0.7095383,-0.6740586,0.19532588,0.15621354,0.44259292,0.37482294,0.12022154,0.4868753,-0.46856374,-0.68130004]],"activation":"identity","dense_3_b":[[-0.056218784],[-0.079843864],[-0.01837998]]},{"dense_4_W":[[0.6685718,-0.15755904,1.0103254]],"dense_4_b":[[-0.027803186]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469904AA'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469904AA'.json deleted file mode 100755 index fba85d85ca..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68469904AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.154286],[0.76042634],[0.3701081],[0.034407996],[0.7532322],[0.755637],[0.7579886],[0.7569121],[0.7567644],[0.75660825],[0.75161266],[0.034349248],[0.034364954],[0.034366276],[0.034332108],[0.03430826],[0.034186568],[0.033984024]],"model_test_loss":0.010220293886959553,"input_size":18,"current_date_and_time":"2023-08-10_03-48-50","input_mean":[[26.29757],[0.21858484],[-0.00041749518],[0.015462894],[0.21635525],[0.2165749],[0.21686907],[0.21543358],[0.21598789],[0.21505341],[0.21361327],[0.015312114],[0.01533278],[0.015349211],[0.015250495],[0.015165519],[0.014907059],[0.014465246]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.5426987],[0.12417949],[-1.4781233],[-0.028249433],[0.20633578],[-0.13907257],[0.72390795]],"dense_1_W":[[-1.1175315,-0.07495566,0.02891214,0.19389996,-0.45027134,0.13735463,-0.6250549,0.85820234,0.59452385,0.042644564,-0.27779862,0.13595949,-0.09487241,-0.10740118,0.17391424,-0.38815653,-0.27959245,0.3287145],[-0.0005434315,0.7250965,-0.001302344,-0.052765388,0.10030851,0.33485708,-0.21132289,-0.115699075,-0.12958458,-0.18765004,0.22767502,0.3379646,0.17437504,-0.35456493,-0.18415342,0.1511127,-0.023203105,-0.03965679],[-1.095963,0.10147642,-0.028861295,-0.45387205,0.49530742,-0.11415999,0.055746414,-0.2760433,-0.46584845,-0.20907946,0.19582038,0.14730005,-0.041585524,0.4082932,-0.3926017,0.2602935,0.29690772,-0.18358155],[0.0038369219,0.37911403,-0.0045367144,-0.23510593,0.094250835,0.34022862,-0.2284937,-0.13612238,0.27017567,-0.33356893,0.14501272,0.4917901,0.03173992,-0.1809757,-0.032653864,-0.33173367,0.115388945,-0.28278348],[-0.003918218,-0.43321767,0.0073618796,0.5832146,0.45349523,0.29272223,0.3733469,0.47134906,-0.83762276,-0.85482854,0.09775691,0.017050214,-0.01622581,0.47676057,-0.03653979,-0.34529078,-0.30939806,0.26684877],[-0.017790653,0.697322,-6.3714147,0.46992886,0.8733624,0.17037292,0.6718011,0.47720847,-0.32684425,-1.1077062,-1.3093247,-0.6193358,-0.10829769,0.15212813,0.27934057,-0.50214195,-0.5461845,0.43900922],[0.51826936,0.12391658,0.051776137,0.072040915,-0.3065168,0.027357819,-0.37797117,-0.17238732,-0.353872,-0.31592342,0.29717565,0.38155913,-0.3906893,-0.14551696,0.22231571,-0.15257306,0.20485455,1.0147902]],"activation":"σ"},{"dense_2_W":[[0.32709605,1.1362737,-0.17482026,-0.046062417,-0.51949316,0.17334434,-0.2578324],[-0.15792392,-0.9065706,0.30352244,-0.48481166,0.3429801,-0.02744591,-0.19637136],[0.91549116,0.3893739,-0.13849072,0.090474464,-0.4911054,-0.309263,-0.51762164],[-0.4134321,-0.7770418,0.8557953,-0.3741374,0.751485,-0.051834386,-0.51904815],[-0.4399301,-0.61924434,0.6309824,-0.35251677,0.66121125,0.2404353,-0.23494475],[0.086413786,0.6363439,-0.41028103,1.0290276,0.047232375,-0.40705454,-0.4344609],[0.9350081,-1.4516156,0.7794276,-0.565611,-0.6901311,0.41864678,-1.1327723],[-0.8245831,-0.8406043,0.08613439,0.052566387,0.6732224,0.28659236,0.16209623],[-0.20109951,1.205864,0.6048377,0.7521136,0.44900057,0.3182956,-0.281427],[0.8864913,0.30494544,-0.53948045,0.63693535,-0.5898942,-0.17208202,0.16690974],[-0.5475406,-0.7371354,0.4504668,-0.5240461,0.34616926,0.32284823,0.44203338],[0.12659965,0.09303629,0.014360431,0.11488345,0.17780194,0.13185121,0.030691903],[-0.29399133,-1.1127974,0.42915276,-0.2730042,0.13696739,-0.2734059,-0.30105415]],"activation":"σ","dense_2_b":[[-0.095232666],[-0.12903397],[-0.16596866],[0.10246624],[-0.03857397],[-0.073855616],[-0.2992988],[0.2189761],[-0.1223435],[-0.1884392],[0.18001069],[-0.08254514],[-0.029937575]]},{"dense_3_W":[[0.26818132,-0.25044084,0.027241506,-0.19964801,0.56580776,0.22428977,-0.43430313,0.67310864,-0.6071206,-0.75302726,0.5696926,-0.25766462,0.02067551],[-0.5776643,0.3400569,-0.1890818,0.5839983,0.35982898,-0.75322586,0.5884296,0.4361948,-0.04064355,-0.82264584,0.77007246,-0.028092124,0.30400428],[-0.565468,-0.022219652,-0.61670506,0.17880899,0.33762756,0.25232822,-0.6182462,0.07745964,-0.14152253,0.07606692,0.43158156,0.40247133,-0.14412662]],"activation":"identity","dense_3_b":[[-0.02423033],[-0.05393112],[-0.025509434]]},{"dense_4_W":[[-0.25194114,-0.987808,-0.020282954]],"dense_4_b":[[0.045462962]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68522583AA'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68522583AA'.json deleted file mode 100755 index 372c112a42..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68522583AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.100081],[0.7303489],[0.40821353],[0.033808213],[0.72612214],[0.72782314],[0.7296681],[0.7202953],[0.7148411],[0.7080344],[0.7024381],[0.03380297],[0.033810258],[0.03380648],[0.033657998],[0.03346423],[0.033204034],[0.03290225]],"model_test_loss":0.027830945327878,"input_size":18,"current_date_and_time":"2023-08-10_04-40-02","input_mean":[[26.731352],[-0.01177522],[-0.004391138],[-0.011022535],[-0.008092633],[-0.008825226],[-0.0103097875],[-0.0098579945],[-0.0067649335],[-0.0050272304],[-0.0049507814],[-0.0109223435],[-0.010953117],[-0.010988373],[-0.010941988],[-0.010961072],[-0.010930893],[-0.010915838]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.1745371],[0.9457931],[-1.2435032],[-1.0458435],[-0.1081323],[0.035753693],[-0.02165228]],"dense_1_W":[[0.16186859,-0.09768836,-4.7846518,-0.15079269,2.5244157,1.6883308,1.5134919,-0.89384186,-3.5332396,-0.6423725,-0.296458,-1.1548986,0.15355624,0.5327785,0.6254284,-0.37240118,-0.04440246,0.32268947],[2.0046134,0.53838843,3.4404945,-0.1141708,-1.1936749,-0.76779556,-0.97976905,-0.29515216,0.7165664,0.17453694,1.4159857,0.19968158,-0.324134,0.020139258,0.36342832,0.07758869,-0.21961124,-0.24075823],[-0.8806507,-0.36592105,-0.1603686,0.019333879,0.7319277,-0.018883258,-0.007104287,-0.4886063,-0.5159273,-0.25874293,0.71235996,-0.08952812,0.39945298,0.44347215,-0.71560186,-0.11375067,0.1372514,0.08856255],[-0.8596358,0.4530633,0.15744632,0.6229328,-0.19767399,0.50342345,-0.48811507,-0.012905224,0.035012916,0.10218181,-0.18411104,-0.14965416,0.28510785,-0.20222001,-0.84866565,-0.21149859,0.06309471,0.2692289],[0.00787326,0.17291375,0.02989127,0.33595058,0.097436145,-0.8344158,0.12299558,-0.056537054,0.063804835,0.102107935,-0.1609201,-0.4358222,0.17648806,-0.15191726,0.27956975,-0.26774335,0.21951361,0.14714526],[0.0013040424,0.0146544995,-0.034251958,-0.017003387,0.48911396,0.7778323,-0.6013927,-0.24220061,-0.1423357,-0.07045295,0.32420683,0.2770749,0.17541865,-0.6925609,0.13146631,-0.09090916,0.21767132,-0.08619563],[-0.0013283036,-0.76572543,-0.021439318,-0.07231562,0.33608717,-0.9519956,0.80349934,0.13154784,0.053906552,-0.0063607194,-0.05806696,-0.48233724,0.030579537,0.24628532,0.1421058,-0.049592685,0.37368706,-0.28366596]],"activation":"σ"},{"dense_2_W":[[-0.11426035,-0.4633911,0.5931024,-0.13167584,0.3877006,-0.8240802,0.4996165],[-0.6506094,-0.043036364,-0.63225603,0.09525037,-0.0013785976,0.30910346,0.09042436],[-0.111270815,-0.037402347,0.42292774,-0.5026528,-0.06920168,-0.5414584,-0.14867242],[0.62404346,-0.21483791,0.5609062,-0.58235985,0.1793472,-0.63125086,0.14775465],[0.39018965,0.30572656,0.19105321,0.120262615,-0.39587906,-0.3727809,0.19191758],[-0.43854353,-0.4174901,0.2537852,0.023853898,-0.6724934,-0.03747815,-0.44509795],[-0.59352624,0.107269265,-0.10295583,-0.05914811,-0.46114132,0.91326886,-0.28330517],[-0.6905027,-0.06767795,-0.20643814,0.2871444,-0.7398764,0.40445343,-0.16377075],[-0.19539294,-0.33604875,0.30735624,-0.3262871,0.6336829,-0.9044841,0.7461942],[-0.076478384,0.0081171375,-0.45632637,0.25862965,-0.033632897,0.95767784,-0.9119975],[-0.6780045,-0.5742568,-0.19451007,0.9155922,-0.2558469,0.7328771,-0.9628025],[0.10786977,-0.3863365,0.52240795,-0.4421973,0.7063569,-0.8783838,0.16820244],[0.043110512,-0.36765873,0.07240629,0.37819213,-0.38525218,0.62788934,-0.6130581]],"activation":"σ","dense_2_b":[[-0.1541479],[-0.0021927624],[-0.07528638],[-0.08054171],[-0.072549514],[-0.034027867],[0.12834808],[-0.10132512],[-0.065889865],[0.047784895],[0.03540158],[-0.04747654],[-0.065598845]]},{"dense_3_W":[[0.71479976,-0.3480489,0.110358596,0.32083592,0.24253292,-0.28188017,-0.5622667,0.011309102,0.6315449,-0.43116945,-0.5399975,0.29667172,-0.4142423],[0.19218774,-0.09594727,-0.10361748,0.10555191,-0.09383906,-0.56986606,0.03129942,-0.07917779,0.33813822,-0.41512942,-0.36388016,0.6792136,-0.223361],[0.34802097,0.07021865,-0.36761415,-0.12873147,-0.05381047,0.11233469,0.49716663,0.4738285,0.29140377,-0.2302745,-0.18917024,-0.5822452,-0.35502756]],"activation":"identity","dense_3_b":[[0.039899256],[0.044181313],[-0.031747688]]},{"dense_4_W":[[-1.0547942,-0.97846806,0.263912]],"dense_4_b":[[-0.039440837]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552788AA'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552788AA'.json deleted file mode 100755 index 6a3c858682..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552788AA'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.868239],[0.75070703],[0.34816617],[0.034229066],[0.74701726],[0.74780625],[0.74831426],[0.746065],[0.74128854],[0.7355061],[0.72421074],[0.03417469],[0.03418928],[0.034195792],[0.03400789],[0.033847637],[0.033606727],[0.03322697]],"model_test_loss":0.008458372205495834,"input_size":18,"current_date_and_time":"2023-08-10_05-30-40","input_mean":[[29.99863],[0.20272265],[-0.025704622],[0.008401776],[0.21002854],[0.20785059],[0.205384],[0.19537038],[0.18984987],[0.18505052],[0.1809265],[0.008209475],[0.008253665],[0.008296503],[0.008406267],[0.008323119],[0.0081936885],[0.007896792]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.2260764],[0.6165127],[0.2977843],[-0.14787921],[-0.9168285],[-0.12295077],[-0.09766494]],"dense_1_W":[[1.065022,-0.05936225,0.0022720068,0.08219392,-0.8567543,0.111217014,0.54122514,-0.2706693,-0.15036803,0.25742987,-0.08767648,-0.34830713,-0.027404225,-0.4185975,0.35305434,0.3575998,0.14072141,0.2625152],[0.15924072,0.593216,0.00052627287,-0.1057818,-0.36246762,0.28154594,-0.3878058,0.041176394,0.20087384,-0.038753517,0.042374074,0.48755527,0.036274087,-0.6767191,0.12023098,0.19956696,-0.13944839,0.03492848],[0.26169267,-0.59497786,-0.001051651,-0.324159,0.33932126,0.09371173,0.11345156,-0.016827654,-0.40026185,-0.100701384,0.15730438,-0.13552007,-0.1270308,0.4102569,0.28058168,0.12271481,-0.24961802,0.05837292],[-0.033944216,-0.29202187,0.00077848736,-0.114458814,-0.5727945,0.060648486,0.61588925,-0.11821368,0.11814919,-0.052538417,-0.13625127,-0.7172482,0.51400244,0.333069,-0.10085215,0.11445696,0.17483449,-0.20612186],[0.87344337,0.26699117,0.0022017667,0.28822276,0.37948754,-0.05094396,-0.41495946,0.40114012,-0.0048360685,-0.0020655768,-0.11235444,0.6665909,0.047259506,-0.11638346,-0.71936154,-0.22467732,-0.19744919,-0.10152469],[-0.107145384,-1.0915395,-6.141535,0.70560014,0.4831924,1.1330324,0.95880973,-0.5413501,-0.5439982,-0.9502495,0.21910736,-0.7986927,-0.226854,0.97576135,0.2663551,-0.53631556,-0.1967203,0.27619123],[0.014165441,0.4128995,-0.0009244823,0.15947568,0.20772904,-0.27174422,0.23572557,-0.68967,0.117952354,-0.32811052,-0.07497509,-0.07766617,-0.1715381,0.10645008,0.13909376,0.09034561,-0.076432556,-0.0002952288]],"activation":"σ"},{"dense_2_W":[[-0.11342565,-0.2809018,-0.05111502,0.22586785,-0.046716776,-0.035705794,0.6600342],[-0.18827938,0.9972883,-0.072743565,-0.61405253,0.7193729,-0.41576892,-0.104350396],[-0.3556824,0.66933596,-0.10034228,-0.36175656,0.80487776,-0.048805095,-0.6517391],[-0.0029814816,0.037780087,0.4565041,0.57524407,-0.61115396,0.00441405,-0.3738763],[-0.2594761,0.31262296,-0.09214641,-0.002778288,-0.00446783,0.19304605,0.54612243],[-0.28130808,-0.3503751,0.5588698,0.616398,-0.49632117,-0.41926727,0.7246912],[0.19776937,-0.29551616,-0.80695623,-1.1329869,0.094373874,0.6795281,-0.74388427],[-0.8445154,0.94859,-0.08256833,-0.4775403,0.04127346,0.10181072,-0.6063285],[-0.85923886,0.39777043,-0.36597455,-0.06115376,-0.044814575,-0.2704239,-0.4685487],[-1.1660684,0.25082108,-0.7324697,0.2520158,-1.2055342,-1.5113032,-0.13736865],[0.4879582,-0.67548096,0.3822733,-0.05974599,-0.4401489,0.06402922,-0.13399549],[-0.41230774,-0.33770072,0.6218817,0.5027607,-0.201837,-0.21050662,0.1802105],[-0.17762303,0.13510232,0.5571139,0.447668,-0.12594385,-0.07661345,0.27156433]],"activation":"σ","dense_2_b":[[-0.036336433],[0.23029093],[0.055804957],[-0.042286173],[-0.009081475],[0.06398727],[-0.23855366],[-0.03628939],[-0.059604287],[0.011632554],[0.008110043],[-0.00869093],[-0.060943495]]},{"dense_3_W":[[-0.35496664,0.23448576,0.5805028,-0.4621804,-0.5448057,-0.60412884,-0.11938377,0.13103668,0.5007172,0.321409,0.34096,-0.40516585,-0.017715745],[0.36484855,0.40388605,0.44538534,-0.056106996,-0.292742,0.19839688,0.2952001,-0.43382752,0.5743617,-0.051075302,-0.21471448,0.14332166,0.2699585],[-0.2499691,0.68792695,0.57182634,0.20412138,0.10965183,-0.7152176,0.39847228,0.60519606,-0.0041895057,0.82069314,-0.5085393,-0.22828765,-0.30936882]],"activation":"identity","dense_3_b":[[-0.014063893],[-0.06281853],[-0.02118316]]},{"dense_4_W":[[0.7967157,0.21090265,1.0282162]],"dense_4_b":[[-0.01977677]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552791AB'.json b/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552791AB'.json deleted file mode 100755 index 97d661e070..0000000000 --- a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN b'68552791AB'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.327477],[0.83636034],[0.35854557],[0.03027954],[0.8322574],[0.8326431],[0.8336623],[0.8205453],[0.8127496],[0.8029663],[0.7927199],[0.030091072],[0.030136604],[0.030175311],[0.030065328],[0.02983974],[0.029646473],[0.029447762]],"model_test_loss":0.014091002754867077,"input_size":18,"current_date_and_time":"2023-08-10_06-46-47","input_mean":[[30.319626],[-0.08276231],[0.005369592],[0.004473744],[-0.08501025],[-0.084354036],[-0.08372337],[-0.082539454],[-0.081338175],[-0.07844728],[-0.074738294],[0.0042737313],[0.0043124184],[0.0043546893],[0.004361203],[0.0043273983],[0.0043060128],[0.004311133]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.35763365],[-1.3521506],[-0.016218545],[-0.059472244],[-0.6437557],[-1.6056265],[0.12085991]],"dense_1_W":[[0.87513417,-0.49436525,0.001526756,0.007689951,0.105178826,-0.7741091,0.389623,0.30006444,-0.030422192,0.10987545,-0.14698596,0.18236087,-0.29306155,0.38676205,-0.33443922,0.039674185,0.33462492,0.22763555],[-0.36546978,-0.40689582,2.668961e-5,0.02264227,0.05264314,-0.024173336,0.4129403,-0.48889917,-0.012633747,-0.10086103,-0.20651652,-0.32730335,-0.29228786,0.3802635,0.3812668,0.4096499,-0.3554582,-0.11867983],[-0.0013656212,-0.48252577,-0.0009152643,0.2006504,0.14096452,-0.6883657,0.5257372,0.07914371,-0.047559284,-0.19422947,0.058318842,-0.44962868,0.28549084,0.012210312,-0.064143956,-0.0011885081,-0.015983405,0.013072292],[-0.0026489464,0.5069076,1.9415842,-0.15803127,-0.43643364,-0.22442625,-1.1007931,0.72446126,0.6154824,0.30189446,0.05599185,0.30916336,-0.42455056,-0.12520063,0.21027873,-0.04347085,0.32625684,-0.19425716],[0.9294821,0.54150075,-0.0014356759,0.098655105,0.17580858,0.3025255,-0.4274019,0.063312046,-0.056220684,-0.19399443,0.15516913,0.15510176,-0.17118718,-0.12277757,-0.15992972,0.1450927,-0.30511072,-0.21360834],[-0.38354275,0.5149199,0.00057220226,-0.19913933,0.113392256,0.16671515,-0.8061363,0.12808692,0.49387446,-0.045991942,0.21927999,0.46965662,-0.16261269,0.10389701,-0.14170384,-0.65069014,0.22400732,0.25261372],[-0.002354059,-0.7396432,0.0020271204,0.45820466,-0.25027558,-0.94205016,0.6306626,0.48574498,-0.2435183,-0.0036713302,-0.101162255,-0.15816127,0.22204119,0.070377395,-0.33187887,0.02354076,0.015245039,0.21813555]],"activation":"σ"},{"dense_2_W":[[-0.39639628,0.133772,-0.45599017,-0.12503287,0.6173994,-0.1820395,-0.10319031],[0.52661186,0.6336824,0.38281307,-0.27256545,-0.11690951,-0.31991315,0.35685524],[-0.3293337,-0.0649368,-0.71211916,-0.01983682,-0.04604264,0.21905379,0.22640918],[-0.13469312,-0.3821376,0.38459212,-0.9789118,-0.59137386,-0.69679177,-0.46103966],[-0.3486451,-0.30294892,0.20108142,0.033686325,0.20845367,-0.15991163,0.16748387],[-0.5856937,-0.43619728,0.027885517,0.10118421,0.29912174,0.16026014,-0.145594],[0.5430804,0.85552984,0.428548,-0.4006437,-0.4890019,-0.48459867,0.3640567],[0.05403504,0.021867719,0.0033385737,-0.40292013,0.5227002,-0.3627125,-0.039094802],[-0.40562767,1.3550378,0.45764822,-0.619266,-1.8762536,-0.93922824,0.09558092],[-0.36202994,-0.6913235,-0.7093955,0.21246669,0.16837499,0.5995575,0.14070001],[0.36312523,0.43244222,0.028741337,0.028756998,-0.41653222,-0.8163697,0.50980633],[-0.33022994,0.76520115,0.5691923,-0.50416476,-0.23335694,-0.47498608,0.39545852],[-0.1516905,-0.15376274,-0.5148544,0.33134565,-0.1089893,0.73183095,-0.6926165]],"activation":"σ","dense_2_b":[[0.07102355],[-0.12229542],[0.019641167],[-0.29842442],[0.010732347],[-0.22115242],[-0.14720376],[-0.03818797],[-0.65264404],[-0.054308396],[-0.0794121],[-0.37990314],[-0.015795233]]},{"dense_3_W":[[-0.17495315,0.6230324,-0.2510061,0.2996151,0.20122245,0.16665521,-0.5264948,-0.12510355,0.58361983,-0.035939705,0.39780724,-0.49274892,-0.13300937],[0.19338629,-0.14241812,0.38995105,-0.24322313,0.103984654,0.67614037,-0.59531045,-0.3055774,0.2720826,0.49907777,-0.348274,-0.4995533,0.62145895],[-0.4343396,0.46093857,-0.6372687,-0.59232146,-0.37132394,0.42294338,0.64938694,-0.38425207,0.43624443,0.01882502,0.60109246,0.43596882,-0.4406191]],"activation":"identity","dense_3_b":[[-0.04878774],[0.05141081],[-0.054991424]]},{"dense_4_W":[[-0.57082623,1.0047814,-0.8701593]],"dense_4_b":[[0.05418028]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN.json b/selfdrive/car/torque_data/lat_models/RAM_1500_5TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/RAM 1500 5TH GEN.json rename to selfdrive/car/torque_data/lat_models/RAM_1500_5TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/RAM HD 5TH GEN.json b/selfdrive/car/torque_data/lat_models/RAM_HD_5TH_GEN.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/RAM HD 5TH GEN.json rename to selfdrive/car/torque_data/lat_models/RAM_HD_5TH_GEN.json diff --git a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820527T6070405'.json b/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820527T6070405'.json deleted file mode 100755 index 09703241a2..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820527T6070405'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.822513],[0.7748963],[0.45073962],[0.028469948],[0.7594248],[0.7647172],[0.7702192],[0.76471704],[0.7589174],[0.7535919],[0.7483726],[0.02835351],[0.028382754],[0.02841451],[0.028416976],[0.028403616],[0.02836127],[0.028289525]],"model_test_loss":0.005644185468554497,"input_size":18,"current_date_and_time":"2023-08-10_09-20-08","input_mean":[[21.586409],[-0.0068980567],[-0.009099182],[-0.012765147],[-0.003074515],[-0.0043314965],[-0.0054138857],[-0.00872431],[-0.008043755],[-0.007268204],[-0.008552191],[-0.012878481],[-0.012848849],[-0.012813383],[-0.012694143],[-0.012824441],[-0.012981006],[-0.013215528]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.559899],[0.061946217],[-1.1318369],[-0.15356188],[-0.11130223],[-1.6501099],[0.72932065]],"dense_1_W":[[1.2257729,-0.21475899,-0.21481141,-0.06141821,-0.32331187,0.34948754,-0.45195353,-0.7936406,-0.2963517,0.075721286,0.16471535,0.3187927,0.026701737,-0.12669133,-0.19016542,-0.21420473,-0.03571252,0.24129197],[-0.0037353956,1.1463906,-0.032696437,0.08411021,-0.45902684,0.47184968,-0.049507096,0.48809394,0.6835621,-0.15164956,-0.2564982,-0.13430756,-0.05483595,-0.10893071,0.14104505,-0.15664752,0.14854911,-0.14124799],[-0.5031497,0.5740853,0.13468973,-0.07342075,0.22242497,0.5158128,-0.49981844,0.13897888,0.05672014,0.012715707,0.039177578,0.15471649,-0.13522737,0.18366553,-0.012791789,-0.20473395,0.17170367,-0.028233869],[-0.0030404613,-0.23232347,-0.051857546,-0.08527703,0.5234089,-1.2333686,0.76485693,-0.14326906,0.036368743,0.053107988,-0.030047482,-0.16562696,0.020687701,0.39415163,0.3789338,-0.36305478,0.031212157,0.050091427],[-0.00634946,0.2520326,-2.9768014,0.45517653,-0.44722444,-0.4035937,0.13028944,-0.25888947,-0.60737526,0.18608572,0.7329467,-0.059370834,0.17232452,-0.3012327,-0.63019043,0.29433328,0.35139483,-0.2806337],[-0.72473496,-0.41749117,-0.15656829,0.24190299,-0.14515589,-0.86861235,0.59240955,-0.26769835,-0.025524082,-0.033400673,-0.0374126,-0.012645718,-0.2529195,0.034257527,-0.11211495,-0.07982842,0.20105368,-0.08527751],[1.3300412,0.21610664,0.21324499,-0.047655277,0.30579573,-0.16403562,0.3423395,0.5994678,0.36008987,-0.104190245,-0.12160565,-0.28337744,-0.3201555,0.46343824,0.2363151,0.3774341,-0.27325517,-0.117115274]],"activation":"σ"},{"dense_2_W":[[0.89337134,0.06212176,0.69424486,-1.1258126,-0.41406798,-0.03324763,-0.8690317],[0.45488375,0.9383094,0.7518038,-0.23470305,-0.3165762,-1.0129137,-0.03375848],[-0.31297848,-0.49257454,-0.9567864,0.8079615,0.031627808,0.47916612,0.3070335],[0.16672489,-0.57691675,0.05825881,0.7295758,-0.48249677,0.8452979,-0.0969158],[-0.78628397,0.23688492,1.0961475,-0.21738441,-0.89421016,-0.75636774,-0.74580187],[-0.77340865,-0.19145031,0.8292296,0.08286966,-1.4438053,-0.20321132,-1.5541686],[1.4181628,0.6372049,1.5007821,-0.7996564,-0.8494127,-0.7805535,0.40175954],[-0.5131002,-0.28726596,-0.7685454,0.82989246,-0.3419074,0.9553502,0.20237355],[-0.028016198,0.6447288,0.70404804,-0.9766476,-0.08476289,-1.1437272,-0.59247833],[-0.04841889,-0.17168015,-1.1055567,0.8258706,-0.11265719,0.14096239,0.44926792],[-0.7357998,-0.46887338,-0.5601688,0.18314798,-0.3938517,0.6898303,0.30288145],[-0.91847914,-0.9485166,-0.36430508,0.18779275,0.10875428,0.7242329,0.20822012],[0.9209807,-0.09816239,0.44547236,-1.0485634,-0.72605056,0.12374904,-0.86046124]],"activation":"σ","dense_2_b":[[-0.13824841],[-0.037492033],[0.009199112],[-0.032276437],[-0.19626792],[-0.35359505],[0.104143284],[0.13742983],[-0.02941952],[-0.082949385],[-0.0472394],[-0.13388354],[-0.030517787]]},{"dense_3_W":[[-0.50135684,-0.6265797,0.37889096,0.23949896,-0.28617254,-0.80253077,-0.78707784,0.76118404,-0.6785741,0.6882018,-0.12380857,0.76802224,0.35342324],[-0.65878934,-0.25308114,0.5803435,0.40448022,-0.5880374,-0.10790633,-0.61491644,0.7250317,-0.50604415,-0.16505781,0.6877505,0.31448555,-0.26105368],[-0.30674505,0.52787536,-0.73549473,0.4655279,0.70805156,0.37356392,-0.22046967,-0.53852963,0.295031,-0.6098088,0.40994385,-0.40091082,0.61514527]],"activation":"identity","dense_3_b":[[0.037118178],[0.025729012],[-0.0008306772]]},{"dense_4_W":[[-0.45146888,-0.6571699,0.3420233]],"dense_4_b":[[-0.017946098]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G500'.json b/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G500'.json deleted file mode 100755 index 040727ee92..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G500'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.170632],[0.5570021],[0.32616535],[0.036937848],[0.5544301],[0.55469906],[0.55466586],[0.54358166],[0.53542227],[0.5261058],[0.52150166],[0.036922906],[0.036903005],[0.036881007],[0.036733527],[0.03662628],[0.0365955],[0.036601096]],"model_test_loss":0.011051010340452194,"input_size":18,"current_date_and_time":"2023-08-10_09-45-15","input_mean":[[21.523685],[0.005822485],[0.017957574],[-0.0105598625],[0.0046025654],[0.006011144],[0.0077467156],[0.01335771],[0.019210018],[0.024844872],[0.029322863],[-0.010329333],[-0.010309703],[-0.010285427],[-0.010262218],[-0.010182764],[-0.010136091],[-0.01018172]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.8376012],[0.79891944],[0.27328137],[-0.049832694],[0.1671762],[0.77761924],[0.080337375]],"dense_1_W":[[0.061794475,0.615098,-0.45199832,-0.89162534,0.14803112,-0.3359411,1.216409,-0.30902275,-0.46318957,0.15326177,0.5617341,-0.79835445,-0.41347325,-0.11659805,-0.5467362,-0.07835621,-0.23650429,0.081196256],[0.6269029,0.6299682,0.00862801,-0.28406104,-0.40516195,0.34416673,-0.05962201,0.12889835,-0.118009314,-0.006291829,-0.015252909,0.4089935,-0.14335842,-0.44551474,0.32767174,-0.07098034,0.08289599,-0.05129482],[2.873063,-0.39785758,-0.06460063,0.5302846,-0.54400563,-0.32484847,-0.74205005,0.15385602,0.2992983,-0.14630033,-0.20480666,0.5095823,0.26476872,-0.21809368,-0.38910902,-0.36676934,0.13174173,0.21983561],[0.061674196,0.40320727,-0.005555039,-0.012705039,-0.44866937,0.76068926,-0.53796315,-0.019318009,-0.011975164,0.49870455,-0.34061676,0.10459906,-0.10904486,-0.43353584,-0.16262761,0.19058083,0.45760906,-0.37183845],[0.061266888,0.49422592,-2.2183287,-0.2156109,-0.4867127,-0.22925144,0.71946245,-0.42894575,-0.5862933,-0.4373623,1.1160414,0.12841341,-0.36759555,0.023551682,0.07593063,0.50553346,0.03556044,-0.25252578],[0.74545926,-0.32704693,-0.008650265,0.02720982,-0.01538259,-0.82613665,0.5189707,0.14880055,0.040636804,0.12673292,-0.19592556,-0.262724,-0.07316436,0.3629183,0.25224432,-0.09442609,0.19599767,-0.1895605],[0.008984444,-0.8195131,-0.0010790422,0.45667002,0.27273402,-0.70226806,0.18335287,0.106715776,-0.11851017,0.8999131,-0.59194285,-0.27304903,-0.5033789,0.045519818,-0.23001073,0.25903532,0.51413286,-0.51565295]],"activation":"σ"},{"dense_2_W":[[-0.17816369,-0.4823508,-0.19070831,0.3857896,-0.5818765,-0.5350052,-0.750577],[-0.04763508,-0.32846496,-0.28990135,-0.5891694,-0.40825295,0.6042029,0.80569786],[-0.31981805,-0.048176482,-0.6725098,-0.0116866045,-0.7275763,-0.6111508,-0.5524373],[0.8248028,-3.5739028,0.45623106,-1.4498163,0.16980822,-0.20465934,1.124565],[-0.43001968,0.0030000166,-0.078488536,0.76254296,-0.45105755,-0.65158,0.25315326],[0.28314695,-0.2640387,-0.010856731,0.6712196,-0.42694327,-0.7123847,-0.51776206],[-0.08497496,-0.2769552,0.3038657,-1.5984288,-0.94830346,0.76130813,-0.5299745],[-0.13139525,-0.14840417,0.13429053,-0.9094941,0.006232065,-0.209775,0.01644083],[-0.27333236,0.36955395,0.06687941,0.8257492,-0.4901239,-0.8291871,-0.66357756],[-0.25540715,-0.4607236,-0.46596804,-0.80555916,0.07256802,0.75021,0.38117334],[-0.47401762,-0.25782427,-0.48962656,-0.95336634,0.078216136,0.7174792,-0.33049294],[0.53245556,-3.517823,-0.40500528,-1.7386801,2.6048553,-1.0151122,0.45161602],[-0.25264537,-0.55914116,-0.60352135,-0.4744699,0.39310023,0.123256855,0.5423338]],"activation":"σ","dense_2_b":[[0.02130018],[0.03923013],[0.0066096364],[-0.10651471],[-0.02452014],[-0.026465867],[-0.19940089],[-0.33655235],[-0.008171532],[0.14014752],[-0.24019146],[-0.028391115],[-0.08230956]]},{"dense_3_W":[[-0.69569725,0.45874256,-0.28139538,-0.15990418,0.33506617,-0.048326474,0.42024234,0.12925243,-0.30243614,0.646346,-0.046070546,0.755795,-0.38833755],[0.27728352,-0.4111872,0.5240284,-0.023659706,0.40603057,0.42206782,0.19779211,0.20356862,0.623484,-0.61507636,-0.103538364,-0.3267671,-0.52325946],[-0.10045345,0.4899018,-0.33766255,0.53569114,-0.43111655,-0.3958533,0.6952763,0.29030153,-0.5106717,0.21320766,0.12684761,-0.031848744,-0.15174294]],"activation":"identity","dense_3_b":[[-0.1256119],[0.056057606],[-0.06149789]]},{"dense_4_W":[[-0.4201209,0.91140276,-0.7814627]],"dense_4_b":[[0.059609402]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G600'.json b/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G600'.json deleted file mode 100755 index f5a288fa5c..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567T600G600'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.978942],[0.6101572],[0.41588354],[0.03231331],[0.60168684],[0.6050097],[0.60834473],[0.58961505],[0.57773924],[0.56671244],[0.5566466],[0.032140717],[0.032189563],[0.032246154],[0.032141175],[0.0321322],[0.032021564],[0.031848647]],"model_test_loss":0.011636423878371716,"input_size":18,"current_date_and_time":"2023-08-10_10-11-28","input_mean":[[19.614794],[-0.106306285],[0.01432459],[-0.024576934],[-0.10741898],[-0.106938824],[-0.106123485],[-0.099019445],[-0.093359515],[-0.09050246],[-0.08906652],[-0.024685377],[-0.02465698],[-0.024623092],[-0.024553658],[-0.024545813],[-0.02454542],[-0.02470256]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.69355416],[2.4732628],[-1.3702826],[-0.11549802],[-3.2115526],[-0.4695894],[1.7158915]],"dense_1_W":[[-0.09712236,0.70359236,0.029870417,-0.32686847,0.41420302,1.2504632,-0.16431941,1.2449944,0.8515324,0.1591466,-0.47704843,0.42924815,-0.3310643,-0.32485127,0.4103194,0.14313804,0.27483824,-0.3073054],[1.9112779,-2.012766,1.1709712,-0.12909168,0.92364335,1.5146329,-1.5916656,0.3833729,0.68214667,0.8704969,-0.7785849,0.20670438,-0.0054348283,-0.6571034,0.59524465,0.25777373,-0.13047084,-0.13789715],[-0.35545897,0.74289757,0.0010395766,-0.4791203,-0.17787026,0.69020367,-0.2601107,0.35769174,0.03863855,-0.17375207,0.06826012,0.4671819,0.2501633,-0.30800718,-0.009430912,-0.123984225,-0.17020024,0.27680448],[-0.012191877,-0.46145502,3.9199607,0.20028035,0.6080922,1.1058863,-1.2070769,1.5072201,0.40595236,0.57759535,-1.5408669,0.43732843,-0.37236336,-0.17954569,-0.64967644,-0.065201126,0.5412813,-0.12528999],[-2.0663908,-1.4909488,1.3023357,-0.53967714,0.24725075,1.0423123,-0.69051623,0.5551958,0.6623838,0.41527644,-0.6491754,0.6272475,-0.13575684,-0.4233404,-0.0887856,0.60994846,0.2752093,-0.32854816],[-0.28226903,-1.5632701,0.038757235,-0.01621774,1.8377037,-0.7989218,0.74388874,2.3336496,0.76146716,0.1356443,-0.5690615,-0.30151263,-0.21605678,0.47128358,0.29254648,0.062264904,0.07035633,-0.18515895],[0.56221074,1.1516801,0.0010512201,-0.8426568,-1.0685285,1.9994211,-0.8278666,0.5958917,0.074260615,-0.4739713,0.17006992,0.6652615,0.05565689,-0.0064310133,-0.0893498,-0.17889997,0.13203734,0.14932431]],"activation":"σ"},{"dense_2_W":[[0.50028837,-1.064031,0.90041625,0.47736132,0.90677744,-0.90660274,0.13473313],[0.5786526,-0.17570329,1.1356779,-0.316433,-0.18528749,0.074578024,0.07604858],[-0.5514635,0.12420603,-0.9303746,0.07806514,0.043209217,0.44727743,-0.3354667],[-0.97645247,-0.8832375,0.33142787,-0.8761601,0.562086,0.28258607,-0.7472652],[-0.012420426,0.10160729,0.9597554,-0.54730177,0.92053396,-0.76612854,0.1645351],[-0.05629443,-0.6274549,-0.5702288,-0.47625864,0.007329011,-0.00937992,-0.27663508],[-0.39911163,-0.47183767,-0.26182827,-0.5910186,0.24520285,0.8801795,-0.7366388],[1.183774,0.38708115,0.95070434,-0.27969792,-0.647032,-0.06648758,0.63079244],[-0.92506593,-0.43120384,-1.1437249,0.3507138,0.048965972,0.2929897,0.023275621],[0.065495975,-0.7477936,-0.49741834,-0.43279028,-0.4596529,0.5749685,0.10943722],[-0.26667404,0.1566403,-0.56995285,0.18439355,0.006458198,0.0508498,-0.6114961],[0.07948333,0.6847074,-0.94002885,0.18541375,-0.5421211,0.40665948,-0.54692215],[-0.45402494,0.73848003,-0.42449367,1.1125244,1.3159411,-0.5954729,-0.3588103]],"activation":"σ","dense_2_b":[[-0.6029877],[-0.059801936],[0.04953782],[0.036911793],[-0.211757],[0.055112183],[0.07609173],[-0.14383955],[-0.064524055],[-0.18153428],[-0.24345446],[-0.07112296],[-0.13606189]]},{"dense_3_W":[[0.014554647,0.094213516,-0.67582,-0.6185381,0.2408976,-0.10117373,-0.69420695,0.073527485,-0.32116425,0.22428901,-0.08845355,-0.14691015,0.21477464],[-0.8124889,-0.4184272,0.58543867,0.62858254,-0.21226135,0.3507662,0.030289248,-0.5906286,0.029745838,0.5918081,0.020885047,0.24012372,-0.18108715],[-0.5155024,-0.053247117,0.26342782,-0.14311959,-0.32982498,0.58627313,0.5567257,-0.2194575,0.4445848,-0.44104552,0.24620505,0.69306016,-0.55217963]],"activation":"identity","dense_3_b":[[0.059930358],[-0.027894666],[0.031020114]]},{"dense_4_W":[[1.1718056,-0.8948126,-0.15244067]],"dense_4_b":[[0.05171624]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521T00403A1'.json b/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521T00403A1'.json deleted file mode 100755 index 011cf806ea..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521T00403A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[10.092253],[0.8257708],[0.45484608],[0.028356912],[0.8140217],[0.81918985],[0.82255614],[0.8102244],[0.7955667],[0.77078706],[0.7444314],[0.028424477],[0.028405886],[0.028365526],[0.02817091],[0.028066315],[0.02797186],[0.027903816]],"model_test_loss":0.008641937747597694,"input_size":18,"current_date_and_time":"2023-08-10_11-28-48","input_mean":[[22.111403],[-0.020468052],[0.00260176],[0.017814223],[-0.019568035],[-0.019937012],[-0.02050278],[-0.017664416],[-0.015589151],[-0.013915732],[-0.0077555873],[0.017904663],[0.01790113],[0.017888824],[0.018040547],[0.01814623],[0.0184057],[0.01856536]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.8901903],[-0.7438429],[-0.6122344],[-0.2412558],[0.8543316],[-0.3185247],[1.8399776]],"dense_1_W":[[1.1625189,0.40039057,-0.0025008812,-0.41890216,0.16774665,1.3301513,-1.05835,-0.43560216,-0.29536605,-0.29428786,0.5059595,0.15214878,0.3311833,-0.1092579,-0.12995712,-0.2121695,-0.25328377,0.34366265],[-0.2108492,1.8213944,-0.0037650513,-0.4443187,-0.9336769,0.5478224,-0.17455208,-0.13268296,0.30928424,0.40694132,-0.46156526,0.110320315,0.2874757,0.1347806,0.08251065,-0.11447139,-0.15634517,0.11815532],[-0.39651474,0.2910717,-1.0581565,-0.39096954,-0.84142905,-0.6921981,1.3464824,-0.6867708,-0.22886333,0.3074725,-0.056309637,0.3235317,0.21882245,0.5208447,-0.23176116,-0.3196763,-0.3908853,0.4924444],[0.023868388,0.93133456,6.693503,0.1693899,-0.6633739,-0.0019848838,-0.81877935,0.98811,0.14710788,0.8430833,-0.9749285,-0.027155153,0.3262936,-0.36924264,-0.38995093,-0.27307773,0.2114907,0.10148348],[0.41686654,1.3670295,0.0021478476,0.057002787,-0.14275764,-0.056658525,0.024400754,-0.086303845,0.66810167,-0.03742678,-0.23496434,0.30531916,0.17594281,-0.22570042,-0.13516694,-0.38421035,0.20677494,0.019969082],[1.0289154,-0.64804214,-0.0014387759,0.42662656,0.14895122,-0.58820724,0.22127119,0.34592313,0.31323263,0.24369654,-0.36650044,0.03182343,0.10101775,-0.264594,0.10111715,-0.0765178,-0.1477554,0.11140398],[0.5695519,1.808156,-1.253366,0.49105036,-1.9823967,-1.4973999,2.9290652,-1.7067322,-0.6763123,0.7516668,-0.19734581,0.3499678,-0.111037284,-0.2012088,-0.07701846,-0.0106067145,-0.5977169,0.38696328]],"activation":"σ"},{"dense_2_W":[[0.012349895,-0.081942245,0.24179463,0.25615865,-0.3466578,0.20768717,0.20456062],[-0.34042543,-0.95279694,0.40695366,-0.15362829,-0.15595287,0.58774436,0.04863392],[1.3811588,1.5968466,-1.302473,0.5022756,1.007051,0.15855049,-0.41123948],[0.5894904,0.29552183,-0.088070914,-0.05923328,0.14361995,-0.48715538,-0.15394852],[0.6696779,0.8154732,0.08090532,-0.067599624,0.30964845,-0.4651497,-0.98328984],[1.048996,1.7286566,-0.8740424,0.68472356,0.6781938,-1.3097667,-0.841068],[-0.5152714,-0.8245123,0.51846474,-0.19924398,-0.9657816,-0.46467522,-0.2969826],[0.5162466,-1.3718777,-0.81976885,0.5777913,-1.1951425,0.52725565,-1.5065942],[-0.6157756,-0.64146185,0.28268078,0.11798595,-0.19853584,0.59471726,0.19424395],[-0.51709485,-0.27288422,0.44598293,-0.50114965,-0.4821885,0.1842942,-0.13447413],[0.30716494,0.5455412,0.2820038,0.42298153,-0.16316639,-0.67882645,-0.80919987],[0.20057538,-0.6075936,0.021517077,0.0058594905,-0.4455176,0.8283304,-0.04153079],[-0.5672435,-0.55653644,0.9335801,-1.064612,-0.98080814,-1.6662495,-0.7125999]],"activation":"σ","dense_2_b":[[-0.04758697],[0.103950314],[-0.21034029],[-0.1759661],[-0.14534564],[-0.4014301],[-0.07821672],[-0.34081164],[-0.09482991],[-0.00027300368],[-0.3289372],[0.22015864],[-0.12635086]]},{"dense_3_W":[[0.08841069,-0.7012008,-0.27067128,-0.22566004,0.42384112,0.537129,0.3303587,-0.202971,-0.10006057,0.25611818,0.3373171,-0.31684256,0.22898418],[-0.20768598,0.04598255,0.601375,0.29420632,0.33671921,0.5732239,-0.68677086,-0.5184719,-0.42104113,-0.5277463,0.5918677,-0.5941145,-0.60128295],[0.22220895,-0.21446738,-0.119648,-0.22185299,0.34326845,0.40759936,-0.04515529,-0.16942169,-0.40177232,0.38087803,0.14435387,-0.41597226,-0.17067248]],"activation":"identity","dense_3_b":[[-0.03592224],[-0.03948418],[0.031077854]]},{"dense_4_W":[[0.37178338,0.77815956,0.08979673]],"dense_4_b":[[-0.04114462]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516A00604A1'.json b/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516A00604A1'.json deleted file mode 100755 index 3ce7297d91..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN b'xf1x875Q0909144R xf1x891061xf1x82x0516A00604A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.290525],[0.82917035],[0.45113942],[0.041450657],[0.808434],[0.81629485],[0.82408255],[0.80830437],[0.795252],[0.78207934],[0.75818783],[0.041417964],[0.04143028],[0.041436702],[0.04143413],[0.041470982],[0.041412164],[0.041415334]],"model_test_loss":0.009140637703239918,"input_size":18,"current_date_and_time":"2023-08-10_11-55-29","input_mean":[[21.323723],[0.03325226],[-0.0033735863],[-0.0014594422],[0.031559683],[0.031856444],[0.03170563],[0.030355902],[0.029319406],[0.029543923],[0.028728634],[-0.0014694724],[-0.0014749364],[-0.0014824574],[-0.0015196581],[-0.0014603077],[-0.0013572131],[-0.001339693]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.56922615],[0.041300163],[-1.254721],[-0.03413835],[-1.6554084],[-0.17410408],[-0.61522776]],"dense_1_W":[[1.0540022,0.32624736,-0.00025852903,-0.04124151,0.22274004,1.4750109,-1.0787313,-0.99540067,-0.21925406,0.2080301,0.2912927,-0.14616714,-0.25007066,0.20059223,-0.13467374,-0.0125623,-0.09478596,0.01950804],[-0.009923938,-0.8645872,-7.849316,0.710686,0.36944547,0.15362212,0.93729883,0.06761643,-0.86989343,-0.44896173,0.77435964,-0.17029198,-0.030723508,-0.21656048,-0.28410506,-0.06316728,0.2806839,-0.2605462],[-0.22319421,1.3061746,-0.0011745724,0.087363705,-0.25787622,0.4865888,-0.5896333,0.6109107,-0.22302917,-0.10719543,0.017179906,0.39940724,-0.05673451,0.004958241,-0.6851484,0.37105274,-0.19090329,0.16849352],[-0.00035891216,-0.08626613,0.7303526,-0.68880993,0.22034171,0.9209459,-0.9556948,0.24309121,0.3545939,-0.0061660036,-0.62081426,0.31249496,0.24340105,-0.7395673,0.9197471,0.015660668,0.32094327,-0.3404047],[-0.28631234,-1.2720017,0.0011188913,-0.2188701,0.4519371,-0.4818437,0.28755167,-0.6112673,0.016787104,0.31543645,-0.056267515,-0.013484296,-0.31466198,-0.011283184,0.7387095,-0.08435522,-0.17678128,-0.018290224],[0.0018439082,-2.029053,0.008057842,0.5382048,0.2763366,-0.38902655,0.37340102,-0.40996662,-0.72045624,-0.2956851,0.42397067,0.25387588,-0.2772578,0.2145016,0.18141706,0.32736105,-0.10156828,0.018716993],[1.0636653,0.48715422,-0.0015376196,0.06604384,0.097244695,-1.8101829,0.46069503,0.8842625,0.013887742,-0.037064083,-0.32184562,-0.029657703,-0.070020884,0.14429364,-0.09371257,0.57893306,0.1488897,-0.2923841]],"activation":"σ"},{"dense_2_W":[[0.7879515,-0.46467248,1.0794638,0.7671335,-0.037539307,-0.652591,-0.44380203],[0.33411276,-0.23360157,0.31899008,0.79018146,-0.8197005,-0.58276,-0.74289805],[0.024688005,-0.13412961,-0.04840187,-0.8028189,0.66260815,0.03016398,0.039253287],[-0.018770358,-0.40480068,-0.46193084,-0.3494696,0.14812449,-0.6306497,-0.5127451],[-0.16712199,0.83740616,0.36462277,-0.13354221,-0.23577684,0.30791536,-0.43564942],[0.6434626,-0.8392937,1.6532009,0.7021095,-1.2320117,-1.1602876,-0.48219097],[0.6646111,0.21732892,0.49050468,-0.043008015,0.15137905,-0.48478547,-0.7212236],[0.11034068,-0.25311738,0.92781943,0.45044476,-0.9269697,-0.19231662,-0.4140086],[-0.7476244,-1.0192593,-0.04007068,0.5831176,-0.26690418,0.002005247,-1.3112344],[-0.5888374,0.08341635,-0.115199275,-0.922099,0.46274543,-0.19802791,-0.35727945],[-0.46942028,-0.17014697,-0.69315624,-0.0143117765,0.60911614,-0.15416178,0.62788534],[-0.84331405,0.302827,-0.99390453,-0.7173678,0.94187963,0.43155667,0.8959295],[-0.7744463,0.28774765,-1.1058409,-0.44697827,1.1843737,0.58229053,0.52381843]],"activation":"σ","dense_2_b":[[-0.0032762832],[0.09442419],[-0.22760114],[-0.14811619],[-0.021788245],[0.3878685],[-0.08048255],[-0.012592701],[-0.31711572],[-0.11638991],[0.0040142215],[0.04542833],[-0.013753473]]},{"dense_3_W":[[0.28196597,0.22568545,-0.030387998,-0.18586706,-0.16660844,0.5718057,0.15152381,0.44033635,0.2491916,-0.37710536,-0.65969247,-0.5834342,-0.57187986],[-0.628642,-0.025283614,-0.596149,0.47220096,-0.15986364,0.097276665,0.09287301,-0.3092298,-0.31016326,0.29485568,0.55567294,0.20108289,0.51474637],[-0.26703876,-0.70533663,0.45624056,-0.48600736,-0.64598805,-0.038812235,-0.69938004,0.40345365,0.2961252,0.4420242,0.5804485,0.38022405,-0.23318103]],"activation":"identity","dense_3_b":[[0.049912658],[-0.018233176],[-0.024009932]]},{"dense_4_W":[[0.8335982,-0.14927465,-0.36007002]],"dense_4_b":[[0.041336924]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143K xf1x892033xf1x820514UZ070203'.json b/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143K xf1x892033xf1x820514UZ070203'.json deleted file mode 100755 index da7a4077ac..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143K xf1x892033xf1x820514UZ070203'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[11.043713],[0.70319986],[0.5343478],[0.026934588],[0.6932889],[0.6982947],[0.70214796],[0.6804861],[0.6649965],[0.6459059],[0.6288712],[0.02683069],[0.026860924],[0.026891591],[0.026939137],[0.026965177],[0.027052335],[0.027131638]],"model_test_loss":0.007857225835323334,"input_size":18,"current_date_and_time":"2023-08-10_12-47-08","input_mean":[[22.51676],[0.0007204448],[0.013955519],[-0.007230524],[-0.0025695318],[-0.0022219676],[-0.0015167582],[0.006477074],[0.012144769],[0.0140706785],[0.014874495],[-0.0073296432],[-0.007318436],[-0.007308196],[-0.0074638575],[-0.007604219],[-0.007796417],[-0.007880043]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.15176187],[1.7611258],[0.08499729],[1.2638843],[-1.0145266],[1.1479009],[0.019360576]],"dense_1_W":[[0.002253989,-3.1604483,2.767584,-0.8068704,2.3291543,2.6853511,-1.0791886,0.007758601,-0.49927247,0.57279307,-0.27753213,0.6716626,-0.06696021,-0.76052266,0.6966655,0.7008176,-0.40914094,-0.1446268],[0.7218885,1.6974216,0.0065495796,0.4848664,-0.38044524,0.9584917,-0.35017136,0.2935823,0.013307751,0.07913103,-0.08967284,0.17916568,-0.022755025,-0.45461747,-0.017031884,-0.22419493,-0.029785138,0.11329553],[-0.021195402,0.41831255,-0.006486072,-0.20005222,-0.044353534,1.5854481,-0.4566311,-0.5508707,0.0053089573,-0.73440605,0.7127015,0.0178563,0.105017535,-0.10557691,-0.08303766,-0.3148053,0.1120448,0.08851348],[1.0059944,-1.3769217,0.0028758708,-0.17301795,0.38417014,-0.8320218,-0.0021920572,0.05236675,-0.11604148,-0.010877651,0.017621847,-0.31199968,0.26072103,0.14645621,-0.060435038,0.23222387,-0.07030094,-0.048769366],[-0.59738463,-1.4774386,4.2301564,-0.6372516,0.28283474,0.29814866,-1.5950772,-0.37465736,-0.046396185,-0.23227905,0.2788923,0.43851766,-0.13952476,-0.1730685,0.5122576,0.09155205,0.22722334,-0.23425691],[1.9368905,-0.55235744,-0.030420046,0.088646464,-0.8423889,0.40580097,-1.086312,-0.1729247,0.11532571,-0.07618555,-0.12122231,0.14744973,0.014324671,-0.49680474,0.14322798,0.3056609,-0.1648101,-0.03914734],[-0.017226573,0.9975025,0.028348321,0.26694727,-1.7435403,0.6003638,-0.015127457,0.33234358,0.77899,0.36002707,-0.7812798,-0.110702105,0.4372163,0.062443327,-1.0144533,0.07515875,0.14223565,0.11260919]],"activation":"σ"},{"dense_2_W":[[-0.3708766,-0.09346849,-0.4860665,-0.28673357,-0.20471741,-0.3887301,-0.53816146],[-0.2870411,0.077891976,-0.7692872,0.46041366,-0.08263284,0.18123056,-0.50797004],[0.8342386,-0.045646798,0.4450974,-0.23703974,-0.12750176,0.7012232,-0.08630407],[0.08431561,-0.07679201,-0.581064,0.011516861,-0.7343563,-0.6116229,-0.34984374],[0.25569338,-0.5237751,-0.48068842,-0.102060966,0.28852814,0.32561827,-0.7739834],[0.17638424,-0.30714586,-0.8407769,0.7255838,0.32686406,0.014714416,-0.67529327],[0.15759718,-0.1990726,0.6290832,-0.42295182,-0.64416325,0.053911954,0.57387424],[-1.3421621,-1.2502698,0.12817562,-0.2831332,-0.016792206,-0.8235658,0.19831528],[-0.8367818,-1.409201,0.18254657,0.4927183,-0.25860602,-1.0264908,-0.50290155],[0.47554544,0.058592763,-0.0097552,-1.9191943,1.0258328,-0.8242871,0.45348266],[-1.2065568,-1.4047163,0.113010526,0.4773201,-0.4767762,-1.2966703,0.2312964],[-0.18884628,-0.058959916,-0.041673712,-0.5327593,0.11240756,0.10169141,-0.23927355],[0.22284397,-0.29184937,0.9790536,-1.3780024,-0.2994004,0.49964294,0.48355368]],"activation":"σ","dense_2_b":[[-0.22963583],[0.032741938],[-0.04570257],[-0.08706406],[-0.14223282],[0.05371619],[-0.34291068],[-0.20564795],[-0.061394084],[-0.5258954],[-0.060946673],[-0.1682708],[-0.30500868]]},{"dense_3_W":[[-0.109130874,0.1274272,0.13656163,-0.4027122,-0.4333919,-0.6936401,0.502236,-0.3675514,-0.7237411,0.4035158,-0.47524786,0.09295235,0.14962798],[-0.16585311,0.47740844,-0.37112427,0.06724968,-0.37363434,0.06406272,0.47516382,0.118478574,-0.022609822,0.2940244,-0.0018366133,-0.40694827,-0.63223433],[0.009586715,0.5517231,-0.34838903,0.078904286,-0.039595366,0.116432205,0.003195687,-0.17880835,0.5144741,-0.46928853,0.36233348,0.4112465,-0.08295281]],"activation":"identity","dense_3_b":[[0.073130004],[-0.049100634],[-0.073537566]]},{"dense_4_W":[[1.1643018,-0.47747687,-0.8026266]],"dense_4_b":[[0.068460904]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143M xf1x892041xf1x820522UZ070303'.json b/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143M xf1x892041xf1x820522UZ070303'.json deleted file mode 100755 index 97f7731e2e..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0909143M xf1x892041xf1x820522UZ070303'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[10.427667],[0.83860636],[0.42204696],[0.03361851],[0.81973565],[0.825077],[0.8310441],[0.83052015],[0.8284627],[0.8263309],[0.8187787],[0.033480283],[0.03350828],[0.03353586],[0.033594076],[0.0336516],[0.033648238],[0.033631567]],"model_test_loss":0.008597739972174168,"input_size":18,"current_date_and_time":"2023-08-10_13-12-36","input_mean":[[25.706522],[0.050851874],[-0.010751898],[0.01802959],[0.054632157],[0.05350465],[0.052438986],[0.04850811],[0.048906337],[0.046515435],[0.045032594],[0.018018972],[0.018040042],[0.018053347],[0.018092638],[0.018076882],[0.018033529],[0.018010886]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.2964697],[0.049180523],[-3.1576617],[0.118301444],[-0.61603487],[0.25273886],[-0.07330951]],"dense_1_W":[[0.89546925,0.7464279,0.35021314,0.22637925,-0.2754313,0.27137527,-0.031470492,0.33797157,0.21643418,0.26727158,-0.23981565,0.43944034,-0.3634637,-0.32961583,0.30687925,-0.18917838,-0.14749566,0.04560524],[0.0062736324,-0.26759228,-3.0462065,0.030409567,-0.7790592,-0.9642961,0.74581957,0.029767705,-0.2603852,0.43679196,0.83964103,-0.31235635,0.11810286,-0.33990052,0.35530522,0.512531,-0.19636977,-0.21697098],[-1.2924967,1.5836774,0.49238458,0.17067905,-0.25315788,0.8040949,-1.3140789,0.90885764,0.10285396,0.12174135,-0.1821378,-0.03410296,-0.02985042,-0.05142844,-0.092534445,0.31806526,-0.14324093,-0.14495374],[-0.0056716613,-0.20092379,0.015451282,-0.03791514,0.30047786,-0.6232725,0.5658962,0.2011616,-0.2557471,-0.06808377,-0.20146759,-0.44247743,-0.28945133,0.34938657,0.24206486,-0.2013541,0.4648372,0.19353375],[-0.05128189,0.67123437,0.06952555,-0.0042294925,-0.14324088,0.27791318,-0.5421431,0.23997568,0.13052511,0.08122149,-0.13987608,-0.022714188,0.032299228,-0.37737137,0.39930877,0.19679675,-0.15827186,-0.10318431],[-0.019568905,-0.0607303,0.0130618,0.12254651,0.45252982,0.62943685,-0.3645628,-0.24168354,-0.5303252,-0.24557371,-0.016784955,-0.15041395,-0.44035485,0.090951286,-0.45376906,0.050149996,0.75379664,0.5303551],[0.0017316106,0.90743756,-0.00965252,-0.23193015,-0.2623223,0.7361792,-0.38086128,0.18679944,-0.03619202,-0.030559268,0.008687389,-0.06500352,-0.14568505,0.24354985,0.37842107,-0.5658337,0.10926247,0.07731545]],"activation":"σ"},{"dense_2_W":[[-0.39177263,-0.18800414,-0.20788462,0.11247796,-0.22365552,-0.31875002,-0.5684635],[-0.40389916,-0.6881541,0.6079956,-1.2894017,0.4109726,0.6156602,0.94629717],[-0.7998929,-0.7778953,-0.44944042,-0.64266866,-0.12719534,-0.47801676,-0.39805946],[-0.5706913,0.22585051,0.16944969,-0.791522,0.31455386,-0.68588865,0.5746767],[-0.30519763,0.1677756,-0.25193778,0.90596414,-0.032425787,-0.3528361,-0.6918698],[0.21673183,0.024453318,0.1322771,-0.5855296,0.33343047,0.44287738,0.5721365],[-0.5699235,0.2542559,-0.35358787,0.50997967,-0.2712492,-0.5551658,-0.40215912],[0.2629367,-0.16355118,0.033490267,-0.13413614,0.5478591,-0.032118343,0.912505],[-0.36946553,-0.42410433,-0.52718824,-0.29544082,-0.79523194,-0.59584975,0.060524564],[-0.87224454,0.47336072,0.19169393,0.46603736,-0.86350787,-0.010868162,-0.6611907],[-0.67190355,0.14076924,-0.05090652,0.82290465,-0.009441278,-0.669959,-0.41791293],[0.21663819,-0.7003845,-0.1493456,0.60176605,-0.48739564,-0.47414222,-0.7249381],[-0.7122426,0.54805565,0.38896307,0.3285942,-0.112064436,-0.25502503,-1.1255239]],"activation":"σ","dense_2_b":[[0.03228759],[-0.33656517],[-0.34582642],[-0.14028646],[0.08078773],[-0.21520647],[0.10405124],[-0.26432717],[-0.13297138],[-0.03255631],[0.012594238],[0.13707925],[-0.05311798]]},{"dense_3_W":[[0.3323226,-1.0349873,0.16582553,-0.26558918,0.5585341,-0.50477654,0.5019021,-0.44945425,0.1489514,0.6722085,0.6043886,0.6088044,0.074028775],[0.32264686,0.2705527,0.6175214,-0.29842913,-0.061648432,0.5753947,-0.5904476,0.5447954,-0.03628221,-0.34314078,0.0864569,-0.61685383,-0.45528167],[0.63654476,-0.5604362,-0.044634674,0.42495975,0.19226094,-0.08704097,-0.45119545,-0.30201146,-0.48162442,0.5252597,-0.18146215,0.050959926,0.21880749]],"activation":"identity","dense_3_b":[[-0.0937596],[0.03815688],[0.062478464]]},{"dense_4_W":[[-1.019849,0.32047084,-0.07043468]],"dense_4_b":[[0.074612744]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070600'.json b/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070600'.json deleted file mode 100755 index 4e379cc35c..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070600'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.5485353],[0.842432],[0.47768155],[0.04491059],[0.8398388],[0.84115833],[0.841805],[0.82316613],[0.80845445],[0.7870207],[0.7709587],[0.044732787],[0.04478789],[0.044834975],[0.044941053],[0.04496564],[0.04483491],[0.04457904]],"model_test_loss":0.006399661768227816,"input_size":18,"current_date_and_time":"2023-08-10_14-01-50","input_mean":[[18.00953],[0.099562876],[0.011085797],[0.0136965355],[0.093436636],[0.09476455],[0.09581153],[0.100991],[0.10254183],[0.103215754],[0.09966734],[0.013582862],[0.013622751],[0.013662026],[0.013673613],[0.013685121],[0.013669784],[0.013470834]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.15596858],[0.4892694],[-2.485747],[-0.9076746],[-2.5210748],[0.62608117],[-0.12859546]],"dense_1_W":[[0.06842267,-0.8856152,-6.732937,0.19605958,0.741428,0.17544515,0.8053877,-0.35061014,-0.9764092,0.036799543,0.6009394,-0.6558462,0.35444188,-0.045649398,-0.06968357,0.21508473,0.2215049,-0.29990086],[-0.05740703,2.9165752,-0.005158554,0.15602402,0.39699048,0.5971187,-0.41904238,1.342937,1.2498165,0.20092702,-0.7303743,0.651644,0.032748777,0.0769538,-0.3169141,-0.06470094,-0.28091532,0.12019054],[-1.1610528,-0.90291053,-0.31168118,0.055444643,0.44807604,-0.53198224,0.92507297,-0.8764255,-0.11257939,-0.023954267,0.044729616,-0.0076007335,-0.1563039,0.1664793,0.21945952,-0.2034357,0.105529465,-0.06975108],[0.7200636,0.8466922,-0.007632461,0.033045746,0.05856158,1.3452346,-1.1502894,-0.12675957,-0.031347644,0.048609737,0.10773478,-0.09310796,-0.0042046523,0.009717507,-0.48196545,0.12704822,-0.033978984,-0.037001982],[-1.2062674,0.9051149,0.32335874,-0.1533066,-0.51617926,1.020792,-1.4042579,0.9042442,0.25317815,-0.05583252,-0.03010343,0.20175298,0.094550155,-0.16070417,-0.47876874,0.32050544,0.077573724,-0.015020535],[-0.7045055,0.2921713,0.0013640912,0.19007114,0.12720339,1.0896366,-0.5078957,-0.07863772,-0.027926547,0.21197884,0.007679035,0.08988427,-0.16537076,0.047214698,-0.45457175,-0.35825354,0.05781769,0.10457059],[-0.00158783,-0.2575547,1.3867532,-0.40103778,0.7387132,0.89181244,-0.06297082,0.24265654,0.16146004,-0.4570955,-0.37828583,0.21716939,-0.32538953,0.059181254,-0.2786397,0.0642267,-0.0045156525,0.13521087]],"activation":"σ"},{"dense_2_W":[[-0.054360803,-0.93450505,1.1069156,-0.25341234,-0.6672028,-0.56871617,0.46180332],[0.66834545,0.311226,0.92539716,-0.7637285,-1.0001141,-0.04506302,-0.79037106],[-0.336666,0.43282512,0.5231884,-0.33170068,-0.5402114,-0.67988545,-0.52936053],[-0.32985738,0.09310308,0.2807457,0.7175757,0.3434783,-0.054528777,0.14698726],[-0.9319756,0.55159384,-0.94562346,1.0089458,1.0009207,0.78610414,-0.39165795],[-0.24430718,-0.17523226,-0.21583228,-0.25136957,0.7013932,-0.1965411,0.6438836],[-0.7124287,-1.5932802,0.37554362,-0.114048585,0.643049,-0.22720207,-0.061459664],[0.72168005,-0.4816915,0.06136277,-0.7875475,0.35240883,-0.42538184,-0.2659062],[0.26363212,-0.8677782,0.10591171,0.32766673,-0.31068003,-0.60304576,-0.44430232],[-0.5729361,0.18546028,-0.095558025,-0.46766767,-0.7543451,-0.78625745,0.0124949105],[-1.4273218,0.6574617,-1.3855623,0.2680664,-0.93055564,-1.384056,0.09248577],[-0.146575,0.10351455,0.07099619,0.09571776,-0.004123669,0.1455809,-0.22726196],[-0.46773708,0.4945239,-1.1005019,0.59550714,-0.406852,0.60328615,0.46037948]],"activation":"σ","dense_2_b":[[0.15551081],[0.063135676],[0.21190381],[-0.12186496],[-0.32130012],[-0.10350768],[-0.1497363],[0.13513808],[-0.3129862],[-0.019406611],[0.081084184],[-0.107219465],[-0.31931284]]},{"dense_3_W":[[0.038192756,0.90545493,0.22436228,-0.08363581,-0.95819527,-0.48104054,0.14439842,0.49872485,-0.52165586,0.4655063,0.96369386,0.08209213,-0.043807942],[0.24979138,0.046216443,-0.24985886,0.46128502,-0.14784333,0.29726094,-0.09796824,-0.37513828,-0.13519555,-0.10046912,-0.019793414,0.26303867,-0.32336316],[0.6733837,0.65772706,0.5991573,-0.2601565,-0.8885243,-0.5688783,0.6620791,0.56542003,0.17227326,0.053705327,0.33648482,-0.17200494,-0.6597408]],"activation":"identity","dense_3_b":[[0.020342646],[0.01258384],[-0.08370784]]},{"dense_4_W":[[-0.4212374,0.007912168,-0.6052606]],"dense_4_b":[[0.07501488]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070700'.json b/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070700'.json deleted file mode 100755 index b48d15badb..0000000000 --- a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567UZ070700'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[10.325298],[0.7057722],[0.47287977],[0.031460747],[0.6921104],[0.697218],[0.70135456],[0.69763875],[0.685733],[0.66782856],[0.6485855],[0.0315074],[0.031504214],[0.031491026],[0.03148004],[0.03150045],[0.03156164],[0.031616196]],"model_test_loss":0.006121247075498104,"input_size":18,"current_date_and_time":"2023-08-10_14-26-22","input_mean":[[22.306183],[0.0053800372],[-0.00795939],[0.0013631819],[0.009645737],[0.008109978],[0.007211559],[0.00485605],[0.001991116],[0.0019658916],[0.0011436291],[0.0012911396],[0.00132131],[0.0013504513],[0.0012909095],[0.0012066179],[0.0010719349],[0.000821153]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.037611403],[-0.039259925],[5.3037424],[-0.014289626],[-0.04116731],[-5.299878],[-0.047248736]],"dense_1_W":[[-0.0064652376,-0.86517066,0.009122232,0.64427334,0.60157204,-1.5649973,0.5922017,0.32393336,0.10592543,-0.10904223,-0.08311717,-0.41152525,-0.17221938,-0.024847839,-0.42303094,0.6325312,-0.20199557,-0.13121592],[-0.01127936,-0.17854609,3.2403448,0.4238691,-1.0125954,0.7522482,-0.7303807,0.5404295,1.1757061,0.29872945,-0.5916982,0.07851869,0.16200984,0.12478189,-0.49618125,-0.35802162,-0.44821835,0.57569295],[2.7688413,1.5677587,0.41038755,-0.33729497,0.1729276,-0.8542694,-2.1819742,1.2398255,1.4715692,0.047309943,-0.2706118,-0.24824658,-0.13942274,0.20966528,0.4355863,0.31434494,-0.293769,-0.07769441],[0.0036463365,-1.5028012,1.0467403,-0.26813957,0.76441354,1.4152889,-0.99150753,1.1589833,0.72802955,-0.70228565,-0.74011207,0.19401184,-0.1607593,-0.33000073,-0.08714993,0.64130986,-0.27448478,0.06201577],[-0.003765804,-0.2075825,-0.022305839,0.9898987,0.50378066,0.95337635,-0.22548404,-0.1336573,-0.58790505,-0.4490368,0.749273,0.13859859,-0.027452512,-0.61067677,-1.153898,-1.1776212,0.24113877,-0.27340102],[-2.7447796,1.9117345,0.4073564,-0.04775491,0.23204777,-0.51974696,-2.9568594,1.3113073,1.4277631,0.020979766,-0.2532327,-0.26606435,0.13057557,-0.30686697,0.4028711,0.3851677,-0.4117104,-0.023646714],[0.0020379785,-1.0273771,-0.0040772515,-0.15474853,0.40938514,-0.8294739,0.61741006,0.41521803,0.19431064,0.012701662,-0.14437585,-0.53484315,0.40445113,0.42614287,0.2149064,-0.33539692,-0.026481858,0.0847282]],"activation":"σ"},{"dense_2_W":[[-1.524189,0.9351632,0.55989957,0.6639257,-0.41399422,1.9353259,-2.080693],[0.4837269,-0.42052314,-0.016988551,0.26961946,-0.5820897,-0.113735415,0.6621344],[0.66784316,-0.18224554,-0.46350604,-0.24139507,-0.33972263,-0.10908334,0.46273032],[-0.25121573,-0.5433506,-0.3747119,-0.48113945,-0.6870209,-0.2597966,-0.6666107],[-1.5878243,0.8484644,1.6857767,0.8684603,-0.49275222,0.8885371,-1.6989545],[-0.37864903,0.1991398,1.0727624,-0.06963282,0.744443,0.0127678355,-1.0510542],[0.6948821,0.4031339,-0.4709602,0.024776852,-0.19349359,-0.61693877,0.6901456],[-0.16844974,0.34244663,0.2792154,-0.22678165,-0.009063555,-0.2205289,0.30833983],[-1.0003111,0.061680865,-0.22125538,-0.14785585,0.33567291,0.23772448,-0.49937972],[-0.25907272,-0.45068902,-0.4165561,0.371873,0.6574395,0.3054128,-0.3081276],[0.4063414,0.31216034,-0.351421,0.24184814,-0.48907033,0.2369533,0.18272556],[0.6680394,0.23359145,0.2988422,-0.13820608,-0.0924177,-0.6595436,0.7519552],[0.7290062,-0.29669526,-0.7187181,-0.4984251,0.33927912,-0.05567023,0.7271803]],"activation":"σ","dense_2_b":[[-0.2505063],[0.036255818],[0.03159872],[-0.22770797],[-0.0873118],[-0.06630587],[-0.048832744],[-0.07904234],[-0.22275046],[-0.08476886],[-0.0669902],[0.0096226],[0.07374443]]},{"dense_3_W":[[0.8759032,-0.59936947,-0.44472367,0.26480153,0.8450838,0.48954475,-0.5052384,0.16207619,0.013260613,0.43904993,-0.105288796,-0.16599573,-0.31243858],[0.14936896,-0.628315,0.2414504,-0.10917872,0.4430291,-0.35649955,0.22603549,-0.48412538,0.2549734,0.48249015,0.0134211285,-0.071542166,-0.37372112],[0.047143627,-0.08542679,0.6750787,0.18638729,-0.011972222,-0.2818068,-0.23235205,0.124561444,-0.23522471,-0.3220255,0.30383208,0.18026324,0.34829038]],"activation":"identity","dense_3_b":[[-0.031695265],[-0.013660732],[0.018769676]]},{"dense_4_W":[[0.80076545,0.24590294,-0.42213082]],"dense_4_b":[[-0.026628232]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SKODA KAROQ 1ST GEN.json b/selfdrive/car/torque_data/lat_models/SKODA_KAROQ_MK1.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SKODA KAROQ 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/SKODA_KAROQ_MK1.json diff --git a/selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN.json b/selfdrive/car/torque_data/lat_models/SKODA_KODIAQ_MK1.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SKODA KODIAQ 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/SKODA_KODIAQ_MK1.json diff --git a/selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN.json b/selfdrive/car/torque_data/lat_models/SKODA_OCTAVIA_MK3.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SKODA OCTAVIA 3RD GEN.json rename to selfdrive/car/torque_data/lat_models/SKODA_OCTAVIA_MK3.json diff --git a/selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN.json b/selfdrive/car/torque_data/lat_models/SKODA_SUPERB_MK3.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SKODA SUPERB 3RD GEN.json rename to selfdrive/car/torque_data/lat_models/SKODA_SUPERB_MK3.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x05xc0xd0x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x05xc0xd0x00'.json deleted file mode 100755 index 31b79abf84..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x05xc0xd0x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.7864456],[1.0675452],[0.44117737],[0.042466324],[1.0634382],[1.0641662],[1.0649238],[1.0489594],[1.0356928],[1.0174093],[0.9990636],[0.04239807],[0.042411074],[0.042412493],[0.042160373],[0.041902237],[0.04156318],[0.041192904]],"model_test_loss":0.006247136276215315,"input_size":18,"current_date_and_time":"2023-08-10_15-19-46","input_mean":[[22.789394],[-0.107057944],[-0.015220077],[0.0053075603],[-0.10096015],[-0.1036062],[-0.10646909],[-0.1105645],[-0.11274725],[-0.1129047],[-0.112440266],[0.0053247744],[0.0052974327],[0.0052765487],[0.005187726],[0.0051564705],[0.005072803],[0.005050624]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.22735131],[-1.1558822],[-2.4949677],[-0.028262757],[0.016046714],[0.46825287],[2.14808]],"dense_1_W":[[0.0063389866,1.1687455,5.6478443,-0.7739389,-0.37703404,-0.2977524,-0.35879293,-0.2989859,0.27854565,0.5250727,-0.5768838,0.437727,0.79303294,-0.25440294,0.015966117,-0.7346069,0.1822349,0.40839165],[3.5873764,-0.038363542,-0.49252892,0.88343006,-0.8263806,-1.0448018,0.35837594,-0.82923394,-0.2903959,-0.59976083,0.39708364,0.4991477,0.14932378,0.23114131,0.71492994,0.7446338,0.86800545,-0.10675554],[-0.71696925,0.589286,0.005141117,0.2558955,-0.15218897,0.56768674,-1.9735179,0.37540847,0.70758367,0.54208136,0.011372507,0.30521852,-0.07170634,-0.3685703,-0.17633998,-0.12821102,0.49403462,-0.28528726],[-0.0126111545,-0.25394174,-0.0476702,-0.051051825,0.15847693,-0.8556249,0.9062775,-0.35461852,0.08610974,-0.016350707,0.05444419,-0.021587849,-0.024609195,-0.041649777,0.2721636,0.11223671,-0.13007721,0.027287088],[-0.00082902284,-0.2895202,0.02292975,0.40938672,-0.5772713,-1.4159223,0.9096195,0.46552798,0.07192008,0.58374035,-0.7259645,-0.4192547,-0.119582735,-0.040364027,0.023777857,-0.099143706,0.07231984,0.05833065],[-0.034051787,-0.68221754,0.09880095,-0.083567955,-0.74208,-0.90698755,0.04928286,0.16156256,0.019495055,0.042218853,-0.28641602,0.051178593,0.26687574,0.46796858,0.46098933,-0.07269996,0.45891553,0.5021809],[0.66424364,0.45286804,-0.0005165507,0.2288496,-0.004017847,0.39797547,-1.7530091,0.4336208,0.41258094,0.72541785,-0.0085950075,-0.29211155,0.17102799,0.101752244,-0.20573312,0.25594547,-0.22377016,-0.008692318]],"activation":"σ"},{"dense_2_W":[[0.20325899,0.082790025,-0.64574623,0.5835337,0.2445456,0.39990926,-0.37031835],[-0.6524255,-0.44563344,0.23222709,0.45553765,0.0009599149,0.07084656,-0.40249822],[-0.42582795,-0.35526115,-0.41792208,0.71313417,0.48622853,0.42440364,0.124865286],[-0.42827517,-0.33303145,0.6030186,-0.6233551,-0.7089609,-0.19002749,0.98240393],[0.37648484,0.5340621,-0.075831234,-0.35439888,-0.05369259,-0.0852395,-0.5522382],[-0.18600848,-0.17840625,-0.13572167,-0.39332452,0.069297686,0.55391586,-0.56896216],[0.5372773,-0.42328098,0.46704698,-0.3903592,-0.31730473,-0.1323594,-0.15068243],[-0.025426986,0.27607596,-0.8116318,0.44459775,-0.039600827,0.2860532,0.21579745],[-0.34013402,0.61537576,-0.37449715,0.2465375,0.1431466,-0.20966384,-0.50743437],[-0.42331675,0.2752822,1.4675745,-0.7314219,-0.98570365,-0.13913184,0.50083154],[0.42013124,0.5378009,-0.11075335,-1.0205,-0.12323601,-0.10791454,1.2503781],[-0.46719682,-0.30131668,-0.7835209,-0.36901754,-0.74570584,-0.18500452,0.309284],[0.4626236,-0.17921384,0.23175037,-0.45361674,0.032451127,-0.29581988,0.68514556]],"activation":"σ","dense_2_b":[[-0.10602414],[-0.017100008],[0.040201504],[0.31925488],[-0.023480363],[-0.014836832],[-0.083288915],[-0.06903872],[0.040521644],[0.03449383],[0.06455035],[-0.22185017],[-0.065645464]]},{"dense_3_W":[[0.24577592,0.60105056,0.39954543,-0.2241492,-0.024554443,-0.15969503,-0.3220896,0.3241807,0.17859495,-0.5020777,-0.20332621,-0.26195568,-0.43355486],[0.14188491,-0.31661624,-0.65018225,0.34786117,-0.24704528,-0.57218057,0.3886062,-0.13966885,-0.6255838,-0.3665181,-0.27110517,-0.43634248,0.3648473],[0.2685311,-0.24588606,0.4600874,-0.6152837,0.44763306,0.503137,-0.21638398,-0.21211603,-0.17489356,0.066063605,-0.35907042,0.3705208,-0.39206743]],"activation":"identity","dense_3_b":[[0.03704233],[-0.009847877],[0.03596555]]},{"dense_4_W":[[-1.1007925,0.13783514,-0.4093285]],"dense_4_b":[[-0.037597723]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x85xc0xd0x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x85xc0xd0x00'.json deleted file mode 100755 index 868f130879..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x85xc0xd0x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.751917],[1.2651925],[0.6286032],[0.041758075],[1.251075],[1.2542156],[1.25788],[1.2476728],[1.2321731],[1.209085],[1.171815],[0.0416455],[0.04166907],[0.041675318],[0.041540235],[0.041331045],[0.0410227],[0.04076636]],"model_test_loss":0.010389542207121849,"input_size":18,"current_date_and_time":"2023-08-10_15-45-17","input_mean":[[21.811985],[-0.08200492],[-0.021123547],[-0.015392087],[-0.077132],[-0.07836754],[-0.07990758],[-0.08903278],[-0.09390533],[-0.0994351],[-0.09906808],[-0.015419691],[-0.015373937],[-0.015333388],[-0.015234815],[-0.01517176],[-0.015184814],[-0.015314578]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.112263665],[-0.2413684],[2.3331506],[-2.6163883],[-0.065890506],[-0.11267999],[0.2540324]],"dense_1_W":[[0.00082437333,-0.6100184,0.0085841585,0.19443965,-0.3853334,-1.0094393,0.54652345,0.4635451,0.41569796,-0.024827078,-0.35933343,0.013195037,-0.34806025,0.38918108,-0.2045975,-0.028205873,0.21251714,-0.14155327],[0.00052090845,-0.067986116,-0.0049952795,-0.17397985,0.19120865,-1.151794,1.4686754,-0.26064983,-0.37115577,-0.14031996,0.22627379,-0.61062306,-0.6003732,-0.08005905,0.6625579,0.27400896,0.2810858,0.22422503],[0.9736936,-0.2066802,-0.03221171,0.38892078,0.12595229,-0.78887135,1.7474787,-0.357525,-0.87113667,0.059320755,0.12783788,0.29396367,-0.33448485,-0.18315637,-0.08755342,-0.07393691,-0.20805165,0.19661658],[-0.8980642,-0.61740303,-0.036882922,0.014804519,0.0004633668,-0.56963277,2.2672677,-0.8473421,-0.7454484,0.14973474,0.15070617,0.14196523,-0.4790531,0.44873357,0.1199102,-0.23800696,-0.27427772,0.2604217],[-0.019455962,0.23203465,-0.00544805,-0.37386358,0.198604,0.39421222,-0.9399687,0.4006715,-0.18001914,0.28436452,-0.16559297,-0.27809414,-0.3476229,-0.23943123,-0.15492289,0.29176927,0.45100713,0.6297477],[0.00265877,-1.9257119,-5.770941,-0.015959108,0.91101694,0.2507323,0.9135306,0.027248167,-0.37422356,-0.42659408,0.31162933,0.048672486,-0.09029977,0.20116101,-0.2788187,0.54255015,0.17655331,-0.34923193],[-0.053368453,-0.32306084,-0.0011745194,0.14451449,-0.10494747,-1.0513184,1.6973016,-0.3520769,-0.08723632,0.20861532,-0.03754033,-0.12658818,-0.45617837,-0.53323764,0.17189239,0.19411314,0.18694821,0.41706687]],"activation":"σ"},{"dense_2_W":[[-0.6774667,0.12969257,-0.4430792,-0.91589767,0.04770356,-0.14245662,0.32101628],[-0.007977094,-0.35256377,-0.17704034,-0.63430905,0.16956906,-0.70034474,0.04581389],[-0.46165147,-0.62357444,0.17046474,-0.75571364,0.43287623,-0.30724007,0.1923109],[-0.6784181,-1.1244366,0.11541932,0.0015692321,0.3201062,0.22912836,-0.3314084],[0.7617433,-0.10211574,0.85646874,0.09638195,-0.3320897,0.5301404,-0.12944654],[0.035080303,0.9425994,1.1255182,0.170445,-0.9830605,0.28675708,0.19016503],[0.050772995,0.07033034,-0.7225591,-0.4550455,-0.16105704,-0.13258936,-0.5693541],[0.33667997,-0.61400133,-0.51990676,-0.64140576,-0.114089586,-0.42780593,-0.09286493],[0.5349278,-0.001589271,0.36740375,1.0545287,-0.42867026,-0.08572172,0.1694925],[-1.0343602,-0.7271993,-0.040044453,-0.6931338,0.5427271,0.71489084,-0.30788174],[0.13735534,-0.39718962,-0.597495,-0.44561583,0.53015804,-0.5777026,-0.35073844],[-0.53797716,-0.5482148,-0.20631851,0.100615636,0.21108344,-0.1866766,-0.27603066],[1.0084223,-0.13957444,0.24433044,0.6394643,-0.8311719,-0.009334607,0.5582453]],"activation":"σ","dense_2_b":[[-0.09939182],[0.068688095],[0.009566937],[0.011495638],[-0.106889665],[-0.24243665],[-0.026521178],[0.1317154],[-0.10032767],[0.08581992],[-0.01238223],[0.015781516],[-0.17793517]]},{"dense_3_W":[[0.4781185,0.3084316,0.08325544,0.04606733,0.08636447,-0.6786478,-0.35504982,0.59879106,-0.120570466,0.8481977,0.4478148,-0.3906098,-0.63914454],[0.3031589,0.25322372,0.5268686,-0.22374596,-0.1588417,-0.0013027226,0.19833587,-0.4039331,-0.48228812,0.23426887,-0.09250619,0.19117919,-0.26200604],[0.059065677,0.54438025,0.23591729,0.44685203,-0.76421094,-0.22385049,0.4203905,0.5741656,-0.51101667,0.6874898,0.39969978,0.64433825,-0.3296311]],"activation":"identity","dense_3_b":[[0.021213043],[-0.017086985],[-0.06297748]]},{"dense_4_W":[[0.25790158,0.11600269,1.2381012]],"dense_4_b":[[-0.05793729]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x95xc0xd0x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x95xc0xd0x00'.json deleted file mode 100755 index 591ebdc7f7..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019 b'x95xc0xd0x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9305706],[1.166364],[0.52697164],[0.04559408],[1.1611184],[1.1617836],[1.1621717],[1.1572268],[1.1512266],[1.1410046],[1.1271056],[0.045430746],[0.045456205],[0.045471754],[0.04538521],[0.045166407],[0.044751257],[0.044259742]],"model_test_loss":0.007159117143601179,"input_size":18,"current_date_and_time":"2023-08-10_16-11-18","input_mean":[[23.875044],[-0.04762809],[0.0020058034],[-0.0051164185],[-0.04738313],[-0.047682315],[-0.04707818],[-0.04922181],[-0.052050225],[-0.05241706],[-0.053604044],[-0.0052390727],[-0.005214684],[-0.005188381],[-0.0052186437],[-0.0052642184],[-0.005336835],[-0.005483444]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.30677524],[2.305386],[0.21258113],[0.0011374068],[-0.07798925],[0.13210933],[-2.2330644]],"dense_1_W":[[-0.9153392,-0.04457669,0.07580861,-0.14653037,-0.09173063,-1.0210644,0.28700185,0.2787717,-0.110930994,-0.22061832,0.031545375,0.21201925,-0.14316308,0.22535005,-0.13208093,0.47763622,-0.19806175,0.07550945],[1.408277,-0.8102327,0.07669226,-0.36992925,-0.10502352,1.4004408,-0.944446,0.52676916,0.45272207,-0.24533494,0.035849094,0.2495303,0.107555866,-0.19849469,-0.20219192,0.3377574,0.091887705,-0.09355204],[0.9365069,-0.6004133,0.073348165,0.15801865,-0.25915328,-0.8621952,0.9956089,0.10657743,-0.26742437,-0.09970222,0.07917549,-0.56488645,-0.07252198,0.6092978,0.18529537,0.062446173,0.21213096,-0.21162209],[-0.021605618,2.0233808,6.686231,-0.77553934,-1.7767231,-0.2691988,-0.54059815,-0.5960048,0.83274704,1.3160363,-0.8824629,0.47476387,0.31446755,0.564766,0.32654157,0.2584088,-0.60193515,-0.5081355],[0.0014130626,-0.53958946,-0.0328115,0.029045805,-0.032773897,-0.6771303,0.90978366,-0.1976198,0.17000276,0.09847352,-0.13980895,-0.6394955,-0.0060927877,0.14346723,0.3639303,0.4022752,0.04658495,-0.3556684],[0.035749156,-0.10624368,-0.104625024,0.035823658,0.20164482,-0.25137526,1.265547,-0.2905279,-0.5661436,-0.21419431,0.47792393,-0.30237326,-0.12908356,0.4366763,-0.18249804,-0.4698138,0.027572105,0.08708235],[-1.396587,0.15164146,0.07955495,0.8348063,-0.16462886,1.0165251,-1.172671,0.6484491,-0.2163863,-0.007840905,0.042114086,-0.29386994,-0.31274995,-0.1285774,-0.3331896,0.39886513,-0.12885635,-0.101650245]],"activation":"σ"},{"dense_2_W":[[0.38495073,-0.7412111,-0.22137684,-0.12030764,0.6368522,-0.06314703,0.03507243],[-0.6724593,0.739151,0.34064248,0.48897338,-0.50050086,-0.22222371,0.38529333],[0.44841364,0.03794733,-0.1467243,-0.20161211,-0.21433899,-0.43315327,-0.6118354],[0.06565437,0.23752235,-0.54241395,-0.19601826,-0.2867999,-0.1890192,0.41696703],[-0.27295426,0.30162266,0.6954773,-0.09653864,0.48812908,0.26977977,-0.4546936],[0.48944157,-0.61165446,-0.2726838,-0.39025265,0.26824158,0.44155118,0.23420909],[0.17367882,-0.1447462,0.5705062,0.11740234,0.38665462,0.3405028,0.37385175],[-0.4640401,-0.34844878,-0.520765,0.2933172,-0.23360184,0.06336928,-0.20476247],[-0.2682518,-0.2981224,-0.061291657,-0.15070377,0.4602456,-0.1752958,-0.35343117],[-0.4592221,1.1183828,-0.8640038,-0.4991326,-0.44832966,-0.2623515,1.0564609],[-0.045591548,0.03365201,-1.1687095,0.5368091,-0.6330926,-0.8546177,0.9726235],[-0.67239046,0.06492867,-0.5151909,0.16666827,-0.059304733,-0.17748602,0.7295886],[-0.17871682,0.7711487,-0.93309194,-0.24634744,-0.4780839,0.016693426,0.3126589]],"activation":"σ","dense_2_b":[[-0.0015952135],[0.012052551],[-0.010449206],[-0.044464882],[0.009422688],[-0.04994557],[-0.035012778],[-0.028600752],[0.016694155],[0.09361134],[-0.25293818],[-0.04506597],[-0.0031262708]]},{"dense_3_W":[[0.50088197,-0.45380923,-0.3447632,0.17479855,0.35610682,-0.29754344,0.29226437,0.40267113,0.3446978,0.15563208,-0.3483347,-0.6286209,-0.17550218],[0.4510917,-0.59041935,0.36655262,-0.30154505,0.49209,0.6228336,-0.18296722,-0.020777082,-0.10334578,-0.5006874,0.010148908,-0.52687216,-0.41658545],[0.39971578,-0.6320007,0.4202651,-0.58625245,0.6280199,0.34103268,0.25863847,-0.6293903,0.5739891,-0.46801668,-0.13070941,-0.01960773,-0.064851746]],"activation":"identity","dense_3_b":[[0.025732024],[0.02984865],[0.02392714]]},{"dense_4_W":[[-0.8745196,-0.8096158,-0.53739285]],"dense_4_b":[[-0.028630944]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019 b'x8dxc0x04x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019 b'x8dxc0x04x00'.json deleted file mode 100755 index 51e4706c5d..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019 b'x8dxc0x04x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.799702],[1.4022106],[0.64107347],[0.048644897],[1.3754585],[1.384525],[1.3930372],[1.3637297],[1.3325337],[1.3025023],[1.2634097],[0.048490796],[0.04852734],[0.048555136],[0.04845293],[0.04838427],[0.048089206],[0.047663692]],"model_test_loss":0.007386927027255297,"input_size":18,"current_date_and_time":"2023-08-10_17-31-57","input_mean":[[23.816095],[-0.049997237],[-0.007897631],[-0.0071165124],[-0.04356241],[-0.044834737],[-0.046383783],[-0.045705367],[-0.044091124],[-0.04704344],[-0.044948243],[-0.0070246058],[-0.007036013],[-0.007050358],[-0.0070076296],[-0.0069411667],[-0.006977052],[-0.007046174]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.11336769],[-0.1558763],[-1.490285],[-1.5598854],[0.012304846],[-0.022315644],[0.041771296]],"dense_1_W":[[-0.01977819,1.1443615,6.4567647,0.22709283,-0.07258762,0.1256894,-0.9979844,-0.84394026,0.93974406,0.6906267,-0.6703605,-0.016698701,-0.12463053,0.4582139,-0.46097878,-0.1382326,-0.07665762,0.016058486],[0.01751075,-0.39227998,-0.042306893,-0.06479078,0.2590678,-0.7885349,0.8643044,-0.05622104,-0.5792078,0.49931744,-0.1498453,-0.091571845,0.068086684,-0.16460074,0.20773992,0.28189114,0.20789368,-0.30530888],[-0.84948033,1.009252,0.011256742,0.33373848,-0.42635688,-0.50016934,1.3120202,-0.9743089,-0.8169875,0.0070605767,0.07339234,-0.13629174,0.34325087,0.7454428,-1.020692,-0.6009766,-0.16322955,0.5690257],[-0.859371,0.6779426,-0.011156044,0.24427465,0.21054544,0.41095948,-1.243871,0.14078836,-0.18485905,-0.18274853,0.53857833,-0.17150062,0.010126415,-0.39408815,0.18594584,0.07860817,0.14298649,-0.1758404],[0.0010954959,0.5071819,-0.020262098,-0.2741187,0.15675487,0.48042226,-1.1560334,0.25577885,0.18734348,0.319839,-0.3276146,0.15339972,0.06763019,0.24912529,0.19296181,-0.35772792,-0.030918041,-0.056021962],[-0.001659214,-0.41259018,0.10546883,-0.04128334,-0.57788277,-1.2264594,0.9491901,0.31587604,0.42403442,-0.46528783,0.21479684,0.2612383,-0.07516154,0.10787102,0.12550128,0.20215736,0.010438747,-0.26799598],[0.0069037564,0.071458444,-0.17135356,-0.15143572,-0.42506117,-0.14927572,1.4475372,-0.7957649,-0.09695476,0.09732733,0.068755925,-0.447942,-0.39005634,-0.47970626,1.3778332,0.15125123,-0.061111715,-0.27014065]],"activation":"σ"},{"dense_2_W":[[-0.5476857,-0.34267196,-1.1804522,0.9826078,1.2559764,-0.06669344,-0.59067243],[-0.19235519,-0.73507553,-0.07926594,0.89560527,0.74729407,-0.61155975,-0.7242012],[-0.48663774,0.7720404,0.10374275,-0.6260227,-0.17417191,0.4686119,0.6312232],[0.36561587,-0.15491518,-0.44031703,0.06942568,0.64594734,-0.4462405,-0.6349547],[0.7081136,-0.29506996,-0.83266884,0.122376084,0.75587255,-0.3350482,-0.2778585],[-0.6224533,-0.5645358,-1.0115622,0.89887905,1.4065654,-0.32766277,-0.39135978],[-0.4492619,0.03162113,0.52745104,-0.41767576,-0.13911435,-0.020886017,-0.009816406],[-0.5448073,0.91549146,0.68613285,-0.013575926,-0.29431057,-0.06598866,-0.16217463],[-0.3627731,0.41454732,0.17659637,-0.039793443,-0.50492966,0.6114329,-0.2755667],[0.0074237594,0.78070295,0.22676738,-0.37978444,-0.3925154,0.5993168,0.31498003],[-0.34473616,0.4788029,-0.111885466,-0.2417559,-0.39796054,0.3986806,0.7663913],[-0.5048224,-0.041392315,-0.69820964,0.1713349,0.7381618,-0.29876855,-0.30547982],[0.028930116,0.4292938,-0.051137988,0.08411418,-0.11514599,-0.39944056,-0.04911791]],"activation":"σ","dense_2_b":[[0.20303766],[0.14015818],[-0.08520703],[0.09250628],[0.23017566],[0.48661518],[-0.00044188643],[-0.06016225],[-0.007325745],[-0.18048085],[-0.02599478],[0.0058664232],[-0.022089954]]},{"dense_3_W":[[0.13350116,0.4653472,0.35548818,-0.19969355,-0.19666392,-0.36159652,-0.4205869,0.4367674,-0.4891205,-0.15468554,0.156333,-0.36591503,-0.24838057],[-0.0064647943,-0.10470988,-0.5210429,-0.100936055,-0.54979503,0.6029704,-0.3322796,-0.58332735,0.060819454,-0.060762953,0.5044272,0.4439412,0.33067426],[0.26523876,0.8024418,-0.5483982,0.41635954,0.6793265,0.5232535,-0.3263415,-0.4702453,-0.20712556,-0.50518614,-0.36013588,0.21646436,-0.09427801]],"activation":"identity","dense_3_b":[[0.0074690827],[0.029551204],[-0.025025982]]},{"dense_4_W":[[0.06027109,0.044870634,1.0522106]],"dense_4_b":[[-0.022553917]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'x8axc0x10x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'x8axc0x10x00'.json deleted file mode 100755 index bdf37fa0a6..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'x8axc0x10x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9070053],[1.0543791],[0.45644546],[0.04216511],[1.0496393],[1.0514421],[1.0525388],[1.0388994],[1.0230772],[0.9977821],[0.97294074],[0.042082436],[0.042079873],[0.042074014],[0.04191643],[0.0416697],[0.0412085],[0.04074361]],"model_test_loss":0.01961229182779789,"input_size":18,"current_date_and_time":"2023-08-10_18-47-37","input_mean":[[24.166582],[-0.028447185],[-0.004559452],[-0.0096051665],[-0.024261262],[-0.025696838],[-0.027025647],[-0.028589323],[-0.030067492],[-0.03444616],[-0.035814732],[-0.009534621],[-0.009544901],[-0.0095633445],[-0.009623893],[-0.009606267],[-0.009746497],[-0.009912363]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.7455199],[0.049996253],[-0.28023538],[-2.2060273],[-0.013816978],[-0.9874536],[-0.9019276]],"dense_1_W":[[0.6895121,0.5161322,0.14658317,0.11381423,0.1892214,1.7092749,-0.96651584,0.44850215,-0.0011632228,-0.042724244,0.15792367,0.5514578,-0.377292,-0.20945737,-0.76233065,0.012376638,0.07503095,0.03581266],[-0.6286081,-0.19999953,-0.26134518,0.40281624,0.025883766,1.6258272,-1.282856,0.15094246,-0.4982385,-0.14781019,-0.1479545,0.2354319,0.11133424,0.01337905,-0.27134678,0.36755842,-0.2766078,0.20018724],[0.01425971,0.12655693,0.027717352,0.25218877,-0.14888945,1.3863931,-0.58381855,0.119170696,-0.30655816,0.28394252,-0.028384114,0.28937957,0.11933416,-0.17924944,-0.5354822,-0.1023875,-0.112619705,0.23060223],[-0.70373154,0.21793373,0.15077697,0.2048877,0.536804,1.0242751,-0.6825991,0.6318776,0.21126975,-0.1301757,0.11066647,0.16537508,-0.13113236,0.008809388,-0.91487056,0.1511099,-0.20573723,0.17212375],[0.6260223,-0.82557577,0.2577335,0.09809156,-0.0992909,0.8572501,-0.7068254,0.11579019,0.9520398,-0.10346599,0.24801868,-0.04993002,0.1822422,-0.8884633,-0.5575527,0.70132893,0.013880684,-0.26569209],[-0.038469315,1.393094,4.8376126,-0.17993413,-2.8555899,-0.81073236,-1.82493,0.3075214,3.1346302,2.149397,-1.5296553,0.16216949,0.63347834,-0.16527048,-0.52531976,0.4832946,-0.8622477,0.4553706],[-0.0084891105,1.6197035,2.4590979,-0.13657339,-1.2173172,0.13232367,-0.9361693,0.3940753,0.5279083,0.7115164,-0.9698505,0.27118906,0.24368131,-0.12613261,0.07012018,-0.2520898,-0.77435726,0.66100776]],"activation":"σ"},{"dense_2_W":[[-0.3877504,-0.5656672,-1.2326187,-1.1548815,-0.2756651,0.68949634,0.3156601],[-0.086553685,0.083017066,-0.46457613,-0.06040094,-0.24278064,0.21467605,-0.820212],[-0.31367186,-0.38895422,0.5136481,0.54023415,0.13330653,0.1338129,0.4324519],[0.48387918,0.4686007,0.7549132,0.5443022,0.64290255,-0.3914411,-0.18872365],[-0.4481094,-0.3843902,-0.18481985,-0.12798713,0.0073901964,-0.8419567,0.07509202],[0.5552352,0.042670928,-0.77402955,-0.73152304,-0.43447974,0.11009675,-0.40836683],[-0.3615617,-0.56010073,-0.20947416,-0.66224504,-0.020653427,0.21728848,-0.3211307],[-1.4455059,-0.76313007,0.2822113,1.7159922,-0.5230928,-2.34454,-0.7053262],[0.5867471,0.043875463,0.29294136,0.05382179,0.34849784,0.6732012,-0.029372701],[0.23746303,-0.28121752,-0.6422261,-0.517458,0.11123861,-0.21673626,-0.02707978],[0.14627667,-0.5604455,-0.556298,-0.32100976,0.32297257,-0.35747936,0.035987776],[-0.28271908,0.46155292,0.36581132,0.38092643,0.5151189,-0.36064845,0.38086742],[-1.7228172,-0.6008753,-0.028210318,0.9336887,-0.7923858,-1.5424409,-1.1373487]],"activation":"σ","dense_2_b":[[0.3649016],[-0.28463706],[-0.18955103],[-0.0975359],[0.014972014],[0.19693135],[-0.20519742],[0.5246628],[-0.010990981],[0.14763328],[-0.051889963],[-0.065584496],[0.24132432]]},{"dense_3_W":[[-0.2141626,-0.5071306,0.47525346,-0.30042058,-0.13658617,0.33044663,-0.19224532,0.47024256,-0.43578166,-0.17088617,0.11608789,-0.46500286,-0.25973997],[-0.69258684,-0.4011068,0.47469568,0.40183055,-0.6213789,-0.5464064,-0.21653396,-0.016826013,0.18607092,-0.6653599,0.15087543,-0.011308093,-0.69397706],[-0.55069065,-0.4436314,0.4907695,0.59020114,-0.2770053,-0.10887845,-0.5752601,-1.0579756,0.44049686,-0.7758806,-0.5634297,0.25996745,-1.2285975]],"activation":"identity","dense_3_b":[[-0.0030500097],[0.016847884],[0.21006793]]},{"dense_4_W":[[-0.8614738,1.2687197,0.32792068]],"dense_4_b":[[0.007946701]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'zxc0x04x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'zxc0x04x00'.json deleted file mode 100755 index d738a84d5c..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019 b'zxc0x04x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.614999],[0.88142365],[0.4115542],[0.04286995],[0.8717417],[0.8741691],[0.8768661],[0.87092763],[0.86162114],[0.8471719],[0.83313096],[0.042673744],[0.04272682],[0.042776305],[0.04276147],[0.042682905],[0.042456076],[0.042026334]],"model_test_loss":0.020124401897192,"input_size":18,"current_date_and_time":"2023-08-10_20-02-36","input_mean":[[22.85947],[-0.016667789],[0.0068580806],[-0.012056368],[-0.020457769],[-0.019109555],[-0.018067708],[-0.017776748],[-0.018178418],[-0.018938173],[-0.020024292],[-0.011968072],[-0.011980279],[-0.011996548],[-0.012103643],[-0.01220858],[-0.012383698],[-0.012489372]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.08823245],[-1.1790096],[1.2441144],[-0.011465203],[1.0564277],[0.0697024],[-1.3683548]],"dense_1_W":[[0.0014331031,0.30712977,0.039872505,0.80071706,-0.06956878,-1.9827149,1.0480732,-0.021383282,0.005184354,0.0075036837,-0.20064104,-0.3831549,-0.048222806,-0.46527135,0.28325924,0.08959743,0.16869979,-0.19650029],[-0.47628394,1.0323036,0.0727205,-0.12824745,-0.03173074,0.8555501,-1.0978942,-0.3188049,-0.23511048,-0.108945906,0.25071257,-0.13640903,0.22402667,0.2394587,-0.2969934,-0.05407172,0.23281921,-0.08285842],[0.5358869,0.30272746,0.73764825,-0.47511554,-0.67684716,1.2363486,-0.9340444,-0.06546125,0.26209694,0.1302329,-0.31725046,-0.26148638,-0.084479555,0.05804304,0.812802,0.13063046,0.061406944,-0.28873906],[-0.006784061,-0.19369683,0.5173411,-0.14995524,0.69393647,-0.8419515,1.0821712,-0.57659614,-0.5480855,0.040282447,0.3126287,0.14098974,0.21859266,-0.27093312,0.17456277,-0.07563259,-0.03413685,0.0682818],[0.49518052,0.9090121,0.07206266,-0.07255221,-0.40314698,1.3829393,-1.300141,-0.10262215,-0.14204547,-0.16600157,0.189207,0.114158854,0.5331006,-0.039711166,-0.51919204,-0.41197154,0.16707423,0.21446657],[-0.010184907,2.5707195,4.8210435,-0.59082705,-2.13527,-0.02737542,-0.084925294,-1.5004889,1.5263844,0.82498163,-0.750615,0.46455646,0.5213816,0.3898705,-0.31170332,-1.3961885,0.08791534,0.6026678],[-0.604111,0.33238423,0.7429127,-0.4376858,-0.1869525,1.0722656,-1.3618989,0.13231814,0.12388613,-0.027485399,-0.14985481,0.01705928,-0.40608093,-0.46543834,1.1232054,0.62169623,0.074105,-0.5730497]],"activation":"σ"},{"dense_2_W":[[0.66628206,-0.3684147,0.29401556,0.33376765,-0.20291045,-0.43510544,-0.49534982],[0.3000001,-0.27556387,-0.4702806,-0.012585157,-0.4258327,0.33206144,-0.23892596],[0.4380561,-0.38661313,0.19346173,-0.010281955,-0.6983228,-0.7392101,0.36173314],[-0.90225124,0.7195273,0.5120532,-0.4113813,0.3908176,-0.19042808,0.5445649],[-2.0083435,0.1796547,0.53105164,-0.43887454,0.55858135,0.095837146,1.0666932],[0.94471526,-0.7361511,-0.3394616,0.5484322,0.21810979,-0.04098551,-0.55697936],[-0.17648907,-0.1659118,0.09883211,-0.019644987,0.09760398,-0.2444248,-0.23118357],[0.012475254,-0.2854982,0.77410185,-0.5734643,0.86467403,0.57916874,0.36548907],[0.21869864,-0.059679627,-0.8418387,-0.3505286,0.19995454,-0.18443146,-0.3518136],[0.733226,-0.8237715,0.11591505,0.12030088,-0.16572322,-0.29059696,0.033399917],[0.4081683,-0.40732962,-0.696102,0.46398422,-0.9380676,-0.117172115,0.06541085],[-0.636597,0.5673404,-0.18129148,-0.80558836,0.3210611,0.22610644,0.059019666],[-0.17355403,0.38050172,0.7130264,-0.49735093,0.6084085,0.47226894,-0.23599635]],"activation":"σ","dense_2_b":[[0.15390728],[-0.27060974],[0.051722474],[-0.18110798],[-0.45624837],[0.005322652],[-0.048935406],[-0.13153522],[-0.2941039],[0.02853757],[0.031165767],[-0.283588],[-0.11898526]]},{"dense_3_W":[[-0.6583376,-0.1158339,-0.5825397,0.38649017,0.6810171,-0.48431656,0.18096629,0.5144921,0.03614329,-0.6123482,-0.3714544,-0.12423297,0.5612449],[0.21774262,0.41141757,0.5053978,0.036839064,0.012879289,-0.01591902,-0.39873704,-0.15116392,0.39331844,0.013287693,-0.51785904,-0.40162948,0.036296766],[-0.6850239,-0.028873632,0.09147937,0.6863797,-0.22511397,-0.7087885,-0.38730666,0.30543882,-0.19349012,0.35246828,-0.21587896,0.49934873,0.63229257]],"activation":"identity","dense_3_b":[[-0.018641375],[-0.010103108],[-0.022765955]]},{"dense_4_W":[[1.1674396,-0.010352109,0.70566726]],"dense_4_b":[[-0.022187218]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x00'.json deleted file mode 100755 index fd0b885f31..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.149806],[1.0466807],[0.48216617],[0.03926948],[1.0378215],[1.0405693],[1.0433956],[1.034937],[1.0209817],[1.0002661],[0.97917086],[0.03917731],[0.039209686],[0.039230634],[0.039230503],[0.039089043],[0.03877449],[0.038412858]],"model_test_loss":0.0086250901222229,"input_size":18,"current_date_and_time":"2023-08-10_21-44-49","input_mean":[[24.784973],[0.022257574],[0.0018790626],[-0.0014456466],[0.021444617],[0.021993408],[0.022768045],[0.024583662],[0.0267569],[0.026212335],[0.025587328],[-0.0014159543],[-0.0014121836],[-0.0014230785],[-0.0014949344],[-0.0015499452],[-0.0016750016],[-0.0018316169]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.11915471],[0.4647498],[-0.18471648],[-0.05602483],[0.7303728],[-0.020603865],[0.08058517]],"dense_1_W":[[0.02919073,1.8689783,4.4265075,0.16716953,-3.2808,-1.9433872,-1.6631875,0.64648163,3.702317,1.9939891,-0.7665767,0.8001585,0.7883229,-0.39065278,-0.15145746,-0.16460232,-1.2793592,-0.002752089],[0.60766363,-0.8283458,0.086918816,0.49001363,0.1764836,1.6148571,-1.172861,0.28852218,-0.12384417,0.22311504,-0.038648173,0.08665237,-0.22122696,-0.1211155,-0.16418546,-0.06580166,-0.12981877,0.1223207],[-0.0611153,2.1892653,4.1823645,-0.020211374,-0.126075,-0.26824856,-0.21868485,0.009974396,0.54638195,0.08174665,-1.6289697,0.13641535,-0.026207518,0.037753426,0.0224,-0.30633605,-0.18595642,0.18627088],[-0.006284281,-0.9393309,0.131348,0.27939406,0.15329085,-1.1371962,0.67140526,0.23289137,-0.25185016,0.14388521,-0.20779973,-0.51052564,-0.30346033,0.5853443,0.3393873,-0.16495557,-0.28405264,0.07844043],[0.7133973,0.36651134,-0.09357234,0.053284127,-0.32661018,-1.1806043,1.2274599,-0.13515554,0.15792286,-0.40642232,0.14303061,-0.012403075,0.007870057,0.0046764547,-0.06777944,-0.23694073,0.4407839,-0.18311372],[0.063063905,-0.105903134,-0.07843828,-0.14851844,0.09402292,-0.94803673,0.9120545,-0.20011538,-0.16328399,0.105953924,0.057462662,0.09776021,-0.14990965,-0.06046959,0.15974031,0.2219897,0.004509259,-0.1270214],[0.0070889555,-0.44478884,0.06164922,-0.122812085,0.30908406,1.5513293,-0.5627223,0.25208586,0.123981394,-0.111266494,0.066460505,0.043457642,-0.06717314,-0.4400081,-0.30934328,0.038612906,0.059938014,-0.23997127]],"activation":"σ"},{"dense_2_W":[[0.36688,-0.19320922,0.28094387,-0.9803768,-1.1758837,-0.99039465,0.49203432],[-0.28640324,-0.72820544,-0.4875037,0.1816081,-0.5080949,0.39986604,-0.2271453],[-0.20991027,-0.33078238,0.36123854,-0.4010081,0.42690548,0.5543692,-0.66790026],[0.028127942,-0.46438977,-0.2351104,0.114041865,-0.8311537,-0.69191617,0.13150403],[0.6023005,3.1064928,0.30146995,-1.728805,0.39918655,-1.0887272,0.8644791],[0.17403108,-0.5989185,-0.5602132,0.23924266,0.047311135,-0.21583998,-0.08689489],[-0.408518,-0.67819715,-0.48529884,-0.43457308,-0.6859549,-0.72042423,-0.10757325],[0.13631205,0.05900456,-0.31221914,-0.42799878,-0.5074306,-0.066171676,0.2549441],[0.38185734,-0.41993743,0.16787384,0.48273364,0.23232572,0.16146578,0.1430547],[0.36192957,0.7118042,-0.11004752,-0.44175497,0.037270173,0.11878499,0.21234997],[-0.45457327,0.13838753,0.22052445,0.07949341,-0.62185955,-0.6223187,-0.597313],[-0.22084583,-0.1706968,-0.31476033,0.620582,0.66211015,0.5056345,-0.30923542],[-0.14307842,-0.09773044,-0.11317682,0.31420723,-0.032641448,0.05758633,-0.23174715]],"activation":"σ","dense_2_b":[[-0.1766578],[0.0030768153],[0.011622017],[-0.2613647],[0.41335022],[-0.029892111],[-0.27720392],[-0.03462619],[-0.03277327],[-0.033704933],[-0.23574014],[0.07590818],[-0.0031470906]]},{"dense_3_W":[[0.44066054,-0.5858187,-0.49569857,-0.27353624,0.016213497,-0.59161377,-0.48449734,0.46109423,-0.0024176766,0.34991503,-0.13543713,-0.48638907,-0.19906554],[0.669034,-0.12078269,0.06202367,0.44989127,0.5493621,0.336327,0.4797354,0.5557385,-0.36501727,0.26719907,0.3279164,-0.33229584,-0.3502743],[-0.5095002,-0.2236471,0.21968824,0.042991508,-0.38274318,-0.11278709,-0.5325957,-0.45203722,-0.12108213,-0.19157046,0.58804715,0.48384163,0.023208706]],"activation":"identity","dense_3_b":[[0.0001239895],[-0.013890755],[0.030029856]]},{"dense_4_W":[[1.067811,0.9453486,-0.14499813]],"dense_4_b":[[-0.002235052]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x01'.json b/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x01'.json deleted file mode 100755 index 6f5ea46958..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'nxc0x04x01'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.433109],[0.9277941],[0.4133138],[0.042486828],[0.91961175],[0.9212083],[0.9230463],[0.9178699],[0.90644723],[0.8922139],[0.87602633],[0.042294905],[0.042328734],[0.04236129],[0.042348858],[0.04222418],[0.04196347],[0.041606702]],"model_test_loss":0.006344182416796684,"input_size":18,"current_date_and_time":"2023-08-10_22-11-17","input_mean":[[27.48561],[-0.045379456],[0.000610541],[-0.0075939377],[-0.04516856],[-0.04590259],[-0.04635042],[-0.0455905],[-0.044134438],[-0.047893465],[-0.04872525],[-0.0075862017],[-0.007591181],[-0.0075963517],[-0.0077280067],[-0.007869005],[-0.008030396],[-0.008253526]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.13907726],[0.91428226],[-0.08902528],[-0.8122626],[2.4960856],[0.6941552],[3.1465714]],"dense_1_W":[[0.012394863,2.442848,6.000615,-0.9667802,-2.4481606,0.04116472,-0.298802,-0.45781717,1.0988615,1.5439192,-1.6183215,1.5120034,0.70879805,0.33042568,-0.6360781,-0.72864187,-0.42245787,0.1924922],[-0.039127346,-2.5879724,0.45108536,0.10737795,-1.9936459,-2.6408718,-0.10216445,-0.74508464,-1.0754778,-1.6742834,-0.6845894,-0.2893954,-0.6440116,-0.68839306,-0.8477463,-0.49898022,0.39530098,0.49870434],[-0.028086787,0.11074618,-0.029657526,0.53074354,-0.09886754,-0.50980574,1.6068281,-0.1943193,-1.0108532,-0.4594659,0.7215557,-0.24808267,0.30215025,-0.18002108,0.2840001,-0.57245183,0.10710855,0.07138346],[0.4541753,0.06447674,0.019618178,-0.050374724,0.13303722,1.2749394,-0.6110799,-0.06389013,-0.17551425,-0.02773791,0.21997307,0.28395706,-0.14487898,-0.20185138,-0.18616714,0.03085588,-0.22616515,0.1570019],[0.933303,-0.34038252,-0.065301575,-0.16815153,-0.48548433,-1.0974069,1.3661956,-0.6751278,-0.06634803,-0.05417734,0.008298623,-0.21462391,-0.17723723,0.39795777,0.2967163,0.078405224,-0.10986368,0.0066645048],[-0.44923598,-0.02191377,0.020238422,0.43116552,0.33337408,1.5234641,-1.2367504,0.123196624,-0.13720761,0.06765882,0.14065754,0.2515097,-0.3147324,0.12851562,-0.5540239,-0.48021403,-0.22485968,0.4229258],[1.1905549,0.10563058,0.08857988,-0.563186,1.1590731,1.2013718,-2.1805055,0.6349522,0.81047887,0.13184841,-0.23018143,0.040691454,0.22812058,0.2580085,-0.2708511,0.37357846,-0.14638875,-0.019385386]],"activation":"σ"},{"dense_2_W":[[-0.4165453,-0.17428897,-0.656896,0.56047696,0.075286396,0.29055318,0.6539704],[0.67952734,0.31715697,-0.38251033,-0.9062763,0.61300415,-0.6845408,-0.5751852],[0.33353442,-0.4632752,-0.45792413,-0.58633304,0.45437384,-0.8976134,-0.459859],[-0.28707662,-0.20765603,-0.09663817,0.0712579,0.030774899,-0.9440693,-0.11771196],[-0.034040477,-0.44995186,-0.34478307,0.7316748,-1.0665529,-0.03579851,-0.029609136],[0.2525717,0.42749283,-0.3511222,0.24611457,0.047738947,0.7055022,-0.096511096],[1.0310456,-0.14640242,-0.67039543,-0.05573537,-0.97901416,0.053892918,-0.95491844],[1.935988,-0.24661754,-0.47021067,0.26482674,-2.1922724,0.12265447,-1.0171564],[-0.27922088,0.047959074,-0.4585162,0.43318775,-0.022253482,0.6992371,0.366425],[-1.2182665,0.30541417,0.54548246,-0.82654715,-0.86802375,0.36274722,-1.2755734],[-0.55027056,0.3726949,0.29450348,-0.663457,-0.28297377,-0.7872144,-0.77983695],[-0.29113156,-0.57935303,-0.07371765,0.569743,-0.046916172,-0.095878035,-0.24269529],[-0.4188927,0.2442818,0.6791062,-0.24187906,0.8024283,0.36645007,0.15694125]],"activation":"σ","dense_2_b":[[-0.13162552],[0.14610669],[0.06542088],[-0.008890042],[-0.25142753],[-0.13560805],[-0.25826016],[-0.17347474],[-0.1645501],[0.07222336],[0.059977163],[-0.32542986],[0.18807274]]},{"dense_3_W":[[0.57400185,-0.65310407,-0.026245644,-0.21171129,-0.0046483884,0.5902724,-0.07411066,-0.13533744,0.33003673,-0.23319454,-0.7222472,-0.062199857,-0.31266594],[0.08517949,0.10523219,0.17653435,0.22985537,0.03910563,0.48629716,0.024153559,-0.2307055,-0.5041997,-0.12600066,-0.1328216,0.066026025,0.2542358],[-0.07466326,0.03751704,0.34207597,0.08640459,-0.55675924,-0.43693897,-0.5372613,-0.67614335,-0.008879703,0.5449217,0.60687166,-0.079967305,0.23276323]],"activation":"identity","dense_3_b":[[-0.057068646],[-0.010597932],[0.064764485]]},{"dense_4_W":[[0.7126766,-0.056579176,-0.97978544]],"dense_4_b":[[-0.058505826]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'x9axc0x04x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'x9axc0x04x00'.json deleted file mode 100755 index e20bbbb102..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020 b'x9axc0x04x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.236228],[0.9541643],[0.46896935],[0.037251],[0.942408],[0.94659024],[0.95044875],[0.9528363],[0.95431703],[0.9549371],[0.94726866],[0.037057787],[0.03711012],[0.037162427],[0.037273765],[0.03735724],[0.03742994],[0.037366863]],"model_test_loss":0.01245664618909359,"input_size":18,"current_date_and_time":"2023-08-10_22-36-02","input_mean":[[23.454796],[0.043741453],[-0.009617127],[0.008929559],[0.048594497],[0.0470797],[0.04575023],[0.04157434],[0.037163395],[0.031240081],[0.02667783],[0.00891148],[0.008930276],[0.0089419745],[0.0089975605],[0.00889156],[0.008654451],[0.008377715]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.08725138],[0.62947553],[0.55281675],[0.47698602],[-0.010579495],[0.5603157],[0.121154435]],"dense_1_W":[[0.010149323,0.0927383,-0.049159903,-0.92321444,0.5301868,1.6467744,-0.34752372,-0.7960734,-0.23776174,-0.47925645,0.85876715,-0.12972605,0.07995605,0.4340685,0.24205516,0.10737243,-0.12019449,-0.15221375],[0.06681955,-0.8268898,0.08758739,0.8848569,-0.36724785,-1.2158617,1.1197345,0.067235485,0.035998013,0.15957934,-0.3456709,0.58034456,0.4314829,0.35206887,0.54623073,0.46871477,0.18022528,0.060644507],[1.5824217,1.7102716,3.6078386,-0.0684419,-1.5800762,-0.6593468,-1.0315231,-0.30346423,1.6339799,1.228651,-0.4846987,0.3710236,-0.4006895,-0.34770697,0.8819552,-0.5398949,-0.32821923,0.17143293],[1.303329,-2.1399665,-3.1076748,0.23288973,2.0736525,1.078245,1.2427267,-0.34367758,-2.3364317,-1.4993668,1.4313731,0.25981635,-0.069500186,-0.007198234,-1.0189565,0.4751188,0.6546988,-0.30582112],[0.0036950526,0.04958046,-0.041147415,-0.23472723,0.24974303,-1.5454353,1.8054543,-0.6608297,-0.26494673,-0.4223114,0.47601548,0.24096386,-0.38269913,-0.12060513,0.5988521,0.036612313,0.05911714,-0.14717643],[0.08024163,1.0550786,0.07653441,0.4824589,-0.5017987,0.01434394,-1.376971,-0.131279,0.006976325,-0.22164595,-0.06650469,0.74893504,0.41389975,0.5270169,-0.2144425,0.6345238,0.68122786,-0.1719554],[-0.07933006,2.3567731,0.0042914962,0.74784595,2.28212,2.9230127,0.23938161,1.0576327,0.23800474,0.61905783,0.1781994,0.63615847,0.0073392615,-0.002428518,0.5748812,-0.15760459,-0.54738325,-0.36927438]],"activation":"σ"},{"dense_2_W":[[-0.21508381,0.9633951,0.5315358,0.92654145,0.28553194,0.039701536,-0.18630505],[-0.1678206,0.207308,0.40976796,0.08400935,-1.1243716,0.39975542,-0.330028],[-1.1226933,0.52033097,1.0243174,-0.62620866,1.505394,-0.3176458,-0.777051],[0.693296,-0.28314844,0.4684673,0.17668417,-0.82024777,-0.012310348,-0.5580614],[0.24386548,-0.4684305,-0.25006077,-0.4782456,-0.47599876,0.5501203,0.062193394],[-1.3514801,0.9189132,-0.7240175,-0.28889558,-0.18423705,-0.08741435,0.24606031],[-0.67244714,0.47862688,-1.0843797,-1.111484,0.4975643,-0.52863014,-1.5702293],[0.06620587,-0.3826648,0.0595068,-0.31371126,-0.9359945,0.5710785,0.30018663],[-0.08168836,-0.51131517,-0.073826596,-0.008216051,-0.54347867,0.20297381,-0.6430736],[0.4543929,-0.49646172,0.43142736,-0.66066104,-0.23015887,0.028297924,-0.05720952],[-0.52589,0.61320555,-0.7472295,0.4251358,0.8921376,-0.78721434,0.28226647],[-0.711873,0.25582448,0.14650942,0.4705447,0.64871144,-0.113993205,-0.037552968],[0.41052327,0.18220364,0.35270774,-0.49306205,-0.956854,0.4278162,-0.03011779]],"activation":"σ","dense_2_b":[[0.10105641],[-0.09731066],[0.0055902563],[0.15583935],[-0.1778042],[-0.31665945],[-0.35505518],[-0.011538101],[-0.15872312],[0.123221055],[-0.20084055],[0.12061009],[-0.092269965]]},{"dense_3_W":[[0.34495553,-0.52540576,0.48382422,-0.21559586,0.16588818,0.4986695,0.7247998,-0.20436342,-0.21009935,-0.33020142,0.42502496,0.23494504,-0.6989969],[-0.43483838,-0.16045101,-0.7069782,0.6482748,0.6546552,0.19802035,-0.19270848,0.603569,0.15212789,0.32036832,-0.1777731,-0.59341335,0.37551636],[-0.23369972,-0.018393897,-0.23587896,0.03520326,-0.4262701,0.34585303,0.126404,-0.4852999,0.50604486,0.18693419,0.6988773,0.2218146,-0.40111375]],"activation":"identity","dense_3_b":[[-0.077010185],[0.06201826],[-0.041295182]]},{"dense_4_W":[[-0.8782402,0.5793239,-0.13800435]],"dense_4_b":[[0.0672247]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN b'x9bxc0x10x00'.json b/selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN b'x9bxc0x10x00'.json deleted file mode 100755 index 83a9167915..0000000000 --- a/selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN b'x9bxc0x10x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.572336],[1.1483445],[0.42820358],[0.048202544],[1.1448809],[1.1459116],[1.1458608],[1.1237723],[1.1024351],[1.0727179],[1.0412753],[0.047973968],[0.048014168],[0.04805022],[0.048102845],[0.04802677],[0.04776489],[0.04739827]],"model_test_loss":0.026644039899110794,"input_size":18,"current_date_and_time":"2023-08-10_23-31-10","input_mean":[[24.136143],[-0.042093538],[0.013022028],[-0.0036085332],[-0.0470961],[-0.0462333],[-0.04523365],[-0.040591415],[-0.036471754],[-0.03127247],[-0.027871577],[-0.0038120802],[-0.0037680487],[-0.003724908],[-0.0035597768],[-0.0034507068],[-0.0033237508],[-0.0032780103]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.05131335],[-0.22923447],[-0.014189909],[0.09295414],[-2.8221803],[2.6356938],[-0.1626522]],"dense_1_W":[[-0.0006246851,-1.937167,0.02453268,0.124314785,-0.07763876,-1.3915496,0.6514346,0.062224012,-0.3782371,0.045342997,0.0131263565,-0.07671119,0.2950009,0.5244766,0.24981722,-0.6029727,-0.1914875,0.17850396],[3.6474159,-0.3351425,-0.13860475,0.017950775,-0.5807133,-0.48789144,-0.33976758,-0.092757314,-0.5980742,0.16750406,0.022784369,-0.0036915683,0.2978329,0.22988808,0.5386405,0.8470415,0.41101706,0.8745821],[0.00071263144,0.34790343,-0.025052998,-0.2664853,0.1425834,-1.2502533,0.901666,-0.40636706,-0.07849224,0.18394355,-0.039707936,-1.0538421,-0.278847,0.80892915,0.6621467,0.35024366,0.22499272,-0.44423023],[5.855231e-5,2.4907784,6.5716834,-0.76951736,-2.4156885,-0.6084292,0.32178223,-0.12523341,0.017727956,2.4002576,-1.4535077,1.1310626,0.7982315,0.10428222,-0.34654096,-1.1077892,-0.17795445,0.20854695],[-0.6954145,0.84418166,0.0098673105,0.052796964,0.26646963,1.0693092,-1.161872,-0.3446245,0.8000167,0.6914431,-0.18510826,0.27281952,-0.013284309,-0.51565313,-0.14262609,0.20675737,-0.08539979,0.11145477],[0.68266046,0.9602112,0.009963625,-0.1402191,0.20056713,1.5516362,-1.738518,-0.2687681,0.82588196,0.6286699,-0.16402455,0.6550529,-0.15899514,-0.72548264,-0.29978648,0.7046594,-0.24264838,0.08307443],[4.025976,0.7285796,0.14887388,-0.6201622,0.13705282,0.47417828,0.4768622,0.35751063,0.19407505,0.7661748,-0.6106113,0.17202562,-0.2742306,0.21339923,-1.1030523,-0.35447115,-0.85436875,-0.7747486]],"activation":"σ"},{"dense_2_W":[[0.46410686,0.62191635,-0.062384292,-0.5430435,-0.695603,0.057965573,-0.52540386],[0.6584527,0.21343426,0.17701761,-0.69918996,-0.049447756,-0.037598107,-0.5069386],[-0.44375354,-0.26292452,-0.64291656,0.63415337,0.26265192,-0.11597562,0.15929869],[-0.812513,0.10907013,-0.8120618,-0.19890812,0.8949706,0.5529603,0.13160336],[0.1050679,0.5375794,0.6706402,-0.041373048,-0.6123938,-0.44150752,-0.34567338],[-0.40558782,0.11219362,-0.5137659,0.38914016,0.22155257,0.522915,-0.50805056],[0.63432807,-0.43097767,0.5424638,-0.31058156,0.0059383763,-0.3071036,0.523059],[0.34565827,0.36890084,0.48656797,0.107707486,-0.46674815,-0.2624921,-0.4052778],[-0.022453148,0.6077112,-0.5046755,1.402873,-0.6407784,0.8215227,0.25630465],[0.03767525,-0.2515635,-0.56157374,0.22053413,0.5938849,0.04716324,-0.55130476],[0.02723474,0.6362109,-0.7232292,-0.18455642,0.45341918,1.2936736,-0.802384],[0.06902041,-0.60314816,-0.22065936,0.08411181,-0.19968052,-0.4402093,0.5050189],[-0.58374166,-0.4504642,-0.1112549,0.46519062,0.15296236,-0.15458451,-0.00064379047]],"activation":"σ","dense_2_b":[[-0.014328261],[-0.034038804],[-0.056317214],[-0.025555097],[-0.023897748],[-0.27516785],[-0.03674292],[-0.04560086],[-0.13362178],[-0.17087862],[-0.1543581],[-0.063457526],[-0.20349929]]},{"dense_3_W":[[0.13543664,0.6195368,-0.43438953,-0.59657305,0.5921997,-0.14353473,0.44341394,0.5110973,-0.33468905,-0.41089338,-0.19091435,0.34869814,-0.3758429],[0.30076426,-0.21575679,-0.38356882,-0.036623813,0.2787459,-0.3038595,0.44368634,0.27318835,-0.63082767,0.14850685,-0.27673995,-0.14115706,0.30847898],[0.2674523,-0.39884198,0.21306512,0.41216707,-0.02011493,-0.04432381,0.3676808,-0.016420744,-0.40233457,-0.1554329,-0.009226843,0.43924707,-0.23986638]],"activation":"identity","dense_3_b":[[0.017441018],[0.01997646],[-0.017420627]]},{"dense_4_W":[[-1.0507979,-0.56773245,0.31234828]],"dense_4_b":[[-0.019663213]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019.json b/selfdrive/car/torque_data/lat_models/SUBARU_ASCENT.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU ASCENT LIMITED 2019.json rename to selfdrive/car/torque_data/lat_models/SUBARU_ASCENT.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019.json b/selfdrive/car/torque_data/lat_models/SUBARU_FORESTER.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU FORESTER 2019.json rename to selfdrive/car/torque_data/lat_models/SUBARU_FORESTER.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019.json b/selfdrive/car/torque_data/lat_models/SUBARU_IMPREZA.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU IMPREZA LIMITED 2019.json rename to selfdrive/car/torque_data/lat_models/SUBARU_IMPREZA.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020.json b/selfdrive/car/torque_data/lat_models/SUBARU_IMPREZA_2020.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU IMPREZA SPORT 2020.json rename to selfdrive/car/torque_data/lat_models/SUBARU_IMPREZA_2020.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU LEGACY 7TH GEN.json b/selfdrive/car/torque_data/lat_models/SUBARU_LEGACY.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU LEGACY 7TH GEN.json rename to selfdrive/car/torque_data/lat_models/SUBARU_LEGACY.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU LEGACY 2015 - 2018.json b/selfdrive/car/torque_data/lat_models/SUBARU_LEGACY_PREGLOBAL.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU LEGACY 2015 - 2018.json rename to selfdrive/car/torque_data/lat_models/SUBARU_LEGACY_PREGLOBAL.json diff --git a/selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN.json b/selfdrive/car/torque_data/lat_models/SUBARU_OUTBACK.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/SUBARU OUTBACK 6TH GEN.json rename to selfdrive/car/torque_data/lat_models/SUBARU_OUTBACK.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016 b'8965B41051x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016 b'8965B41051x00x00x00x00x00x00'.json deleted file mode 100755 index dc9102a55c..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016 b'8965B41051x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.155588],[1.2222154],[0.51593876],[0.045921255],[1.2146778],[1.2164576],[1.2193325],[1.2000308],[1.184473],[1.1582026],[1.1294578],[0.0457375],[0.04576663],[0.04578905],[0.04568079],[0.04555454],[0.04528545],[0.044940177]],"model_test_loss":0.0077543435618281364,"input_size":18,"current_date_and_time":"2023-08-11_00-22-19","input_mean":[[25.38624],[-0.109525174],[-0.0071247322],[-0.008090862],[-0.108410954],[-0.11049666],[-0.11148748],[-0.11183658],[-0.110412374],[-0.111614786],[-0.109395765],[-0.008206939],[-0.008208384],[-0.00822236],[-0.008191385],[-0.0081957765],[-0.008351754],[-0.008558403]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.147119],[-0.7151291],[-0.06542077],[-2.6854012],[-2.9215784],[-0.6333571],[-0.3588006]],"dense_1_W":[[0.050412737,-0.7688983,0.051297277,0.20422332,0.29614073,-0.7492136,0.6221707,-0.28156716,-0.25521812,-0.04673187,0.27558443,-0.7143839,-0.37546682,0.5423986,0.43472832,-0.09003486,-0.1610108,-0.13676094],[-0.86945575,-0.066927284,-0.060515594,-0.049497765,0.37880427,-0.4104487,0.99254173,-0.24023093,-0.22767603,-0.14191294,0.21729311,0.27627876,-0.03367094,0.08543982,-0.105297364,0.16060211,-0.23347247,0.2110998],[0.041003693,0.0019961689,-0.011989706,0.2586212,-0.2982694,1.1390727,-0.09271339,0.011216761,-0.07928292,-0.31107566,0.30151826,0.32163844,-0.111424804,-0.111504324,-0.54352456,0.08193889,-0.09293932,0.1449024],[-0.6092506,-0.34562534,-0.19357689,0.102853455,-0.076768324,-0.9644875,0.3549321,-0.35967496,-0.16627687,-0.3403019,0.100230105,-0.4866395,-0.054948322,0.3741284,0.2193991,0.1279479,-0.07926067,0.061663166],[-0.5892953,0.5779403,0.18596417,0.027102116,0.23143159,0.8041496,-0.5180442,0.17604749,0.13967356,0.3647289,-0.08085053,0.4862775,0.16692553,-0.6730509,-0.07277034,-0.0592746,-0.21806034,0.08425947],[-0.9096294,-0.17975268,0.062644206,0.16992755,-0.027315069,0.18641698,-0.2329115,-0.40319765,0.0728141,-0.022310384,0.15630817,0.19813018,-0.10582375,-0.52104795,-0.120786585,0.1117218,0.06465282,-0.11865458],[-0.032926153,1.0616482,6.864475,-0.11564605,-0.14158455,-0.4117831,-0.76951504,0.10398355,0.7756398,0.61653835,-1.1051329,1.1516933,-0.017778216,-0.34992045,-0.15732552,0.10676282,-0.53930724,-0.00068106386]],"activation":"σ"},{"dense_2_W":[[0.607369,0.045042686,-0.90820694,0.69801354,-1.0983257,-0.2685714,0.34300095],[-0.67589545,0.1324981,0.14731272,-0.85306466,0.5206796,0.7536436,0.09453407],[0.6423009,0.57089245,-0.4761381,0.6488958,-1.2223575,-0.8009584,0.3689039],[0.29086414,0.10636214,-0.45522293,0.20708704,-0.15621087,-0.78096426,-0.048316985],[-0.3550279,1.0548292,-0.88649863,1.015021,0.2844367,0.20109054,-1.1682143],[0.965661,-0.14941974,-0.7082443,0.19087248,-1.4366155,-0.36316642,0.28074083],[-0.21697107,0.5959022,-0.7900999,0.34238023,0.22955489,0.51429254,-1.3292482],[0.02833417,0.38777432,-0.41333404,0.41482702,-0.6048467,-0.38053027,-0.03946799],[-0.122554004,-0.105075054,0.72700727,-0.087382294,0.37528226,0.65905285,-0.4292818],[-0.47591224,-0.3380254,0.6051541,-0.2619172,0.30789238,0.24751364,0.37409812],[-0.08474495,-0.46902463,0.37705857,-0.61829376,0.35094222,0.6649397,0.07235656],[-0.6540115,-0.46159643,0.66689605,-0.59667706,1.0229484,0.06419672,-0.12906657],[0.14077464,0.25589386,-0.705507,0.41406876,-0.5768568,0.08440071,-0.3479489]],"activation":"σ","dense_2_b":[[0.06355875],[-0.17415898],[-0.1774852],[-0.11819309],[-0.41535345],[-0.1463154],[-0.38811693],[0.09710054],[-0.05073436],[-0.11638209],[-0.14782049],[-0.102039225],[0.13234599]]},{"dense_3_W":[[-0.17214395,0.5678262,-0.11139721,-0.08668092,-0.27163222,0.13644972,0.52798116,-0.08823449,-0.5390309,-0.41089463,-0.5085388,-0.5108906,0.6503059],[-0.49004817,0.507694,-0.28311312,-0.27198496,-0.6048582,-0.32954597,-0.027210526,-0.598534,0.24722685,0.6126394,0.63478196,0.4942442,-0.35184625],[0.66657585,-0.16694659,0.27015567,-0.4425793,-0.12436591,-0.39648074,0.17227231,0.61576825,0.53334814,-0.54657924,0.16337119,-0.4853141,-0.29025096]],"activation":"identity","dense_3_b":[[0.07506834],[-0.027431693],[0.033431824]]},{"dense_4_W":[[-0.19975226,1.0868903,-0.14778052]],"dense_4_b":[[-0.030237392]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019 b'8965B07010x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019 b'8965B07010x00x00x00x00x00x00'.json deleted file mode 100755 index 971abf4ae7..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019 b'8965B07010x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.3547435],[0.9349845],[0.3416719],[0.03020802],[0.9287519],[0.93094236],[0.9321697],[0.9195053],[0.90565664],[0.88330543],[0.85894924],[0.03025142],[0.030234234],[0.030215727],[0.030088654],[0.030025238],[0.029914714],[0.029875476]],"model_test_loss":0.007811516057699919,"input_size":18,"current_date_and_time":"2023-08-11_01-12-12","input_mean":[[27.099766],[0.021257939],[-0.009488095],[-0.0040843748],[0.024692915],[0.023505691],[0.0221261],[0.019820152],[0.016889216],[0.016442697],[0.016379314],[-0.0040564938],[-0.004047964],[-0.004046166],[-0.0040283427],[-0.0039906264],[-0.0039846366],[-0.0040857326]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.2157677],[-2.3838754],[3.0455196],[0.8014893],[0.07945207],[3.106963],[2.1556125]],"dense_1_W":[[1.1125633,-0.56988466,-4.0888886,-0.15938745,0.6582105,-0.46116465,-0.41639355,0.04232433,-0.59602994,-0.32990792,1.0122606,-0.49626034,-0.13254666,0.37965775,0.3581549,0.51340127,-0.18809582,-0.113844536],[1.1409476,-0.52942747,0.0009779995,0.17279683,0.42025048,-1.0194471,0.19619784,0.018046845,-0.05372719,0.19695577,-0.14354223,-0.35454744,-0.4519569,0.3006548,0.89002454,-0.13396992,0.37972572,-0.4401214],[1.3309811,1.4823053,0.2582569,-0.032915797,-0.28236762,0.4846734,-0.15269001,0.3552266,0.30250248,0.14145501,-0.27240917,0.4871061,0.5173212,-0.7224162,-0.27998483,-0.41258854,0.20030643,0.14221442],[0.7907197,1.6901718,5.3816576,-0.27129257,-1.145268,0.31147382,0.019620774,0.17815213,0.4287783,0.04148877,-0.8830161,0.44120663,0.42428204,0.22440527,-0.92130196,-0.22413124,-0.33906758,0.54252696],[-0.012449405,1.7189058,-0.011069483,-0.08866588,0.0305128,0.9370316,-0.35130048,-0.024127513,0.24698113,0.31200036,-0.14631376,-0.17734727,0.21231978,-0.45571813,-0.14337474,0.32901996,0.2770767,-0.34568372],[1.3784999,-1.3435363,-0.2745729,0.25279233,0.07493813,-0.42336947,-0.063481055,-0.31757474,-0.12468922,-0.118494295,0.1393878,-0.64342916,-0.024168873,0.13941756,0.21592365,0.3690261,0.13736965,-0.3378454],[-1.1883208,-1.0948199,0.0016973034,0.36374646,0.6156439,-0.702277,0.4276083,-0.17839254,-0.15477405,-0.0038111163,0.15055132,-0.24193537,-0.24351074,-0.2785849,0.9893942,-0.10433792,0.28482616,-0.3947434]],"activation":"σ"},{"dense_2_W":[[-0.41992396,1.2538254,-1.3762401,0.18826605,-1.2015911,1.0849522,0.95279044],[-0.554603,-0.46099252,-0.21578617,0.045173306,0.6597546,-0.67514,-0.10196972],[-0.062698506,-0.5813329,-0.4847704,0.3779744,-0.18567432,-0.012139243,0.13781239],[0.54706806,0.63951415,-0.85959625,0.06293286,-0.7042504,0.8421599,0.5909391],[0.46164697,0.4020649,-0.33452457,-0.014348776,-0.62764764,0.124300346,0.9453233],[-0.3903317,0.6063093,-0.43484682,-0.2860064,-0.8296564,0.7835651,0.21584539],[0.175473,-0.5825516,-0.22237642,0.07386135,-0.3432968,-0.3868117,-0.21827103],[-0.5004876,0.97018445,-0.43547085,0.36776522,-0.27490538,0.48544273,0.9886506],[-0.6295581,-0.7262303,0.18957756,0.4320069,0.15381597,-0.37602007,-0.3400327],[-0.18816905,-0.27860478,0.91212904,0.38390306,0.2492882,0.12610404,-0.27094096],[0.037768684,0.45618993,-1.6272914,-1.0754924,-0.6273605,0.48672768,0.96011865],[-0.33102858,-0.027864542,0.42045346,0.14589894,0.015219363,-0.13589944,-0.77460396],[0.17902899,-0.50285494,-0.4366347,0.16011943,0.070149496,-0.4917402,0.015056903]],"activation":"σ","dense_2_b":[[-0.22400843],[-0.01302815],[-0.03749996],[-0.11806751],[-0.11926077],[-0.09058484],[0.06280237],[-0.2770851],[0.030630045],[0.07445694],[-0.22077157],[0.09475054],[-0.29818374]]},{"dense_3_W":[[-0.010462812,-0.24828628,0.041264076,0.5696833,0.15721063,-0.0060403845,0.0508466,-0.10241195,0.11243323,-0.5261026,0.49312815,-0.60535157,-0.22609983],[0.66831225,-0.3054378,-0.1565705,-0.031996824,0.26015618,0.4501768,-0.6939041,0.5919593,-0.69475293,-0.031049775,-0.053406052,0.018912103,0.13819246],[-0.50486624,-0.55928755,-0.53656745,0.48358017,0.5427902,0.50403154,0.46978712,-0.30256158,-0.14531422,-0.0904506,0.031830106,0.5406881,-0.063055396]],"activation":"identity","dense_3_b":[[-0.068349525],[-0.07652613],[-0.057301868]]},{"dense_4_W":[[-0.72008973,-0.7991561,-0.02538519]],"dense_4_b":[[0.07405978]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022 b'8965B41110x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022 b'8965B41110x00x00x00x00x00x00'.json deleted file mode 100755 index 95fdae0f2d..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022 b'8965B41110x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.376161],[1.2838221],[0.5474099],[0.04934304],[1.2836047],[1.2821697],[1.2806356],[1.258706],[1.2369865],[1.2116693],[1.183833],[0.049019773],[0.04906449],[0.049113937],[0.049148172],[0.049036138],[0.048767343],[0.048263323]],"model_test_loss":0.008681067265570164,"input_size":18,"current_date_and_time":"2023-08-11_02-26-47","input_mean":[[23.067476],[-0.03387557],[0.0021314505],[-0.00026479672],[-0.0335918],[-0.03408871],[-0.034120698],[-0.033429306],[-0.03334599],[-0.035154633],[-0.03337258],[-0.0003344364],[-0.00031001537],[-0.0002858812],[-0.0002081701],[-0.00014168753],[-0.00010316148],[-0.0001947083]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.00035714143],[-0.44112498],[-2.0768487],[0.033623725],[2.3311365],[-0.2579414],[0.068420805]],"dense_1_W":[[-0.00509446,-0.23187363,-1.2282524,-0.8727873,-0.20932141,0.4933777,-0.6846191,0.32296148,0.60479945,-0.27046466,-0.14131822,-0.012867556,0.5326964,-0.12989101,0.29854774,0.2623998,-0.22680795,0.051163733],[-0.059410393,0.43026504,0.010004543,0.2136965,-0.26893613,0.8620313,-0.18596862,-0.13626388,-0.107266344,-0.1622253,0.22793797,0.35623074,-0.27369574,-0.48247203,0.1288161,-0.14182153,0.17263421,-0.15390971],[-0.64431036,0.55822396,-1.3443316,-0.12504154,0.01676618,-0.694321,0.6168717,-0.6036482,-0.25818932,-0.11348284,0.24836093,0.107356064,0.13224693,0.04477359,-0.029285533,-0.43488002,-0.15231457,0.32518724],[0.048481237,0.42892945,0.026479786,0.108767025,-0.73508763,1.1185008,-0.38002115,0.03620541,0.086171456,0.061443076,-0.08954377,0.7163156,-0.22313805,-0.4416368,-0.18677765,-0.29935995,-0.004914676,0.18798521],[0.6947259,0.22686858,-1.3395145,-0.026273083,-0.024484975,-0.63676757,1.010914,-0.69115335,-0.47127905,0.24076219,0.13991874,0.05702926,-0.38383457,0.4660129,-0.15360665,-0.10321115,-0.20715226,0.20123789],[0.015787806,0.48204544,-0.021891365,0.12252965,0.067283645,1.2190595,-0.67878187,-0.18536092,-0.18721336,0.10465234,0.14439303,0.15279837,0.07980276,0.09336658,-0.8014295,-0.043885637,-0.058773834,0.113214575],[0.0014229139,-1.1489844,-3.6802135,0.37640184,1.4294708,-0.076660365,0.3178863,-0.64991164,-0.70733184,-0.21969552,0.770838,-0.26442793,-0.2161789,0.15546018,-0.12903892,0.17621045,-0.28502613,0.11893793]],"activation":"σ"},{"dense_2_W":[[-0.54397076,-0.540163,-0.5861562,-0.557604,-0.49618587,0.10378188,-0.11437754],[-0.41089043,-0.41863373,-0.26381302,0.06044076,0.28395495,-1.129064,-0.59406483],[-0.7494169,-0.08572868,0.52618885,-0.5607684,0.39462608,-1.169383,-0.1503176],[0.4045638,0.70051044,-0.5056532,0.6174259,-0.5292022,0.26922572,-0.424674],[-0.27162388,-0.9250028,0.26857534,-0.01561676,0.5560947,-0.33507198,-0.16067682],[-0.5384087,-0.64021826,-0.31936148,-0.2864999,0.42469084,-0.5843407,0.030071743],[-0.80377173,-0.5939738,1.089976,-0.60083944,-0.96987534,-1.6227651,0.9416666],[0.40233278,0.16919671,-0.42055172,0.41217375,-0.26429188,0.31943977,0.2621414],[0.0319197,-0.45274907,-0.0022422147,-0.6616981,0.45422152,-0.74961704,0.64761114],[0.298545,-0.08646255,0.16982067,0.49902782,0.06976334,0.75716037,-0.17437762],[0.12613215,0.7822465,0.19383484,-0.011980963,-0.5947784,0.040464688,-0.67411786],[-0.27101958,0.011575684,-0.007966585,-0.32394916,-0.23960575,-0.05978105,0.3404521],[-0.07279379,0.53345263,-0.46249855,0.589232,0.4325604,0.32934994,0.050769333]],"activation":"σ","dense_2_b":[[-0.27212226],[-0.03061088],[0.223251],[-0.1398213],[0.024589097],[-0.05151826],[0.1156625],[-0.07707154],[0.17189187],[-0.07979791],[-0.0551535],[-0.04675364],[-0.061966155]]},{"dense_3_W":[[-0.12258424,-0.67310715,-0.6216291,0.70087993,-0.5456542,-0.08261071,-0.794985,0.378915,-0.7075973,0.33079588,0.28384545,-0.3226729,0.3842719],[-0.53314304,-0.3283625,-0.027936831,-0.30382243,0.5143159,-0.11898092,0.06643987,-0.22891304,0.20859952,-0.62020797,-0.6542792,0.21820208,0.08545237],[0.4545815,-0.4721545,-0.28263086,-0.19456169,-0.294614,0.42408562,-0.28720883,0.50096816,0.17924507,0.2068184,-0.38797694,0.21201205,0.27561057]],"activation":"identity","dense_3_b":[[0.020500826],[-0.0064320345],[-0.03172262]]},{"dense_4_W":[[1.3453387,-0.38940504,-0.36594775]],"dense_4_b":[[0.020062331]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019 b'8965B41090x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019 b'8965B41090x00x00x00x00x00x00'.json deleted file mode 100755 index eb5ba30c31..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019 b'8965B41090x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6056595],[1.1011987],[0.45016465],[0.036513034],[1.0954262],[1.096654],[1.0972972],[1.0781622],[1.0577228],[1.0278832],[0.99876994],[0.03632588],[0.03636222],[0.03639234],[0.036382567],[0.03631101],[0.036141142],[0.035890657]],"model_test_loss":0.009378368966281414,"input_size":18,"current_date_and_time":"2023-08-11_03-42-04","input_mean":[[25.669659],[-0.047895048],[0.011095525],[-0.0010007567],[-0.050389417],[-0.04983048],[-0.04955661],[-0.044621523],[-0.04115602],[-0.035016187],[-0.028634345],[-0.0010792029],[-0.0010608791],[-0.0010422019],[-0.00097256503],[-0.0010143764],[-0.0010519858],[-0.0011353532]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.16146694],[-1.5599775],[-0.17506365],[-0.19151914],[0.33073556],[-0.0044728843],[-1.8738011]],"dense_1_W":[[-0.022587843,-1.696307,-5.400682,0.3648149,0.67200285,-0.078337416,0.5580287,-0.7384839,-0.4336378,-0.06844309,1.2609831,-0.46469173,-0.3023337,0.33104905,0.30154014,0.21899197,0.04919983,-0.20795655],[-0.47104296,0.73747975,0.17403716,0.23270167,-0.1037867,0.8239424,0.09184954,0.16263483,-0.037750896,0.15098697,-0.0754606,0.34493265,-0.082084626,-0.33557257,-0.18489552,0.33800292,-0.16610008,-0.057679377],[-0.0027718232,1.5370984,0.024881154,-0.5346706,0.23415335,1.4315361,-0.14873216,0.105326936,0.066477254,0.8128371,-0.3328177,-0.32810703,0.40303403,0.28103107,0.07711046,0.079642035,0.076980725,-0.08185225],[-1.133281,-0.037655216,-0.20665579,0.09188236,-0.7868618,-0.026023107,-0.8787548,-0.6428669,0.033134256,0.11970976,-0.10050087,0.059997767,-0.022198018,-0.16140892,-0.35953227,0.29168937,0.034544915,0.05378626],[1.1066848,0.27753586,-0.22365077,0.16971135,-1.1832408,0.44884738,-0.96368015,-0.91032207,-0.23031113,0.08507745,0.05559425,-0.31901634,0.28722385,-0.31672338,0.21700029,-0.091585815,-0.15736222,0.17971504],[-0.004321371,-0.06275011,-0.048157416,0.24579182,0.47604734,-1.3198181,0.6782722,-0.10995617,-0.20460491,0.042091597,0.05913588,-0.5444536,0.061146915,0.30363235,0.18061714,0.2797491,-0.014113867,-0.18732737],[-0.5763257,-0.9677455,-0.1951802,0.11323726,-0.312983,-0.53621775,0.1185856,-0.21250775,0.04489358,-0.15929341,0.064324245,-0.2883423,-0.13198704,0.2777305,-0.03675221,-0.22492863,0.11493704,0.080734536]],"activation":"σ"},{"dense_2_W":[[-0.61590296,-0.5195715,-0.108829506,0.4103641,-0.15294282,0.4410914,1.4810303],[0.4780821,-0.8781517,-0.4252669,-0.59855515,0.4804704,0.7194652,0.3171456],[-0.0060195136,0.31312257,0.64193386,0.2910982,0.84490585,-0.9846345,-1.0567933],[0.1459189,-0.50605303,-0.69084024,-0.14800137,-0.88331693,0.6852774,0.2694695],[-0.3053409,0.35913458,0.7041157,-0.23017813,-0.017635284,0.06075772,-0.2936795],[-0.1356475,-0.78858066,-0.8566893,0.1977979,-0.3749218,0.33831593,0.691472],[0.5872542,0.44983965,0.22061676,-0.116593465,-0.36591926,-0.96924776,-0.14946656],[0.13530682,0.6748068,-0.19304672,0.5032931,0.8270327,-0.7906366,-1.0424157],[0.30044878,-1.209003,-0.07319125,-0.34063867,-1.1481062,0.9603452,1.1442114],[-0.20257956,0.61473626,0.5823472,0.24531272,-0.22855185,-0.6818321,-0.42225984],[-0.7394789,0.7810616,-0.058806174,0.8324751,-0.3867912,-0.97824925,0.15068337],[0.5175145,-0.9351888,-0.3562028,-0.7593984,-0.32492992,1.3009138,0.008064033],[-0.7596698,-0.08702234,-0.5448599,-0.6187972,0.3668954,-0.02732415,0.09881363]],"activation":"σ","dense_2_b":[[0.12397174],[0.33330676],[-0.0799793],[0.04158973],[-0.09782006],[0.037273075],[-0.23756596],[-0.14609045],[-0.24821158],[-0.159363],[-0.2940094],[0.17432326],[-0.22460997]]},{"dense_3_W":[[0.44469282,0.50233734,-0.66101295,0.3700973,-0.07787853,-0.08806539,0.41965428,-0.43115306,-0.022663087,-0.6569443,-0.39882353,-0.02137261,0.15087838],[0.16178976,0.09075096,-0.7934335,0.5412506,-0.092891194,0.6815236,-0.3410796,-0.31042063,0.55821943,-0.65534914,-0.56217957,0.64118695,-0.00170126],[0.49080417,-0.35064137,0.1350645,-0.5279935,0.09069881,0.516484,0.42135808,-0.110838115,-0.23615395,-0.30600968,0.33043766,-0.74036384,0.1663846]],"activation":"identity","dense_3_b":[[0.07007987],[0.05591756],[0.010658105]]},{"dense_4_W":[[-0.39591685,-0.9289211,0.07738602]],"dense_4_b":[[-0.050904196]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019.json deleted file mode 100755 index b1b51e3228..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6041064],[1.1035304],[0.4484023],[0.03683061],[1.0957737],[1.0976914],[1.0990177],[1.0801798],[1.0598575],[1.0331676],[1.0052766],[0.036654923],[0.036684364],[0.03671293],[0.036709417],[0.036651965],[0.036492568],[0.036210157]],"model_test_loss":0.009458640590310097,"input_size":18,"current_date_and_time":"2023-08-11_02-52-02","input_mean":[[25.630205],[-0.05623775],[0.010955678],[-0.0011824107],[-0.058129467],[-0.058100134],[-0.05753972],[-0.052215047],[-0.05002431],[-0.042788718],[-0.035654448],[-0.0013065297],[-0.001283106],[-0.0012580294],[-0.0011568652],[-0.0012149647],[-0.0012245286],[-0.0013113298]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.6020029],[-0.014326092],[2.131077],[0.9675631],[-0.19065784],[0.022073187],[-0.17599037]],"dense_1_W":[[-1.3987874,-1.1022329,-0.34505498,0.7636868,-0.20586683,-0.9504459,-0.049020052,-0.3938162,-0.123028636,-0.32886922,0.15735438,-0.4781323,-0.48132908,0.23977482,0.10422825,-0.12448882,0.05244729,-0.11038789],[-0.018301038,-0.6299352,0.00622713,0.13428006,0.5419454,-0.8375825,0.56663495,-0.19548799,-0.23334435,-0.2798497,0.34237435,-0.3636734,0.1918039,0.26086813,0.23164305,0.07724925,0.36682686,-0.23426089],[0.9700282,-1.2141867,-0.24132554,0.7250985,-0.054316934,-0.82846856,0.20743893,-0.07541251,-0.0029775759,-0.2764805,0.07297132,-0.55774605,-0.61494875,0.7186673,-0.20925622,-0.012554848,-0.007072312,-0.06780203],[1.2655128,0.6922755,-0.24722645,-0.26949418,-1.186765,0.52344996,-1.3021243,-1.0206279,-0.081423774,0.2734177,-0.22090656,-0.008360833,0.42805007,-0.6104315,0.10659541,0.59180355,-0.07409862,-0.16140598],[0.0016111843,2.3020566,-0.09538863,0.4775302,0.19104634,0.7581803,1.2245975,0.3259312,0.13016133,0.71805245,0.37977412,0.2731153,-0.35271376,-0.75976604,0.3985421,0.36015168,-0.24252148,-0.09097576],[-0.1696741,0.7506803,0.118888825,-0.3327318,-0.5104699,1.7509611,-0.8092226,-0.102412894,0.21171542,-0.41029605,0.29316515,0.289645,0.3842453,-0.32381833,-0.080485,-0.27451643,0.2969006,-0.0033906084],[0.016534764,-2.0133348,-5.4863,-0.03373743,1.1940682,-0.20837387,0.4025841,-0.2529515,-1.1387988,-0.38183406,1.9944586,-0.12616248,-0.8426146,-0.22513841,1.2779588,0.51199806,0.32435155,-0.69949305]],"activation":"σ"},{"dense_2_W":[[-0.7638269,0.031352714,0.10360953,0.5546481,0.30863878,0.82808226,-0.33563384],[0.51879066,-0.44226646,-0.5796693,-0.40858063,0.1578528,0.15035929,-0.84812665],[-0.15702121,-0.67073447,-0.4197038,0.3220818,-0.05991348,0.38041055,0.06092204],[0.806767,0.06304986,0.8075057,-0.20168602,-0.33820373,-0.87435573,-0.28601554],[0.20003784,-0.08937316,0.25184897,-0.5255257,-0.5728098,-0.43476734,-0.010894257],[-0.01787694,0.27795494,0.11630318,-0.06266501,0.060686372,-0.63279563,0.44636598],[-0.4958114,0.43005335,0.7080226,-0.12047338,-0.48428482,-0.2889726,0.44259036],[-0.39932543,-0.51808834,-0.7372899,-0.29793862,0.48923936,0.58836514,0.25622228],[0.25029996,0.08891042,-0.81593496,0.46271,0.15725288,-0.2126664,-0.08401766],[0.6195721,0.5448667,0.041502103,-0.8573642,-0.5645224,-0.87836134,0.20946307],[-0.14115311,-0.90280044,-0.5433088,0.7701665,-0.6260164,-0.13906801,0.23042479],[0.07473069,0.28087774,-0.9681486,-0.009864042,-0.6672649,0.45934054,-0.64873284],[0.13347791,-0.02133041,0.0807407,-0.2441324,-0.5546702,-0.2578623,-0.16019678]],"activation":"σ","dense_2_b":[[-0.020695023],[-0.118575685],[-0.045242883],[0.028083786],[-0.27159098],[-0.023374764],[0.012269623],[-0.12869656],[-0.1787051],[0.0306908],[-0.07568033],[-0.10759439],[-0.27744076]]},{"dense_3_W":[[-0.49162164,-0.4191868,0.0067901798,0.102787994,0.10602838,0.67330825,-0.04103629,-0.5477224,0.37683812,0.7409758,-0.15619572,-0.5923507,-0.07951754],[-0.039288122,0.28114173,-0.59904766,0.6645154,-0.44911647,-0.06922432,0.215001,-0.27168792,-0.19525866,0.49492684,-0.23237818,-0.6230769,-0.50621545],[-0.22085246,-0.51831955,-0.27986276,-0.38381657,0.54892325,0.44768026,0.31407866,-0.5329104,-0.16832387,0.34908122,-0.08704006,0.5308806,0.64026624]],"activation":"identity","dense_3_b":[[0.0607661],[0.06281816],[0.04532571]]},{"dense_4_W":[[-0.5887859,-0.83423084,-0.84973454]],"dense_4_b":[[-0.054816216]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022 b'8965B41110x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022 b'8965B41110x00x00x00x00x00x00'.json deleted file mode 100755 index c4dd358d7f..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022 b'8965B41110x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.621417],[0.60216844],[0.33766446],[0.031071559],[0.6074495],[0.6063964],[0.60408527],[0.592746],[0.5848162],[0.57773405],[0.57088673],[0.031094117],[0.031086348],[0.031075306],[0.03092497],[0.030987453],[0.030950982],[0.03085089]],"model_test_loss":0.0035974758211523294,"input_size":18,"current_date_and_time":"2023-08-11_04-33-01","input_mean":[[23.851212],[-0.011735492],[0.014822557],[0.0015981287],[-0.017860906],[-0.016335273],[-0.014861164],[-0.008908558],[-0.00019100294],[0.008320288],[0.015085844],[0.0013476122],[0.0014353959],[0.001521554],[0.0016404905],[0.0017713357],[0.001890435],[0.0018140652]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.29046783],[-0.7386649],[0.8099128],[-0.0830979],[-0.066769995],[-0.58767533],[-0.5783042]],"dense_1_W":[[-0.06973173,-1.1593121,-3.7385426,0.17812389,1.2648335,0.17882043,0.11353305,-1.1128533,-1.1402131,0.49317023,1.1549392,0.22488351,-0.039551347,0.54545957,-0.9453328,-0.30246973,0.48812893,-0.003690356],[-2.088028,0.03569328,0.06524252,0.3073911,-0.0669223,1.0475743,-0.9218425,0.20211175,-0.4463,-0.18910088,0.9684125,0.13405068,-0.1174013,0.081153475,-0.36694288,-0.18311328,0.19375218,-0.05552698],[2.1723948,-0.104979195,0.06845127,0.13558877,0.12955302,0.54661036,-0.71585613,0.37260148,-0.47275162,0.1936406,0.69998413,-0.17018797,-0.29841486,0.19461034,0.11221291,0.08999232,0.40883166,-0.48241648],[-0.0035949238,0.5195585,0.056816265,-0.21500319,0.13682762,0.6210256,-0.26336774,0.2708143,-0.3960605,-0.09337605,0.18600617,0.40625247,-0.03272976,-0.39815915,-0.4334662,0.03242743,0.106475964,0.18782848],[0.00026254903,-0.43522957,-0.29160616,1.2150093,0.561134,0.13226019,-0.3680962,0.4117709,-0.523177,0.21208563,0.37644473,1.2890456,0.35225967,0.95191664,-0.18308976,-1.3802807,-0.5709553,-2.2156804],[0.53350025,0.035052005,0.008865246,-0.04431933,-0.3176884,0.83934355,-0.37516874,0.00706265,0.0775229,0.030765524,-0.040516727,0.006187998,0.5950189,0.14796092,-0.52394676,0.060235158,-0.5274258,0.1178207],[0.5637231,0.13862197,-0.008244962,-0.3938652,0.48107556,-0.6489267,-0.07129171,-0.071288355,-0.050481576,-0.2556226,0.21773542,-0.3818978,0.122946635,-0.0005463466,0.5423771,0.15439962,-0.14910692,0.2768216]],"activation":"σ"},{"dense_2_W":[[0.33422744,0.5476326,-0.40897554,0.03363565,0.42117637,0.1993684,0.11700197],[0.016211191,-0.42357254,-0.013600616,0.58073217,-0.10585923,0.4968173,-0.06083235],[0.2560805,0.23497431,-0.4423548,-0.6719212,0.33036447,-0.65422225,0.11651074],[-1.0021728,0.6715551,-0.28054923,0.066978924,-0.047049686,-0.23047742,-0.7727124],[-0.8329245,-0.06253365,-0.8275449,-0.19949576,-0.49645177,-0.3025703,-0.39923748],[-0.0965028,-0.28401488,-0.29893482,-0.5392418,0.516837,-0.38260764,0.7805964],[-0.13280529,-0.06303277,-0.27558568,-0.47452193,-0.09497839,-0.026708731,-0.06549511],[0.33222172,0.09532853,0.094424486,0.41390723,-0.59934753,1.2102501,-1.4455571],[-0.18434185,-0.40622485,0.019825913,-0.44427174,-0.063956864,-0.15254037,-0.16048898],[0.4783499,-0.016979024,-0.38030294,0.03715881,-0.38931444,-0.73212904,-0.18792534],[-0.66844565,0.34431502,-0.1439725,0.48682266,0.041338764,0.32482722,-0.9202753],[0.10901106,0.37365302,0.25427094,-0.22439355,0.1677833,0.32048756,-0.757699],[-0.03728728,0.22946912,-0.5708871,-0.12548028,0.13651444,-0.3683857,0.40373203]],"activation":"σ","dense_2_b":[[0.03504426],[-0.021830266],[0.014506293],[-0.15004124],[-0.1996024],[0.08620867],[-0.22626895],[-0.2200163],[0.027354911],[-0.0187473],[-0.26950043],[-0.080006495],[-0.00023749561]]},{"dense_3_W":[[0.003805781,0.57647467,-0.3215517,0.6421878,0.36746186,-0.44294173,0.24244395,0.5338086,-0.60588413,-0.45965254,0.3151681,0.50712276,-0.30720553],[0.4721997,0.13897571,-0.66421515,0.36394912,-0.12090668,-0.54066294,-0.06981957,0.42225152,-0.1879612,-0.44998485,0.2981854,0.4459964,-0.1991944],[-0.46331075,-0.33276492,0.31424695,-0.0069436645,-0.17305002,0.6113178,0.48357555,0.2451846,0.33225268,0.5144922,0.4602627,0.007510923,0.5021902]],"activation":"identity","dense_3_b":[[-0.014281405],[-0.011103369],[0.0054283007]]},{"dense_4_W":[[0.86027306,0.53091425,-0.4524987]],"dense_4_b":[[-0.011388131]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022.json b/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022.json deleted file mode 100755 index e308b6f7fd..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON HYBRID 2022.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.6210785],[0.6022118],[0.33968922],[0.03099292],[0.60531795],[0.60364884],[0.60261005],[0.5927404],[0.5860802],[0.5780433],[0.57123464],[0.03102364],[0.03101872],[0.031000676],[0.030836336],[0.030818319],[0.03077106],[0.03060258]],"model_test_loss":0.0035856943577528,"input_size":18,"current_date_and_time":"2023-08-11_04-08-26","input_mean":[[23.850887],[-0.011798306],[0.008752907],[0.001631103],[-0.017083079],[-0.015211123],[-0.013052424],[-0.009723851],[-0.0010425432],[0.00763124],[0.012975372],[0.0013719393],[0.0014717524],[0.0015690022],[0.0016464603],[0.0017470267],[0.0018605703],[0.0018421216]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.64532423],[0.2870542],[-0.58806527],[0.26318058],[0.6671186],[0.6541222],[-0.22572796]],"dense_1_W":[[1.5230434,-0.007496155,1.0794041,-0.4841308,-0.6977591,0.51557744,-0.09899542,-0.23689902,0.18946739,-0.113655314,0.44560134,-0.532302,0.034997255,-0.1360111,0.17597911,0.59236944,0.050468095,-0.20623948],[1.0181296,-0.059453703,0.009536515,-0.01483209,0.38743848,-1.6092814,0.42287022,-0.26000166,0.51355636,-0.09300312,-0.20316118,0.07417511,-0.78482175,0.31442174,0.45461628,-0.05262415,-0.16865608,0.13292025],[-1.3765476,0.27935305,0.9930571,-0.51475865,-0.93571097,0.3701744,-0.72828853,0.1573733,0.84987473,0.26969302,-0.27910694,-0.17882767,0.23388991,-0.56191975,-0.17135333,0.69586045,0.3468155,-0.3236991],[1.0663162,0.11496424,-0.010609953,-0.34656164,-0.31095302,1.2454789,-0.104264125,0.16323781,-0.511932,0.1954236,0.14337912,0.27471086,0.2458354,0.09317978,-0.29965654,0.074385874,0.1680878,-0.15244573],[-0.5496053,0.30009452,0.019474812,-0.15155403,-0.42104033,0.804735,-0.24418715,0.12206082,0.01419753,-0.0772803,0.0075358734,0.31184286,0.119791746,0.02318575,-0.7550021,0.101326704,-0.19755691,0.20817216],[-0.4716649,-0.39404374,-0.017001849,0.30398825,0.37287918,-1.0172095,0.57842916,0.051887393,-0.14316402,0.08946873,-0.013960456,-0.18220635,-0.4013893,-0.019781204,0.40079808,0.3981192,0.09988082,-0.2901716],[-0.0910912,-1.8955553,-5.6552796,0.74153733,1.5436069,0.09860224,-0.26889333,-0.8300267,-0.9122361,0.28157806,1.6353471,-0.3455456,-0.19665305,0.20067552,-0.12310253,0.0478631,-0.24051762,0.018789763]],"activation":"σ"},{"dense_2_W":[[0.19653954,-0.5258311,0.14326829,0.16017042,0.2240187,-0.14981109,-0.23470822],[-0.20858146,0.37757653,-0.22290857,-0.24139176,-0.58756834,0.94805384,-0.3055405],[0.3827672,0.8731881,-0.5274364,0.5947985,-0.12186718,-0.22117402,0.97557515],[0.22888982,0.034816697,-0.4402026,-0.1263617,-0.2391757,0.375515,-0.45880428],[-0.50858766,-0.009293968,0.20779714,-0.06797905,-0.15627685,0.8566428,-0.16560455],[0.33234873,-1.0452052,0.3114699,-0.49879384,0.37760928,-0.10235413,-0.7995544],[-0.21585348,-0.7473184,0.45133677,0.48506138,0.35556215,-0.6276531,-0.18618119],[-0.3087059,-0.757823,0.30346602,0.1112487,0.23632218,-0.32476935,-0.23821081],[-0.33813116,-0.067351766,-0.084407635,-0.7633368,-0.33403933,0.5852588,0.04424095],[-0.13047165,-0.57245564,-0.10349484,0.44043526,0.8112992,-0.22286835,0.1134046],[-0.81824476,-0.48836493,0.24637613,-0.97839844,-0.44806626,0.014597846,0.6120905],[-0.011660478,0.27182546,-0.27260295,0.021457694,-0.15093423,0.103856236,-0.289786],[0.08348892,-0.27305228,-0.033261165,0.8160634,0.7069094,-0.68072647,-0.18045369]],"activation":"σ","dense_2_b":[[-0.028337892],[0.16126229],[-0.024233993],[-0.15039966],[0.010798022],[-0.2899587],[-0.050011154],[-0.23201685],[0.014608492],[0.003838476],[-0.08799288],[-0.049894854],[0.027036132]]},{"dense_3_W":[[-0.27019745,0.66014105,0.44614148,0.13896823,0.4704919,-0.17726699,-0.7050766,-0.099338174,0.18850864,-0.27997562,0.48057485,0.0069672302,-0.6804747],[0.4988687,-0.31667402,0.47645807,-0.12850301,-0.14989346,0.22235468,-0.09084276,0.10203466,0.19078694,-0.2741972,0.11726287,-0.24347067,-0.14281158],[0.11220936,-0.20938803,0.22899435,-0.17603627,-0.23535244,0.4323248,-0.064221285,-0.06924562,-0.5364228,-0.29542312,0.031429153,0.48623005,0.53304803]],"activation":"identity","dense_3_b":[[-0.056309115],[-0.10035845],[-0.002584182]]},{"dense_4_W":[[-0.93852043,-0.002831195,0.0376801]],"dense_4_b":[[0.05399409]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018 b'8965B10040x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018 b'8965B10040x00x00x00x00x00x00'.json deleted file mode 100755 index 1a89e9aa72..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018 b'8965B10040x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.7313623],[0.9888169],[0.4152069],[0.033757195],[0.97801226],[0.9809649],[0.98316544],[0.97654957],[0.96262586],[0.9422399],[0.9169314],[0.033564508],[0.033611197],[0.03365405],[0.03371377],[0.03366836],[0.033512793],[0.03326571]],"model_test_loss":0.010666782036423683,"input_size":18,"current_date_and_time":"2023-08-11_05-49-47","input_mean":[[24.96519],[-0.033782624],[0.009671044],[0.0077961436],[-0.038051996],[-0.037176047],[-0.037127484],[-0.032916453],[-0.028262928],[-0.021224912],[-0.019132588],[0.0075910226],[0.007635079],[0.0076770876],[0.0077970643],[0.007867494],[0.007903498],[0.007878507]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0528064],[0.08900857],[0.75784385],[-0.8937406],[-0.51171505],[-0.10186542],[-1.3997765]],"dense_1_W":[[-0.08676465,2.0455117,-0.102706365,-0.6707259,3.1681015,4.2520304,2.8067908,2.0205982,2.160316,1.8089273,0.55365646,0.3163457,0.4537371,-0.29166102,0.61781347,0.54595727,-0.13856713,-0.8539102],[-0.00016419945,-0.56122553,0.006468475,0.058191027,0.3205225,-1.7764372,1.0253428,-0.22990642,-0.023242323,0.14960705,-0.11546516,-0.47926554,0.13979027,0.25853786,0.35933894,0.231268,-0.163933,-0.011948538],[0.8706783,0.5629842,-1.0976667,0.6597201,0.074501075,-1.1088905,0.073258646,-0.08372772,-0.027485643,0.40303627,-0.085082166,-0.15307684,0.13970284,0.4372201,-1.0356691,-0.46190366,0.08466662,0.31719726],[0.00088525575,0.28771025,-0.00041574074,-0.12136347,-0.45848206,0.7646498,-0.7480068,0.08633297,0.2238723,0.22185136,-0.27731135,0.24002591,0.5882265,-0.46785995,-0.36120954,-0.06715729,-0.019443577,0.20275888],[-0.06155146,-0.9296325,-6.176115,0.32850727,1.9988121,0.056870196,-0.7210163,-0.90295607,-0.6347279,-1.0500165,1.7257686,-0.63104945,-0.20577207,0.52953875,-0.038163472,0.21641904,0.24872929,-0.38487554],[0.0006827544,0.06588264,0.019023217,0.33368507,-0.50753003,1.274059,-0.41946143,-0.4562805,0.1713312,0.022509854,0.060954157,-0.0036319275,-0.14435211,-0.17530417,0.13293767,-0.04580827,-0.16321899,0.061178423],[-0.97508353,0.3754842,-1.2725447,0.30404013,0.06964748,-0.63675576,-0.116767436,-0.46295738,0.2441482,-0.061135307,0.2693983,0.19074592,0.19255072,-0.050766017,-0.34838012,-0.5683125,-0.16777495,0.4320534]],"activation":"σ"},{"dense_2_W":[[-1.7291162,0.18712735,-0.784268,-0.5211682,0.23055974,-1.0369477,1.2522866],[-1.4083703,-1.245634,1.5253365,-0.38234624,1.1451472,0.3420805,-1.3369085],[0.4079928,0.09092335,0.3915673,-0.6955576,-0.99043214,-0.37307084,-1.0267273],[0.36806342,0.86456835,0.014784731,-0.9323144,0.08767326,-0.98557246,-0.49028188],[-0.2841241,-0.47625312,-0.21175718,0.43561095,-0.36729914,0.8540727,-0.43895096],[0.16099487,0.7311489,0.19461572,-0.69285166,0.41518864,-1.1639454,-0.08508787],[-0.3261969,0.4563855,0.48312464,-0.14733022,0.76256764,-0.44852886,-0.35733178],[-0.8633155,-0.17938924,-0.4462165,-0.48804846,-0.8097996,-0.4533271,-0.46252802],[0.12385623,0.009189586,-1.1579738,0.71919787,-1.7606289,-0.31546488,0.448854],[0.07684563,1.1983187,0.08234343,-1.091461,-0.19976689,-0.54287857,-0.37857434],[0.560663,-1.4880527,-0.28693125,0.17221202,-0.36113575,0.19427057,0.44083765],[-0.059977785,-0.58561826,-0.57772005,0.7993362,-0.8236306,1.0891352,0.02070652],[0.57416856,-1.5304499,-0.030536273,0.6002819,0.3496771,0.52368426,-0.5069396]],"activation":"σ","dense_2_b":[[-0.2280989],[-0.6234252],[-0.692007],[-0.121901624],[-0.3153857],[-0.17784967],[0.07650244],[-0.45358527],[-0.4148523],[-0.08295175],[-0.3685902],[-0.006143885],[-0.21816583]]},{"dense_3_W":[[-0.6464554,0.59161955,-0.08040031,-0.38394913,-0.2547638,-0.66541696,0.10209947,0.22952524,0.51443064,-0.6007329,0.16476616,0.8392625,0.86081135],[0.29400313,-0.47131515,-0.07440717,0.4786253,-0.22355409,-0.141201,0.57343155,0.42071205,0.08289365,0.49173295,-0.2876836,-0.6514307,-0.34931198],[-0.41638458,-0.038208514,-0.21903223,-0.25014666,0.40054414,-0.80169666,-0.35611898,0.19608808,0.50653106,-0.22687514,0.33846655,0.9839725,0.9331715]],"activation":"identity","dense_3_b":[[-0.1338492],[0.02347098],[-0.14936106]]},{"dense_4_W":[[0.63154566,-0.2949555,0.46449748]],"dense_4_b":[[-0.07701077]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10091x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10091x00x00x00x00x00x00'.json deleted file mode 100755 index 3f9d6a7e29..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10091x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.8614244],[0.75124866],[0.55659616],[0.019078998],[0.73906744],[0.7388618],[0.7372679],[0.7206659],[0.7110691],[0.699438],[0.68114865],[0.01886521],[0.018885473],[0.01889542],[0.01875568],[0.01862864],[0.018454202],[0.018320806]],"model_test_loss":0.01200881041586399,"input_size":18,"current_date_and_time":"2023-08-11_07-04-43","input_mean":[[19.02321],[-0.009182516],[-0.017429296],[-0.011283472],[-0.0053655286],[-0.007232309],[-0.0092455],[-0.01603544],[-0.01682772],[-0.019174336],[-0.027758926],[-0.011568266],[-0.011541738],[-0.011520918],[-0.01157352],[-0.011571877],[-0.011668593],[-0.011788717]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.03519353],[-0.15095843],[-0.7353578],[0.13929218],[-3.4776504],[0.041195296],[0.1761386]],"dense_1_W":[[0.046379987,-0.13878189,-0.036664445,0.38224146,-0.0646248,-1.0924313,0.8775562,-0.053549852,-0.15888737,0.1178062,-0.06738964,-0.47581938,0.02085043,0.04761963,0.19045879,-0.015851231,0.15402271,-0.23869996],[0.047233846,-0.37163836,-6.5784287,-1.1358076,0.5292454,-0.7138368,-0.020171849,0.20063849,0.18085273,-0.92067474,0.81135595,-0.51245284,-0.1656133,0.42384866,0.7504459,0.84762216,0.13103229,-0.24118356],[-1.1028277,-0.49579862,-0.098353446,0.35713926,-0.16605736,-0.5360656,-0.20586732,0.2877909,0.058039125,0.21760072,-0.28679097,0.055256702,-0.39677158,0.21102457,-0.21540093,0.018043555,0.26613265,-0.19123672],[-0.08534582,-0.9939401,-0.4242228,-2.8671207,0.6624762,-2.9042678,-4.992002,-3.7515533,-5.1040688,-1.9935926,1.7598441,1.1262454,1.8797381,1.1090043,-1.6218112,-0.863951,-0.5581413,1.6114283],[-1.1540707,0.43415037,-3.6339066,-0.47187626,-0.7554667,-1.4905885,0.6125929,-0.101766944,0.6937759,0.20132032,-0.47469506,0.018180996,0.51194876,0.07081824,-0.20423755,-0.27204958,-0.23085469,0.6143729],[0.005116348,0.3945791,0.10539601,0.331683,-0.8352237,0.98771363,-0.21386153,0.10292913,0.044619523,0.08716431,0.101707004,0.073796205,-0.09338911,-0.22695537,-0.19353603,0.3005215,0.19999096,-0.5015498],[0.018626228,-1.0940357,0.17377485,1.577099,0.87160116,-1.4516218,1.9833297,0.18896727,0.31323293,0.32171655,0.22981676,-0.048349075,-0.14686754,-0.003915933,-0.9725042,-0.13146995,-0.36996123,-0.098727204]],"activation":"σ"},{"dense_2_W":[[0.97411454,-0.51938444,0.8659755,-0.46950406,0.11822711,-0.8958734,0.6047596],[-0.14340101,0.1965236,-0.48290092,0.25887898,0.037219662,-0.33671203,-0.47383884],[0.883092,-0.04182707,0.39375,-0.28783375,-0.27379218,-0.5107806,0.12861542],[-0.3499007,-0.075701565,-0.16065952,0.028407833,-0.21673161,0.32120997,-0.24848087],[-1.0644221,-1.5145135,1.0423622,0.057657007,-0.8929386,0.38188818,-0.29111302],[0.6651675,-0.10167774,0.34609315,-0.41527653,0.24346839,-1.3106738,0.04831263],[-0.33749178,0.13250409,-0.17898846,-0.07075638,-0.325455,0.4888969,-0.32574978],[-0.13392222,0.005456629,0.32891217,0.2271199,0.03492276,-0.6633292,0.12100792],[-0.87907666,-0.5363504,0.67260146,-0.8091148,0.42400393,0.35343498,-0.5102727],[0.73019344,-0.2813332,0.32472983,0.5224319,-0.19995011,-0.8258774,0.12310978],[-0.9651855,-0.19100729,-0.40759322,0.079893395,0.14696078,0.21351884,0.17654544],[-0.38321492,-0.5142046,0.69242734,-0.7369066,-0.16813168,0.6556536,-0.5864559],[-0.87097305,-0.40665868,0.033173006,-0.36359137,0.2589845,0.35792008,0.16423905]],"activation":"σ","dense_2_b":[[-0.022246333],[-0.20147786],[0.01618344],[-0.018682426],[-0.39971286],[-0.37426376],[-0.05391573],[-0.14660585],[-0.12656218],[-0.13277695],[-0.1482318],[-0.31037378],[-0.18615629]]},{"dense_3_W":[[-0.44387364,-0.21935597,-0.264997,0.5069316,0.5022933,-0.08028709,0.39096925,-0.6225095,0.68565357,0.42978552,0.34397504,0.35004535,0.5203644],[0.7957216,-0.052110795,0.6300835,-0.47696984,-0.1722768,0.6797043,0.3657801,0.37323546,-0.4012943,0.56815857,0.08386955,0.013114558,0.5138369],[-0.0116800405,-0.3395463,0.52625775,-0.33296672,-0.6938831,-0.008207481,-0.47937372,-0.119277634,-0.20143117,0.46600667,-0.013720797,-0.29413077,-0.17268106]],"activation":"identity","dense_3_b":[[-0.060016062],[0.030613739],[0.060220987]]},{"dense_4_W":[[1.0726175,-0.54023695,-0.9860894]],"dense_4_b":[[-0.053101283]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10092x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10092x00x00x00x00x00x00'.json deleted file mode 100755 index 3846c4ff8a..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022 b'8965B10092x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6808248],[1.0210598],[0.5966659],[0.042756997],[1.0107573],[1.012554],[1.0153259],[0.9912984],[0.9735415],[0.9533497],[0.9332258],[0.042687085],[0.042698804],[0.042709883],[0.042716887],[0.04270658],[0.042552505],[0.04235409]],"model_test_loss":0.008525088429450989,"input_size":18,"current_date_and_time":"2023-08-11_07-30-00","input_mean":[[22.609735],[0.021366691],[0.0036772767],[-0.0055039055],[0.018654037],[0.020882115],[0.02251627],[0.021924747],[0.02177209],[0.018817721],[0.015407738],[-0.005619203],[-0.0055884435],[-0.005562743],[-0.005521372],[-0.0055254106],[-0.005608956],[-0.005731615]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.10787289],[2.7295141],[-0.014846635],[-2.52249],[-0.41797954],[0.009203023],[-0.03822759]],"dense_1_W":[[0.006059761,-0.2780369,0.019265022,0.3020706,0.034155324,-1.3772042,0.47423708,0.35504794,0.36091778,-0.19814305,-0.16233607,0.22252728,0.31619906,-0.26939157,0.13296632,0.16370413,0.24879563,-0.44122157],[1.2936878,0.5217924,0.16455218,0.27345595,-0.03019537,1.0137162,-1.5315937,0.121129505,0.2535813,0.051281486,-0.114028275,0.08941389,-0.16636313,-0.046149377,-0.58158803,0.44673163,0.3362695,-0.30439505],[0.010025998,-1.1366434,0.06847304,0.05892584,0.7231386,-0.90292823,0.3060419,-0.17182396,0.06936535,0.13302577,-0.08824037,-0.6510271,0.25069413,0.5232841,-0.39950168,-0.1576116,0.20445362,0.044638686],[-1.2454971,0.6038898,0.16080211,0.12973976,0.13429877,0.7463809,-1.2848366,-0.16410895,0.124600835,0.30732483,-0.16996159,0.18161087,0.29306152,-0.6729109,0.00044485295,0.22021376,-0.11470402,0.0064366944],[-0.057729445,-1.6840429,-6.5337806,0.5755675,1.9029108,0.3108279,-0.045327578,-0.4666652,-0.8846539,-0.7133611,1.3928591,-0.7003825,-0.16232297,-0.3231918,0.5879237,0.5351214,-0.0139183095,-0.46289876],[0.012766599,-0.6894872,0.24702038,-0.23795167,0.051006347,0.81989294,-0.44921973,0.5467078,0.1596552,-0.13800426,-0.14706412,0.2545808,0.15971354,0.31360984,-0.8261207,-0.0990083,-0.2607686,0.524966],[0.011152478,-0.2827323,-0.0088778855,0.10415767,0.04776933,-1.0724484,0.85188013,0.12321841,-0.17070293,0.04727044,-0.03278087,-0.34906387,-0.070353836,0.4458464,-0.016616534,0.07696789,-0.16656372,0.2188996]],"activation":"σ"},{"dense_2_W":[[0.013153307,0.72258556,-0.9607895,0.5651246,0.30607197,-0.020686822,-1.0686581],[0.250104,-0.78947,0.47588462,-0.6149001,-0.032745462,-0.4966682,0.88839453],[0.22150557,-0.76598793,-0.3002023,1.2499317,-1.6504543,0.030420702,0.15898795],[-0.083388545,-0.689518,0.05265897,1.5231378,-1.540956,0.26537773,-0.5574814],[0.24958974,-0.37062392,-0.14619073,-0.13918088,0.43284532,0.04136838,0.07143529],[0.15065649,-0.109692805,0.093387246,0.30221173,-0.024876209,-0.09227776,0.63619983],[0.56862855,-0.17278619,-0.33281788,-0.10547164,-0.00034883298,-0.56013817,-0.22195897],[0.42458898,-0.77232456,0.6531793,-0.07446621,-0.1938117,-0.45410666,0.6741056],[-0.16886851,-0.47917107,0.49286413,-0.034239717,-0.108527124,-0.08425037,0.07619126],[-0.26427963,-0.02655328,-0.7206567,0.46840718,-0.6032674,0.5223421,0.075842224],[0.0049433056,0.95529455,-0.5440883,0.41637206,-0.45465398,0.8077066,-0.71393406],[-0.063968115,-0.108970076,0.109497316,-0.3942332,-0.68592453,-0.0995049,-0.4702665],[-0.70982593,0.37136346,-0.37781605,0.35262644,0.4457534,0.16508546,-0.5957397]],"activation":"σ","dense_2_b":[[-0.116926156],[0.0042479504],[-0.46176797],[-0.23112983],[0.011751201],[-0.011064423],[-0.038083997],[-0.029864028],[-0.008636633],[-0.040441785],[0.016329648],[-0.3489733],[-0.0816719]]},{"dense_3_W":[[-0.022905884,-0.09678962,-0.42239848,0.013462638,0.31903088,-0.51887375,-0.33630884,0.26145482,-0.1154883,0.33833036,0.11669115,0.06747294,0.11933737],[0.050040435,-0.5856353,0.14493953,0.6705113,-0.3872963,0.361062,-0.5757033,-0.16463317,0.09669611,-0.44681597,0.35252583,0.50204754,0.63696355],[-0.45258597,0.3210578,-0.28552428,-0.19756064,0.47599337,0.4500213,-0.24421427,0.72807336,0.25044173,-0.62012583,-0.6892487,0.28510118,-0.39239216]],"activation":"identity","dense_3_b":[[-0.032324813],[-0.058080077],[0.051499244]]},{"dense_4_W":[[0.19064297,0.63367367,-1.2247652]],"dense_4_b":[[-0.051857576]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33540x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33540x00x00x00x00x00x00'.json deleted file mode 100755 index 185558301f..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33540x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9780097],[1.4051862],[0.48408332],[0.04853162],[1.3928818],[1.3977288],[1.4018258],[1.375475],[1.3433505],[1.2949077],[1.2478521],[0.048412163],[0.048431084],[0.048459467],[0.048518475],[0.048504874],[0.04839253],[0.0481143]],"model_test_loss":0.00801712553948164,"input_size":18,"current_date_and_time":"2023-08-11_08-30-17","input_mean":[[25.642933],[-0.0019835518],[0.0040060235],[-0.009254944],[-0.0033266023],[-0.0029646403],[-0.0019904082],[-0.0020933496],[-0.0038487294],[-0.005581948],[-0.0044637513],[-0.009216257],[-0.009224849],[-0.009232599],[-0.00923392],[-0.00923287],[-0.009259574],[-0.009315466]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.04618915],[-3.334577],[-0.022748481],[-0.07218225],[3.7755296],[-0.122582935],[-0.0052783587]],"dense_1_W":[[-0.0012499753,0.33883905,0.042702407,-0.2214031,-0.36033404,1.2806584,-1.0731505,0.25989679,0.14866988,-0.10340344,-0.015702773,0.5870672,-0.09173469,-0.32383582,-0.35129866,0.27342206,0.0042890036,0.025042968],[-1.6428236,-0.63481885,-0.111530595,0.3713098,0.092823684,-0.6249234,0.54686266,0.41442233,0.03279755,-0.1797473,-0.09668681,-0.3626609,0.28806838,-0.031328026,-0.23864591,-0.1097307,-0.016905924,0.0765963],[-0.0009610195,1.2744341,-0.11151947,0.054716695,-0.73242664,0.90427834,0.16628876,-0.017297843,-0.053887896,0.30539826,-0.19929217,-0.22211027,0.10559502,-0.13222888,0.23039715,0.42640105,-0.40309757,0.036333088],[-0.023137279,1.8224742,4.434084,-0.51519555,-1.1649675,-0.28008473,0.09062625,0.14845455,0.49387005,0.02369536,-0.5737739,0.32818693,0.34118465,0.1457762,-0.5785472,0.1424408,0.16707024,0.08814323],[1.7683705,-0.1194262,-0.13175204,-0.23340832,0.29679087,-0.8300054,0.16098455,0.44727117,-0.1962079,-0.44604713,0.14344603,-0.46670324,0.37683523,0.5052653,-0.11880916,-0.39280412,0.36395994,-0.05599607],[0.00085408555,-0.3749454,-0.00757018,0.07293645,0.47284073,-1.08383,0.43937385,-0.3126087,-0.2110254,0.091425285,0.019250873,0.18259677,-0.20196928,0.24545331,0.41908297,0.12497451,-0.04950806,-0.27745348],[-0.002797162,0.45220622,0.0928887,0.14079146,-0.038952228,1.2299527,-0.77015364,-0.33163518,-0.19668595,0.18426204,-0.054098736,0.3948651,0.4821092,-0.12373006,-0.4104894,-0.3608244,-0.050283466,-0.054687865]],"activation":"σ"},{"dense_2_W":[[-0.9274079,3.2624276,-0.5414991,-1.8350966,-0.8542368,0.35031518,-0.34859648],[0.9660724,-0.7803512,0.48230568,0.0805093,0.19358476,-0.52365863,0.4405566],[0.7851582,-0.6059611,0.086790875,-0.26486087,-0.7225202,0.06725921,0.7280278],[0.62741816,0.033202164,-0.2685909,-0.15281594,-0.8427713,0.13733315,0.01932823],[0.8164209,-0.41978616,0.2836711,0.26222813,-0.87872094,-0.8590503,0.68521476],[-0.043918654,0.16022983,-0.2956201,-0.4721823,0.8772654,1.004911,-0.83114386],[0.07872535,-0.29399154,-1.0099515,-1.1905336,0.052381076,-0.71205014,-0.7501543],[-0.4239558,0.48020416,-0.45598856,0.09060652,0.64608604,0.5741175,-1.1443394],[-0.09043453,-0.1659236,-0.6169011,-0.7262809,1.2436397,1.0421194,-0.40427843],[0.4041751,-0.14081301,0.57343036,0.18853396,0.12455946,-0.9625049,-0.17269157],[-0.8457818,0.12824811,-0.046741482,-0.18018991,0.9064454,0.3723606,-0.51164293],[-1.1185607,1.6248577,-0.42184004,-0.4399729,-0.2472109,0.8469407,-0.9312666],[0.49973565,-0.3323982,-0.3472047,-0.593044,-0.38130876,-0.39827725,0.49389073]],"activation":"σ","dense_2_b":[[-0.18386438],[-0.05718434],[-0.06549015],[-0.07134607],[-0.10577739],[0.005866841],[-0.2776331],[-0.04393405],[0.1977544],[-0.06883987],[0.05352327],[-0.20584084],[-0.11540173]]},{"dense_3_W":[[-0.06877563,-0.7143566,-0.03641639,0.39388388,-0.18843412,-0.014399047,-0.45135775,0.8130004,0.5402372,-0.22440514,-0.026450275,-0.359043,-0.019707523],[0.18318374,-0.5381017,-0.6231416,-0.5614665,-0.5481862,0.61288226,-0.22442989,0.39143884,0.5283164,-0.4216234,0.38933647,0.2545475,-0.002126224],[-0.88305146,0.18006742,-0.40557522,-0.16114128,0.08966503,0.26192102,-0.4644843,0.3903803,0.02153314,0.22797619,-0.26264903,-0.33558837,0.53328735]],"activation":"identity","dense_3_b":[[-0.0750595],[0.053941935],[-0.05915371]]},{"dense_4_W":[[-0.07031837,-1.2113694,0.261664]],"dense_4_b":[[-0.05185825]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33542x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33542x00x00x00x00x00x00'.json deleted file mode 100755 index 541c69ebe1..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33542x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.253551],[1.2301955],[0.4433781],[0.048036292],[1.2180563],[1.2215648],[1.2244625],[1.2078366],[1.1872348],[1.1560153],[1.1222544],[0.047749482],[0.047788024],[0.04782943],[0.047852717],[0.047783505],[0.04746524],[0.046932556]],"model_test_loss":0.008610215969383717,"input_size":18,"current_date_and_time":"2023-08-11_08-57-34","input_mean":[[26.187445],[-0.0071422574],[0.001980914],[0.001046037],[-0.007964942],[-0.007880573],[-0.007988253],[-0.009467786],[-0.008615659],[-0.008149362],[-0.009630898],[0.00084624556],[0.00086762797],[0.00088921416],[0.0008551317],[0.00078379776],[0.00071628735],[0.0006797733]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.02733056],[0.9519103],[1.179534],[-5.256048],[-0.068846025],[-0.001023872],[0.047838554]],"dense_1_W":[[-0.007770572,-1.2564598,0.036638457,0.21713501,0.23338117,-0.7073799,0.33575004,-0.19753128,0.24105607,-0.25897455,0.00047999376,-0.40289143,-0.1727166,0.26855484,0.15926753,-0.11272167,0.14361864,-0.027891645],[1.4905782,-0.47127068,0.26584575,0.3194812,1.1585804,-0.49999246,0.8128295,-0.06897485,0.27223653,0.27935958,0.6564722,-0.1511041,0.08323231,0.105417795,-0.19195606,-0.5771197,0.2512899,-0.16904134],[0.9752811,0.3798001,0.17150617,0.078614265,-0.4016901,1.0311221,-0.43946624,-0.046153106,0.45251793,0.23658508,0.19738759,0.27465844,0.24110676,-0.52507246,-0.1172636,-0.13135712,0.0018473302,-0.044648286],[-1.9979073,0.469533,0.38075405,0.38248965,0.03199995,0.8767418,-0.3808672,0.13193713,0.9768667,0.6579403,0.27945238,0.12676767,0.05653972,-0.5021998,-0.005707313,-0.5350684,0.50075513,-0.48098195],[0.09501199,-0.43849072,-0.02388532,-0.19896263,0.5059142,-0.7151482,0.5014636,0.14320679,-0.26502132,-0.10398254,0.097926326,-0.31807315,-0.017643483,0.26102692,0.11085488,0.44673,0.070843324,-0.24798131],[0.01869301,1.0456816,4.226997,-0.0017353684,-0.24813181,-0.09464798,0.19211425,0.2305938,0.75171006,0.0668822,-1.5460484,0.17806499,-0.3484644,-0.10388819,0.11723415,-0.087600686,0.043417487,0.026686585],[0.026612299,0.18889695,0.025076069,-0.31810546,-0.24766445,1.1192691,-0.5334893,0.19868112,-0.17242211,-0.24407543,0.15552837,0.44391513,0.22742282,-0.40553492,-0.3606672,0.12259318,0.1473879,-0.045519803]],"activation":"σ"},{"dense_2_W":[[0.60255677,0.16861977,-0.09762268,-0.2837764,-0.07567895,-0.37070033,-0.79792696],[0.49195844,0.17409827,-0.4679116,-0.20569389,0.6392559,-0.2820173,-0.7966848],[-0.053543754,-0.04045658,0.061384078,-0.27339914,0.29516026,0.09619451,-0.5365491],[0.19862464,0.40960187,-0.5885574,0.19464053,0.31404445,-0.14482382,-0.71336615],[0.050688785,-0.2452892,-0.71070766,-0.0914633,-0.36177072,-0.4671836,-0.55903697],[0.4795129,-0.131694,0.1492489,0.15489131,-0.007348985,-0.22303534,-0.31186175],[0.5021524,0.2245533,-0.6239134,-0.6030447,0.4679717,0.1760995,-0.099333],[-0.49081337,0.24919184,0.8373565,-0.41256565,0.28563014,0.67823786,0.38134417],[-0.8883889,-0.43416515,0.52214336,0.38264576,-0.64902043,-0.3316096,1.2996199],[0.13214777,-0.09506896,-0.7131637,0.5065029,-0.10351111,-0.593896,-0.7980942],[0.10000199,0.33303285,-0.18169716,0.19090554,-0.36384225,0.3556522,-0.67900723],[-1.5198281,-1.2734241,0.3973511,1.1452348,-1.8075484,0.96129864,1.0681554],[-0.81462014,-1.5782593,1.6699271,-0.5293936,-1.0444264,0.0026833075,1.7008731]],"activation":"σ","dense_2_b":[[-0.07236402],[0.028845945],[-0.1323438],[-0.1738864],[-0.09381208],[-0.1300469],[-0.11935734],[0.07721876],[0.14992687],[-0.06720915],[-0.19223419],[-0.33762133],[-0.1208263]]},{"dense_3_W":[[0.16432953,0.5942093,0.24944223,0.07672291,0.17414363,0.19451983,0.59266853,-0.668625,-0.64897245,0.6133092,0.21917813,-0.2546305,-0.6117167],[0.58310723,0.54848456,0.44340667,0.1732376,0.31500515,0.234152,0.39546844,0.19260909,-0.2684148,0.04366559,-0.37576258,-0.3523593,0.018720862],[0.2536531,-0.7660225,0.56532425,0.067297734,0.030229906,-0.009724075,0.45067325,-0.23095876,0.112479135,0.20881021,0.014405874,0.8360824,-0.10908318]],"activation":"identity","dense_3_b":[[-0.09141844],[-0.10133247],[0.05868698]]},{"dense_4_W":[[-0.96234053,-0.4108186,0.2421145]],"dense_4_b":[[0.09122495]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33581x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33581x00x00x00x00x00x00'.json deleted file mode 100755 index 03a5364272..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018 b'8965B33581x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.861338],[1.27499],[0.57348746],[0.046157062],[1.2795943],[1.2781751],[1.2762386],[1.24604],[1.2176551],[1.1878494],[1.1657255],[0.046013683],[0.046028],[0.04604425],[0.045964256],[0.045818],[0.045440868],[0.044904295]],"model_test_loss":0.0066848318092525005,"input_size":18,"current_date_and_time":"2023-08-11_10-12-24","input_mean":[[25.302942],[-0.08986686],[0.006437036],[-0.000770344],[-0.09078672],[-0.09131106],[-0.09105468],[-0.087818414],[-0.08535958],[-0.08077309],[-0.07629666],[-0.0008042366],[-0.00080282136],[-0.00080204045],[-0.0008154784],[-0.0008211331],[-0.0008975459],[-0.0010069694]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0742805],[0.92973286],[-1.2597991],[-0.015863936],[0.076297365],[0.039942347],[-0.09862842]],"dense_1_W":[[-0.89714944,-0.5694732,0.2553829,0.08549169,-0.3029584,0.8248408,-0.34906214,-0.0043470534,0.29719195,-0.2585757,0.16454367,0.2295475,0.1065112,-0.042710267,-0.63867694,0.22198902,0.1815665,-0.019736245],[0.043996632,-0.5165713,-0.01470944,-0.01490538,0.0015828871,-0.37951434,0.41633916,-0.43565232,0.0105871195,-0.09095717,0.14132233,-0.23960045,-0.23504797,0.4974917,0.23090471,-0.0010534904,0.14477685,-0.15111166],[-0.8907693,0.102393575,-0.26280454,-0.2428607,0.0006221315,-0.75598705,0.89070266,0.24951544,-0.1677102,-0.22674787,0.041006655,-0.6199366,0.055024263,0.34216496,0.2160915,0.37361667,0.13422973,-0.37392148],[-0.041263368,0.22979482,0.02687934,0.23515709,-0.058687184,1.2512988,-0.31698132,-0.20909786,-0.24276179,0.0524146,0.18924035,0.05974352,0.018966423,-0.30618235,-0.39119706,0.09769458,0.1381972,-0.09514759],[0.046502795,0.6602059,-0.037667993,-0.25442934,-0.11708759,0.86960804,-0.49021152,-0.07804353,-0.11474104,0.1469114,0.04552821,0.3126329,0.2082432,-0.5143092,0.114365466,0.15073813,-0.16331002,0.05541271],[0.05034215,0.14753957,0.032934844,0.028605228,-0.5262837,0.40912592,-0.21305162,0.5888757,0.5798016,-0.2346427,-0.29419842,0.1249654,0.34906247,-0.4432667,-0.36166826,-0.043212466,-0.00637034,0.10826623],[0.002508507,-0.9045623,-6.878152,-0.029319404,1.0181056,-0.451885,0.033875328,-0.75717235,0.07011871,-0.14485015,0.786407,-0.3947812,-0.098444514,0.39931172,0.10100173,-0.07530515,0.36536965,-0.30755058]],"activation":"σ"},{"dense_2_W":[[0.22400917,-0.30598494,0.25054607,0.37136942,-0.24538715,0.034769878,0.4539929],[0.037326954,-0.41299608,0.16081683,0.24574164,0.056523614,-0.027640207,-0.1309322],[-0.39091694,0.5082205,0.93584853,-0.63075423,-0.15180112,-1.0432836,-0.22495167],[-0.15306623,-0.45128495,0.41558233,0.48239455,0.6017532,0.7212807,-0.30316913],[-0.08770284,0.46613476,0.47092214,-0.53098565,0.050529372,-0.8164752,-0.0025518546],[-0.33539963,-0.48491186,-0.34354278,0.012208527,0.4700861,0.36545125,-0.041543964],[0.17866884,-0.19735998,-0.67110294,-0.3110027,-0.5290932,-0.68236077,-0.111222625],[-0.7327989,0.93089855,0.07169331,-0.49829224,0.19631308,-0.13825691,0.5089517],[0.36573797,-0.3776811,1.7510772,-1.9604117,-2.1450837,-1.4785987,1.3181192],[-0.21792145,0.016347371,0.10254979,0.51089144,-0.06845565,0.3958906,0.20665437],[-2.080944,3.407494,-0.39748654,-0.95476985,-0.6695305,0.49773726,1.6649209],[-0.3173275,-0.17373022,0.098646894,-0.46179616,-0.40287703,-0.20223522,-0.4789483],[0.030579967,-0.23474593,-0.26780617,0.6667259,0.5838826,0.37227827,-0.38209188]],"activation":"σ","dense_2_b":[[0.031172732],[-0.046594083],[0.04188912],[-0.009133611],[-0.020946773],[-0.008495372],[-0.2704271],[0.094023824],[-0.40898916],[-0.048260532],[0.6355896],[-0.01349315],[0.003674332]]},{"dense_3_W":[[-0.31565678,0.29919386,0.12521249,-0.51271564,0.4427603,0.122981675,0.48869878,-0.06551224,0.7051895,0.21552129,0.39309025,0.5903403,-0.5543942],[-0.2777765,-0.6289323,0.28298908,0.31119838,0.6172389,-0.27801976,-0.23232892,0.41942078,-0.05232441,-0.3835318,0.032355104,0.40797642,-0.5436199],[0.30726758,-0.13741928,-0.16658607,0.55618703,0.04306974,0.5606126,0.19286956,-0.5398464,-0.2852267,0.1816551,-0.6652878,0.26612532,0.55205345]],"activation":"identity","dense_3_b":[[-0.03041773],[-0.017930472],[0.016982466]]},{"dense_4_W":[[-0.9280437,-0.7111026,0.5093497]],"dense_4_b":[[0.021796599]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021 b'8965B33630x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021 b'8965B33630x00x00x00x00x00x00'.json deleted file mode 100755 index 5e651c0507..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021 b'8965B33630x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.546224],[1.4038109],[0.5651468],[0.043467518],[1.3987619],[1.4010857],[1.4028497],[1.3774658],[1.3484732],[1.3066528],[1.2626185],[0.043321155],[0.043366555],[0.043409824],[0.043420527],[0.043341193],[0.043100573],[0.04268996]],"model_test_loss":0.008768445812165737,"input_size":18,"current_date_and_time":"2023-08-11_11-30-42","input_mean":[[23.653286],[-0.08564946],[0.00538869],[-0.0041225236],[-0.08325304],[-0.08371971],[-0.08399296],[-0.078614086],[-0.07081872],[-0.05996409],[-0.049967643],[-0.00410234],[-0.0040951944],[-0.0040958365],[-0.0041202484],[-0.00410688],[-0.0041029328],[-0.00419054]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.03874873],[-0.784227],[3.223217],[0.5529675],[0.30194795],[-1.4031215],[0.056803867]],"dense_1_W":[[0.034401055,-0.34275624,0.030142846,0.1802324,-0.107920006,-1.022601,0.54692894,0.13827248,-0.059076726,0.30037975,-0.31303012,-0.06996616,-0.12360416,0.28437266,-0.15365309,4.6970963e-6,-0.26872233,0.2647263],[-0.16882746,-0.5824008,-0.020696588,0.14142953,0.2510791,-0.82992935,0.7110236,-0.29950327,-0.11735881,-0.14580877,0.19486403,-0.225828,-0.2887637,0.32220486,0.15587561,0.14097172,0.05713667,-0.11179676],[1.2839215,0.69310856,0.25602317,-0.010940563,0.09358904,0.9869969,-1.9319696,-0.5257503,-0.3271229,0.07050555,1.0539954,0.37352842,-0.48068744,-0.5090061,0.5122622,0.41323286,0.19394471,-0.44235808],[1.1244255,0.013561664,-0.29108623,-0.36359474,-0.19730152,0.99993306,-0.5672578,0.35510588,0.0071264915,-0.11894784,-0.73594254,0.24889143,0.22513571,0.13149923,-0.34713557,-0.09747717,-0.21321945,0.36720133],[0.15369973,-0.45637712,-0.03247139,-0.1660746,-0.09586008,-0.50975263,0.6658816,-0.49961114,0.11238557,0.07679043,-0.0053253584,-0.15730502,-0.12147023,-0.2606572,1.0126175,0.005088513,0.28010598,-0.38153377],[-0.79352224,0.26021218,0.16691022,-0.21337944,-0.48989457,0.5108416,-0.9224001,0.012780019,0.02489179,0.38960975,0.22246063,-0.043535743,0.18737064,-0.2547757,0.2212282,0.41946402,-0.13940004,-0.1286837],[0.010760579,1.3616978,5.955588,-0.23460385,-1.2176392,0.08488249,-0.47026646,0.4500766,1.1898807,-0.050334588,-1.1531816,0.45957503,0.277536,0.27783328,-0.79819953,-0.6636131,0.3210711,0.3499502]],"activation":"σ"},{"dense_2_W":[[0.3657454,0.81196916,0.34115106,-0.05315271,0.418085,0.20080918,0.51165557],[0.24918951,0.758012,-0.7564233,-0.48264846,0.14990342,-0.45200977,-0.5562867],[-0.80529535,-0.9293644,-0.17528604,0.41654125,-0.21587072,0.21727388,-0.27255547],[0.5453549,-0.083353505,-0.49446028,0.53072816,0.4999342,-0.032543693,-0.27890655],[-1.0843325,-0.7817543,-0.7844736,-0.08889147,-1.439987,1.2749369,0.77239406],[0.14125653,0.5189451,-0.45035714,0.023866806,-0.18329848,0.025697729,-0.67258346],[-0.10291709,0.37623602,0.3589048,0.48825127,-0.16012862,0.22953656,-0.57453346],[-0.14062448,-0.6055541,-0.83215773,-0.40746033,-0.924489,-0.010786422,0.17521149],[0.30822852,-0.12148049,-0.40332836,-0.48652056,0.08054319,0.13378952,-0.7915521],[-0.7257491,-0.7932184,0.10272839,-0.25080377,0.0010266063,0.74610263,-0.049907055],[0.42381865,-0.0553793,-0.38158083,-0.265551,0.85806245,0.1474835,0.14327356],[-0.67127514,-1.3377081,1.2235403,0.68773735,-0.28817493,0.81384164,0.74030864],[-0.71422875,-0.88451463,0.27248266,0.44150946,-0.58906794,0.77334875,-0.2741372]],"activation":"σ","dense_2_b":[[-0.038974255],[-0.060381696],[-0.11952605],[-0.073940076],[-0.046222135],[-0.047778048],[-0.04543839],[-0.24633041],[-0.30813476],[0.036111247],[0.013441597],[0.1894709],[0.040286675]]},{"dense_3_W":[[-0.07313357,-0.59815574,0.26091176,-0.66873443,0.35969868,-0.25591415,0.0072562387,-0.098555766,-0.4751247,0.21601625,-0.14175397,0.41238782,0.47897983],[0.09714538,0.3654853,-0.2926264,-0.28464285,-0.61904335,0.3250731,0.15649477,-0.22976924,-0.41835013,-0.24120942,0.41197148,-0.17491877,-0.5697462],[0.55913174,-0.20682354,0.04047605,-0.075866535,-0.51092017,-0.47107786,-0.1388181,-0.17455935,0.5574489,-0.6044243,-0.13675697,0.4066009,-0.3129467]],"activation":"identity","dense_3_b":[[-0.054309756],[0.06553867],[0.04563365]]},{"dense_4_W":[[1.1299008,-1.1184049,-0.16297631]],"dense_4_b":[[-0.059165344]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33540x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33540x00x00x00x00x00x00'.json deleted file mode 100755 index ef4b109aee..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33540x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.8744264],[0.95179135],[0.41017145],[0.033567343],[0.9481631],[0.94890034],[0.9500518],[0.9391581],[0.92971367],[0.91555744],[0.9017156],[0.03344094],[0.03347542],[0.033526078],[0.033655073],[0.033587176],[0.033420175],[0.033133168]],"model_test_loss":0.006604278460144997,"input_size":18,"current_date_and_time":"2023-08-11_12-47-30","input_mean":[[24.228636],[-0.006917462],[0.012768614],[-0.01302538],[-0.007990223],[-0.007133511],[-0.006058136],[-0.000751731],[0.0036597915],[0.011357695],[0.014827531],[-0.012985793],[-0.012987019],[-0.012994645],[-0.013017216],[-0.013077659],[-0.013120363],[-0.013297155]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.304586],[0.857909],[-0.13514984],[0.041853286],[2.706798],[-0.056241833],[0.21371262]],"dense_1_W":[[-0.3753853,-0.9076579,0.0028183204,0.4173851,0.21572869,-1.0650074,0.73067254,-0.042485468,0.09713275,-0.03332723,-0.06025824,0.031956095,-0.41729087,0.31993416,-0.17310858,-0.047939993,-0.17648701,0.17462116],[0.33882773,-0.6728253,0.008314714,-0.09627012,0.36394936,-1.1073593,0.40562075,0.025473012,0.14220724,-0.22702415,0.032973353,-0.19210276,-0.099463224,0.3244121,0.4324219,-0.2788309,0.019109316,0.013932906],[-0.0022891897,0.031610064,-1.2756119,-0.41923544,0.012356326,-0.58470213,0.4747707,-0.59731174,-0.27581474,0.25697255,0.45881832,-0.34830928,0.25764722,0.26794606,0.1684697,0.28286308,0.054468513,-0.20199662],[-0.07542859,0.49655056,0.009735591,-0.29418063,-0.39386368,1.3242066,-1.0746825,-0.027953196,0.4030883,0.05812593,-0.17800117,0.14682488,0.52946347,-0.23444709,-0.2074028,-0.1704285,-0.1765637,0.28617206],[2.4904616,-0.26425233,-0.0018980796,-0.21572022,-0.50891054,0.17968056,0.5879445,0.25236315,0.11600188,-0.48917735,0.18833756,-0.108221054,0.18672714,0.2742739,-0.25533918,-0.044307824,0.22729309,-0.061135843],[-1.5304627,-0.06861046,-0.0068868627,-0.14318405,0.5373798,-0.4130537,1.0160918,0.28602827,0.1930912,0.6789012,-0.4611178,-0.4333957,-0.061391115,0.2945637,0.18769418,0.11001372,0.012913331,-0.2238074],[-0.041391328,1.6325934,8.690423,-0.05333061,-1.1986765,-0.6498667,-0.09251747,0.8950851,0.6041451,0.18318479,-1.2228688,0.04124331,0.48312688,-0.46965152,-0.5156128,0.43232778,-0.04794754,-0.017222332]],"activation":"σ"},{"dense_2_W":[[0.37433198,0.6652587,0.08239935,-0.8569689,-0.8685764,-0.3847302,0.0137114385],[-0.35057282,-1.2175003,-0.42322615,0.38215703,-1.0018536,-0.15562555,0.6304607],[0.86870515,0.79735583,-0.4298693,-0.554179,0.43315074,0.091884896,0.17298584],[0.9098309,0.52323526,0.12250424,-0.6117293,0.70999146,0.24827984,0.08124493],[0.57016754,-0.119958416,0.007385769,-0.20906192,0.028813249,-0.092872046,0.018928468],[-0.20748374,-0.31650364,-0.22984746,-0.6644821,-0.058953296,0.064504504,-0.48933387],[-0.22011767,0.2896796,-0.48634374,-0.12751068,-0.70889044,-0.26188907,0.11740775],[0.015611131,-0.3213432,-0.6176512,-0.23218389,0.2165557,-0.08857583,-0.32597545],[0.97897273,0.065667436,-0.2384423,-0.51702297,-1.5663196,-0.2764533,-0.7045769],[0.11058509,-0.9896542,-0.6524602,0.28573242,-0.63486636,-0.24109863,0.24683195],[-0.66108924,0.24438925,-0.27961603,0.6331003,0.7140061,-0.40370527,0.74801046],[-0.15248063,-0.86366767,-0.5378505,0.54860836,-0.28483847,0.048412364,0.030324109],[-0.5823096,0.039869063,-0.044110443,0.24722692,-0.14052401,-0.2127331,-0.4708845]],"activation":"σ","dense_2_b":[[-0.23049933],[-0.005141671],[-0.006018821],[-0.09049717],[0.07267921],[-0.2727181],[-0.37398845],[-0.007982683],[-0.31346324],[-0.006329838],[0.18627632],[0.060891155],[-0.025011454]]},{"dense_3_W":[[-0.6244113,-0.0693489,-0.64380056,0.02070149,-0.2835836,0.17476825,-0.30840033,-0.18814965,0.20354885,0.48808318,0.12971187,0.6179497,-0.062635556],[-0.03557403,-0.6171725,0.38030297,-0.011414498,0.7638232,0.5485419,0.069103144,-0.53698826,0.41040367,-0.646017,-0.50121707,-0.34758377,0.05735551],[-0.2116303,0.35683113,-0.32435957,-0.6160469,0.15839952,0.04338889,0.16674682,0.29060665,-0.39650652,-0.32134357,0.6334751,0.45032698,0.4106783]],"activation":"identity","dense_3_b":[[0.035586465],[-0.021380048],[0.02714556]]},{"dense_4_W":[[0.96291214,-0.41048172,1.2709689]],"dense_4_b":[[0.03164057]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33542x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33542x00x00x00x00x00x00'.json deleted file mode 100755 index cae93624e0..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33542x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.103622],[1.1064674],[0.4549032],[0.04746862],[1.0982857],[1.0995609],[1.1011963],[1.0907159],[1.0762013],[1.0530915],[1.0245787],[0.04732885],[0.047370408],[0.047405586],[0.047371153],[0.047191557],[0.04685842],[0.046427477]],"model_test_loss":0.0077569992281496525,"input_size":18,"current_date_and_time":"2023-08-11_13-13-15","input_mean":[[24.77323],[-0.008526437],[0.012011691],[0.006570668],[-0.006429047],[-0.0059693544],[-0.005243256],[-0.0018391812],[-0.0014637707],[-0.0009910533],[-0.0016574132],[0.0064960546],[0.0065228636],[0.006551923],[0.006488435],[0.0064425557],[0.0063805063],[0.0062670223]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[3.3205738],[0.14958848],[-0.037750356],[2.9136846],[0.37804675],[0.029861098],[-0.23139778]],"dense_1_W":[[1.9326701,-0.5547836,-0.10067679,0.88928187,0.3556339,-0.44636774,0.371038,-0.16718003,-0.1884807,-0.48036063,-0.07517039,-0.37563908,0.008011507,-0.122201584,0.38154516,-0.52539575,0.3565951,-0.21173865],[-0.05472125,0.71019995,-0.011301738,-0.24624866,-0.20143683,0.6633662,-0.528109,-0.039701864,0.11818609,0.072079115,-0.06178089,0.09657236,0.26577142,-0.09257749,-0.33768046,0.16679412,0.043577697,-0.00800075],[0.08681189,0.67218554,0.016864384,-0.17151606,-0.7993779,1.7853086,-1.0030217,-0.03944043,0.4116835,-0.25059646,-0.008190873,0.24095483,-0.04000996,0.015966445,-0.048546206,-0.30038705,0.0048840884,0.13509746],[1.8621184,0.9286514,0.09670759,-0.8034425,-0.62457097,0.7103663,-0.60736674,0.08118307,0.21853067,0.34846613,0.11744647,0.5011902,-0.26050925,0.06353079,-0.00013581893,0.13610855,-0.20387033,0.17545028],[0.017074391,-0.6718979,-0.0025658803,0.1153182,0.39260125,-0.89202017,0.73113865,-0.48909268,0.13709295,-0.059374757,0.08379893,-0.21752448,-0.17059386,-0.12913309,0.55954635,0.06616547,0.2593372,-0.35252413],[-0.0015273993,1.122298,4.36107,-0.7284269,-0.52017367,-0.053717256,0.22980922,0.29242814,0.73537266,-0.28037038,-0.91037434,0.6036067,-0.20762318,-0.43595174,0.30240452,0.042510543,-0.03717491,0.16869526],[-0.057129644,2.118584,-0.030197065,-0.98787266,1.289168,1.9827989,1.6250021,1.1510297,1.2282369,1.2243376,0.013641883,0.543552,0.53434277,0.10262394,-0.19424945,0.7177195,0.3077161,-0.2747159]],"activation":"σ"},{"dense_2_W":[[0.13961074,-0.8202845,-0.7884319,0.05487456,0.4678429,0.49467292,-0.1308989],[-0.22201177,-0.32698002,-0.7149156,-0.29914114,0.031437565,0.047704495,-0.28477243],[-1.1148013,0.34092113,-0.18912317,-0.48008075,-0.8709616,0.59132445,0.40171188],[0.71819705,-0.2069683,0.51701564,0.9862385,-0.6635331,0.7514818,0.56039315],[-0.4868372,0.7213388,0.18281417,-0.06934696,-0.74189734,0.28737235,-0.11886813],[0.20839769,-0.28190994,0.67423296,-0.53066903,-0.09744761,0.4307269,-0.19752182],[0.26911464,-0.7672294,-0.62952495,0.1261736,-0.1012706,-0.5423726,0.6709568],[0.6176686,-0.08770763,-0.54375565,-0.10256734,0.7390516,-0.21484475,0.11860012],[-0.19913496,-0.7181119,-0.45452398,0.15518615,0.6978777,0.025296569,0.3637034],[-0.25252303,-0.53283435,-0.1554272,-1.2265081,-0.42687193,-0.36367923,-0.5279896],[0.32439613,-0.07298584,0.1197523,0.3783207,-0.7045304,0.37183088,0.21917883],[-0.09075075,-0.62557536,-0.3368084,-0.887969,-0.4871516,-0.23721167,-0.37883517],[-0.22336866,-0.7741714,-0.6305694,-0.4416341,0.7521898,0.00021530618,0.12290076]],"activation":"σ","dense_2_b":[[-0.121355705],[-0.09121598],[-0.24085803],[-0.083796315],[-0.094084196],[-0.058419645],[-0.14530613],[-0.037983466],[-0.080644384],[-0.025107358],[-0.004766168],[-0.08153612],[-0.044914465]]},{"dense_3_W":[[0.24312028,-0.01319292,-0.6061371,-0.6909818,-0.51359975,0.2992521,-0.39097613,0.31651005,0.2757285,0.4441153,0.31348884,-0.27545422,-0.3225179],[-0.39810908,-0.36194545,0.7269056,0.4569008,0.46710286,0.04934306,-0.3813575,-0.5831742,-0.3599856,-0.41585222,0.4099908,-0.41335598,-0.39183122],[0.306892,0.25172576,-0.07124628,-0.122216314,-0.41072568,-0.32011005,-0.027263654,-0.29434043,0.36800984,-0.007864523,0.36681712,0.40220886,0.41821438]],"activation":"identity","dense_3_b":[[-0.017188622],[0.047469802],[-0.052530196]]},{"dense_4_W":[[-0.30256894,1.1517153,-0.40644947]],"dense_4_b":[[0.042950604]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33580x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33580x00x00x00x00x00x00'.json deleted file mode 100755 index 5b1459e29b..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33580x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.2698],[1.0929606],[0.43473774],[0.041922506],[1.081593],[1.0849229],[1.0877095],[1.0787771],[1.0640684],[1.0383222],[1.0108876],[0.04182125],[0.041832544],[0.041841984],[0.041791342],[0.041712664],[0.041520424],[0.041276637]],"model_test_loss":0.00780085613951087,"input_size":18,"current_date_and_time":"2023-08-11_13-38-19","input_mean":[[25.180971],[0.067363806],[0.0050942847],[-0.0016889262],[0.0692244],[0.068829365],[0.06866644],[0.070981584],[0.07282052],[0.07147961],[0.07122264],[-0.0016967524],[-0.0016941526],[-0.0016961577],[-0.0017855666],[-0.0018609619],[-0.0020476414],[-0.0022919406]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.078407],[-0.085797824],[-0.60504895],[1.2304441],[1.2940428],[-0.2765851],[-0.1730718]],"dense_1_W":[[0.03620994,0.5334588,-0.008751684,-0.30718732,-0.24120554,1.1354307,-0.8072042,-0.32701683,0.3591096,0.08543978,-0.093012184,0.035917368,0.05168646,0.01635545,0.0006926348,0.21674627,-0.1275013,0.018545493],[0.003296379,0.27156684,-0.0114976885,0.24166274,0.21411923,0.8352162,-0.8050061,-0.0060145953,0.31223345,-0.34529817,0.22191735,0.27288175,-0.13967498,-0.44568652,0.24579433,0.1121055,0.23223591,-0.2451417],[-0.28206483,0.5281006,0.004273511,-0.058251712,-0.66737545,1.2072822,-0.48789716,0.09432811,-0.43518975,0.28679478,-0.041617993,0.34799293,0.14502835,-0.048017643,-0.4097651,-0.3127551,-0.21574068,0.43956098],[1.2072837,-0.23662613,-0.3173964,0.3888246,0.13292286,-0.1938199,0.6423224,-0.16508526,-0.24950479,-0.32070765,0.33587667,-0.31030202,-0.07912521,0.1687367,0.30611345,-0.17966121,-0.5359515,0.3222771],[1.2397379,0.4381082,0.3287358,-0.23143762,0.23506987,0.24820729,-0.96802294,-0.019559357,0.15710932,-0.0708022,0.043548137,0.082909495,0.052344177,-0.057601973,-0.30085152,0.35778126,0.2825749,-0.26779613],[-0.1566607,-0.26598597,-0.0057827565,-0.0664115,0.7773096,-1.0950903,0.25486425,-0.30872136,0.16972275,0.088417634,-0.04042932,-0.63080585,0.16424803,0.31180224,0.17867585,0.27970847,0.35946506,-0.47439978],[-0.021681845,-1.7487134,-6.625535,0.1751056,1.331768,-0.03913034,-0.052204903,-0.722452,-0.59748906,0.19350941,1.3864747,-0.45786792,0.005014887,0.4978294,0.06386993,-0.059275076,-0.19035634,0.068175]],"activation":"σ"},{"dense_2_W":[[-0.27746135,-0.11133147,-0.7466579,0.32316014,-0.82424444,0.8190084,-0.07618176],[-0.98910165,-0.29924926,-0.121483654,-0.06462649,-0.77615696,-0.052050546,-0.2068846],[-0.81079465,0.21189949,-0.7650154,0.16670461,-0.24258237,0.6706145,0.41312888],[-0.04046249,-0.2564188,0.13485432,0.19543083,0.4125496,-0.28913745,-0.47865254],[-1.2282639,-0.5878796,-0.13990462,-0.68876964,-0.4017427,0.6788837,0.5318957],[-0.5227068,-0.48116323,-0.5057654,-0.09864695,-0.32342318,0.5650167,-0.13734272],[0.6354482,-0.15141888,0.64957154,-0.046926428,-0.21597984,-0.24500787,0.3873409],[0.10921166,0.40626168,0.77957875,-0.94732684,-0.37726498,0.010828876,-0.6373631],[-0.6380874,-0.68041843,-0.50705653,0.40137365,0.13087752,0.8324961,-0.20889166],[0.7565542,0.08734602,0.53366995,-0.75452554,0.105391264,-1.0089295,-0.034701627],[-1.1198757,-0.2618769,-0.59588647,-0.706865,-0.21783987,0.86488605,0.3997857],[-0.8328754,-0.35271266,0.12354107,0.1924855,-0.78571886,0.2952341,0.24212927],[0.7423821,0.44760862,0.035012443,-0.8567946,-0.23191078,-0.5886413,-0.664454]],"activation":"σ","dense_2_b":[[-0.010436229],[-0.066020235],[0.0060121845],[0.031020565],[-0.15874258],[-0.07110535],[0.020249015],[-0.13936971],[0.08172514],[-0.19487327],[-0.16985166],[-0.07488271],[-0.1648508]]},{"dense_3_W":[[0.2368204,-0.38186413,0.16379678,-0.093882345,0.18792015,0.30424705,-0.2652192,-0.0128758745,0.4871652,-0.82823867,0.3168634,0.36287144,-0.05755385],[0.08671304,0.26755866,-0.44672224,0.3511056,-0.07436179,-0.029944455,0.51201284,0.011309003,-0.009461364,0.03749171,-0.14320603,-0.5220241,0.5982596],[-0.6713392,-0.4692543,-0.18836813,0.16650435,-0.38397953,-0.09753196,0.4263721,0.3648231,-0.48916298,0.63411295,-0.26365083,-0.5657471,0.31661007]],"activation":"identity","dense_3_b":[[-0.043500695],[0.043294493],[0.070429035]]},{"dense_4_W":[[-0.13705656,0.4213639,1.0240872]],"dense_4_b":[[0.0634434]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33581x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33581x00x00x00x00x00x00'.json deleted file mode 100755 index 1e7cb72b13..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018 b'8965B33581x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.970947],[1.0384973],[0.5339848],[0.0439044],[1.0386008],[1.0383806],[1.0382704],[1.0300301],[1.0274649],[1.0244931],[1.0205593],[0.043891665],[0.043891575],[0.04389554],[0.043873448],[0.04374348],[0.043487765],[0.042901814]],"model_test_loss":0.005093628540635109,"input_size":18,"current_date_and_time":"2023-08-11_14-02-50","input_mean":[[24.332022],[0.060984537],[-0.010774325],[-0.010102695],[0.06669931],[0.066552386],[0.06558183],[0.064041205],[0.059805464],[0.057570588],[0.052696057],[-0.010093866],[-0.010066769],[-0.010040301],[-0.01002835],[-0.010157424],[-0.0103778625],[-0.01061843]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.0042867805],[-0.08686578],[-0.037254773],[0.03485279],[1.0671247],[-0.047314014],[-0.993783]],"dense_1_W":[[-0.021375071,-0.14122938,-0.35861322,-0.08880356,-0.82792205,0.7598527,-0.4383258,0.5881781,0.65400213,-0.08076669,-0.47284502,0.6587817,0.42645591,-0.71615744,-0.19810899,-0.26471764,0.089353725,0.25006968],[-0.0043314192,1.954295,6.3405747,0.22489387,-1.1874827,0.14704707,-0.07096752,0.41535223,0.5072961,0.09738453,-1.6553766,0.052053954,0.10042309,0.32028568,-0.6243986,-0.57866776,-0.2910692,0.6025305],[-0.004210423,-1.1789036,0.043389764,-0.17041136,0.018858045,-1.028696,0.60524696,0.12432735,0.1403251,0.6718426,-0.58897483,-0.49425384,0.26766488,0.021670086,0.47191808,-0.2670336,0.17180552,-0.076177396],[-0.0014423821,0.40574962,0.09375788,-0.030430922,-0.28834507,0.96773094,-0.4115615,-0.25777864,-0.122904286,0.16757521,-0.093617134,0.086109094,-0.19272889,0.12177329,-0.16501935,-0.3261848,0.109229244,0.048125066],[0.7480793,-0.44217807,0.47803837,0.12700126,-0.30083793,1.1000353,-0.34668228,-0.22410758,0.59894305,-0.2912633,0.106452525,0.12899296,0.16302301,-0.58852977,-0.4219825,0.3098118,0.30627355,-0.26459885],[-0.0010856693,-0.073189795,-0.010420755,0.510726,0.48776355,-1.3092571,0.5646315,0.09301288,-0.04550693,-0.18133546,0.030909019,-0.22555129,-0.37417185,0.066544555,0.21544787,-0.19924314,0.04824762,-0.037603877],[-0.7319411,-0.53309584,0.47002098,0.51350844,-0.15382649,0.8515273,-0.2119853,0.10290207,0.060688037,-0.017283736,0.07458493,0.12407178,-0.3054991,-0.5866961,0.32772487,-0.36159655,0.15252681,-0.10539709]],"activation":"σ"},{"dense_2_W":[[-0.8456761,0.29112202,0.5538746,-0.27183205,-0.66401464,0.9681805,-0.45490798],[-0.29222146,-0.19562286,0.64160013,-0.29229674,-0.22581333,0.8861653,-0.4574926],[0.20166388,0.07838155,-0.07201707,0.28346765,0.5453596,-0.2245247,0.5990845],[-0.7644849,-0.2661926,0.28970414,-0.36327568,-0.696993,0.51633406,-0.0007974338],[-0.58643913,-0.088404864,0.8255952,-0.36814624,-0.7079003,0.37753046,-0.022236357],[-0.06973816,0.19982524,-0.83173025,0.71500087,-0.3413635,-1.0756832,0.73801243],[-0.13959065,0.19020522,0.24497935,0.56480676,-0.2445819,-0.8559911,0.45792028],[-0.02966249,-0.7037074,0.8162655,0.044394657,-0.36493388,1.2052823,-0.84985954],[-0.42486554,0.19081669,-0.012745155,-0.80222046,-0.5517139,0.23807476,-0.1403817],[-0.5011139,-0.3268968,-0.6706034,-0.15131825,-0.3535179,-0.07793423,-0.2949964],[-0.108988635,-0.38238916,0.66745275,-0.89970803,-0.22937314,0.28115448,-0.01224377],[0.23614992,-0.08788459,-0.09533522,0.3415471,0.20813029,-0.80524844,0.5243813],[-0.7208867,-0.55935323,0.19054662,-0.89190704,-0.95664173,0.9696772,0.28062636]],"activation":"σ","dense_2_b":[[-0.052245323],[-0.22305784],[-0.09663632],[-0.20786262],[-0.014743078],[-0.08700816],[-0.10860553],[0.080216914],[-0.2522886],[-0.39075246],[-0.11641336],[-0.07052046],[0.5928834]]},{"dense_3_W":[[-0.7149941,-0.47273389,0.41016644,-0.104267396,-0.31817394,0.9295361,0.055846684,0.010776243,-0.5708312,-0.022532204,-0.6505357,0.15083706,-0.34012407],[-0.021996325,-0.48407006,0.39829472,-0.41447127,-0.45983404,0.2265217,0.64464855,-0.14684099,-0.13853866,0.1992617,0.023521371,0.6656039,-0.001323564],[0.11754858,-0.5532173,-0.6610757,-0.14822331,0.48995,-0.5581861,0.22167473,0.5960896,-0.36395517,0.18789944,-0.047904395,0.038645275,0.7867522]],"activation":"identity","dense_3_b":[[0.12575556],[0.038765904],[-0.04705467]]},{"dense_4_W":[[0.68855655,0.4865954,-0.44680688]],"dense_4_b":[[0.05231935]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018.json deleted file mode 100755 index d70742e35d..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2018.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.113561],[1.288432],[0.44980875],[0.049022406],[1.276642],[1.2789117],[1.281596],[1.2659067],[1.2421862],[1.2042812],[1.1628327],[0.04884337],[0.048885074],[0.04892067],[0.048904777],[0.04874475],[0.048363086],[0.047754645]],"model_test_loss":0.008815777488052845,"input_size":18,"current_date_and_time":"2023-08-11_12-22-51","input_mean":[[24.583223],[0.035939325],[-0.0035848166],[-0.00051022915],[0.040922612],[0.04026527],[0.039454605],[0.038882907],[0.03908899],[0.037455987],[0.037543096],[-0.0004972871],[-0.00047999652],[-0.00047416435],[-0.000555545],[-0.00067389105],[-0.0009116623],[-0.0012008604]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.6907706],[0.020205228],[1.9151607],[2.0762143],[-0.070254005],[1.656243],[0.040563114]],"dense_1_W":[[1.9184645,0.12281177,-0.05548771,0.3325733,0.049481086,-0.93242055,1.1692095,0.029121507,0.09385143,-0.09659533,-0.11398056,-0.42710423,0.0013246255,0.5561167,-0.1495541,-0.21716745,0.1501572,-0.089972384],[0.0095424475,0.5977504,0.01609186,0.008589333,-0.6946006,1.0936681,-0.6658466,0.21197227,-0.06230653,0.17695144,-0.13071376,0.49202713,0.38372365,-0.6296875,-0.6752815,-0.07816118,-0.20058149,0.47544223],[0.7138527,0.88336164,0.10898959,0.07776455,-0.11466185,0.85354257,-0.44323412,0.28020075,0.1735972,-0.30542865,0.0051241503,0.41995117,0.010464949,0.16623583,-0.4241442,-0.028010447,-0.026523042,-0.14295045],[0.802182,-1.1617771,-0.1162637,-0.0067429696,0.18329306,-1.2598122,0.9663145,-0.18042558,-0.41879544,0.5239016,-0.06684812,-0.45527652,-0.28534758,0.2599457,0.2397677,-0.0516189,0.007355238,0.23112406],[-0.0030232992,-1.1722454,0.051927917,0.095425725,0.19179568,-0.96292347,0.33426154,-0.015786754,-0.26612803,-0.41344067,0.36896846,0.25567958,0.21475382,-0.40880233,-0.21282537,-0.22598088,0.27500418,0.0051436215],[1.9630992,-0.32222328,0.058737174,-0.5038972,-0.16381685,1.1271104,-0.9266026,-0.31080577,-0.05270356,0.24345441,0.07495984,0.039676085,-0.27428615,0.117246784,0.3644701,-0.038675178,0.4529369,-0.3158286],[-0.006583586,-1.90042,-5.086346,1.178374,0.9872427,-0.08279943,-0.11563482,-0.085821435,-0.30849832,-0.483396,1.235762,-0.6782165,-0.1051005,0.049771134,-0.08851904,0.47486317,-0.18179584,-0.33851555]],"activation":"σ"},{"dense_2_W":[[-0.98456967,-0.08674989,0.050625086,-0.7365153,-0.20228219,0.14482267,-0.011665877],[-0.5769628,-0.497833,-0.57603395,-0.27131066,-0.43619764,-0.41154072,-0.44292274],[-0.030439235,0.4782569,0.09370738,-1.0248427,-0.75271314,0.27682835,0.100586735],[0.7785517,-0.8945198,-0.24256033,0.12664571,0.73264015,-0.72209287,0.32675773],[-0.79072905,0.5852975,0.8183082,0.11523399,0.013696286,0.8965856,-0.12477829],[0.99764585,-0.9510505,0.026474258,0.8939435,0.6465811,-0.30319425,0.5071415],[0.4976951,-0.7593475,-0.8069521,0.42173788,0.46559027,-0.18526554,-0.5820664],[0.07649806,-0.0935198,-0.07850874,-0.52957004,-0.6727888,-0.7231066,0.25522104],[-0.27911595,-0.9477233,-1.153818,-0.15193523,0.7870086,-1.0027183,0.7966875],[-0.9716597,0.89015436,0.32853165,-1.0613221,-0.12263486,0.3528593,-0.5928117],[0.2827416,-0.32474115,-0.9680884,0.022911986,0.27188945,-0.98760265,0.3656817],[0.7160093,-1.0138652,-0.50953317,0.46416208,0.06371475,-0.028066937,0.23573612],[-0.77464837,0.44803238,0.14630596,-0.8826064,-0.56392753,0.6949805,0.12345892]],"activation":"σ","dense_2_b":[[-0.25699404],[-0.26730993],[-0.015171051],[-0.09039672],[-0.061481774],[-0.07387397],[-0.047998182],[-0.30401027],[-0.02116504],[-0.07505101],[-0.15518288],[-0.117099114],[-0.09308846]]},{"dense_3_W":[[-0.004456457,-0.17817564,-0.5636806,0.58977455,-0.6984907,0.37438712,0.4960488,0.08712738,0.672033,-0.39785558,0.5507936,0.3100092,-0.41587812],[0.36591443,-0.53552973,0.346754,0.4773916,-0.07704387,-0.27689734,-0.5725575,-0.2300009,0.38975373,0.5509545,-0.06661364,-0.16530657,-0.32090378],[0.5468248,-0.2983021,-0.18621923,-0.1862858,0.6007365,-0.7406874,0.013266623,0.53915715,0.18158531,0.8944796,-0.62438655,0.092128076,0.3605866]],"activation":"identity","dense_3_b":[[-0.09266206],[0.104886286],[0.028007649]]},{"dense_4_W":[[-1.0827008,0.1191742,0.25597933]],"dense_4_b":[[0.081487015]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33630x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33630x00x00x00x00x00x00'.json deleted file mode 100755 index 263e742b40..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33630x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.527258],[1.58837],[0.5055459],[0.046407],[1.5704566],[1.5757883],[1.5804579],[1.5656428],[1.5384976],[1.4943614],[1.4440472],[0.046127472],[0.046209764],[0.04628142],[0.04638724],[0.046373256],[0.046248272],[0.045979995]],"model_test_loss":0.013032137416303158,"input_size":18,"current_date_and_time":"2023-08-11_15-08-28","input_mean":[[23.675987],[-0.061649498],[-0.0037433535],[-0.00974628],[-0.0592297],[-0.059604164],[-0.060115922],[-0.06090137],[-0.05811594],[-0.054634698],[-0.050830174],[-0.009785485],[-0.00977242],[-0.009764823],[-0.009743659],[-0.009729754],[-0.009756633],[-0.009844285]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-4.2454443],[-3.9935453],[0.028671095],[0.5960012],[-0.03880155],[0.05596765],[-0.034470085]],"dense_1_W":[[-1.64422,0.68550414,0.54501456,0.53847647,0.27692503,0.063880496,-0.7023363,0.5811879,0.4607719,0.32430968,0.33705142,-0.15086013,0.25737584,-0.14769863,-0.5269933,0.09086217,-0.039941527,0.056566585],[-1.6872351,-0.8609276,-0.5547092,-0.32451072,-0.42200893,-0.61688584,1.3860269,-0.36377195,-0.3244275,-0.36894146,-0.46561348,0.135956,-0.314409,0.33939078,0.11052305,-0.4511116,0.6767753,-0.25145525],[-0.0011624083,-0.46549657,-0.029367186,0.0338469,0.10036589,-1.3792645,1.3517435,-0.087907985,-0.17922819,0.27989322,-0.1508471,-0.30754912,0.12222471,0.27249634,-0.11857876,0.2081331,-0.20149365,0.092303105],[-0.019411901,-2.743489,0.2092647,0.03613767,-1.4975988,-2.199135,-1.4105736,-1.1626186,-1.1813308,-1.2874912,-1.0614506,0.12311394,-0.35716504,-0.39015725,-0.19417982,0.030657688,-0.10556074,0.30376726],[-0.0013404661,0.811287,-0.011727227,-0.184332,-0.50731385,1.0558553,-1.0108443,0.3428108,0.06010551,0.10949871,-0.1949178,0.31412193,0.35021275,0.1347588,-0.3269873,0.002721337,-0.3956695,0.107962616],[0.0018287555,0.9383599,-0.020639788,-0.10069178,0.012285102,0.8423632,-0.76416844,0.2949073,0.02011132,0.32481852,-0.20832625,0.09446031,0.05286432,-0.25073406,-1.0954369,0.19070928,0.29430318,0.21283779],[-0.0031318972,1.86199,3.7149577,-0.45614806,-0.9853326,0.0031807204,-0.36801562,-0.017010337,0.8629713,0.27299413,-0.93133396,-0.040520113,0.20344736,0.16688503,0.18763259,-0.3295253,-0.44451007,0.54270303]],"activation":"σ"},{"dense_2_W":[[-0.10703138,0.26329565,0.372871,0.62210536,-0.91045755,-0.5059908,0.082728624],[-0.8455082,0.60686517,0.77131647,0.18505652,-0.83584833,-0.061201718,0.06414944],[0.9602546,-0.33188254,-0.6254281,0.28107804,0.4938986,0.19022591,-0.021539062],[0.6665293,-0.88368744,-0.4690383,0.09154278,0.07947504,0.50024533,0.59482914],[-0.38501546,-1.222405,0.2893011,-0.6509259,-0.70557487,-0.66354203,-0.10562698],[0.49674258,-0.5769124,-0.49069,-0.41817957,0.67324835,0.4933393,-0.10286841],[-0.2216885,0.47380883,0.56191033,-0.28784683,-0.4096605,-0.490356,-0.031157235],[-0.0936251,-0.45093265,-0.76677954,-0.3329675,0.8052054,0.061642174,0.5920758],[-0.6441064,0.4133462,-0.15337071,-0.0061294995,-0.73091877,-0.11528061,-0.37335342],[0.18037143,0.040658288,0.91772383,0.17238702,-0.43315202,-0.4585807,-0.4309972],[0.2177669,-0.30795693,0.17052971,-0.16855669,-0.13677986,-0.69589096,-0.19900195],[-0.65990835,-0.1468485,-0.12448653,0.4080429,-0.14782807,-0.4780015,0.24199547],[0.34541848,0.07740233,-0.46892044,-0.18850818,0.12455788,0.3817125,0.20588997]],"activation":"σ","dense_2_b":[[0.004909596],[-0.1015675],[-0.026956508],[-0.14565209],[-0.068403244],[-0.17654194],[0.011075499],[-0.07494447],[-0.17450505],[0.081554756],[-0.067178436],[-0.08978031],[-0.16875927]]},{"dense_3_W":[[0.3513672,-0.21975671,-0.040741704,-0.6609442,0.47521582,-0.1486722,0.40466824,-0.651978,-0.1652465,0.65699995,0.5369138,-0.07486931,-0.4354842],[0.15970285,0.41789836,-0.22640069,-0.57340044,0.4493888,0.14716445,0.4456815,-0.39007702,0.5953172,0.079848245,0.08602837,0.51125026,0.2055881],[-0.44146788,-0.50463027,0.28063488,0.044468172,0.21196483,0.7198564,-0.37790608,0.103921935,0.4282467,-0.56497794,-0.14485644,0.31268966,0.57528377]],"activation":"identity","dense_3_b":[[-0.051718097],[-0.07012978],[0.038476463]]},{"dense_4_W":[[-0.54659784,-0.6573955,0.52299213]],"dense_4_b":[[0.05747961]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33650x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33650x00x00x00x00x00x00'.json deleted file mode 100755 index 4cee46ce78..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021 b'8965B33650x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.4544187],[1.1398869],[0.59536827],[0.03667061],[1.1367389],[1.1371896],[1.1369772],[1.1125838],[1.0882599],[1.0540591],[1.015276],[0.0365254],[0.03656361],[0.03660487],[0.03671011],[0.036751248],[0.036655042],[0.036459148]],"model_test_loss":0.00820766668766737,"input_size":18,"current_date_and_time":"2023-08-11_15-33-20","input_mean":[[16.952526],[-0.052201446],[-0.0025111593],[0.008815221],[-0.04683998],[-0.048375413],[-0.049727276],[-0.04895246],[-0.046067394],[-0.042347096],[-0.043832958],[0.008778602],[0.008794993],[0.008793817],[0.008708494],[0.008642194],[0.008570167],[0.008426222]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.6888532],[-0.14074084],[-4.6503873],[-0.0526546],[-0.16162582],[-4.8515434],[0.0059119985]],"dense_1_W":[[-0.1887723,1.7019817,-0.0113050295,-0.84645253,0.5320028,1.9590821,0.32137358,0.4540078,0.31248295,0.3334322,0.94135123,0.46212864,0.41069177,-0.008444669,0.44834596,-0.1659424,0.075368986,-0.14096133],[0.09387379,-0.24212502,0.004232037,0.1580718,0.5345186,-1.7837541,0.8140116,0.35570875,-0.09320282,-0.33667397,0.1162101,-0.07693762,-0.4861762,0.39767268,0.37297454,-0.23607363,-0.07967667,0.044579674],[-2.367052,-0.45616403,-0.06572045,-0.2425425,-0.008704978,-0.20262632,1.2449195,0.03634092,-0.26020807,-0.18703146,-0.27698797,0.04616871,0.3345856,0.27772164,-0.38416603,-0.26807493,-0.179506,0.45063913],[0.0060991277,1.3728696,6.3618674,-0.1529537,-1.0295473,-0.36459753,-0.5428813,-0.1351585,1.359785,0.59491414,-0.95546675,0.47300407,-0.07679976,-0.4389862,-0.09457229,0.09079313,-0.3535876,0.35535023],[0.10419659,0.6981407,0.0010684849,0.50049585,-0.6847731,1.2972739,-0.845766,0.4630602,0.014233105,-0.22511983,0.036824916,0.03641603,0.14271958,0.017790886,-0.62306106,-0.45059016,-0.12857214,0.3850661],[-2.4553664,0.7025891,0.07218532,0.3614062,-0.18104361,0.14960986,-1.4881148,0.47337767,0.12397967,0.15814431,0.22360176,-0.14111422,0.026148688,-0.4370157,0.06734503,0.2592729,0.23636505,-0.40628332],[0.011856804,0.28269672,-0.8995745,0.5396218,-0.41245276,-1.3505635,1.202017,0.23253399,-0.109473534,-0.1018154,0.30684808,0.012973135,0.26841184,0.26688126,-0.936263,-0.32659927,-0.01672119,0.30120432]],"activation":"σ"},{"dense_2_W":[[0.3640571,-0.6617311,-0.0747308,-0.37031746,0.6537133,0.37298128,-0.53218305],[-0.11639251,0.61945325,0.0017198602,0.1977158,-0.8382063,-0.58378947,0.45054537],[-1.5765465,-0.4710046,-1.2433935,-1.1040761,0.11871377,-1.103308,-0.08877445],[-0.35699993,0.6091763,0.03869232,-0.27107364,-0.480981,-0.37596822,0.63457584],[0.3026075,0.5471183,0.5758416,-0.22221741,-0.8760496,0.02318747,-0.014120267],[2.2380452,-0.91835636,-4.180824,0.85650325,2.4713848,-1.189591,-0.59328234],[0.4808254,0.5034869,-0.06683023,-0.2557325,-0.46868747,-0.563796,0.3365589],[0.17383875,0.052510574,-0.2056088,0.06328794,-0.0013120257,-0.39633247,-0.124248356],[0.32954514,0.45643237,0.41245767,-0.6036774,-0.11574388,-0.3204366,-0.17148384],[0.32425106,0.045497462,0.35014722,0.43193093,-0.43063545,0.021148223,0.30852592],[-0.25192562,-0.5058624,-0.8747967,0.552287,0.750765,0.5214585,0.05243548],[1.162155,-3.353464,0.5340603,0.659619,0.7062718,3.5616868,-0.5632878],[0.3252148,-0.06799463,0.5038412,0.12492446,0.07536071,-0.7216808,0.56761354]],"activation":"σ","dense_2_b":[[-0.058470216],[0.013836472],[-0.11013916],[0.024257516],[-0.047517203],[1.0202676],[-0.028003285],[-0.07813839],[-0.020832257],[-0.024440002],[-0.021560166],[-1.8247504],[-0.041251946]]},{"dense_3_W":[[0.40882266,-0.55162454,0.19300854,-0.7047124,0.18826057,-0.024725482,0.26570073,-0.54785085,-0.47576043,-0.58123916,0.60901785,-0.034762446,0.30913785],[-0.4319101,-0.61121434,-0.3207124,0.45264772,0.043344818,0.176912,0.48326144,0.14974174,-0.4031163,-0.005480138,0.21610041,0.40871677,-0.3560042],[0.43242753,-0.27668396,0.2542409,-0.29328224,-0.467545,0.8394127,-0.62540203,0.22238283,-0.031581767,0.07810114,0.41339856,0.8512083,-0.37855253]],"activation":"identity","dense_3_b":[[-0.03324967],[0.0075375573],[-0.052993078]]},{"dense_4_W":[[0.5854674,0.016769838,1.1952219]],"dense_4_b":[[-0.04352723]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021.json b/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021.json deleted file mode 100755 index c221878177..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY HYBRID 2021.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.740597],[1.6114016],[0.5348656],[0.046610184],[1.595203],[1.6010917],[1.6055775],[1.5847278],[1.5526379],[1.5036105],[1.4504586],[0.04635463],[0.046429936],[0.046500154],[0.046611696],[0.046591446],[0.046455257],[0.046220616]],"model_test_loss":0.01294305082410574,"input_size":18,"current_date_and_time":"2023-08-11_14-35-46","input_mean":[[23.0379],[-0.053410813],[-0.0019288365],[-0.0063912515],[-0.050324135],[-0.05122038],[-0.051873837],[-0.051581234],[-0.048981857],[-0.047338136],[-0.045371193],[-0.0064203762],[-0.006407644],[-0.006401244],[-0.006397862],[-0.0063910685],[-0.00646659],[-0.0066046687]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.5836827],[-0.00027897302],[-0.18345492],[1.9316171],[2.4109695],[-0.35735247],[-0.00752829]],"dense_1_W":[[-0.19923586,-0.8446253,-0.049223807,0.062187098,0.034134634,-0.5164691,0.5356359,0.02361736,-0.094354145,-0.13402478,0.03197027,0.025565224,-0.34767163,0.44327018,-0.2331072,0.08544469,0.13220021,-0.042109292],[0.19774629,0.7956804,0.048354603,-0.03464038,-0.5552806,1.4616147,-1.1069727,0.25491667,0.24574293,-0.032276858,-0.074901365,0.32208532,-0.005093918,0.04149316,-0.38724327,-0.3423741,0.038095005,0.20536087],[-0.01277339,-1.1209253,-3.2829685,0.2908269,0.7730306,-0.26604077,0.15447722,0.3180269,-0.39517486,-0.7156121,0.5851515,-0.157586,0.20472787,-0.10676806,0.103783496,0.38098288,-0.20058244,-0.17163335],[1.0040841,0.5252502,0.022688726,0.2826037,0.21658197,0.34697813,-0.94360363,0.24253304,-0.18907677,0.3291399,-0.11032786,-0.018658556,0.083128914,-0.6952669,0.32141057,0.35096252,-0.33404535,-0.04190496],[1.8762695,0.36984375,0.050812285,-0.69581956,-0.06582166,0.15085408,0.7331872,-0.22675583,-0.21822771,-0.05756491,0.2606855,0.33968002,0.33952188,0.08715113,0.047839224,-0.36322674,-0.25783,0.3792682],[1.4820158,0.1705126,0.0016943603,0.4127989,-0.0974151,-0.9748564,0.8694424,-0.44104308,-0.11535523,0.46097124,-0.24303544,-0.6474734,0.12288866,0.059170075,0.5683426,-0.27918825,-0.1918551,0.038009226],[-0.036992043,-3.7975738,0.13517864,0.27046844,-2.310979,-1.828817,-1.5850654,-1.539081,-1.5010515,-0.6565915,-0.9062962,-0.20627469,-0.67237496,0.12094677,-0.4404271,-0.19511403,0.5184492,0.33670986]],"activation":"σ"},{"dense_2_W":[[-0.42162207,0.37654948,0.20128639,-0.063237175,-0.48145297,0.4043876,-0.3341159],[0.44190538,-1.1244025,-0.09626844,-1.0280551,0.18970345,0.26944143,-0.009037805],[-0.49628687,-1.2132783,0.52467674,-0.7936528,-0.9315534,0.56592065,0.73007417],[-1.1409178,0.2814847,-0.25048304,-0.12513222,-2.585411,-0.61156756,-1.9930322],[-0.22451939,1.0647622,-1.433535,0.027757127,-2.0988069,-1.5258986,-1.1993341],[-0.39952537,0.90642506,-0.15748514,0.093761675,-0.14429392,-0.34393898,0.54427654],[-0.97083896,0.3346563,-0.51369995,0.31469372,-0.33595,-0.14703576,-0.02035328],[0.040784314,1.0367972,-0.2969124,0.8747469,-0.17848283,-0.3237289,-0.09698425],[0.1814441,-0.9662698,0.13469651,-0.82734567,-0.0686567,0.20662351,0.010672753],[0.7433569,-1.089515,-0.5163916,0.07499303,-0.0010849822,-0.03413402,0.3965658],[-0.070186645,-0.9964952,0.03863335,-0.39458206,0.121162325,0.0053036516,-0.23557144],[0.34303343,-0.22630331,0.42313117,-0.40690577,-0.72221476,-0.43852168,-0.6039356],[-0.45295054,-0.11365345,-1.2165514,-0.090053685,-0.5146623,-0.9904289,0.33478776]],"activation":"σ","dense_2_b":[[-0.46519402],[0.015997758],[-0.15750933],[0.36400142],[-0.0012292],[-0.056723733],[-0.11375456],[-0.05405809],[-0.015591645],[-0.0058899955],[-0.04078644],[0.00196873],[-0.16756381]]},{"dense_3_W":[[0.047287945,-0.6736067,-0.46639067,0.9129947,0.33239195,0.62215215,0.4689233,0.10021073,-0.6075113,-0.49370164,-0.27906764,-0.047028817,0.12527764],[0.09248094,0.1314878,-0.33640304,-0.49161217,-0.21528612,-0.5316355,-0.095554546,-0.5099446,0.39594427,-0.4868655,0.2566146,0.19383566,-0.56233704],[0.17183253,-0.6922636,-0.7815626,1.7245736,0.26443008,0.34830126,0.18106776,0.4897128,-0.5520722,-0.3594627,0.04037111,-0.46142736,0.64785737]],"activation":"identity","dense_3_b":[[-0.0055949884],[0.06270205],[0.041998606]]},{"dense_4_W":[[0.9982169,-0.30214822,0.8375058]],"dense_4_b":[[-0.011819658]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02181x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02181x00x00x00x00x00x00'.json deleted file mode 100755 index 986005262e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02181x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.939101],[1.5599267],[0.57329994],[0.051986337],[1.5397805],[1.5469866],[1.5538288],[1.5324374],[1.5024316],[1.4477412],[1.390682],[0.051756933],[0.051815208],[0.051863786],[0.05182103],[0.051682103],[0.05124605],[0.050552182]],"model_test_loss":0.0067290966399014,"input_size":18,"current_date_and_time":"2023-08-11_16-34-05","input_mean":[[24.415758],[-0.0708019],[6.1642786e-5],[-2.1343174e-5],[-0.06627885],[-0.06775841],[-0.06956871],[-0.06583787],[-0.064153455],[-0.06203538],[-0.058261454],[-1.822088e-5],[-1.6343323e-5],[-2.2065358e-5],[-6.640849e-5],[-0.00010978214],[-0.00016678876],[-0.00023529833]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.090955906],[0.04917988],[-0.1741757],[-0.10349463],[0.073517144],[-0.14433604],[-0.21417597]],"dense_1_W":[[0.031386774,-0.0064099,0.008045171,0.2867708,-0.08236162,-0.84199697,0.10240696,0.13015348,0.21739843,0.13009188,-0.336333,0.18302079,-0.4356695,0.20127627,-0.14926645,-0.18274651,0.20071413,-0.009890185],[0.01055423,-0.9589615,-4.888261,-0.4326293,0.9792688,0.06254708,0.81589156,-0.22105382,-0.72918415,-0.47384414,0.57448494,-0.89492524,-0.42377415,0.28702468,0.94103277,0.3108972,0.22522354,-0.06581927],[0.00889319,0.5760613,-0.011418503,-0.2077564,-0.20235416,1.1582084,-0.71085477,-0.22053532,0.048205245,-0.0015826726,0.071042135,0.5661853,-0.19431645,-0.14515138,-0.23947677,-0.06749122,0.15579678,0.042601693],[0.021154417,0.73471886,-0.20633163,-0.092965506,-0.11627686,0.78098047,-0.3053794,-0.10012283,0.19263598,0.108361736,-0.21976234,0.1443252,-0.27093878,-0.088000044,0.14388824,0.12235138,0.7552596,-0.30535087],[0.7607973,0.059191745,-0.17095767,-0.18675576,0.4779047,-0.8605541,1.0540863,0.077983476,-0.35377684,0.34912428,-0.23799801,-0.61662775,0.19051781,0.324648,0.20347545,0.34229413,0.3465081,-0.20990801],[0.016754853,0.13105184,0.060855266,0.19800498,-0.25625008,0.93284976,-0.99328595,0.43371382,0.1287163,0.3198935,-0.34120345,0.36319074,-0.17294398,-0.40115258,0.018337402,-0.10593194,-0.09644049,0.093416676],[-0.80104244,0.5966007,-0.17412119,0.0745668,0.26523033,-0.12644067,0.37905166,-0.47610426,-0.19432892,0.23034103,-0.11601362,-0.0361885,-0.44668338,0.47873983,0.13158317,-0.19112219,0.28012928,0.10046652]],"activation":"σ"},{"dense_2_W":[[0.12751395,-0.579469,-0.42941913,-0.82789993,0.118697666,-0.030509774,-0.4625477],[0.43198177,0.34745836,-0.7453266,-0.28072536,0.3007269,-0.5361298,0.21595009],[-0.64348674,-0.43256557,0.5034301,0.23926352,-0.71879435,0.54971355,-0.32021347],[0.021957472,0.5988634,-0.9111236,-0.8090046,-0.04196959,-1.0256908,0.7584421],[-0.04072775,-0.5223909,0.8810148,0.102556,-0.08203382,0.8192045,-0.31275043],[0.52576905,-0.11147491,-1.0164086,-0.46802506,0.69514006,-0.9750496,0.25202104],[0.5843185,-0.43077394,-0.5290841,-0.8182589,0.56711,-0.2554457,0.27834472],[-0.9143706,0.14909329,0.7489671,0.21731603,0.094174676,0.5228992,-0.63162416],[0.5781319,0.077873595,-0.7260175,0.053800765,0.22003157,-1.1925383,0.4699523],[-0.8478256,0.27122667,0.574439,0.3034642,0.18656549,0.30236706,-0.74189764],[-0.89728916,-0.540247,0.42537263,-0.26421598,-0.71848625,0.5283021,0.27896],[-0.6038582,-0.6634362,0.35248938,0.39700025,-0.96313494,0.1258266,0.27540943],[-0.702523,0.28951612,-0.34453344,0.061114356,-0.6473836,-0.3301445,-0.5951263]],"activation":"σ","dense_2_b":[[-0.044364497],[-0.21510312],[0.11091102],[-0.13621476],[-0.06183172],[0.102863066],[-0.036004663],[-0.07521248],[-0.19428256],[-0.050729755],[-0.16412741],[-0.1322501],[-0.13190113]]},{"dense_3_W":[[0.21880057,0.17238903,-0.59318775,0.54590964,0.328959,-0.08423074,-0.021402186,-0.30087715,0.105242334,-0.07735786,-0.64967847,-0.60325295,-0.019917456],[-0.5737253,0.054932736,0.6915356,-0.5588708,-0.3497235,-0.66048837,-0.55370605,0.6054378,-0.6448654,0.5938389,0.70369726,0.15654652,0.4921153],[0.22326133,0.38247967,-0.68284494,0.74056363,-0.46936858,0.6398252,0.30618396,-0.1293351,0.72910917,-0.47571996,0.19982132,-0.50786984,0.120341815]],"activation":"identity","dense_3_b":[[0.0075428453],[0.03185654],[-0.06226225]]},{"dense_4_W":[[-0.20277399,0.36300623,-0.80966884]],"dense_4_b":[[0.048043206]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02191x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02191x00x00x00x00x00x00'.json deleted file mode 100755 index cda75eb28b..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017 b'8965B02191x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.0005245],[1.1223631],[0.56650954],[0.040156633],[1.1045293],[1.1096628],[1.1155437],[1.1086388],[1.1007575],[1.0822154],[1.0583125],[0.040068675],[0.040072493],[0.04007388],[0.039984047],[0.039851412],[0.039609052],[0.039315373]],"model_test_loss":0.005991812329739332,"input_size":18,"current_date_and_time":"2023-08-11_16-59-30","input_mean":[[25.675858],[-0.14288636],[-0.014269486],[-0.0032686314],[-0.13565269],[-0.1382612],[-0.14184494],[-0.14358865],[-0.14512834],[-0.14613849],[-0.14589326],[-0.0033924344],[-0.0033741088],[-0.003360874],[-0.0033476953],[-0.0033650529],[-0.003380635],[-0.0034961724]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.17480564],[0.18210134],[-0.56885064],[-0.19985428],[-0.045291904],[-0.57443535],[-0.11631125]],"dense_1_W":[[-0.007863749,-0.28470495,0.04231277,-0.66548604,-0.12848611,-0.91329616,0.30217457,0.16402288,0.19537158,-0.256202,-0.14585154,0.09115254,0.1150835,0.30422798,0.017745864,-0.29077125,0.5362173,-0.1107794],[-0.005497062,-1.2494678,-5.5986447,-0.093020305,0.934668,0.26794314,1.5251178,-0.6939207,-0.6933608,-0.6269682,0.42408594,-1.5087744,-0.582999,0.43095827,1.0934985,1.0581348,0.19804095,-0.61133814],[1.2855586,-0.045317598,-0.041259,0.6257151,-0.5867755,1.315738,-0.619025,-0.031879213,0.08639269,0.38603297,-0.21348597,0.4264018,-0.23836033,-0.62063384,-0.10609298,-0.61321807,0.107925534,-0.0714755],[-0.0047950665,-0.43550637,-0.028580034,-0.3060538,0.5702284,-1.100899,0.34844038,0.10669702,-0.11319558,0.3034445,-0.20166925,-0.30887967,0.33024544,0.51993126,-0.30957666,-0.01086123,-0.11150792,0.20599872],[-0.0060232766,-1.0670959,0.34271115,-0.76167846,0.07718474,0.8662963,-0.26442152,0.36251798,0.23742421,-0.071805924,-0.110565305,0.08984451,0.35723057,-0.25795203,0.08405907,0.2909975,0.04691789,-0.046068314],[1.243962,-0.06773367,0.041754216,-0.49038526,0.67357427,-1.419546,0.61591196,0.15995342,-0.3010706,0.116759814,-0.05290848,-0.58484674,-0.2919908,0.76646173,0.79990584,0.6095101,-0.2919323,-0.040067844],[0.0063426853,0.29359382,0.029911779,-0.11636771,-0.17950699,1.065461,-0.6709385,0.09389695,0.14424817,-0.031868383,-0.076493725,0.89900523,-0.100873575,-0.6742322,-0.11008049,-0.102969535,0.15808189,0.059139792]],"activation":"σ"},{"dense_2_W":[[0.1780774,-0.23879893,0.40886527,-0.03837895,0.6731009,0.37912157,0.024035169],[0.26459897,0.39045632,0.21518803,0.15523876,0.49753502,-0.24493335,0.25550902],[0.6711707,-0.43927252,-0.036247067,0.64019126,-0.31602848,0.52645594,-0.8239448],[-0.022878619,0.057614833,-0.1544598,0.04378831,-0.058183365,-0.0948237,-0.84012353],[-0.39999592,-0.30837488,-0.5094495,-0.45057485,0.04420731,-0.39995825,-0.0781143],[0.16760944,0.20678467,-0.40867665,0.471323,0.24410716,0.32461926,-0.22563171],[0.5557148,0.41185716,0.24847849,0.31282943,-0.41320753,0.50370765,-0.21249676],[-0.19418764,-0.012745005,0.19675006,0.15134968,-0.32846612,0.16126548,-0.086756974],[0.17462167,0.13238178,-0.31408685,0.038765885,-0.017508972,0.25259814,-0.58019114],[-0.017934231,0.26039112,-0.34202117,0.43214414,0.24746032,-0.30627286,0.5151575],[0.4940814,0.15724,0.06147876,0.2419263,-0.5808532,-0.0146812,-0.6242227],[-0.44739762,-0.51928467,0.49245462,0.08635158,0.5575218,-0.35451686,0.4488533],[1.2522198,-0.2360379,-0.6547458,0.8267273,-0.88394165,0.70522034,-1.0572921]],"activation":"σ","dense_2_b":[[0.026364576],[-0.025734073],[-0.04295231],[-0.25066647],[-0.013064962],[-0.08499931],[-0.036362205],[-0.004759432],[-0.061301507],[0.005311887],[-0.039976895],[0.04567746],[0.013406974]]},{"dense_3_W":[[-0.5968739,-0.439085,0.48412055,0.3187139,-0.29512522,0.5073818,0.20465378,0.045948084,0.013481034,-0.1332729,0.60977477,-0.6310519,0.23163827],[-0.27164835,-0.4812297,-0.6265655,-0.023346987,0.25599414,-0.12162734,0.13101235,0.41443184,-0.2227736,-0.2773484,0.3685923,0.030362112,-0.634783],[0.57348764,0.19016632,0.25121495,0.27343124,-0.2428453,-0.26571003,-0.6007244,0.4791869,-0.5334977,0.46657896,-0.4515347,0.35774907,0.027132725]],"activation":"identity","dense_3_b":[[-0.011396689],[0.0397831],[0.009339748]]},{"dense_4_W":[[-0.9927989,0.34151393,0.70749515]],"dense_4_b":[[0.012457315]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json deleted file mode 100755 index d7aedb019d..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.1069937],[1.377736],[0.55493695],[0.05719556],[1.3765576],[1.3775383],[1.3772336],[1.3490695],[1.3153961],[1.2702683],[1.223111],[0.056874666],[0.056979246],[0.05707212],[0.05725215],[0.057166327],[0.056820378],[0.056312907]],"model_test_loss":0.01224404014647007,"input_size":18,"current_date_and_time":"2023-08-11_18-01-17","input_mean":[[21.029448],[0.062122844],[0.011586429],[-0.013362663],[0.058448926],[0.059218813],[0.06003164],[0.060906783],[0.05690931],[0.05107428],[0.04589755],[-0.013371633],[-0.013350069],[-0.013321604],[-0.013194786],[-0.013209626],[-0.013246084],[-0.013091505]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.029981],[0.6557142],[0.025477692],[-0.07285545],[0.14103301],[-0.75449616],[-0.37838358]],"dense_1_W":[[0.45469517,-0.13852943,-0.20428768,-0.4649964,-0.16689883,-0.46213424,0.58211297,-0.2600774,0.011318633,-0.31072444,0.24087484,-0.30786481,0.22569135,0.4312357,0.095120884,-0.040498447,0.016559452,-0.006246631],[0.48909014,0.19140528,0.21468148,0.38366044,-0.2924136,0.90077084,-0.57901615,0.49554396,-0.109812155,0.13619985,-0.1644991,0.0029267913,0.39931184,-0.6447186,-0.28419474,0.011865851,0.32336563,-0.16406368],[0.08335772,0.46219787,-0.006281903,-0.4606084,-0.5252204,1.4688734,-0.81243116,0.23485558,-0.0043862914,-0.1055535,0.017743455,0.25692242,0.48580706,-0.406194,-0.3941023,-0.015782943,0.26534048,-0.03168482],[-0.025222164,1.0567143,7.659574,0.08088202,-1.9668833,-0.6673831,-0.35986438,0.8868536,1.874591,1.4548881,-1.8890685,1.428609,0.31265762,-0.31063205,-0.92161745,-0.96598464,-0.21013777,0.3951245],[-0.24860296,-0.03803796,-0.00405875,0.21248466,0.11106674,0.40961975,0.09255897,0.019209573,0.07700923,0.15433341,-0.100313425,0.10832265,-0.058324855,-0.31074783,-0.18075982,0.055103302,-0.20808068,0.12037389],[-1.7423648,0.82126313,2.705039,0.22467682,-0.003623281,0.25392738,-0.4748977,0.06635853,0.54281545,-0.13825028,-0.21510579,0.61694807,0.04500307,-0.4738145,0.15694156,-0.5615226,-0.28929874,0.30215448],[-0.029229201,-0.24708195,-0.06705875,-0.06484636,0.6352556,-1.6881858,1.0670066,-0.18514188,0.14397305,0.029184626,-0.022868067,-0.11220785,-0.41982648,0.24265464,0.5274242,-0.26783192,0.44759402,-0.3523202]],"activation":"σ"},{"dense_2_W":[[-0.14019006,0.8517118,0.23271823,0.36868808,0.61500895,-0.34682518,-0.7155873],[-0.347382,-1.0464604,-0.77282,-1.3966386,0.86157274,-0.15990283,0.32113728],[1.0913037,0.396265,-0.46790498,-0.52455956,-0.4228992,-0.13811836,0.6824839],[-0.19100685,-0.16689822,-0.38699043,0.19396296,-0.6368938,0.4325597,0.23740473],[0.86992455,0.2691951,-0.31172332,-0.21921356,-0.34238544,-0.21491715,0.80763847],[0.9475764,-0.02158802,-0.87059724,0.014679482,-0.324306,-0.33987498,1.1471028],[-0.2071371,-1.4411374,-0.26056397,-1.5143462,0.40373328,0.42800063,0.34931841],[-0.70536876,0.0997919,0.41194123,-0.036822613,-0.2394713,0.23169665,-0.33681363],[-0.2928761,-0.9999774,-0.19667697,-1.0640647,-0.17863739,0.35508665,-0.24925552],[-0.20061804,0.5150541,0.9944113,-0.39703074,0.5471109,0.24731952,-0.8795763],[-0.09993521,-0.21843813,0.9697644,-0.29330543,0.5018627,-0.17633167,-0.9433106],[-0.61491317,-1.1780969,-0.6712012,-1.6405643,0.7202017,0.3414344,0.14721029],[-0.83430654,-0.30646098,0.7540531,0.1640073,-0.07167989,-0.15225653,-0.6632847]],"activation":"σ","dense_2_b":[[0.008414734],[0.02586258],[0.26360497],[-0.17161213],[0.021794198],[0.11237369],[-0.19526652],[-0.21869946],[-0.15780614],[0.0076409117],[0.08034951],[-0.052167464],[0.008192686]]},{"dense_3_W":[[0.37548563,0.6901746,-0.017093312,0.05906239,-0.17285745,0.7850599,0.16857842,0.2924379,-0.45666716,-0.71577275,-0.20736414,-0.22495872,-0.7006286],[-0.63446444,0.3959629,0.6600817,-0.36419266,0.5282527,0.44988224,0.3944795,-0.48388985,0.33301595,-0.7800839,-0.2381008,0.04726727,0.008106329],[0.4815408,-0.39100966,-0.570321,-0.52544576,-0.5211865,-0.2355475,-0.13347512,-0.45825776,-0.1850824,0.6669436,0.73957324,-0.7607831,0.583408]],"activation":"identity","dense_3_b":[[-0.022654189],[-0.047549613],[0.081376344]]},{"dense_4_W":[[-0.07399648,-0.7841488,0.65943784]],"dense_4_b":[[0.049836714]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12451x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12451x00x00x00x00x00x00'.json deleted file mode 100755 index 44f484b674..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B12451x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.487649],[0.9452884],[0.49897322],[0.036168467],[0.9375047],[0.939802],[0.94176334],[0.9312508],[0.9176832],[0.8981818],[0.8754837],[0.036056127],[0.03607669],[0.0361009],[0.03615947],[0.03622122],[0.036174823],[0.03611307]],"model_test_loss":0.013644726015627384,"input_size":18,"current_date_and_time":"2023-08-11_18-28-16","input_mean":[[22.188808],[-0.0016201948],[0.0067229858],[-0.006841018],[-0.0040381285],[-0.0036605345],[-0.0031642113],[0.0007389491],[0.00048997015],[0.0011243575],[-0.0031244024],[-0.006816045],[-0.0068408772],[-0.006861466],[-0.006930233],[-0.006957305],[-0.0070455903],[-0.0070900545]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0673442],[2.7745846e-5],[-0.99905986],[0.58756214],[0.7617952],[0.04276479],[-0.08482717]],"dense_1_W":[[-1.376805,0.15786377,-3.812531,-0.245421,0.6155368,0.2635061,-0.1198247,-0.3752861,-0.55684185,-0.21776916,0.61006033,-0.44973776,-0.16761783,0.8354563,0.5233352,0.40619633,-0.25151846,-0.48748687],[0.028500041,0.8878804,-0.9752583,0.5530488,-0.47703752,-1.1190318,1.1573414,-0.41567516,-0.6945042,0.08366254,0.6784389,-0.9251646,-0.16067813,0.39871418,0.010591839,0.43614033,-0.1241933,-0.22110312],[0.0055779507,0.20711112,0.043922327,0.5815181,0.79546875,-0.3745229,1.0692942,0.5421788,0.51711035,0.08371175,-0.7767221,0.14060917,0.86184376,1.282557,0.5231202,0.48133206,0.85133666,0.6251881],[0.23285055,-0.4198758,0.0023081363,0.034350406,0.36339942,-0.8756732,0.4318861,0.068672374,0.1868084,-0.105609834,-0.082326055,-0.21219045,-0.052394826,0.38342378,-0.08516862,-0.073896684,0.20564918,-0.09030272],[0.20625626,0.69163126,0.0040207044,-0.2540704,-0.796767,1.4653561,-0.7764364,-0.3945441,0.16091216,0.07360298,-0.009463289,0.33463284,0.12811317,-0.33023477,-0.15273824,0.20237693,-0.057417326,0.027028535],[0.0009643716,-0.4622335,0.008336065,-0.14127259,-0.03327446,-1.2106333,0.1591597,0.17660871,0.1737159,0.04918479,-0.35066015,0.061325263,-0.32096663,0.065511234,0.07052332,-0.009597162,-0.12007005,0.08947649],[0.16628331,-0.74743044,-7.732924,0.14102307,3.3183703,0.25258428,0.033113215,-2.4762802,-1.7066356,-1.0341645,2.3158412,-1.1193362,-0.6722529,0.23111704,1.0017239,1.267337,-0.41339538,-0.4809045]],"activation":"σ"},{"dense_2_W":[[0.21290007,0.64724165,0.49358806,0.056110725,-0.70513237,-0.11181515,-0.11487207],[0.109797336,-0.40518957,-0.22855765,-0.87453985,0.69947445,-0.3448592,0.36246267],[-0.10385788,0.05007824,-0.43522125,-0.24411759,0.6849432,-0.72941595,0.11045129],[-0.366294,0.48336378,-0.026342975,0.38450494,-0.8003826,0.39405254,0.20164785],[0.09994913,0.15614097,0.03521924,-0.31754568,-0.87542045,-0.0036878414,0.6618589],[-0.4278517,0.13070711,0.22683983,-0.50581944,1.1253206,-0.574315,-0.33853972],[0.3912402,-0.057859033,-0.26818904,-0.07417243,-0.53089696,-0.037230473,0.35937098],[-0.007780401,-0.062603526,0.24958208,-1.1340399,-0.118980326,0.0787109,-0.6355662],[0.045311734,0.31174505,0.3089076,0.12579472,-0.5789172,-0.35370818,-0.276329],[0.002701942,-0.17374736,0.26680645,0.52160555,-0.4519264,0.38481277,0.07479425],[-0.16118486,-0.3074708,0.36325666,-1.1860276,-0.21609893,-0.49962327,0.43130475],[-0.18138263,-0.51702213,-0.07574924,-0.36417502,0.49235836,0.32681176,-0.4689479],[-0.39053667,0.11265152,0.20087351,0.767612,-0.99513376,0.61860406,0.3170469]],"activation":"σ","dense_2_b":[[-0.053010453],[0.073241115],[-0.090730816],[-0.14704],[-0.14625446],[0.19712886],[-0.35103756],[0.021736875],[-0.067158625],[0.013618938],[-0.021116722],[0.05918233],[-0.15891494]]},{"dense_3_W":[[-0.32645482,0.5014898,-0.22124335,-0.56819195,0.37468666,0.36114338,-0.35449836,0.31993988,0.2904279,-0.18361193,-0.49852094,0.5350739,0.17842627],[-0.33429646,0.2762441,-0.45675096,-0.17342906,-0.52969354,0.72830856,0.4542556,0.52436656,-0.14327197,0.19658618,0.5030742,0.086073324,-0.4896408],[-0.40658107,0.72393274,0.58974785,-0.31303748,-0.34105098,0.5463775,-0.105001554,0.5828467,-0.25973922,-0.49174955,0.43771726,0.20469081,-0.62791723]],"activation":"identity","dense_3_b":[[-0.042050008],[-0.04370406],[-0.031461757]]},{"dense_4_W":[[0.52837956,0.37841925,1.2096573]],"dense_4_b":[[-0.031662747]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B76012x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B76012x00x00x00x00x00x00'.json deleted file mode 100755 index 3379069f0a..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'8965B76012x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.375572],[1.0479666],[0.5336316],[0.034517776],[1.0380636],[1.0415741],[1.0435171],[1.0233974],[1.0003295],[0.96495837],[0.9329012],[0.034553193],[0.03455014],[0.034553725],[0.0345314],[0.034555648],[0.03454],[0.034541115]],"model_test_loss":0.01448360551148653,"input_size":18,"current_date_and_time":"2023-08-11_19-45-05","input_mean":[[21.282667],[-0.0041169003],[0.0054940344],[0.0054295054],[-0.0039702826],[-0.0047535836],[-0.0049827257],[-0.00041957427],[0.0036263561],[0.010159709],[0.010208528],[0.0053120484],[0.0053210543],[0.005327886],[0.0053719524],[0.005379417],[0.0054208445],[0.0054328674]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.08694271],[2.3874013],[-1.1189023],[-0.20053284],[-0.82135457],[-1.9767927],[-0.24129376]],"dense_1_W":[[0.04281066,-1.1349988,0.0029240015,0.51000357,1.2487551,-1.6569496,0.1126817,0.46920308,-0.18618616,-0.03293716,0.05162156,-0.70887804,-0.03422212,0.34768334,0.17257658,0.11435088,-0.062131677,-0.117349416],[0.78725845,0.5511427,-0.009158071,-0.0879293,-0.29217157,-1.1015882,0.22204675,-0.32402563,-0.31345448,-0.19125423,0.058251724,-0.37509483,0.445088,1.1528792,-1.2366151,-0.30880412,-0.08606776,0.5468172],[-0.53494954,0.8182066,-1.0288574,0.10421147,-0.57160145,-1.2457802,1.087224,-0.11592528,0.16457517,0.12212297,-0.29925084,-0.17019296,-0.27164263,0.33206818,0.03422637,0.16099158,-0.22837052,0.07222221],[-0.018647902,-1.2851863,-5.806965,-0.5820859,1.6532221,-0.15292299,0.3868868,-0.07472222,-1.1960039,-0.9730067,1.3412269,-0.4317284,-0.40662217,0.49923965,0.4225129,0.9066051,0.0015882424,-0.37326196],[-0.57139546,0.46502775,0.99184674,0.396859,0.2340786,0.7237931,-1.2583938,-0.08029648,-0.35627592,0.3597747,-0.040746044,-0.38713092,0.3865338,-0.10270777,-0.41028908,0.27863222,-0.26602527,0.07882698],[-0.5458326,-0.9584286,-0.009850046,0.20454025,0.32909134,-0.98597926,0.7100352,0.04268226,-0.2823607,-0.2440534,0.19341996,-0.3187937,-0.113805935,0.9269717,-0.62920344,-0.21646176,-0.054388206,0.28129458],[-0.020640513,0.1749185,-0.8748891,-0.08894304,-0.6374144,1.5462204,-1.4470797,0.53431803,0.16430534,-0.38660437,0.054579385,0.42408434,0.29847622,-0.53912234,-0.19198798,0.042103697,-0.15677306,0.2510289]],"activation":"σ"},{"dense_2_W":[[0.576956,0.58485156,0.46824354,0.23629351,-0.7127077,0.24054548,-0.801404],[-0.7679824,-0.82911664,-0.1316323,-0.649113,0.5064222,0.32822382,0.5846307],[-0.45726764,-0.2200032,-0.106780164,0.50859475,-0.6885187,-0.9536588,-0.1520038],[-0.6101801,0.0043161334,-0.52828544,-0.6778497,0.20272149,0.17903528,0.6156166],[0.00020568681,-0.8475529,-0.028076276,-0.40698978,0.09670474,-0.032005046,0.34535372],[0.65462285,-0.18649338,0.6973468,-0.1406565,-0.26298824,-0.05047055,-0.112580955],[0.82534224,-0.35191694,0.39351723,-0.1623142,0.109611444,0.19251318,0.25714624],[-1.0138118,-0.30412364,0.05206559,-0.20494476,-0.13674605,-0.24461035,0.34458944],[0.39735422,-0.3080049,0.184732,0.34991446,-0.19378886,0.5201685,0.10663582],[0.051989906,-0.43616736,-0.2765625,-0.6018549,0.35423297,-0.06406093,0.04343631],[-0.46184382,0.2845056,-0.6880694,-0.15087406,0.42838258,-0.8445976,0.78881943],[0.25200763,0.06935976,-0.23696655,-0.39565444,-0.20061536,-0.43781048,-0.48936784],[-1.0732412,0.27758133,-0.028595658,-0.5918897,0.66757387,-0.51985353,0.9180244]],"activation":"σ","dense_2_b":[[-0.13084444],[0.04154609],[-0.1692621],[-0.060585238],[-0.11847037],[-0.0038540647],[-0.009530867],[-0.199515],[-0.15339535],[-0.11540088],[0.031653397],[-0.31335723],[0.043830592]]},{"dense_3_W":[[0.6439716,-0.51321656,-0.29869318,-0.5795511,0.075971514,0.4085636,0.67255604,-0.52776796,-0.080016606,-0.49534002,-0.5485497,0.5257951,-0.51068026],[-0.229645,-0.125913,0.20544381,0.029917588,0.15909044,0.30286267,-0.5067371,-0.31015295,-0.34193483,0.35274273,-0.018820988,-0.10453944,-0.18352267],[-0.71315366,0.5508435,0.56744355,-0.11833193,0.4223396,-0.4779712,0.47948912,0.08573708,-0.28134808,-0.15602563,0.65661746,0.3988988,0.29393244]],"activation":"identity","dense_3_b":[[0.069226205],[-0.050530106],[-0.07095789]]},{"dense_4_W":[[-0.8900288,0.84156877,0.9698375]],"dense_4_b":[[-0.062096175]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json deleted file mode 100755 index a161aec775..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.993547],[1.3824608],[0.5442085],[0.04466587],[1.3670224],[1.373887],[1.3785548],[1.3483428],[1.3078706],[1.2547767],[1.2047329],[0.044602543],[0.044602063],[0.044597205],[0.044438787],[0.044370554],[0.044226427],[0.043893978]],"model_test_loss":0.01754230633378029,"input_size":18,"current_date_and_time":"2023-08-11_20-42-27","input_mean":[[21.669216],[-0.019106807],[-0.00071183714],[-0.004523422],[-0.015881915],[-0.016015995],[-0.01599993],[-0.013354679],[-0.009738685],[-0.0054146647],[0.0011390813],[-0.0044711116],[-0.0044688736],[-0.0044746096],[-0.004526157],[-0.004584231],[-0.0047590407],[-0.004947274]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.3237112],[-0.2403381],[-0.014628102],[-0.022476863],[-2.7615786],[0.007984176],[-0.28538132]],"dense_1_W":[[1.0919807,-0.045324247,-0.75395745,0.08453984,-0.1758099,-0.7810576,0.60001886,0.1895486,0.022043524,-0.13008374,-0.6345032,-0.04466129,-0.10564512,0.4632076,-0.66976476,0.13218683,-0.12667759,0.23693071],[-0.14425355,-0.1333905,0.61592144,0.16705051,-0.4906342,0.47542897,-0.5073153,0.8226191,0.5239043,-0.020427523,0.118154675,0.042043276,0.05852372,-0.22402734,-0.002725648,-0.021388907,0.09187215,-0.10525817],[-0.002070986,-1.0142688,0.0024986335,0.29121137,0.23187101,-1.4923184,1.0455217,0.3253877,-0.026153605,-0.18092944,-0.022284921,-0.7775931,0.17352305,0.4154996,0.0007446691,-0.3231251,0.016695077,0.092076115],[0.003556123,-0.6074834,-5.16307,0.10229213,1.5040752,-0.24918728,-0.31775448,-0.24619824,-1.1433711,-0.9349265,1.3716418,-0.8144274,-0.26113123,0.12032675,0.4644665,0.6542465,0.8436341,-0.81249446],[-1.2800871,0.5802051,-0.8313711,-0.36175877,-0.6173688,-1.0907602,1.1683012,-0.12169285,-0.04679629,-0.31703347,-0.56498647,0.027285641,-0.13184144,0.46147045,0.08659124,-0.20840271,-0.24434797,0.31504855],[-0.0037023455,0.6878883,0.011835528,-0.14244853,-0.7035841,1.4227525,-0.67105776,-0.052963886,0.040167555,-0.06747049,0.03174579,0.07668224,0.270919,-0.25877607,-0.19650425,-0.39022088,0.16024818,0.07297123],[-0.15980847,-0.26276147,0.51323986,0.2717203,0.06203693,-0.92020065,1.1863018,0.17152844,-0.12639117,0.3401608,0.21352135,-0.5127686,-0.17613575,0.42713523,0.15159386,-0.028390504,0.116660304,-0.2374384]],"activation":"σ"},{"dense_2_W":[[-0.31951153,-0.60305333,0.94934136,0.5176455,0.42330498,-0.9991227,0.42707992],[-0.5175407,0.04058364,-0.5662553,0.3280252,-0.46270046,1.0823125,-0.36556607],[0.3591221,0.21218485,0.48469293,0.5919236,-0.39960954,0.10840565,0.34785143],[-0.6868013,0.5927585,-0.2725992,-0.43643984,0.09060123,0.12481008,-0.63349223],[-0.25257543,-0.8518924,0.085459694,0.6604647,0.55866843,-0.17756383,-0.24361156],[-0.3636745,0.036077805,-0.8358255,-0.19005351,0.23775734,-0.3111283,-0.3870686],[-0.5255931,0.4393281,-1.1511757,-0.071744345,0.46959507,0.40960646,-0.40884846],[0.12857412,0.560429,-0.8185417,-0.40506232,-0.06547155,1.1404641,-0.6429645],[0.629162,0.03809335,0.936505,0.342929,-0.6054116,-0.7688969,-0.062184736],[-0.2467538,0.0011489796,-0.6328479,-0.40097603,0.05688727,0.2515537,-0.40826854],[0.32569283,-0.26726797,-0.05968891,0.6881055,0.7094254,-0.566512,0.22227532],[-0.49612823,0.09098714,0.034291003,-0.28518376,-0.1303378,0.3737506,0.21425006],[-0.21644352,-0.40147,0.2609396,0.09716901,0.75330514,-1.2959148,0.58928996]],"activation":"σ","dense_2_b":[[-0.64226997],[0.07075255],[0.029240176],[-0.1350133],[-0.10543014],[-0.14136776],[-0.08885219],[0.04394021],[-0.06569347],[-0.014445162],[-0.30804452],[-0.14045092],[-0.09604305]]},{"dense_3_W":[[0.5584446,-0.49258238,-0.06831941,-0.33898526,-0.010516451,-0.243958,0.3254376,-0.6381771,-0.43171817,0.32533497,0.3000785,0.47373283,0.1616467],[0.62135106,-0.6357912,-0.03967677,-0.3655531,0.13359948,-0.010117412,-0.26593152,-0.2779743,0.7421054,-0.64709723,0.5776921,0.35391986,0.85788155],[-0.24483721,0.4855099,-0.3095385,0.46626845,-0.117039315,0.27388623,0.39779752,0.61265177,-0.034959346,0.2967797,-0.008864683,0.36063853,-0.479764]],"activation":"identity","dense_3_b":[[-0.031353332],[0.04507456],[-0.07856169]]},{"dense_4_W":[[-0.065495215,-0.60703295,1.0466374]],"dense_4_b":[[-0.0710821]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12520x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12520x00x00x00x00x00x00'.json deleted file mode 100755 index 9a58eb918c..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12520x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.850587],[1.2006214],[0.60150135],[0.038597997],[1.1924275],[1.195236],[1.1976618],[1.1804594],[1.160997],[1.129005],[1.0974691],[0.03850275],[0.03851834],[0.038536113],[0.038553298],[0.038495034],[0.038382825],[0.03821236]],"model_test_loss":0.013673663139343262,"input_size":18,"current_date_and_time":"2023-08-11_22-22-26","input_mean":[[21.53012],[-0.045687865],[0.0011462382],[0.0033840926],[-0.041380186],[-0.042962875],[-0.044409957],[-0.04001238],[-0.035696205],[-0.031632073],[-0.029335052],[0.0033047958],[0.003320643],[0.003342723],[0.003354216],[0.0033464204],[0.003304185],[0.0032328872]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.108350344],[-0.20693034],[-0.14522482],[-0.5163846],[-0.37156594],[-0.119947374],[-0.31804028]],"dense_1_W":[[1.0910766,-0.43300736,0.0030034583,0.38913414,0.18278283,-0.31925726,0.64668375,-0.13552432,-0.41154033,0.24433674,0.048472222,-0.030966012,-0.18421704,0.302578,0.05368483,-0.10369585,0.45285794,-0.2643156],[0.021740088,-0.6065864,-0.0005514439,0.08483938,0.5714144,-1.2917976,0.6474515,0.1432958,-0.08682793,-0.0937718,0.09686305,-0.27733508,-0.2996467,0.07307305,0.4865785,-0.08587177,0.48999208,-0.4380169],[-0.0045009824,-0.5964933,0.00063102716,-0.16957587,0.42155236,-1.5124145,0.9020258,0.30124182,0.2940203,-0.19893585,-0.14327702,0.028712958,-0.3790416,0.5805242,-0.25458577,0.27593663,-0.32479686,0.18945682],[-0.031941526,-0.36289775,-6.4586377,0.5251884,1.2119403,0.19459614,0.027046863,0.15272467,-2.0958602,-0.6124005,1.2700095,-0.52332336,-0.1753136,0.04349013,0.5094644,-0.12745608,-0.3554143,0.17660716],[-0.0045775212,0.8235139,-0.9080976,0.8690431,-0.18817183,-1.0143514,0.68702215,-0.302185,-0.3445395,0.32111478,-0.021534106,-0.13426313,-0.1298182,0.04873703,-0.40560097,-0.0978507,-0.36964232,0.38757965],[-0.10878436,-1.5791492,0.060036104,-0.75532895,-1.7842572,-0.77946854,-1.2905889,-1.401123,-1.1079345,-2.0109158,-1.0800682,0.1277004,-0.047745556,-0.14514564,-0.4930343,0.4303121,0.40624237,0.38801444],[-1.047575,-0.3641548,-0.011621664,0.1802768,0.36029488,-0.5678573,0.87215257,-0.32095528,-0.48281944,0.18143207,0.16359733,-0.06739126,0.043152835,-0.06856613,0.3683477,0.08366781,0.41270572,-0.37719706]],"activation":"σ"},{"dense_2_W":[[0.08896879,-1.0618838,-1.236928,1.1085147,0.45503667,-0.29649493,-0.5560603],[0.05802153,0.8222231,0.79636604,-0.7962488,-0.14412767,0.14525741,0.6180748],[-0.15825768,-0.96576464,-0.20819964,-0.59680426,-0.15439917,0.22671004,-0.2357116],[-1.111581,0.27544013,-0.17377003,-1.2714287,-1.0232576,-0.6894107,0.9488163],[-0.5458172,-0.42459664,-1.6347574,-1.4187841,-0.964695,-0.5459487,-1.4589431],[-0.15094759,0.6969223,0.84540576,0.45799604,-0.31126192,0.48867247,-0.46977514],[-0.34919992,0.7479091,0.7190768,0.549971,0.5500571,-0.5448207,0.15025789],[-0.68081254,-0.38789412,-0.048226748,0.4368647,-0.8189457,0.021749284,-0.77771515],[-0.60718095,-0.26552448,-0.28099757,-0.15710582,0.29094604,-0.24080555,-0.7808776],[0.0033568847,-0.71768373,-0.9406896,-0.042297453,-0.36388123,-0.108075835,0.5197345],[-0.4915351,0.9041844,0.25389567,-0.013445068,0.18897061,0.2837717,0.3741654],[-0.3757065,0.23760095,-0.66970426,-0.36544222,-0.8507982,0.4782464,-0.5303433],[-0.29663894,-0.37195724,-0.8442924,0.29635245,-0.19174902,0.070796795,-0.4390862]],"activation":"σ","dense_2_b":[[-0.39513272],[-0.159368],[0.2868388],[-0.23528467],[-0.26247987],[-0.15212747],[-0.22264543],[-0.36984366],[0.033016775],[0.06725842],[-0.3415627],[0.22711973],[0.17381573]]},{"dense_3_W":[[0.69550085,-0.2602267,0.6511873,0.80323565,-0.5139177,-0.6302756,-0.41592857,0.5141956,0.6740762,0.7060216,-0.8168942,0.68222535,0.3284389],[0.089398846,0.46339324,-0.97560817,-0.80172545,0.19869575,0.5268298,0.6723404,-0.00843294,-0.75555086,-0.7210899,0.55462325,-0.8117566,-0.73714113],[0.48829198,-0.5059535,-0.08616368,-0.16644941,0.48320302,-0.48428047,-0.30819136,-0.35214564,-0.15856753,0.5061082,0.11269471,0.5998318,0.5135987]],"activation":"identity","dense_3_b":[[-0.117111795],[-0.062588595],[-0.0089505]]},{"dense_4_W":[[0.7856232,-0.70317644,0.19791394]],"dense_4_b":[[-0.08677392]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json deleted file mode 100755 index 8d7481346f..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.7166467],[0.9360951],[0.54996157],[0.039336555],[0.9278234],[0.92963946],[0.9314855],[0.92150825],[0.91230273],[0.8934071],[0.86945397],[0.039176],[0.03919577],[0.039226335],[0.03920194],[0.03908752],[0.0389208],[0.038630653]],"model_test_loss":0.01772945560514927,"input_size":18,"current_date_and_time":"2023-08-11_22-47-50","input_mean":[[17.004646],[0.045599815],[0.0011152645],[-0.001088986],[0.042060442],[0.043612026],[0.044696216],[0.043072034],[0.044451833],[0.042805985],[0.038478125],[-0.0010230377],[-0.0010265883],[-0.0010224311],[-0.0010469804],[-0.000976282],[-0.0009040997],[-0.0007548164]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.09819362],[-0.04249229],[-0.3479007],[0.03214666],[0.922219],[0.94473046],[-0.2771768]],"dense_1_W":[[0.07611097,-0.64347965,-5.7489953,-0.057701204,1.9627318,0.71188766,0.62335354,-1.5248296,-1.8103973,-1.1273834,1.2180927,-0.7481957,-0.65215784,0.3646581,0.76954377,0.93266475,0.5737459,-0.9375362],[0.082355805,0.0792861,-1.4165217,0.2831444,-0.8286206,-1.796174,0.7789983,-0.7667562,0.39938906,0.6860971,0.7154728,-0.3473279,0.46564227,0.70484024,0.18656117,-0.024444446,-0.13199502,-0.24193652],[-0.24016297,1.706992,-0.00090066914,-0.071590096,-0.7422648,0.8374083,-0.44082543,0.04738862,-0.22899044,-0.4460011,0.39585826,0.47956917,-0.17853828,-0.10812888,-0.08165929,-0.0425193,0.17251264,-0.29201412],[-0.35274625,-1.3477879,-0.0075425776,0.08863907,-0.77081376,0.9018588,-1.3318201,-0.44829947,2.0795786,0.8122879,0.6548207,0.44521397,-0.31335637,-0.17517531,-1.1029497,0.9331358,0.026675547,-0.06601325],[0.8279214,1.8557522,-0.0014833922,0.0585293,-1.1659931,0.9336915,-0.07515252,0.5152648,-0.62365764,-0.30737656,0.34178838,0.14973152,0.07111421,0.014621839,-0.22071289,0.16666935,-0.16080067,-0.23379543],[1.1760968,0.5412744,-0.0017593631,-0.22849438,-0.632045,0.6746573,-1.3172346,-0.8634406,-0.424611,0.5899645,-0.31364056,-0.32016203,0.25754422,0.1650363,-0.7505603,0.7215971,0.19650249,0.1422042],[0.852189,0.065097235,0.0061805155,-0.22967027,1.4924825,1.5642314,-0.60489327,-0.863056,-0.22668254,-1.0052434,-1.1320058,0.42393053,0.071807854,0.3276753,-0.47956294,0.08070331,-0.29770264,0.29226956]],"activation":"σ"},{"dense_2_W":[[-0.18211515,0.44951305,-0.9500942,0.21868896,-0.23856848,-0.2160815,-0.0797832],[-0.69846493,-0.4206712,0.31242144,0.24509996,-0.49114344,0.39693424,0.40193912],[0.17850624,0.19152331,-0.9087939,-0.44867268,0.23942706,-0.20083866,-0.22976424],[1.3243266,-0.25121248,-0.8598626,-1.3246324,-2.2754881,-1.6574712,-0.9889931],[-0.06998735,-0.6535759,0.1664615,0.1401335,-0.5745483,-0.5484165,0.52828187],[-1.0033789,-0.5766727,1.4222881,0.46975863,0.93773127,-0.7977733,0.08462863],[-1.6989592,0.24379954,1.0563916,0.8624438,-2.5557318,-3.1306412,-0.0018583427],[0.7160944,-0.045115337,-0.7554288,-1.3468298,-1.6522032,-1.3480777,-0.55742955],[0.8170345,-0.4355595,-0.24635607,-0.40475637,1.2702687,0.6482177,0.07428298],[-0.041201867,-0.83161634,0.6151208,0.63096315,0.09922941,0.5946334,0.097100645],[-0.8438058,0.4685656,0.83145976,1.2900296,1.6341914,1.3352168,0.91666037],[-0.22399388,0.07508866,-1.2330295,0.0674378,-0.18247488,-0.29714978,-0.35030952],[0.46261635,-0.33211225,-0.3962421,-1.7023565,-1.4344509,-1.1435779,-0.6136494]],"activation":"σ","dense_2_b":[[0.08529015],[-0.19910426],[0.1709426],[-0.27077383],[-0.40408188],[-0.21291175],[-0.6464522],[-0.30908433],[0.2922855],[-0.15335728],[0.09016753],[0.22037135],[-0.12172044]]},{"dense_3_W":[[0.17863923,-0.6011715,0.1722149,0.44289172,0.34816673,-0.49830723,-0.43645224,0.85543525,0.6923212,-0.49683204,-0.44174555,0.7450105,0.2767857],[-0.23232669,-0.05226724,-0.3187981,-0.7006331,0.26881424,0.5859572,0.7913836,-0.5530767,-0.0619629,0.5197311,0.06590323,-0.13048458,-0.727642],[-0.25087458,-0.4260785,-0.5679577,-0.8808904,0.3215431,0.3545877,1.4937782,-0.5066919,0.17787237,0.24629535,0.33879703,-0.77151966,-1.04119]],"activation":"identity","dense_3_b":[[0.11716675],[-0.15205665],[-0.09666118]]},{"dense_4_W":[[-0.6054611,0.6616036,0.5710006]],"dense_4_b":[[-0.113945]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B1254000x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B1254000x00x00x00x00'.json deleted file mode 100755 index 8c62679e2e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019 b'x018965B1254000x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.5586987],[1.0668136],[0.65108716],[0.034576062],[1.0662991],[1.0668288],[1.065283],[1.0460236],[1.0356027],[1.0212996],[1.004612],[0.034393594],[0.034448482],[0.03450532],[0.03473761],[0.03497435],[0.03507344],[0.034994226]],"model_test_loss":0.00870500411838293,"input_size":18,"current_date_and_time":"2023-08-11_23-14-06","input_mean":[[15.162458],[-0.030393902],[-0.032802418],[-0.0010593864],[-0.023624144],[-0.026816128],[-0.030528499],[-0.045015506],[-0.055663712],[-0.07392666],[-0.08540629],[-0.00092076114],[-0.0009717724],[-0.0010414494],[-0.0015066566],[-0.001796707],[-0.002044406],[-0.002223362]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.021506997],[0.21911767],[1.484493],[-1.3083466],[-0.06510764],[0.9399787],[1.458603]],"dense_1_W":[[0.0022624284,-0.3323741,-0.35996,0.30342358,0.4944291,-1.2646209,0.9047208,-0.47583306,-0.23761328,0.18038853,0.38000605,-0.25240594,0.101771735,0.3689774,-0.5897502,-0.13633685,0.18846181,0.053237073],[0.017284913,-1.2738092,-4.2060423,0.73188466,1.3437643,-0.18045263,0.56554645,-0.26942906,-0.49767345,-0.5426496,0.51763725,-0.43579608,-0.3971797,0.086990125,0.05311058,-0.03055538,0.37126696,-0.39750952],[2.0191145,0.49570322,0.031393226,0.54196084,-0.59665686,0.66882825,-1.0989279,-0.18807355,-0.45894685,0.2759851,0.336422,-0.037411854,0.19308677,-0.46080658,-0.4973297,0.5372746,-0.37408796,0.10846941],[-0.46998337,0.3490007,-0.00438622,0.34095845,0.8166364,0.60549915,-0.8988132,0.5476835,-0.37996238,0.3388258,-0.03860557,-0.036083266,0.1092255,0.052381583,-0.5599509,0.24364339,-0.28141674,0.18529813],[0.009164018,0.433447,-0.042506576,-0.17593549,-0.38864172,1.2539347,-0.59288657,-0.13135396,0.29104137,0.023563422,-0.009315888,-0.07067319,0.2342533,0.10161306,-0.5636307,-0.23514093,0.25040185,0.046599127],[0.4312695,0.36135638,-0.0074610105,0.26067948,0.4758904,1.401296,-1.3515489,0.20557608,-0.082261525,0.21485652,-0.0033740771,0.6790412,-0.13174984,-0.46494,-0.69377804,0.41025424,-0.14858818,0.13721205],[1.986749,-0.49324146,-0.02681901,-0.4256105,0.3361303,-0.35204482,0.9926823,0.12374698,0.5503816,-0.09924912,-0.4841911,0.24159499,-0.40405098,0.31244668,0.36439434,-0.044306964,-0.08293645,0.027888171]],"activation":"σ"},{"dense_2_W":[[-0.6324022,-0.2001331,-0.3526252,0.092529655,-0.27300277,-0.43241245,-0.014045538],[0.32039317,-0.116377145,0.3309547,0.63877505,0.5530988,0.50968677,0.24939647],[-0.30597773,-0.40312517,-0.38242427,-0.37124476,0.45356536,0.24014069,0.028166713],[0.96208113,0.43337837,0.14673242,-0.47370073,-0.9436095,-0.7661267,1.4071115],[1.0540173,1.2540439,0.6600092,-1.6646789,-0.54332626,-0.32733205,1.6595306],[0.62378746,-0.023177164,-0.34522477,-0.18102872,-0.551694,-0.5655608,0.6431443],[-0.736956,-0.87690467,1.1770567,0.6597062,0.27471146,1.0888082,0.692091],[-0.62574077,-0.12893064,-0.022563975,0.029874153,0.9045192,-0.17541885,-0.34263155],[0.48334014,-0.41208985,0.18305346,-0.20077266,-1.1162131,-0.2358352,0.34831035],[-0.56035835,-0.06362593,-0.5727027,-0.9132281,-0.30174935,-1.0307825,-0.63969034],[0.14403231,-0.3598213,0.4601045,0.4040111,0.7650697,-0.24749416,-0.4396638],[0.42583916,0.43303528,-0.8717473,0.12096721,-0.70570135,-0.4342938,-0.106751114],[0.84214103,0.1612862,-0.44598746,-0.30170873,-0.734939,-0.39400816,0.33292803]],"activation":"σ","dense_2_b":[[-0.010498221],[0.033183154],[-0.07346041],[0.31818846],[0.4988308],[-0.06161561],[0.13534743],[0.04956322],[0.013285028],[-0.24566568],[-0.054392837],[-0.07685737],[-0.0044829077]]},{"dense_3_W":[[0.320467,-0.094095595,0.29182792,0.19275357,-0.2693895,-0.03124413,0.70573056,0.13810281,-0.14187036,0.4353431,0.59297323,-0.35034177,-0.3786733],[-0.49737677,-0.03697066,-0.4474356,0.4436638,0.22232622,0.077376895,-0.2219271,-0.41994625,0.35827994,0.6140234,-0.30546016,0.06829079,0.09227224],[0.16473123,0.5829968,-0.19248042,-0.60918665,-0.43222797,-0.5060332,0.6062956,0.26105765,-0.52482605,-0.3128516,0.19090605,-0.5577064,-0.6766231]],"activation":"identity","dense_3_b":[[0.03811113],[-0.038507566],[0.07794119]]},{"dense_4_W":[[0.5730286,-0.2928305,0.97310096]],"dense_4_b":[[0.052272193]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019.json deleted file mode 100755 index 98b503aa71..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA HYBRID TSS2 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.718988],[1.5299566],[0.588685],[0.04587614],[1.5157732],[1.5220679],[1.5256046],[1.4840062],[1.4323099],[1.3597063],[1.2913275],[0.04572448],[0.045758896],[0.045787074],[0.045749795],[0.045636524],[0.045395125],[0.044941075]],"model_test_loss":0.01872895285487175,"input_size":18,"current_date_and_time":"2023-08-11_17-36-03","input_mean":[[20.897451],[0.06658304],[-0.006871385],[-0.0023558615],[0.06727495],[0.0672389],[0.06719857],[0.062312864],[0.059572313],[0.053668246],[0.050075833],[-0.0023719259],[-0.002378079],[-0.002380981],[-0.0024748852],[-0.0026206481],[-0.0028906488],[-0.0031310404]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.4188718],[3.7088637],[-0.4249776],[3.6651204],[0.046135984],[-1.4088162],[-0.10634205]],"dense_1_W":[[1.1106812,1.1545246,-4.947238e-5,-0.19786799,-0.18502258,0.5724563,-0.49629408,-0.04241503,-0.0403527,-0.15461488,0.11042651,0.53509825,0.37794867,-0.5013257,-0.36293125,-0.21677697,0.12571956,0.033723105],[1.8875406,-0.87548965,-0.001720046,0.009296322,0.26706383,-0.78977394,1.0030317,0.049685888,-0.81093186,-0.06850548,-0.606039,-0.72494996,0.5103131,0.33077994,0.15339775,-0.43638188,0.059071552,0.17510937],[0.00311601,-3.0533133,0.024360646,-0.6194892,-1.5417911,-1.5249615,-1.0547282,-0.9433036,-1.1036747,-1.0223001,-1.3264794,-0.25942302,0.510594,0.7205571,-0.4561305,-0.24234876,-0.38653123,0.5385542],[1.8394231,0.871029,0.00046375685,0.25113386,-0.26997137,0.6880674,-0.80075204,0.00029531567,0.5298615,0.050234746,0.67435867,0.2723314,-0.19964069,-0.3188195,-0.33458334,0.57019603,-0.115791656,-0.19562978],[-0.0028326493,0.5804407,1.410442,-0.28499115,0.28093004,1.6346636,-0.7038905,0.51737905,0.25173852,0.06668676,-1.1657398,0.79343003,-0.13164437,-1.4595138,-0.089708395,0.2537593,-0.105980076,0.3329512],[1.071272,-0.9638096,0.00031746196,0.07963901,0.52283543,-1.1346815,0.57982945,0.20819707,-0.23751144,0.14297311,-0.030557238,-0.51577616,-0.55872697,0.6908526,0.52733356,0.0744941,0.027328867,-0.12216176],[0.004417767,1.1576066,6.299144,-0.32635224,-1.7558908,-0.30372036,-0.066983394,0.6580024,1.0876615,1.1211929,-1.1704223,1.6710458,0.75445145,-0.87139034,-0.7181289,-1.1046274,-0.4240588,0.63390136]],"activation":"σ"},{"dense_2_W":[[0.2679174,-1.0445848,-0.8299557,-0.25635472,0.4422085,-1.1647375,0.6085093],[-0.6689395,0.39463186,0.23278524,-1.1111928,-0.74221855,0.76892823,0.35332564],[0.31055808,0.3647656,-0.02499961,-0.1409631,0.31955567,0.12277927,-0.15797752],[0.9008812,0.60631984,-0.813905,0.92170995,0.6534263,0.22818235,0.71731585],[0.230484,-0.26698533,0.08754667,0.03489466,-0.3151056,-0.47791874,0.3342572],[0.34251255,-0.7261644,-0.20441282,-0.034852047,0.36376244,-0.89967006,0.219338],[-1.1227978,-0.12817267,0.21945642,-0.8032351,0.09376713,-0.84758645,-1.0390291],[-0.15338765,-0.037509676,-1.0683689,0.50024486,-0.7426109,0.53765345,-0.37471557],[-0.17778587,-1.1523334,-0.80799854,-0.28195953,0.50175095,-1.0760622,0.46772632],[-0.86102694,0.2053753,0.3926311,-1.0105791,-0.2120155,0.7215332,-0.23412094],[-1.2708869,0.66490364,0.25874946,-0.5689588,-0.022179203,0.580645,0.002767838],[0.5473067,-0.6157128,-0.6704757,-0.57233113,-0.29838595,-0.34488145,-0.13409242],[-0.33881795,-0.022099096,-0.55139774,0.18853591,0.050985426,0.8735969,-0.35496432]],"activation":"σ","dense_2_b":[[-0.25471497],[-0.05747227],[-0.061555464],[-0.13456716],[-0.013720933],[-0.07922762],[-0.113175996],[-0.04504478],[-0.35800874],[-0.0046020667],[-0.11548371],[-0.028764911],[-0.05550412]]},{"dense_3_W":[[-0.51718456,-0.015113678,-0.5522247,-0.12137883,-0.18037502,-0.4991924,-0.188951,0.6336781,0.09542685,0.5714098,-0.14561579,0.44534728,-0.09133837],[-0.03161159,0.34381616,0.26201352,-0.41056356,-0.25490084,-0.5049834,0.5320046,-0.12673296,-0.33940148,0.4677796,0.67244035,-0.43483102,0.58558035],[0.22973408,0.5728116,-0.17393303,-0.28269792,0.5416507,0.23091814,-0.074842304,0.019422745,-0.469903,-0.22602552,-0.34416038,-0.09474743,-0.07237691]],"activation":"identity","dense_3_b":[[-0.011782462],[-0.022098923],[0.040575616]]},{"dense_4_W":[[-0.7849743,-1.266133,0.028305434]],"dense_4_b":[[0.018039817]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json deleted file mode 100755 index a981acff9e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'8965B12361x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.9360695],[1.1630229],[0.49147838],[0.04477571],[1.156402],[1.1589196],[1.1612774],[1.1484874],[1.127694],[1.0978333],[1.0665215],[0.0445643],[0.04463128],[0.044691123],[0.044780783],[0.04475211],[0.044584557],[0.044264473]],"model_test_loss":0.014142030850052834,"input_size":18,"current_date_and_time":"2023-08-12_00-18-25","input_mean":[[22.546267],[0.026984693],[0.0015847267],[-0.009265251],[0.02708977],[0.02745922],[0.027661897],[0.027764216],[0.02783128],[0.027259488],[0.02614681],[-0.009333842],[-0.009295044],[-0.009257047],[-0.009214106],[-0.009245656],[-0.009297244],[-0.009411856]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.29641],[-0.092996016],[-0.07247574],[0.01721833],[2.1956046],[-0.15631124],[-0.058797363]],"dense_1_W":[[-0.22285046,-0.1114835,-0.18068203,0.16602449,0.59281373,-1.1307124,0.4008994,-0.16000947,0.085925706,-0.29159763,-0.3772878,-0.6881549,-0.13406135,0.5206962,0.36629307,-0.19463618,0.31983083,-0.1474239],[0.016796593,-0.98549455,-1.7525299,0.3078688,0.5721632,-0.3304454,-0.06705133,-0.11118571,-0.32195482,0.3919248,0.27401718,-0.46777967,-0.48869264,0.28487942,0.6982902,-0.074734256,-0.24820116,0.16100961],[0.31042123,0.19122998,-0.12722188,-0.27483284,-0.4547291,0.8013624,-1.0190685,0.21308842,0.33060518,-0.29281816,-0.40331224,0.17957272,0.39285606,-0.25553757,-0.24935547,0.1355044,-0.06329214,0.22954762],[-0.006421214,0.37099814,0.0027769755,0.010240031,-0.80907327,1.8348622,-0.38069573,-0.056077406,-0.14080317,0.13694486,0.03138031,0.16390382,0.21113038,-0.5778241,0.0057960977,-0.032158796,0.07527852,-0.04575749],[0.3227168,-0.17621782,-0.18886027,-0.37221447,0.32229832,-0.6248933,0.40250614,-0.18772343,-0.19750184,-0.27255252,-0.2845168,-0.30223995,0.15848213,0.16786462,0.3700133,-0.02713416,0.35638666,-0.14070766],[-0.029193275,-0.95258975,-6.3443847,-0.16789156,2.1661074,-0.15078546,0.3174049,-0.41737202,-1.9191536,-0.7163877,1.5734226,-1.7942194,-0.99211544,0.3988617,1.8096817,0.71005505,0.3803724,-0.517763],[1.4648159,-0.23948996,0.29068846,0.25918722,0.6120923,-0.8601464,0.5889934,0.34411243,0.020458814,0.28458166,0.45318642,-0.5825167,0.29618037,-0.066410765,0.42480034,-0.16173336,-0.10525159,-0.2598628]],"activation":"σ"},{"dense_2_W":[[-0.37377402,0.46476626,0.5534617,-0.26033473,0.45733005,1.1248896,0.9239269],[0.80217236,-0.20218013,-0.28995574,-0.92397535,0.33133814,0.21111849,-0.052037425],[-0.39823613,-0.4600786,-0.12479944,0.7203347,-0.6923874,-0.07840685,-0.11677317],[0.13027504,-0.37647787,-0.83754325,-0.6329695,0.6788497,0.2377329,-0.10071739],[-0.4414727,-0.18732905,0.5177299,0.7144774,-0.7800902,-0.009347282,0.04816524],[1.4953467,-0.1516854,-0.7720803,-1.5129604,0.547889,-0.11141382,0.4703957],[-0.082963005,-0.12600237,0.16579789,0.060129933,0.14053828,-0.4156861,-0.032326207],[0.10354526,0.39380085,-1.0558978,-1.1450167,-0.09905039,0.7310668,-0.8474744],[0.97818476,-0.174693,-0.38756898,-0.69246876,-0.029256595,-0.36487702,0.25810534],[0.36486697,-0.3805968,-0.32210922,-0.29974073,-0.2457904,-0.078286484,0.14194314],[-0.4540887,-0.23490758,0.45732084,0.8397524,-0.59814954,0.32775092,-0.22665621],[-0.6326152,0.1386963,-0.054368168,0.29623267,0.26214838,-0.5508051,0.03455977],[0.13512251,0.15923476,0.29472926,-0.41340572,0.10075192,-0.89706355,0.01360474]],"activation":"σ","dense_2_b":[[-0.12671065],[-0.051599756],[0.053335667],[-0.119286604],[0.026706826],[-0.1761932],[-0.024956206],[-0.17874902],[-0.109204695],[-0.030811843],[0.033664174],[0.027278738],[-0.33637452]]},{"dense_3_W":[[-0.41551515,-0.6342881,-0.021494662,-0.006901076,0.6140606,-0.03595642,0.2998105,-0.035869166,0.26118553,0.42404452,0.26687363,-0.34257045,-0.006692998],[0.41666955,0.63193476,-0.5990722,0.22787261,-0.69550204,0.6494638,-0.2658041,0.2686287,0.4277496,-0.08251372,-0.6163266,-0.23402017,-0.2279805],[0.57232213,-0.0648472,-0.58796054,0.13980845,-0.745974,-0.3898328,0.4852061,0.6894071,0.31734547,0.32177705,-0.009921448,-0.5850407,0.5147919]],"activation":"identity","dense_3_b":[[0.046797086],[-0.049840048],[-0.06342088]]},{"dense_4_W":[[0.605299,-1.1554636,-0.685096]],"dense_4_b":[[0.053069614]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json deleted file mode 100755 index cde14c836c..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12350x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.373858],[1.429052],[0.5426649],[0.052008856],[1.4160408],[1.4200201],[1.4230659],[1.3935287],[1.3574492],[1.3125392],[1.2667787],[0.051808108],[0.051840812],[0.051871687],[0.051805917],[0.051645547],[0.05135777],[0.050868414]],"model_test_loss":0.01654689572751522,"input_size":18,"current_date_and_time":"2023-08-12_01-38-11","input_mean":[[22.57365],[-0.10559917],[-0.0033210916],[-0.012123505],[-0.10526322],[-0.105793074],[-0.106214054],[-0.10535747],[-0.101396576],[-0.097008556],[-0.09058301],[-0.0121329045],[-0.012128961],[-0.012128141],[-0.012230474],[-0.012350836],[-0.012518174],[-0.012592093]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.0777179],[0.97938883],[1.5086899],[-0.04293025],[-0.1820288],[-0.6305807],[-0.120503895]],"dense_1_W":[[-0.8936668,-0.9089122,-0.0107665425,-0.33187804,0.63021916,-1.7183859,0.12800273,-0.0100968545,0.024045149,-0.029676547,-0.34905303,-1.0929383,-0.18899661,1.343712,-0.007488287,-0.3871314,0.25819728,0.1568673],[1.5129911,0.79717666,0.022131754,0.5209565,0.4205534,-0.332852,0.6810523,0.8714592,-0.50664216,0.08871834,0.32013246,0.2844342,-0.46781865,0.17079753,0.39502883,-0.36544546,-0.25921047,-0.09649327],[0.35998663,-0.9628087,-0.0062323916,-0.17270656,0.22350977,-0.6925143,-0.13750921,-0.17138264,-0.18750982,-0.013588476,-0.21163066,-0.5151457,-0.16456504,0.12154584,0.47781697,-0.20399685,0.11707962,0.10914235],[0.004396283,0.51554716,-0.9786613,0.69308823,-0.46901524,-1.0285038,0.84607154,-1.1921532,-0.63446474,-0.06949246,1.0443338,-0.42222655,-0.1182501,0.6120174,0.3311507,0.049771998,-0.29231647,-0.24979034],[0.20238344,1.1074004,0.0024114763,-0.0062439544,-0.62287986,1.6389,-1.4840738,-0.053691912,0.08705532,0.07321774,-0.042032983,0.74493074,-0.13798285,-0.52930796,-0.29137415,0.040948115,-0.19026838,0.14882064],[0.5280113,0.27212307,0.007787733,0.15363543,0.35135317,-1.3474009,0.05997354,0.101474024,0.081706434,-0.0908575,-0.10102894,-0.45173493,-0.1977021,0.4278154,0.318782,0.060933735,0.11480374,-0.13501142],[0.0057853195,0.6303344,6.09931,0.026223302,-1.2619864,-0.51326764,-0.03881918,0.49512786,1.4146665,0.79070103,-1.2047328,0.75863904,0.08617853,0.31710652,-0.20454784,-1.32909,-0.210705,0.46263775]],"activation":"σ"},{"dense_2_W":[[0.90623915,-0.19034801,-0.108130135,0.5278633,-1.2545385,-0.12592614,-0.52437365],[0.47535196,0.016532913,0.035282977,0.13013715,-0.870746,0.85260004,0.12751696],[0.5615727,0.46776855,0.09889727,-0.10724942,-1.3574804,0.77887696,0.22862391],[-0.5160793,-1.205545,-1.2478756,-0.8897315,-0.06685275,-0.8264719,0.81887203],[0.48447967,0.9875634,0.8365766,0.21329804,-0.49966353,0.4703453,-0.593851],[0.29606903,0.6514512,0.19704497,0.6196983,-1.1678208,0.060366396,-0.45280713],[0.88284767,0.07871202,0.028610494,-0.24149852,-0.63900256,0.6064404,0.11543124],[0.25333208,0.48942828,-0.12563716,0.051205732,-0.93026,0.80623984,-0.004143445],[-0.2687049,-0.44401962,-1.024401,-0.53700495,0.5412046,-0.6765064,0.29961354],[-0.8286411,-0.43201685,-0.61702985,0.2633626,0.8428664,-0.22970653,-0.1767021],[0.28991467,0.8902969,0.07605267,-0.15893519,-0.76903087,0.4981137,-0.3236638],[0.6096544,-0.21495588,-0.91238225,0.77867436,-1.8102629,-1.2908732,-1.2738218],[-0.5399221,0.2869458,-0.20122242,-0.5448208,1.5114583,0.0075225746,0.47214413]],"activation":"σ","dense_2_b":[[-0.6210039],[-0.7338756],[-0.49544066],[-0.016957626],[0.14940451],[-0.2620403],[-0.33229533],[-0.6031841],[-0.004913182],[0.07355716],[-0.09776186],[-0.21512811],[0.17054316]]},{"dense_3_W":[[0.48983884,0.36363626,0.21502955,-0.9243558,-0.16985188,0.4922954,0.3588781,0.27590808,-0.25560167,-0.46252558,0.39927235,0.69911397,-0.67142934],[0.37070408,-0.123413324,0.18464014,-0.37953055,0.77963734,0.129906,-0.29632708,0.44859973,-0.49503464,-0.2910844,0.2119971,-0.12548667,-0.6616464],[-0.4211456,-0.061192263,0.51209587,-0.8209177,0.81541854,-0.26879197,0.40843183,-0.38219845,-0.50384146,-0.26437145,0.048634317,0.21556903,-0.61757386]],"activation":"identity","dense_3_b":[[-0.14383568],[-0.119675145],[-0.059801787]]},{"dense_4_W":[[-0.9198642,-0.18013722,-0.18726753]],"dense_4_b":[[0.12321251]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json deleted file mode 100755 index c889cb8d88..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B12530x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.948574],[1.1548593],[0.53562486],[0.04142332],[1.1479245],[1.1507511],[1.1525209],[1.1366456],[1.1163762],[1.0853585],[1.0512753],[0.041254494],[0.04129291],[0.04133092],[0.041417275],[0.041405268],[0.041273605],[0.040966455]],"model_test_loss":0.01583303138613701,"input_size":18,"current_date_and_time":"2023-08-12_03-21-02","input_mean":[[22.332148],[-0.0104918955],[0.005065536],[-0.0070506595],[-0.013160345],[-0.013143605],[-0.01291947],[-0.008646495],[-0.0035904623],[0.003121308],[0.0078104283],[-0.0070844237],[-0.0070869317],[-0.007085635],[-0.007076808],[-0.0070724767],[-0.0071802554],[-0.007291667]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.8984663],[-2.0064306],[-0.15834741],[-0.15535103],[-2.6078513],[-0.8259225],[-0.36931977]],"dense_1_W":[[1.9998074,-0.5228987,-0.007837696,-0.37922895,0.2013876,0.9096955,-0.59748536,-0.48922086,-0.22898138,-0.16860367,0.4016587,0.026524307,0.41660535,0.061682027,0.01675915,-0.30379614,-0.22650504,0.31388414],[-0.70133764,-0.31426615,-0.30248472,0.44402006,0.048648655,-0.895414,0.40575865,-0.45831415,-0.31590462,-0.45891097,0.41624534,-0.114576444,-0.32526416,0.48809057,0.09747309,-0.5963326,0.14772642,0.024402922],[-1.3297249,0.20129964,-0.00036146026,0.038497657,-0.5804307,1.210312,-0.79524547,-0.021346122,-0.33560273,-0.2652577,0.30101648,-0.05918743,0.33916757,-0.09221603,-0.38487548,-0.048523333,0.1305082,0.026008023],[0.021477336,0.79985726,-0.0015464973,-0.024727628,-1.1476581,2.130608,-0.8638772,0.0654132,0.11198076,0.11908945,-0.14789096,0.3044069,-0.10925098,-0.37106133,0.018268378,0.16547772,-0.19248393,0.07397156],[-0.7169261,0.5082077,0.33950427,-0.2827534,-0.02629989,0.6695642,-0.17877822,0.435526,0.4602184,0.07237377,-0.22672322,0.29523724,0.30271506,-0.6622034,-0.18534695,0.18379785,0.17853066,-0.034246102],[1.5692992,0.20060617,-0.0087794345,0.22292043,-0.47884136,0.30518147,-0.12451496,0.5754826,-0.21691562,0.2744736,-0.279054,0.5970735,0.4481981,-0.34849948,-0.95557034,-0.4386284,-0.10558777,0.5969739],[-0.09477646,0.0028076046,6.1231327,0.08033729,-1.3894303,-0.101474024,-0.39416897,0.8766576,2.336158,0.5908453,-1.6577489,1.201268,0.18122643,-0.22435206,-0.83741874,-1.0561486,-0.29097697,0.85901344]],"activation":"σ"},{"dense_2_W":[[-0.43103984,0.57259583,-0.45353982,-0.8405737,0.23949991,-0.4028692,0.014858877],[0.73426634,0.05207242,-0.08326654,-0.18289784,0.02668798,0.6674364,1.2636756],[0.5063167,-0.07997967,-0.38297585,-0.54653513,-0.890911,-0.28915372,-0.25040558],[-0.45767108,-0.7947474,-0.98106426,-0.27605048,-0.223204,-0.26669544,0.32884514],[-0.6062595,1.2573644,-0.3091175,-0.5193278,-0.098620065,-0.22738218,-0.6608672],[0.3030579,-0.26088515,-1.2724319,-0.97036225,-0.35874432,-0.74326634,0.53469926],[-0.27986455,0.17539752,-0.7900952,-0.78699905,-0.33842587,0.22881772,0.07359398],[0.3623993,-0.53849274,0.28685072,0.22223133,0.34689447,-0.2684479,0.43466133],[0.46523356,-0.73971575,-1.0159626,-1.149454,-0.27072653,-0.8258129,0.5557078],[-0.53017086,0.72048044,-0.09883555,-0.2829141,0.04501004,0.0050941044,-0.960148],[0.04228475,-0.753709,0.51548535,0.9503595,0.9151871,0.1863079,-0.38379395],[0.20732456,0.4841701,-0.30309632,-0.6324904,-0.32458326,0.030910695,-0.62432814],[-0.414588,-0.5427142,0.07252307,0.13270381,1.1135048,0.40259692,0.40499088]],"activation":"σ","dense_2_b":[[-0.008773873],[0.053248625],[0.012098179],[-0.15198793],[0.031805143],[-0.1111416],[-0.028365295],[-0.14010914],[-0.15508862],[-0.11093824],[-0.08748234],[0.00033527156],[-0.4448109]]},{"dense_3_W":[[0.52092105,-0.5030081,0.3844592,-0.27487588,0.4706045,0.5264942,0.5090887,-0.51060134,0.5129347,0.56152797,-0.28395477,0.3204959,0.02406914],[0.01593203,0.39330208,-0.1664461,-0.33330208,-0.60746926,-0.9253926,-0.235876,0.08486243,-0.59641266,-0.583729,0.34775153,0.23688537,0.26984528],[-0.13828522,0.47288388,-0.14799266,-0.5270513,-0.20191401,-0.25410458,-0.33126354,-0.007962782,-0.09041336,-0.43510935,0.5427055,-0.25327948,0.24559122]],"activation":"identity","dense_3_b":[[-0.07803073],[-0.039414078],[0.06702688]]},{"dense_4_W":[[-0.8098712,0.37011686,0.88090986]],"dense_4_b":[[0.069430865]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B1255000x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B1255000x00x00x00x00'.json deleted file mode 100755 index 0217d51cd4..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019 b'x018965B1255000x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.182226],[1.318108],[0.55038416],[0.04239555],[1.299573],[1.3053768],[1.310721],[1.3021369],[1.2816164],[1.2473235],[1.21014],[0.042187754],[0.042233933],[0.042278603],[0.042346247],[0.042341743],[0.042186968],[0.04189735]],"model_test_loss":0.014659138396382332,"input_size":18,"current_date_and_time":"2023-08-12_03-48-36","input_mean":[[23.368876],[-0.068378255],[0.006725546],[-0.008719376],[-0.06981951],[-0.06967088],[-0.069361694],[-0.063916035],[-0.05700445],[-0.05206913],[-0.047056135],[-0.008766596],[-0.008747308],[-0.008727638],[-0.008741792],[-0.008740139],[-0.008743794],[-0.008700719]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.07148768],[-1.2549438],[-0.12059412],[0.28853613],[0.5968914],[1.0667353],[0.060763594]],"dense_1_W":[[-0.024016947,0.84826535,7.0236993,-0.11074515,-1.0140074,-0.3385152,0.3869476,0.19172075,1.175179,0.6838961,-1.670459,1.526374,0.40274563,-0.15733598,-1.1089683,-0.61065984,-0.49152604,0.4318153],[-0.33222798,-0.9686618,0.001050462,-0.010235882,0.6520806,-2.10211,0.87924844,0.10038173,0.29654494,-0.24353155,-0.38334486,-0.46616292,-0.048904274,1.0027238,-0.324415,-0.18696539,-0.13033646,0.2411943],[-0.0034917125,0.52613735,-0.6482348,-0.2613602,-0.31058145,-0.95539135,0.74526536,-0.2220608,-0.07110724,-0.04182627,0.3254652,-0.77304727,-0.20731975,0.41823757,0.6348863,0.7838213,-0.011969447,-0.49731982],[-0.0023636539,-0.9352469,0.010787807,-0.34020036,1.1659639,-0.64832354,0.7099896,0.5089206,-0.4254998,0.33206016,0.01926688,-0.7223199,-0.3694965,0.43782136,-0.4339172,-0.22489113,-0.02471112,0.028520793],[1.4516557,-0.19518882,-0.0029764688,0.12874876,-0.98909014,0.5284616,-1.16062,0.22776824,0.089895435,-0.19509007,-0.56990606,0.7084235,-0.36520556,-0.498448,-0.059548475,0.3090115,-0.28404635,0.19958587],[0.6468036,-0.7351077,0.008596004,0.35622707,0.15142143,-0.7299676,-0.3414438,0.2833802,0.37200418,-0.32622182,-0.38793376,-0.0299215,-0.09024869,0.012755521,-0.27303815,0.07300682,-0.0782633,0.107511714],[0.0020368258,0.40920547,0.003771097,-0.2989948,-0.5958545,1.302363,-0.5710859,-0.12573288,0.14467251,0.008276177,-0.02948484,0.14001983,0.20254755,-0.68072915,-0.024878774,0.015510983,-0.0020638234,0.009023179]],"activation":"σ"},{"dense_2_W":[[0.041601215,0.24447797,0.4216046,-0.016745664,0.15380263,0.64953125,-1.5191501],[-0.39923093,-0.7630646,-0.076158375,-0.11835629,0.07851075,-0.68705547,0.38427234],[-0.8636165,-0.9983891,-0.19798958,-0.7385011,0.45974955,-0.3868112,0.79535973],[0.37583378,0.031611152,-0.033107635,-0.28120467,0.55615216,-0.03311618,-1.2747175],[0.47308478,0.6686049,0.3348913,0.04881856,-0.61745036,0.7808802,-0.66125715],[-0.3698526,0.166168,0.34443247,0.78737146,-0.22270668,0.6219827,-1.3671186],[-0.84190524,0.0076339054,-0.022591086,-0.6236704,-0.709543,-0.1443693,-0.075285174],[0.19466163,-0.26411548,-0.31579143,-0.1977254,0.022438988,-0.9939421,1.1909277],[0.25067687,0.65360653,-0.74067396,-0.17100555,0.19362506,-1.1775283,0.14330721],[-1.1357728,0.79514545,-1.0022937,-0.09116658,-1.3095479,-0.6293098,-0.13681495],[0.09452845,-0.37880635,-0.5292872,-0.386041,0.3486835,-0.056757417,0.43682256],[-1.2684631,1.433187,-0.12050286,0.46401381,-0.9219034,-0.38595304,-0.7805995],[0.54370886,-0.26546618,-0.40414193,-0.34449917,-0.46030614,-0.5862646,0.8578885]],"activation":"σ","dense_2_b":[[-0.21447611],[-0.2793929],[0.028746858],[-0.3559357],[-0.0974488],[-0.031200977],[-0.41441417],[0.04470072],[0.034972806],[-0.17655064],[0.049306504],[-0.20983955],[0.070270784]]},{"dense_3_W":[[0.28620473,0.49553362,-0.29979274,0.49239248,-0.3187128,-0.8089054,0.5728521,0.19156021,0.5760315,-0.15520339,0.63937896,-0.5519342,0.42006114],[-0.73719287,-0.10893459,0.69925296,-0.6052518,-0.18487976,-0.7727218,-0.39659286,0.65072507,0.53865,-0.36898273,0.17422022,-0.61456436,0.58988386],[-0.05938441,0.28018096,-0.3131366,-0.10477532,-0.56004566,0.48185638,-0.11083797,0.3429314,-0.25739473,0.5281356,0.32803684,-0.5822138,-0.26118425]],"activation":"identity","dense_3_b":[[0.008872742],[0.05966272],[0.06136013]]},{"dense_4_W":[[0.4281875,1.0318612,0.050216466]],"dense_4_b":[[0.027177498]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48140x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48140x00x00x00x00x00x00'.json deleted file mode 100755 index 21de46199b..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48140x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.231288],[1.2236207],[0.48384562],[0.042621814],[1.2090349],[1.213721],[1.2177045],[1.1926111],[1.1658418],[1.1279925],[1.0919241],[0.042506836],[0.04252686],[0.04254458],[0.04244013],[0.042343955],[0.042099677],[0.04176238]],"model_test_loss":0.01185668259859085,"input_size":18,"current_date_and_time":"2023-08-12_04-42-56","input_mean":[[23.357746],[0.02301448],[0.0030845709],[-0.0019251241],[0.024697196],[0.024336],[0.024798963],[0.027229987],[0.029705063],[0.028953856],[0.027455976],[-0.0019747023],[-0.0019767939],[-0.0019740309],[-0.0018473448],[-0.0018153174],[-0.0018839837],[-0.0020214282]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.007139518],[-0.36417663],[-0.22151361],[-2.2752786],[-1.842185],[-0.052370787],[0.52810186]],"dense_1_W":[[0.06463208,-0.14614256,-0.004301284,0.17093673,0.10111846,1.3639654,-0.8234353,0.039920002,-0.11260984,-0.035453953,0.19663298,0.6151078,0.32875365,-0.8119263,-0.287689,-0.23053078,-0.42119426,0.4950128],[-0.07006446,-1.9708806,-6.5331817,0.1236159,1.8130503,0.5166503,0.68799275,-0.060281184,-1.673682,-1.1404577,1.1906871,-1.2054949,-0.46952084,0.06406035,0.34139132,1.0217533,0.42528445,-0.20924324],[-0.0120092,-0.55868286,-0.43635416,0.46025708,0.59761775,-1.3045688,1.4550803,-0.6410079,-0.46044356,-0.22099674,0.6732854,-0.4678468,0.03187814,0.92614293,-0.61934835,-0.05177542,-0.28630045,0.33652946],[-0.83317536,-0.80627066,-0.10179178,0.10999726,0.019785184,-0.956369,1.0176833,0.3697496,-0.028362121,-0.059128877,-0.12437713,-0.30265445,0.27188116,0.79045576,-0.71790576,-0.34110048,-0.04529891,0.3435819],[-0.7444216,0.63491786,0.08715752,-0.054840762,-0.049226776,0.716783,-0.7838131,-0.0045873374,-0.09835043,0.1465429,0.020588161,-0.035376523,-0.03541739,-0.4995638,0.5265647,0.15362841,0.17507628,-0.338172],[-0.102648556,-0.7882426,0.038460653,0.22105083,0.10494431,-1.0060503,0.5764925,0.11352376,-0.25469536,-0.10095615,0.09101166,-0.32238397,-0.4038888,0.48288944,0.24523751,0.06623701,-0.19029224,0.039122805],[0.7842295,0.004104562,-0.034050412,-0.038287047,0.6813913,-0.9235343,1.0443885,0.6999839,-0.30497897,0.19115898,-0.084208526,-0.488823,0.45840722,0.118487336,-0.117081836,0.0810515,-0.21686175,0.02809039]],"activation":"σ"},{"dense_2_W":[[0.31191123,0.012578262,-0.073103,0.4197174,-0.39167115,-0.5860375,-0.0401353],[0.49508798,-0.73552,0.32163823,-0.13604626,-0.20699552,-0.12848318,-0.3038487],[-0.57450694,0.18396352,0.11384991,0.2159519,-0.34654605,0.02929712,-0.44482008],[0.5138877,-0.17677623,-0.5761437,-0.4093428,0.5905016,-0.5129224,-0.05200225],[-1.1020558,-0.31896916,0.23366053,1.0878744,-0.3915952,0.83413684,0.30904847],[0.6287403,-0.45615014,0.28765643,-0.43303448,0.63161,-0.87807333,-0.6236202],[-0.18465663,1.3596067,0.5464439,-0.521901,-1.4459647,0.6942117,1.1208469],[0.72724205,0.047573425,-0.7336553,0.050098203,-0.30979815,-0.030565912,-0.1010699],[0.13069697,-0.7504235,-0.31712496,-0.25702086,-0.4903785,-0.38608697,-0.8202706],[0.25118548,0.26678544,-0.015086808,-0.7808886,0.49729776,-0.9659693,-0.10936706],[-0.8416602,-0.3856989,0.39649925,0.22174147,-0.27461663,0.97619355,-0.26972875],[-1.3890435,0.42025894,-0.07396389,0.83693534,-0.43904755,0.41258448,-0.7992472],[0.36811528,-0.80290574,-0.041142356,-0.1994228,0.36623415,-0.5200105,-0.76657784]],"activation":"σ","dense_2_b":[[-0.22534604],[-0.105216384],[-0.19398747],[-0.016557224],[-0.13661896],[-0.15216051],[-0.08812248],[-0.09663603],[-0.34491262],[-0.09128825],[0.04268533],[-0.39448884],[-0.061641783]]},{"dense_3_W":[[-0.049214575,0.06255724,-0.70038843,0.6088635,0.1090371,0.6303497,-0.5964707,0.47305194,-0.16417064,0.52888405,-0.53463614,0.09932232,0.2497237],[0.08096788,-0.39710945,-0.15236828,-0.64790344,0.3642383,-0.101971485,-0.020350397,-0.35562035,-0.19162105,-0.5233594,0.49097145,0.43193904,-0.1615822],[0.3178663,0.4239579,0.2581351,0.104468025,-0.5409481,-0.05274523,-0.60230494,0.025281865,-0.17851482,0.14904647,-0.5448667,-0.57374054,0.6508731]],"activation":"identity","dense_3_b":[[-0.062227387],[0.06364925],[-0.03869293]]},{"dense_4_W":[[0.5423993,-0.964113,0.53714585]],"dense_4_b":[[-0.056707334]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48150x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48150x00x00x00x00x00x00'.json deleted file mode 100755 index f1afd48621..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017 b'8965B48150x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.754703],[0.99583066],[0.52195853],[0.03364074],[0.9999458],[0.9983864],[0.9967491],[0.9690758],[0.9489988],[0.9172365],[0.89279425],[0.033480037],[0.03352747],[0.033564996],[0.033597305],[0.033555403],[0.03339308],[0.033234917]],"model_test_loss":0.011961689218878746,"input_size":18,"current_date_and_time":"2023-08-12_05-09-42","input_mean":[[20.5533],[0.06072723],[-0.0130017605],[0.00067336776],[0.06433451],[0.06329887],[0.062110342],[0.059719138],[0.055979628],[0.0545425],[0.050233126],[0.0008544997],[0.0008328172],[0.0008131706],[0.0008174784],[0.00082928565],[0.0009185176],[0.0011421707]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.90862113],[-0.7998115],[0.29500127],[3.5970535],[-0.12021488],[-0.008523585],[4.1502047]],"dense_1_W":[[0.16046667,-0.18488905,-0.08116255,-0.18750922,-0.16433491,-1.1152148,0.9359541,0.09028606,-0.37050682,0.02058137,0.08767959,0.07042472,-0.10593792,-0.24539731,0.65890104,0.033354606,0.08174793,-0.13008156],[5.6240082e-5,-2.0457633,0.65334374,1.5251502,-1.3088462,-2.043833,-0.04112441,-1.5476086,-1.6310064,-1.5787094,-2.5516076,-0.15880251,0.8098546,0.84737986,-0.29775852,-0.58279693,-0.109593175,0.9306553],[-0.09240735,-0.23691395,-0.08596292,-0.021863438,0.19790214,-1.3464229,0.85313654,0.04628712,-0.3389506,-0.043647792,0.18819022,-0.37191772,-0.0034588557,0.14444594,0.39095238,0.1306712,0.023204941,-0.12470221],[1.6062875,-0.14168718,0.29216757,-0.29068917,-0.10627767,0.88737196,-0.22878392,0.2706971,0.52616674,-0.1836785,0.015717065,-0.40486693,-0.34726334,0.50040615,0.47368926,0.36900276,-0.0014073849,-0.43910235],[-0.007260963,2.2485175,4.940441,-0.5364479,-1.326066,-0.22738455,-1.5765278,0.108092494,0.6156207,0.84355676,-0.3730777,0.8112125,0.3988551,-0.008641389,-0.27626094,-0.28699768,0.046848673,-0.34230638],[-0.037478976,-0.1001093,-0.0863427,-0.07570549,0.36714154,-1.8569329,0.9551398,-0.16772039,0.1527077,0.12593286,-0.19880708,-0.16723952,0.27533242,-0.15500604,0.52059233,-0.3220368,0.048995454,0.06608929],[1.8863575,-0.09598721,-0.34971088,0.59141415,0.033216525,-1.0910133,0.68912745,-0.5307834,-0.4284811,0.18438782,-0.024860496,0.19869357,0.26999107,-0.24860352,-0.6470507,-0.508486,0.0019406695,0.51603043]],"activation":"σ"},{"dense_2_W":[[-0.48650655,0.2588981,0.0312486,0.43491283,0.16748133,-0.71130973,-0.053482138],[0.27239284,0.07384157,0.1776044,-0.33170608,-0.002457442,0.7151791,0.21523637],[-0.18006818,-0.4765831,-0.6325456,-0.70129013,0.122486345,-0.1399289,-0.26494774],[-0.7057871,-0.47439024,-0.52092475,-0.1475755,0.45321676,-0.11419975,-1.1540185],[0.29741463,-0.47053236,0.84870386,-0.09420109,0.3550361,0.53206086,-0.0045715007],[-0.72433555,-0.6616255,-1.5622116,2.4680088,1.291401,-0.54468,0.7206563],[0.6961331,0.44749773,0.36611405,-0.38041288,0.3445849,-0.18433261,-0.27811208],[-0.69021624,-0.017037576,-0.67009085,-0.09356929,-0.10503188,-0.34458145,-0.02231519],[-1.0635598,-0.33353114,-0.5266894,-0.137938,0.7490435,-0.35423642,-0.99171734],[-0.21807487,0.18801044,-0.68545204,0.12370873,0.9005878,-1.0286127,-0.8563234],[0.5423448,-0.29096147,-0.018749518,-0.09780457,-0.5506883,0.46788862,-0.16100915],[0.03551326,0.2860867,0.6957025,0.21722172,-0.1966169,0.5215825,0.07507346],[-0.5746759,-0.22346315,-0.44673678,0.15813608,0.3015097,-0.40882587,-0.51104206]],"activation":"σ","dense_2_b":[[-0.024497896],[-0.07063643],[-0.19928667],[0.42064607],[-0.005411175],[0.6328674],[-0.049392886],[0.02871734],[0.3210596],[0.26861688],[-0.026878959],[-0.060387224],[-0.10667805]]},{"dense_3_W":[[0.36677212,0.55660695,-0.55313206,-0.4082663,-0.27326408,0.10608849,0.021528898,0.36427072,0.35612637,-0.26106265,-0.580114,-0.5729309,-0.44237646],[0.4771073,-0.6284979,0.4865573,0.72787654,-0.19068882,0.63529533,-0.54094064,0.422667,0.3027027,0.3450987,-0.013951826,-0.53568786,0.41296872],[-0.48427796,0.43434283,0.07578888,-0.43649468,0.40260956,0.3030044,0.14234343,-0.16904311,0.2427833,-0.6615657,0.047491975,-0.2096294,-0.08129209]],"activation":"identity","dense_3_b":[[-0.014429971],[-0.026662724],[0.013837804]]},{"dense_4_W":[[0.45206308,1.1123025,-0.31965008]],"dense_4_b":[[-0.023298338]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48241x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48241x00x00x00x00x00x00'.json deleted file mode 100755 index 07a3ab8f04..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48241x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.209049],[1.1246747],[0.46813142],[0.038223516],[1.1218573],[1.1228344],[1.1237725],[1.099323],[1.0759022],[1.0401212],[1.0056554],[0.0380946],[0.03811699],[0.038133033],[0.038103707],[0.038023833],[0.037828285],[0.037552092]],"model_test_loss":0.011310987174510956,"input_size":18,"current_date_and_time":"2023-08-12_06-10-19","input_mean":[[22.88909],[-0.028824013],[-0.013613169],[-0.010625672],[-0.024585929],[-0.025837906],[-0.02695633],[-0.033290874],[-0.035039704],[-0.03637915],[-0.034272987],[-0.010562119],[-0.0105818845],[-0.010603017],[-0.010749645],[-0.010851333],[-0.011034958],[-0.0111641]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.22523445],[-0.26343995],[-0.16324636],[-0.118881956],[-1.753483],[-0.07577936],[-1.102491]],"dense_1_W":[[0.002532067,-0.03390916,-0.003535666,-0.04854094,-0.08614675,-0.69101536,0.10960003,-0.03146945,0.24333058,0.14761123,-0.2722869,0.27474254,-0.043608457,-0.11733092,0.24542642,-0.10411576,-0.14360683,0.1711039],[-0.002566696,-0.61363703,-0.012943635,0.026450964,0.29015598,-0.71414703,0.554264,-0.037178878,0.03740144,-0.30521652,0.21204664,-0.38488153,-0.21638761,0.41673842,0.33263344,-0.15415925,0.3494084,-0.28160352],[-0.16471842,-0.31117657,0.8566729,0.29125565,0.4319235,-0.75162256,0.95838267,-0.20883378,-0.32447112,0.082446456,0.10276111,-0.49870324,-0.023855265,0.21451043,-0.006508097,0.3004852,-0.32773772,0.011747492],[-0.019952636,-1.5153528,-5.0031734,-0.09435296,1.048899,0.43409705,-0.069626406,0.32380673,-0.8917055,-0.23266096,0.83130217,-0.20197223,-0.07251639,0.20138681,0.1400577,-0.017955068,0.055563636,-0.10964311],[-0.88960624,0.66261613,-0.9217085,-0.023391634,-0.13783228,-0.78201807,0.58500487,-0.34910184,-0.41719157,0.30604267,0.020150643,0.0013851137,0.14963569,-0.0014568489,-0.15652372,0.05179874,0.043643035,0.0022867518],[-0.05010886,-1.9120406,0.16408531,-0.29981497,-0.61399275,-2.088809,-0.7970844,0.03929672,-0.0981413,-0.88908887,-0.7213265,-0.37824726,-0.072238155,0.22233075,-0.5327377,-0.12634961,-0.14507468,0.4685959],[-0.692649,0.076070726,0.835587,-0.07369687,-0.31847525,1.0514476,-0.7529806,-0.02802738,0.112416394,-0.007971444,-0.073445976,0.027493669,-0.023394028,-0.14953516,0.3462396,-0.20032988,0.013378577,-0.006742064]],"activation":"σ"},{"dense_2_W":[[0.14651315,0.65690446,-0.04113687,0.041510507,0.09703274,0.42973572,-0.19722632],[-0.16582173,-0.02892236,0.21182849,-0.07145227,0.7815606,0.6976398,-0.4521055],[-0.09238782,-0.79659176,-0.010888447,-0.64854467,-0.3640353,-0.32341737,0.94107974],[-0.31743294,-1.079859,-0.48714882,-0.31109604,-0.7076601,0.6800173,-0.3782569],[-0.029170444,-0.949289,-0.2557742,0.26696756,-0.6634111,-0.020845836,-0.13919494],[0.39409286,0.7231917,0.6616238,0.6863315,0.45207512,-0.65741384,-0.27147612],[0.9265955,0.55270416,-0.15335171,-0.21362257,0.839455,-0.20367129,-0.54616636],[1.1020366,0.52923506,0.0077937646,-0.6614574,0.1045729,0.40647596,-0.01551381],[0.8354852,0.60446924,0.24171901,0.80390596,0.08422289,-0.5756955,-0.47378206],[-0.86737347,-1.0375736,-0.7943101,0.19968024,0.34953976,-0.27134398,0.38634428],[-0.23586744,-0.90408766,-0.9303652,-0.9001962,0.604345,-0.8173552,1.2277185],[-0.0666105,-1.2101858,-0.17242567,0.21582662,-0.5084395,0.30618143,-0.61344314],[-0.7643587,-0.44565865,-0.5358139,-0.789047,0.60576195,-0.40198153,0.7971051]],"activation":"σ","dense_2_b":[[-0.30520138],[-0.2789117],[0.26295054],[0.20992225],[0.09671134],[-0.23525962],[-0.28452772],[-0.15586977],[-0.24889536],[0.2383187],[0.031573173],[-0.06746427],[-0.18409434]]},{"dense_3_W":[[0.6026086,0.52552027,0.2761912,-0.8430829,-0.66491354,0.069576606,0.08970149,0.5401842,0.24471678,-0.89263755,-0.32295918,0.13739742,-0.5061482],[-0.3305499,-0.5845312,0.7317596,0.93317604,0.087755084,0.2923734,-0.8093447,-0.6683554,-0.6317001,0.99416625,0.7963545,0.5912554,0.59245497],[0.0005086235,0.27584663,0.7916986,0.4292943,0.63182247,-0.6468668,-0.2727807,-0.35912475,-0.3197199,0.82221115,0.32133383,0.2867808,-0.08736428]],"activation":"identity","dense_3_b":[[-0.034214295],[-0.032624304],[-0.05482243]]},{"dense_4_W":[[-0.24479973,0.74612886,0.73167807]],"dense_4_b":[[-0.026686598]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48310x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48310x00x00x00x00x00x00'.json deleted file mode 100755 index 191731833f..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48310x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.603247],[1.3767333],[0.4454295],[0.045631606],[1.3678387],[1.370781],[1.3725109],[1.3436831],[1.311338],[1.2674466],[1.2208972],[0.045455445],[0.045487784],[0.045517508],[0.045482583],[0.045399908],[0.045213446],[0.04482382]],"model_test_loss":0.013772002421319485,"input_size":18,"current_date_and_time":"2023-08-12_06-42-21","input_mean":[[23.356035],[0.011589931],[-0.015715389],[-0.0022615397],[0.015798328],[0.014719816],[0.013118888],[0.009267011],[0.008420342],[0.008507399],[0.009309166],[-0.0022847306],[-0.0022728958],[-0.002267876],[-0.0022721845],[-0.00230573],[-0.0023624457],[-0.0024641412]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.88219327],[-0.05723061],[-0.059791878],[1.4932584],[-0.0350319],[-0.84323514],[0.2996949]],"dense_1_W":[[0.15552013,0.68498236,-0.004401782,0.06613787,-0.3138051,0.9909178,-0.4801728,0.27251762,-3.9911305e-5,0.14424084,0.029309403,0.041476194,0.5599982,-0.5216308,-0.12916003,-0.17854483,0.036074255,0.11677919],[-0.0082084965,-0.53576446,0.0034336871,0.36242324,0.07065764,-1.0044807,0.7644967,0.048346102,-0.28757718,0.05818398,0.0812672,-0.42089686,0.18758625,0.326259,0.5879358,-0.09024579,0.026588196,-0.027274309],[-0.030504204,0.94661164,1.4692297,-0.14969598,0.0024379326,0.62712175,-0.19334361,0.30215573,0.34021494,-0.14773123,-0.9896913,0.8398936,0.06587321,-0.62592477,-0.17010672,-0.34911457,0.26831692,0.1246808],[0.53607357,-0.8794676,0.0014746991,0.35912958,0.35449198,-1.2205513,0.5645118,-0.12328942,0.09299552,-0.07820418,-0.16524789,-0.18727893,-0.30706224,0.03244261,0.17126645,0.03033496,0.062598415,-0.15945143],[-0.29806733,0.62810147,0.016662166,0.04787856,-0.2178898,1.0717077,-0.58408093,0.038249463,0.055414878,-0.16181065,0.2520098,0.14243068,0.2880338,-0.34465408,0.011317232,-0.11930281,-0.32691225,0.30142125],[-0.09203294,1.0721633,5.374889,-0.26402676,-0.21183757,-0.18999156,-0.1049094,-0.13156429,0.3925089,0.41511986,-0.6934615,0.86322796,0.7660964,-0.3449572,-0.41987318,-0.61497223,-0.21786183,-0.13827488],[1.0558003,-0.15531835,-0.014700998,-0.15400389,-0.17445247,0.19957963,-0.7788509,-0.66680443,0.4196881,0.10506768,-0.30046782,-0.113978475,0.022458427,-0.07436751,-0.24094073,0.5980271,0.49674785,-0.5393424]],"activation":"σ"},{"dense_2_W":[[-0.5135834,-0.25661662,-0.026235756,0.030436503,-0.17369603,-1.7777263,-2.4461317],[-0.7826742,0.5919605,-0.203896,1.0301571,-0.49202737,0.30388182,-0.3286326],[-1.4934103,0.1125834,-0.784764,0.10120618,-0.73634833,-0.33474493,-0.51051533],[-0.08085624,-0.5157619,-0.61287373,-0.03598703,-0.13013026,-0.73116446,-0.6332094],[-0.15480644,-0.52027535,-0.43745804,-0.22571458,-0.59228283,0.22646776,-0.22388498],[-0.17604452,-0.18500611,0.50142026,-0.56830126,0.6879626,-0.08546103,0.09753222],[0.45385736,-0.1853672,0.5049051,-0.46082744,0.15115426,-0.3264805,0.27134734],[0.62699825,-0.23365812,-0.12801227,-0.66903687,0.5545601,0.15332852,0.32462138],[-0.107537225,-0.56420654,-0.6508188,0.30347762,0.0477495,-0.41004136,-0.012734894],[-0.19092843,0.54952693,-0.26207697,1.156082,-0.55869824,-0.2928665,0.26659483],[-0.55371886,0.43837482,0.24519897,0.20218645,-1.3142209,-0.4187609,-0.051204197],[-0.9921039,0.17509715,-0.047123123,0.009096356,-0.22319628,-1.7375966,-1.591449],[-2.3417017,-0.10801021,-0.026163574,0.3812512,-1.0870538,-0.819271,-0.7919683]],"activation":"σ","dense_2_b":[[0.3518073],[0.1122314],[-0.0118162315],[-0.2725371],[-0.24143407],[-0.04301829],[-0.037871398],[-0.043535873],[-0.077412814],[-0.016384799],[-0.030182287],[0.060030468],[0.27441582]]},{"dense_3_W":[[0.36764717,0.59455025,-0.26633954,0.55135894,-0.080566764,-0.058451932,0.34915563,0.37275517,0.4936895,0.0741616,0.30454972,0.37950292,0.40615684],[-0.6196921,-0.63125026,-0.48607326,0.026073568,-0.23994817,0.6612403,0.665946,0.624512,0.58777785,-0.47118247,-0.4825106,-0.5355161,-0.5683991],[0.32227254,0.10172928,0.0020228538,0.5071577,0.21635775,0.53688926,0.2714474,0.60069305,-0.26110378,-0.20226555,0.41789976,0.5308405,0.3238944]],"activation":"identity","dense_3_b":[[-0.04775693],[0.03200255],[0.023321353]]},{"dense_4_W":[[-0.6651373,1.1393598,0.5636013]],"dense_4_b":[[0.03244566]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48320x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48320x00x00x00x00x00x00'.json deleted file mode 100755 index 214f8be518..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48320x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.5644407],[0.8395695],[0.34483072],[0.038255572],[0.8326137],[0.8354024],[0.8375865],[0.8230707],[0.8024709],[0.77293986],[0.74346644],[0.03822754],[0.03823464],[0.038251538],[0.038143624],[0.03792401],[0.037752647],[0.03757457]],"model_test_loss":0.012391784228384495,"input_size":18,"current_date_and_time":"2023-08-12_07-07-38","input_mean":[[22.189064],[0.013319887],[0.004920282],[-0.013327403],[0.01110264],[0.011794839],[0.012627523],[0.014629398],[0.0158066],[0.0182441],[0.021402285],[-0.013237113],[-0.013275518],[-0.013312367],[-0.013382163],[-0.013264392],[-0.012985241],[-0.012600721]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.26434997],[-0.79208225],[-0.20664789],[0.013472025],[-0.39775062],[-0.83568007],[0.18677552]],"dense_1_W":[[0.34441796,-0.52539915,0.011351737,-0.0031063606,0.538754,-0.41478962,0.5309099,-0.49093226,-0.122121654,0.17211112,0.031722955,-0.049942363,-0.45295808,0.44230676,0.2298436,0.07178071,-0.19289836,0.0064287023],[1.1373345,0.30843458,0.06299667,0.29950574,-0.0838057,0.4998327,-0.2954441,0.07530557,-0.09903502,-0.3212128,0.0950906,-0.30354694,0.05237616,0.38115606,-0.29169688,-0.02946208,-0.23857956,0.18285783],[0.08874039,-0.36663172,-0.0022011884,0.042667914,0.25671524,-0.9374695,0.76006675,-0.13235554,0.3273898,-0.3046668,0.061351378,-0.16451104,-0.04971849,0.28689685,-0.10612716,0.091517314,-0.094520494,0.022685707],[0.060418982,-0.1157775,0.0033044387,-0.53267866,-0.3576781,1.0214648,-0.7689731,-0.088864565,0.5304823,0.36398104,-0.32102284,0.25985885,0.12955877,0.118082896,-0.41932943,0.5984563,-0.34898463,0.16819601],[-0.35258323,-0.2083451,0.0007432207,-0.19166562,0.53556216,-0.7179964,0.17767152,-0.19613978,0.014983063,0.1352932,-0.07252017,-0.049061526,-0.22725205,0.5097105,0.092519365,-0.052805327,-0.086677946,0.050957207],[1.1484965,-0.36967862,-0.059478328,-0.46070608,0.3855522,-0.77252835,0.12642105,0.28179643,0.06333251,0.08696457,0.012441664,-0.17870833,0.13207336,-0.3562681,0.39463803,0.7484561,0.21307406,-0.5399646],[-0.005871693,1.2971369,4.596029,-0.7689503,-0.85900676,0.2098196,-0.21946974,0.10207684,0.7080346,0.19166191,-1.1770563,0.31363365,0.35723364,0.23915814,0.012657947,-0.18623129,-0.03445843,-0.17965348]],"activation":"σ"},{"dense_2_W":[[-0.3623736,-0.41845292,0.15554701,0.52873987,-0.33623168,-0.109475665,0.1650474],[0.20129873,-0.17509207,0.6367557,-0.022217795,0.6520106,-0.06378363,0.37632793],[-0.02613163,0.6422942,-0.08672158,-0.018176718,-0.5885163,-0.41947407,-0.44015065],[0.06876831,0.2672296,-0.10011656,0.8271233,-0.14820686,-0.08494413,0.034133013],[0.5603243,-0.41052374,0.6464844,-0.7759632,0.13104425,0.6245838,-0.25918558],[0.24931118,-0.72889996,0.60138255,-0.7174911,0.44678172,-0.37861496,-0.6592254],[-0.2587339,0.14566004,-0.7437367,0.41833475,0.11803848,-0.119959645,0.13896635],[0.030275445,0.44386005,0.03581493,0.3722496,-0.7559753,-0.24718514,-0.5880272],[-0.16906022,0.14654645,-0.18917269,-0.5889206,0.30467245,-0.17858168,-0.2796732],[-0.7495855,-0.4666009,-0.668737,0.4311893,-0.3495553,-0.7319314,0.51790726],[-0.89682776,-0.011368982,-0.13440222,-0.12547427,-0.5925041,-0.63063765,0.40521654],[0.90010816,-0.44593993,0.4698638,-0.30274037,0.24248902,0.9315232,-0.4489031],[0.11560195,-0.4628338,-0.63196105,-0.2325408,0.10829967,0.08619985,-0.3691465]],"activation":"σ","dense_2_b":[[-0.09398416],[-0.16811661],[0.0034526016],[0.02302207],[-0.02017339],[-0.18555853],[0.007355943],[-0.012509794],[-0.15630287],[-0.059829053],[-0.22280535],[-0.104731545],[-0.05920679]]},{"dense_3_W":[[0.27258593,0.23565869,-0.3472996,-0.4951552,0.5607892,0.62477237,-0.26927564,-0.54649544,0.28152058,-0.48925486,-0.0038740942,0.41033503,0.5219135],[-0.044915594,-0.13625428,0.14908999,0.50632745,-0.36696005,0.5478251,-0.1786471,-0.3696246,-0.67396617,-0.04566228,-0.30607444,0.009878186,-0.5257712],[-0.45755082,0.5034456,-0.3199554,-0.06326751,0.6669257,0.49097896,-0.5270685,-0.15877146,0.44582334,-0.7103173,-0.2027269,0.0686523,-0.49046502]],"activation":"identity","dense_3_b":[[-0.062416617],[-0.03785598],[-0.053617734]]},{"dense_4_W":[[-1.1007901,-0.35901657,-0.90650785]],"dense_4_b":[[0.058452934]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48400x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48400x00x00x00x00x00x00'.json deleted file mode 100755 index b84d1cc4f8..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020 b'8965B48400x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.76261],[0.93215835],[0.425047],[0.03367151],[0.93245465],[0.93255615],[0.9317443],[0.9169954],[0.90578634],[0.890775],[0.87333876],[0.033522148],[0.033568572],[0.03361294],[0.03370465],[0.03366217],[0.033505887],[0.033300173]],"model_test_loss":0.009005936793982983,"input_size":18,"current_date_and_time":"2023-08-12_07-32-45","input_mean":[[23.330957],[0.031854257],[-0.016394153],[-0.010512169],[0.038015034],[0.037232615],[0.035574514],[0.029611548],[0.02562595],[0.019023875],[0.017404461],[-0.0105256],[-0.010525036],[-0.0105359815],[-0.010630796],[-0.010722013],[-0.010881347],[-0.011070561]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-5.0810957],[0.1603531],[-0.049640577],[5.2707887],[0.67574877],[0.1516555],[0.15765585]],"dense_1_W":[[-2.0682428,0.13633108,0.13491328,-0.36039838,0.43495807,0.68475527,-1.6714412,0.47828165,0.109744266,-0.026151523,0.72647053,-0.47452134,0.06982296,0.3297403,0.17760237,0.58767045,-0.21541646,-0.16653578],[-0.008568287,0.12206914,0.23071772,-0.102156624,-0.500583,1.8274449,-1.554223,0.340697,0.109655045,-0.18670748,-0.23404415,0.2656916,0.5948071,-0.46532926,-0.4009976,-0.39237484,-0.07123574,-0.010524451],[-0.0031924327,-0.62425506,-0.046601616,0.2168617,0.50812894,-1.6562872,0.9460569,0.13316472,-0.15056206,-0.15252529,0.14638653,-0.41414198,0.07276244,0.22266257,-0.15308774,-0.034698598,0.16347538,-0.050810855],[2.125994,0.39522022,0.1382072,-0.10945463,0.44430417,0.8159377,-2.1067505,0.37659898,0.11375099,0.35729685,0.5010697,-0.08696807,-0.36882088,0.1198089,0.24507992,0.24288763,0.26632097,-0.35650986],[-0.029398045,-0.75224733,0.8366512,-0.48501256,0.4163101,0.41848388,1.2642128,-0.53183347,-0.69976854,-0.6898771,-0.12976366,0.07133254,-0.26144692,0.38537222,-0.32685757,-0.23447362,-0.6981122,-1.0000134],[0.00065578264,0.609174,0.0046034064,-0.31727758,-0.15922506,0.9975659,-0.3816561,0.1362802,-0.30854115,0.085538454,0.09641526,0.15830934,0.38728058,-0.4841558,-0.4591731,-0.06406144,0.047263924,0.30575022],[0.0008388964,-1.4820985,-3.707669,0.069603644,3.1635418,-0.36718917,-0.4799769,-0.13187854,-2.1920686,0.1677239,0.9062365,-1.1247116,-0.34561667,0.36416775,0.48867264,0.6879564,0.30840775,-0.39429164]],"activation":"σ"},{"dense_2_W":[[0.2973958,0.08332646,-0.3467805,0.23699734,-0.5854178,-0.129308,-0.43418685],[-0.36580157,-0.3235827,-0.016993066,0.10935744,-0.049958985,-0.5979773,0.03689173],[-0.28405172,-0.45268708,0.4789435,-0.29643363,-0.24837038,0.3182004,0.115557075],[0.15464418,0.46542335,-1.0709205,1.0785366,-0.14720912,0.6205811,-0.8320102],[-0.10603755,-0.22647086,0.28111154,-0.55486935,0.17641152,-0.49721366,-0.09488447],[0.62766623,-0.20216012,-1.2113202,0.7469767,0.067126594,0.47500092,-0.15576144],[-0.49403727,-0.49650237,0.6379596,-0.0013690102,0.39851728,-0.38198105,0.34440374],[-0.35230166,-0.22415853,0.4071291,-0.5434958,0.010856588,-0.33139396,-0.07433657],[0.5740357,-0.03681304,-0.8333273,-0.15300135,-0.014365716,-0.36107722,-0.29574242],[1.0023674,0.22067322,-1.0635573,0.4620926,-0.38083276,0.2977076,-0.30534083],[1.5357183,0.21400538,-1.2476741,-0.5011329,0.20616063,0.50831836,-0.44240168],[-0.22830233,-0.047964964,0.6109007,-0.2337184,-0.4955921,0.11622925,-0.103081025],[0.22968316,0.37905967,-0.1994602,0.5001487,-0.16496213,-0.06584811,-0.18063226]],"activation":"σ","dense_2_b":[[-0.009041046],[-0.2510398],[-0.019130033],[-0.015723245],[0.114224665],[-0.25378084],[0.049713876],[0.14150867],[-0.29484767],[-0.20610979],[-0.49759024],[0.01332179],[-0.057279114]]},{"dense_3_W":[[-0.4027402,-0.60708517,-0.5284704,0.5859432,-0.6416008,0.10952159,-0.1184989,0.03421147,-0.29945162,-0.020218438,0.061756372,-0.5574928,0.31008488],[0.033894606,-0.41223776,0.17423983,0.18949471,0.5258869,-0.33833903,0.17779568,0.4694829,-0.47503108,-0.70289963,-0.48349223,0.21150771,-0.30218485],[0.10131618,0.10130477,-0.11519296,-0.5324584,0.28956762,-0.24111281,0.6044179,0.20313828,0.15558045,-0.2360581,0.09277952,-0.17545496,-0.5429789]],"activation":"identity","dense_3_b":[[-0.033029158],[0.045226328],[0.04225117]]},{"dense_4_W":[[0.6470691,-0.9522123,-0.9472077]],"dense_4_b":[[-0.041427232]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018 b'8965B48160x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018 b'8965B48160x00x00x00x00x00x00'.json deleted file mode 100755 index e8006d9259..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018 b'8965B48160x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.447082],[1.3057796],[0.54874927],[0.045618646],[1.3064655],[1.3057723],[1.3055998],[1.2616607],[1.2238507],[1.1785189],[1.1370367],[0.045534577],[0.04553703],[0.04553903],[0.045388177],[0.045190737],[0.044918988],[0.04458369]],"model_test_loss":0.01316243689507246,"input_size":18,"current_date_and_time":"2023-08-12_08-27-45","input_mean":[[23.570164],[0.036853246],[-0.016496139],[-0.0010369287],[0.042531505],[0.041598342],[0.04004992],[0.035041444],[0.029833477],[0.026067143],[0.021290474],[-0.0010061035],[-0.0009948352],[-0.0009900935],[-0.0009686471],[-0.0009951665],[-0.001064114],[-0.0012318792]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-5.0845885],[0.1004176],[0.00013673597],[5.0672097],[0.16392848],[-0.0016507725],[0.03163203]],"dense_1_W":[[-2.194229,-0.9903979,-0.08080573,0.6365177,-0.016596766,-0.57292145,0.71629894,-0.13917753,0.10558334,0.048379973,-0.37905106,-0.37705103,0.008995534,0.26333934,-0.5870924,-0.014787129,-0.07076682,0.115287304],[-0.017660985,-1.7817364,-7.0660744,0.32349348,0.58495885,0.08818791,0.327425,-0.26258895,-1.0716436,-0.24204725,1.3435555,-0.4196861,-0.3284182,-0.5121312,0.5085909,0.29486054,0.47518936,-0.09737066],[-0.0020460926,0.5839157,-0.4102708,0.33361316,-0.19995423,-1.8766894,1.8676817,-0.6156362,-0.20390484,0.05773844,0.5775369,-0.69629824,-0.48964554,0.76413906,0.17794818,0.013914604,0.26574284,-0.35397956],[2.238539,-1.285662,-0.077533774,0.45735472,-0.15934312,-0.3347021,0.7057036,0.13443239,0.046269502,0.031148197,-0.40138546,-0.3106728,-0.22145422,0.705411,-0.5908254,-0.1697941,-0.099797,0.21151316],[0.0072099357,-1.0319359,-5.8044977,-0.012008662,2.721464,0.9949136,2.1362736,0.755109,-2.9483802,-2.687557,-0.21047898,-0.6913134,-0.46375927,-0.08410903,1.2371743,0.34849486,0.1389388,-0.11194528],[-0.001468309,0.71179956,-0.016407752,0.2380162,-0.59478456,1.7276148,-0.7567721,-0.15031393,-0.0544795,0.07924978,0.074758366,0.3384667,0.1260156,-0.73387,-0.12542778,0.035354953,-0.08498558,0.11839043],[-0.0067242286,0.7752038,-0.015802715,-0.2522099,0.18704206,1.0989213,-0.8221326,-0.1619869,0.36667046,-0.08953081,0.07729341,0.3080005,0.32241634,-0.6751567,-0.08914714,-0.25339732,0.11973354,-0.11458613]],"activation":"σ"},{"dense_2_W":[[0.48777774,0.16780007,0.506049,0.06149719,0.02641481,-0.15557353,-0.47309208],[-0.033767972,-0.22800188,0.3801882,-0.4038235,-0.018416025,0.48671988,-0.1726016],[1.3997426,-0.2836853,0.50399095,0.7228087,0.17250279,-1.1006094,-1.036102],[1.5827407,-0.52164584,0.44014573,1.500202,0.24160044,-1.3031888,-1.155962],[0.9090004,-0.22377129,-0.16544203,0.5805136,0.10938864,-1.071583,-0.36718455],[0.20949104,-0.15260668,-0.35395786,0.16198182,-0.26443386,0.1544654,0.30052176],[0.35954893,0.04215935,0.6288832,0.16029716,0.19912098,-1.1470475,-0.41342846],[-0.27078894,-0.22278617,0.28234375,0.17605774,0.060802832,0.1927992,-0.18586269],[-0.4729232,0.128256,-0.29198325,-0.63878536,0.11258722,0.7476101,0.41813225],[-0.38154852,-0.3791316,-0.5129751,0.013876141,0.11724782,0.6680124,0.40538806],[-0.31103176,-0.5047606,0.33748698,0.095529206,0.18596448,0.45894697,0.30854413],[0.11049385,0.3211236,0.30543202,0.6428709,0.14853697,-0.68060184,-0.22545667],[0.3577858,-0.05270775,-0.24674627,-0.62481797,-0.5663065,0.27451596,-0.25037414]],"activation":"σ","dense_2_b":[[-0.13820776],[-0.044455525],[-0.25503334],[-0.22968425],[-0.19087854],[-0.011678218],[-0.18331416],[0.006042763],[-0.007903232],[-0.012231933],[-0.008202675],[-0.1534127],[0.04731731]]},{"dense_3_W":[[-0.10723448,-0.34210286,-0.03438066,0.37535432,-0.0108004445,-0.6269137,-0.068967775,0.31058553,-0.65623224,-0.31572104,-0.39706936,0.3712482,-0.41853353],[-0.5804139,-0.04486996,-0.049920645,0.46066716,0.3930726,-0.25964186,-0.04363731,0.49404967,-0.013849256,0.4068667,0.38286507,-0.24872099,0.65286624],[0.57707745,0.17859071,0.51623523,0.37261355,0.4789657,-0.0021774643,0.6602461,-0.38525575,-0.35309088,-0.00086821883,-0.062653214,0.57291704,0.00911787]],"activation":"identity","dense_3_b":[[-0.029123915],[0.023471655],[-0.04527022]]},{"dense_4_W":[[-1.0457256,0.43828797,-1.1001852]],"dense_4_b":[[0.033784293]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018.json deleted file mode 100755 index 52a019b0b1..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2018.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.446532],[1.305604],[0.54480565],[0.045578297],[1.3061355],[1.3057326],[1.3058693],[1.2597163],[1.2224401],[1.1767526],[1.1361469],[0.045510642],[0.04551679],[0.04551409],[0.045335952],[0.04515042],[0.04486992],[0.044565506]],"model_test_loss":0.013752324506640434,"input_size":18,"current_date_and_time":"2023-08-12_08-00-18","input_mean":[[23.569853],[0.03672725],[-0.020106794],[-0.0010078558],[0.04061277],[0.039911255],[0.03890138],[0.03328521],[0.027936308],[0.023301033],[0.021146066],[-0.0010234776],[-0.0010079038],[-0.000997834],[-0.0009388888],[-0.001006094],[-0.00110449],[-0.0012551269]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.775717],[-1.5074123],[0.03396842],[-0.21671481],[0.0462703],[0.8037427],[-0.052228786]],"dense_1_W":[[0.9219134,-0.5559626,-0.21603523,0.24129556,0.10209199,-1.0011351,0.5424733,-0.5449639,0.050155614,0.22614123,-0.004761036,-0.55282843,0.41325715,0.0022247569,0.044411074,-0.09423209,-0.10117545,0.04368109],[-0.7283206,-0.35355893,-0.16045861,0.25857133,-0.24542835,-0.62773067,0.48699424,-0.3978315,0.16402064,0.11644162,-0.05423804,-0.15727901,-0.1769678,0.16871296,-0.017148495,-0.1356121,0.12889557,-0.06923812],[0.031175813,1.3461481,-0.05207552,-0.13424256,0.15673165,1.1298523,-0.54824036,-0.16689743,0.049443748,-0.016901892,0.20333812,0.5619182,0.006826116,-0.6597064,-0.026180983,0.22729635,0.2584868,-0.2113748],[0.5795566,0.67358404,-6.977969,0.058563557,-0.29574206,0.5823302,-0.24030899,-0.2995381,-0.26924467,-0.081547186,-0.5541594,0.16588,0.15840445,-0.7864141,0.40154028,-0.2373318,-0.24145977,0.61007404],[-0.009848546,0.30045143,0.029503373,-0.27351668,0.11376449,1.6821749,-1.2038943,-0.049892105,0.37281117,0.18173723,-0.16429949,0.35660785,0.22832245,-0.4506436,-0.23757456,-0.32164904,-0.053110283,0.12267799],[1.3934647,0.36499634,0.26312694,-0.432766,0.75987923,-0.74437225,0.8091179,0.6067964,-0.2472178,0.10360785,-0.13620545,-0.34767386,-0.16454501,0.5357987,0.62150854,-0.05545808,0.010435748,-0.17039369],[0.20956095,-1.419724,-6.043722,0.29923502,0.8952572,0.09468286,1.1705585,0.08298218,-0.94001234,-0.7296266,0.37193263,-0.7382738,-0.4084395,0.52171934,0.029654104,0.22694133,0.35117772,-0.11566992]],"activation":"σ"},{"dense_2_W":[[0.93649673,0.50793236,-0.6459632,0.14732611,-0.31413737,0.24595617,0.5410845],[-0.147114,-0.36361343,-0.09407195,0.02937175,0.22865185,0.1751995,-0.9527202],[-0.7733485,0.011140345,0.23013693,-0.34375155,-0.19983934,-1.170109,-0.9463034],[-0.27665538,-0.39627838,0.51849717,-0.1559539,0.023949604,-0.90093136,-0.9847508],[0.10923114,1.0428375,0.10153842,-0.20655255,-0.99642473,0.0155226635,0.39040205],[-0.7608344,-0.741681,0.61714303,0.29961175,0.40194076,-0.6485538,-0.37572783],[0.06267869,1.0860785,-0.8247702,-0.24703546,-0.5712135,0.2198229,0.5468893],[0.9322532,0.8754985,-0.3895632,-0.72363174,-1.1679527,0.24966148,0.2579374],[0.1763633,-0.5714968,0.6868805,-0.06384768,0.5371141,0.2615531,-0.46435195],[-0.02702668,1.2335556,-0.27594045,-0.05924885,-0.87853885,0.3753951,-0.05063993],[-0.6255276,-0.8581678,0.021257112,0.43066528,0.77454144,-0.020291625,-0.6967373],[0.83754885,0.4857429,-0.050797034,-0.6029118,-1.0627534,0.080022566,0.92563975],[-0.09895578,-1.0526363,0.6905131,0.26684704,0.83103323,-0.55075085,-0.45172825]],"activation":"σ","dense_2_b":[[-0.19245008],[-0.3300925],[-0.017551435],[0.0553758],[-0.2694437],[-0.05464509],[-0.6291996],[-0.030519193],[0.07915488],[-0.22345226],[0.13039747],[-0.10993277],[0.18852183]]},{"dense_3_W":[[0.11073112,-0.533201,0.62755555,0.30198997,0.19470435,-0.51550233,0.43695763,-0.607277,0.5566251,-0.6911583,-0.36105812,0.12090485,0.41196087],[-0.35777438,0.18036212,0.36846223,0.24149348,-0.47303873,0.40955707,-0.50227696,-0.6546859,0.24461997,-0.3516048,0.58416516,-0.115509026,0.5594079],[-0.31891224,0.0019296159,0.70591456,0.27569255,-0.6370788,0.18638003,-0.031307057,-0.28519005,0.49748984,-0.3436976,0.7751193,-0.62876755,0.75629675]],"activation":"identity","dense_3_b":[[0.00038296377],[0.055723432],[0.018070834]]},{"dense_4_W":[[0.011774748,0.8155508,0.383835]],"dense_4_b":[[0.05629205]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48241x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48241x00x00x00x00x00x00'.json deleted file mode 100755 index 35099b6ea8..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48241x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.00827],[1.1619883],[0.4412975],[0.04544336],[1.1478776],[1.1518719],[1.1561376],[1.1453321],[1.1250126],[1.0930616],[1.0567293],[0.045202393],[0.04525232],[0.045298003],[0.045285065],[0.045152135],[0.044884894],[0.044592474]],"model_test_loss":0.009325500577688217,"input_size":18,"current_date_and_time":"2023-08-12_09-31-17","input_mean":[[22.791122],[-0.042878833],[-0.011877181],[-0.014597569],[-0.035545684],[-0.03717921],[-0.03862496],[-0.038736913],[-0.03762687],[-0.03448324],[-0.028882926],[-0.014555443],[-0.014538738],[-0.014526647],[-0.014420466],[-0.014331951],[-0.014239206],[-0.014240208]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.11822516],[0.0008828471],[-1.0862342],[-0.18366772],[0.385106],[0.7609392],[-1.4512328]],"dense_1_W":[[1.1565036,-0.47999045,-0.64334595,-0.046866857,-0.2571887,0.5431218,-0.90600425,-0.015227577,0.6074154,0.2966983,-0.3288622,0.35351965,-0.105130196,0.014889756,-0.2885607,0.062367395,-0.0416696,0.19297217],[0.00013613896,1.1544919,5.8863997,-0.063363396,-0.9809145,0.28564644,0.35597575,0.155261,0.3324481,0.33633226,-1.2474326,0.6385195,-0.11791013,-0.054307703,-0.67459035,-0.1379244,0.102973334,0.19569656],[-0.06969047,0.12243385,-0.0019499671,0.39603442,0.30784214,0.31830847,-0.15033488,0.33314312,0.054290332,-0.028862095,0.027961347,0.2477672,-0.12936744,-0.09928604,-0.74599934,0.26326394,-0.22953305,0.12559183],[-0.02875901,-0.66695607,-0.005256191,-0.06915698,0.43517417,-1.1354989,0.80874676,0.1404699,-0.16011457,-0.005997933,0.033535052,-0.2592826,-0.2594959,0.2704396,0.34614062,0.2440052,0.0562286,-0.21780711],[0.9463859,0.18438934,-0.5292463,0.14852741,0.32597074,-1.031986,0.22700587,-0.24131732,0.20941843,-0.1038609,0.082350604,0.020917263,-0.022982072,-0.06515789,0.07043909,-0.07168746,-0.05299607,0.10198203],[0.0038015677,0.46421862,-0.011183879,-0.101370975,-0.031247087,0.8092469,-0.35475132,0.18806289,-0.1415783,-0.07569947,0.14818926,0.6507605,-0.0435432,-0.57430553,-0.28939062,0.19110921,0.07659029,-0.08136513],[-0.77969193,0.41833523,-0.5825853,0.06571391,-0.036265094,-0.7098911,0.27432096,-0.21149854,-0.14941117,-0.10727135,0.20307949,0.2624021,-0.30541962,0.34553188,-0.38883,-0.16372426,0.28227317,0.046450898]],"activation":"σ"},{"dense_2_W":[[-0.1928296,0.32115498,0.20930864,0.5611469,0.19011536,-0.26645315,-0.17603545],[0.166902,-0.16892958,-0.6638914,0.15825053,0.21120141,-0.748163,0.474334],[-0.1116566,-0.043712437,-0.25810665,0.7776559,0.30960482,0.045773234,0.3270671],[-0.10762828,-0.5864748,-0.28898096,0.15144639,-0.4097048,-0.24713844,0.018743742],[0.6269138,0.2670387,0.51526284,-0.38287458,-0.12963958,0.5141082,-0.16934894],[0.60643613,0.5065733,0.51206255,-0.8444096,-0.23755147,0.9865407,-0.66474754],[0.39914343,-0.31481522,-0.15519524,0.9308352,0.08094447,-0.563002,-0.39392495],[-0.62913185,0.13864003,-0.4409571,1.048762,0.6268857,-0.20228775,-0.062061056],[0.5582918,-0.37558815,0.8273307,-1.1066164,-0.3901795,0.70115936,-0.42085156],[-0.7219747,1.0324795,0.5925977,-0.7950196,-1.1894366,-0.35266805,-0.08333824],[0.17714527,0.035280515,-0.5560802,0.25969428,0.37214068,-0.70087725,-0.007387615],[0.45798004,-0.23500519,0.7236357,-0.7572892,-0.77434045,0.5295288,0.0067519485],[0.12378485,-0.26742935,-0.19959643,0.79587483,0.08676472,0.19069159,0.17077966]],"activation":"σ","dense_2_b":[[-0.023296025],[-0.062371153],[-0.08753547],[-0.012299448],[-0.12436653],[0.12464757],[0.051917683],[-0.044311624],[-0.08723197],[-0.22925796],[-0.037951283],[-0.031904783],[-0.029043172]]},{"dense_3_W":[[0.266644,-0.09708873,0.36481127,-0.3777422,0.34096837,-0.02927695,-0.01537932,-0.24403723,0.71203685,0.10868033,0.3864008,0.357262,-0.061952867],[0.21862133,0.09851822,0.21582417,0.22255906,-0.43100807,-0.68686426,0.00410916,0.4358678,-0.2271849,-0.73627913,0.66998297,0.072033614,0.08977202],[0.44470266,0.32145885,0.62044615,0.21872145,-0.17952862,-0.5809358,0.5550113,0.033751376,-0.20690925,0.011282066,0.040129244,-0.62126046,0.37573385]],"activation":"identity","dense_3_b":[[-0.061297435],[0.035920873],[0.030181145]]},{"dense_4_W":[[0.4694328,-0.89785147,-0.7038385]],"dense_4_b":[[-0.036924034]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48310x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48310x00x00x00x00x00x00'.json deleted file mode 100755 index e15c8a24d9..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48310x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.133618],[1.4129014],[0.44969133],[0.045696877],[1.4049444],[1.4081829],[1.4101628],[1.3818637],[1.3492402],[1.2996615],[1.2511544],[0.04564733],[0.04565076],[0.045647893],[0.04553961],[0.04542456],[0.045219943],[0.0448686]],"model_test_loss":0.014148019254207611,"input_size":18,"current_date_and_time":"2023-08-12_10-02-27","input_mean":[[22.846207],[-0.028825762],[0.0069386563],[-0.011931484],[-0.029900458],[-0.030026564],[-0.029956907],[-0.025415199],[-0.02073705],[-0.016202599],[-0.012826078],[-0.012012862],[-0.011981135],[-0.011950831],[-0.011894881],[-0.011909395],[-0.011980199],[-0.012003033]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.045462497],[0.14482749],[-3.1937203],[0.41232848],[-0.036116436],[-0.10669243],[3.1771445]],"dense_1_W":[[0.04209759,-0.123200886,-0.001966771,-0.27350724,-0.07637217,-0.69638944,0.49670324,-0.10970925,0.17391703,-0.020320209,-0.11798665,-0.32608816,-0.15994923,0.74159515,0.16622286,-0.16900371,-0.11755795,0.12067652],[0.12397108,-0.8622103,0.002287507,0.5233263,0.29362643,-0.90254813,0.6244419,0.09886855,-0.20115684,-0.068305194,0.09150868,-0.040079072,-0.5887415,0.03467633,0.37852713,0.04821548,0.33913377,-0.32878298],[-1.5204463,-0.30083042,0.54742867,-0.22839276,-0.2593333,0.5200578,-0.22732674,0.35200244,0.0005918363,-0.14585528,0.47478247,0.34271586,0.18018198,-0.5389027,0.31345156,0.32557848,-0.10517697,-0.24773833],[0.16338956,0.7465661,0.00091303553,-0.30629274,-0.83907,1.2726458,-0.46392232,0.28630704,0.009157783,-0.092671104,-0.027732085,0.6079292,0.34104618,-0.639812,-0.3557384,-0.16809613,0.056947865,0.15010986],[0.0016282196,-0.808354,-3.8552349,-0.28365737,0.5438757,0.06829288,-0.19340357,0.0031712118,-1.2518381,-0.3716958,1.4632245,-0.3830043,-0.08256899,0.41362843,0.4654074,0.24454728,-0.060357146,-0.29063493],[0.00881861,1.5529372,-0.004645296,0.101736404,-0.44716865,1.1123074,-0.11059584,-0.23869607,-0.19627295,-0.16191976,0.27920842,0.5280347,0.07986667,-0.2998149,-0.13689749,-0.061755475,0.26918095,-0.17861305],[1.5262027,-0.7209147,0.54510105,-0.41295,0.24966663,1.5925447,-1.7505642,0.4582838,0.21614361,-0.11827627,0.48279446,0.7191378,-0.5658482,-0.5843556,1.2161899,0.0055931257,0.16656737,-0.5068038]],"activation":"σ"},{"dense_2_W":[[-0.93619925,-1.0465239,0.51262397,0.74086666,0.21353468,0.3476233,0.32381067],[-0.51265305,-0.87474597,0.46417361,-0.24346405,-0.3276334,0.5293372,0.051842663],[0.53608036,0.56876564,-0.22863568,-0.38303185,0.27319765,0.33705932,-0.7360473],[-0.7518486,-0.65000415,0.35375157,0.28509223,-0.56357265,0.478604,0.03561653],[0.029013865,0.25404042,0.57304466,-1.2749768,0.95642287,-0.6889415,-1.2362365],[0.39669678,0.4147544,-0.33926824,-0.935757,0.07840821,0.26636747,-0.3079712],[0.596397,0.20710751,0.1445996,0.047088236,-0.58025897,0.08174204,-0.08478866],[0.6787158,0.85764533,-0.28679985,-0.9344713,0.11183712,-0.4111803,-0.7435469],[-0.032755844,-0.41277444,0.3462792,0.65885925,-0.33081263,0.115080066,-0.17707695],[-0.5118069,-1.2389166,0.28025037,0.68769765,0.15658064,0.116785616,0.18789898],[-0.1941865,-0.9085792,-0.015243897,-0.11461906,-0.61263376,-0.6787525,0.1516513],[-0.8660754,-1.2627017,1.1963525,0.4615613,-0.7016441,0.5529118,-0.5558919],[-0.25683263,0.2894195,0.38483003,-0.59003097,0.4263322,-0.7981855,-0.42868915]],"activation":"σ","dense_2_b":[[-0.26972106],[-0.23031023],[-0.12965338],[-0.041467585],[-0.15502211],[-0.23721904],[-0.07618676],[0.024510087],[-0.09441283],[-0.18249302],[-0.22564216],[-0.23934019],[-0.07737953]]},{"dense_3_W":[[0.3971231,0.28900996,0.1904874,-0.00935186,-0.193967,-0.02954578,0.06900154,-0.5145334,0.12633824,0.21880715,0.21613063,0.60171586,-0.64756685],[0.0129291145,-0.32070932,0.5608509,0.21185556,-0.22626269,-0.27636886,0.08561043,-0.31846905,-0.5734745,-0.21031462,0.1820749,0.28639615,0.4885934],[-0.12727283,0.26172706,0.64191544,-0.46281716,0.83532584,0.4892697,0.27129266,0.8000755,-0.53944695,-0.16300395,0.15426172,-0.75119865,-0.1486517]],"activation":"identity","dense_3_b":[[-0.022976112],[0.023158783],[0.0038195048]]},{"dense_4_W":[[1.077695,-0.06574526,-0.53436226]],"dense_4_b":[[-0.017774973]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48400x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48400x00x00x00x00x00x00'.json deleted file mode 100755 index c7cff36455..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020 b'8965B48400x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.644386],[1.1440065],[0.4692075],[0.044103775],[1.1367902],[1.1393884],[1.1417042],[1.1268477],[1.1062402],[1.0774581],[1.0459682],[0.04386147],[0.04393631],[0.044005807],[0.044103783],[0.04404187],[0.04392301],[0.04367208]],"model_test_loss":0.01073704194277525,"input_size":18,"current_date_and_time":"2023-08-12_10-27-46","input_mean":[[23.381014],[0.005975481],[-0.009992327],[-0.021032402],[0.008117326],[0.006850381],[0.0054110563],[0.0023832242],[0.002186634],[0.0035959708],[0.0033810092],[-0.021105358],[-0.02110145],[-0.021099575],[-0.021097427],[-0.021086434],[-0.02115564],[-0.02128101]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.834708],[-0.045707446],[-2.563987],[-0.117759325],[-0.91913813],[-0.03334596],[2.6613603]],"dense_1_W":[[0.16599746,0.7096867,-0.0038545108,-0.13340561,0.2588123,0.29712543,-0.2594707,-0.071150005,-0.07657077,-0.013201976,0.10662274,0.04428099,-0.1436738,0.16864574,-0.22712697,0.12658992,0.0954199,-0.12004688],[0.0042369105,0.18097177,-0.22014329,-0.30500078,-0.06370518,0.46832517,-0.90946174,0.6372478,0.25378084,-0.1069116,-0.37374678,0.3893671,0.45563832,-0.4595813,-0.2876199,0.33593014,-0.33627144,0.25168842],[-1.2126169,-0.16930301,-0.21450809,0.20024887,0.03201565,-1.0296049,1.4060705,-0.4294684,-0.0039082374,-0.42241377,0.012848083,0.123701885,0.14541772,-0.08624216,-0.18380383,-0.27203885,-0.19501837,0.2907863],[0.00063447293,1.2981268,4.2820415,-0.2594015,-1.2206693,-0.08402264,-0.313254,0.2832975,1.461314,0.50451976,-1.6309339,0.5598124,-0.14541756,0.23579545,-0.2860597,-0.611733,0.34472165,0.16626717],[0.14616013,-0.495636,0.0058109863,-0.01570958,0.58130336,-1.5504689,0.2670856,0.13132574,0.40939844,-0.057407007,-0.20243555,-0.2075857,-0.18856382,0.72101206,-0.06758915,-0.24377194,0.1419332,0.047459047],[-0.013590818,0.34024894,0.18479231,-0.019695252,-0.86625415,0.9378449,-0.7798978,0.22300671,0.40178698,-0.04151977,-0.13329166,0.45217785,0.09624605,0.084031366,-0.47827828,-0.55867606,-0.046922974,0.4538892],[1.2487265,-0.5044096,-0.22156143,0.51267344,-0.10274288,-0.51327384,1.1344092,-0.17422712,-0.058846287,-0.40755874,-0.003082627,-0.34271088,-0.2929998,0.434721,-0.30842355,-0.021555493,0.21910873,-0.1752489]],"activation":"σ"},{"dense_2_W":[[0.62964183,0.3170662,-0.7668863,0.4648944,-0.35633978,0.323501,0.36004624],[0.9853487,-0.27411574,0.34153345,0.1801431,-0.94035196,0.07904266,-1.1844826],[-0.16382942,-0.5559022,0.39087328,-0.6283743,0.41070727,0.020665707,0.8685],[0.34209964,0.5759347,-0.31890684,-0.2798852,0.13835523,0.6231073,-0.26864585],[-0.6228901,-0.4353858,0.24678996,-0.14232816,0.6366259,-0.22533265,0.60833997],[0.51754946,0.08759814,-0.1679395,0.5345081,-0.6778435,0.03203068,-0.94014156],[0.49474886,0.21732587,0.407077,-0.32371607,-0.2704814,-0.0010814304,0.13743709],[-0.0838043,-0.49292943,0.032049768,-0.05150428,1.0013574,-0.96868503,0.41634974],[-0.63949,-0.648591,1.0157802,-0.31856138,0.9662109,-1.015555,-0.22861005],[0.15993874,-0.013838849,-0.4022037,-0.28916073,-0.47161445,-0.6956427,-0.7160354],[-0.24090491,-0.26874304,0.749612,-0.4140518,0.6883246,-0.89394754,0.041574933],[-0.9463262,-0.55637103,1.0741757,-0.1182538,0.047610544,-1.0402383,-0.16455126],[-0.6265001,-0.59906393,0.09580579,0.026793769,0.63057166,-0.6412282,-0.3706451]],"activation":"σ","dense_2_b":[[0.07676112],[-0.111001514],[-0.008189968],[0.03080702],[-0.023322558],[-0.12537855],[0.041264],[-0.068600364],[-0.17696345],[-0.34724367],[-0.13291265],[-0.119294606],[-0.06824207]]},{"dense_3_W":[[0.30592474,0.65184015,-0.18676876,0.5202834,-0.47716483,0.49206358,0.1335472,-0.46779883,-0.45796365,-0.27737036,-0.61875904,-0.21409914,-0.4281805],[-0.22402486,0.36820185,0.5984844,-0.32377946,0.51082987,-0.5228782,-0.4425499,-0.22049034,-0.28360286,-0.63904005,0.57028985,0.27956602,0.54471344],[0.015972696,0.56076694,-0.4424602,0.50380963,0.1369866,-0.10628985,-0.03996058,0.51810396,-0.27963144,0.5446682,0.091093265,-0.067806154,0.017807629]],"activation":"identity","dense_3_b":[[0.08166017],[-0.07228911],[0.020593217]]},{"dense_4_W":[[1.2059438,-0.34201673,0.15371227]],"dense_4_b":[[0.075159274]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020.json b/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020.json deleted file mode 100755 index 8df2f4bb1d..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER HYBRID 2020.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.164538],[1.4558752],[0.45833412],[0.04711418],[1.4456551],[1.4501203],[1.4533974],[1.4229606],[1.3864104],[1.3335255],[1.2820569],[0.047046598],[0.047047578],[0.047046028],[0.046939764],[0.046797764],[0.046596467],[0.04624541]],"model_test_loss":0.014431758783757687,"input_size":18,"current_date_and_time":"2023-08-12_09-04-44","input_mean":[[22.724527],[-0.0073930244],[0.0021499225],[-0.013335735],[-0.0060209357],[-0.0065084104],[-0.0070741335],[-0.004122651],[-0.0006198622],[0.002992856],[0.0050453614],[-0.013361201],[-0.013339233],[-0.013309726],[-0.013208915],[-0.013188212],[-0.0131769525],[-0.013236434]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.4987317],[-0.21502848],[-0.023930108],[-0.08293208],[-0.18136914],[-2.6931612],[1.9903412]],"dense_1_W":[[0.6072704,0.018546268,1.0117872,-0.02655404,0.12334371,0.9183143,-1.0057606,0.33296764,0.0034425545,0.30709305,-0.1837191,0.43864262,0.1951786,-1.0183357,0.08373593,0.46079198,0.069924854,-0.20370835],[0.018644223,1.3867873,3.9551542,0.15828222,-1.7119819,-0.06886215,0.15835802,0.104763426,1.5361047,0.7793233,-1.5410533,0.57826525,0.2791371,-0.091204755,-0.9631753,-0.25537375,-0.40537784,0.6930675],[0.05840197,0.83388406,-0.0011560204,-0.3091371,-0.24360721,1.7607956,-1.0322315,-0.24692948,-0.22033525,0.058811415,0.1848893,0.50187564,0.024970453,-0.10388528,-0.35247543,-0.33053055,-0.036511794,0.19697922],[0.041596312,1.2468644,0.00062399096,0.08458749,-0.64712596,0.8903513,-0.17702456,0.29386955,-0.32305542,-0.060308453,0.11958216,0.5488134,0.25830337,-0.8367097,-0.20763892,0.1274579,0.2367986,-0.21593204],[-0.16188623,-0.123164184,-0.9382007,0.13822892,-0.38314018,0.43343663,-0.5543238,0.26458925,0.39078033,-0.18539841,-0.12467638,0.29254597,0.14244753,-0.47446775,-0.09593193,0.09456061,-0.35750958,0.26552486],[-0.88318425,1.1153313,0.0017999654,0.19061683,-0.30666143,0.75104123,0.11356683,0.48195174,0.02523524,0.010765657,-0.04291398,-0.03229076,0.4961786,-0.31880328,-0.67625135,-0.14397632,0.15807933,-0.0985196],[0.5923598,0.6756624,-1.0463923,0.37445185,0.11736687,-1.0798235,0.55913264,-0.47123235,-0.54284656,0.055854443,0.17690535,-0.7807285,0.3889109,0.4822052,-0.42190412,-0.21585964,0.19765395,-0.03469817]],"activation":"σ"},{"dense_2_W":[[-0.7025875,-1.01547,-0.43722752,-0.09516741,-0.24370766,0.28927654,0.014542646],[0.2749662,-0.29885203,0.30274695,-0.10304987,-0.3782751,-0.26847735,0.025089832],[-0.54648656,0.24413349,-1.0082586,-0.23474653,-1.1860299,-1.0889997,-0.08883737],[-0.4322979,-0.7916055,0.08303449,-0.5981394,-0.08842554,-0.4015095,-0.44426244],[0.25884318,-0.48712513,-0.4562449,-0.765338,-0.3228274,-0.009145744,0.7458293],[-0.61903703,0.009864125,-0.7634911,-0.21205765,-0.7243218,-0.29422146,0.7232771],[-0.30022988,0.15801793,-0.4750129,-0.39146864,0.43409535,-0.20482707,0.21319191],[-0.09161583,0.29012272,-1.1244291,-0.7968736,-0.52818763,-0.31070143,-0.7589764],[0.41631448,-0.041808337,0.45858353,0.5034346,0.25543645,0.5356051,-0.6972568],[-0.779109,-0.23796116,-0.9607459,-0.6135155,-0.25498068,0.41323018,0.25573388],[-0.5596749,-0.21328482,-0.9854063,-0.5111223,-0.7307937,-0.06609184,-0.16158096],[0.26007235,0.24132085,0.5798595,0.6841223,0.65867245,0.061028752,0.36075428],[-0.3321862,0.12987743,0.56252885,0.2816003,-0.16890442,-0.22842854,-0.9761609]],"activation":"σ","dense_2_b":[[0.020393617],[-0.1259718],[0.15805069],[-0.23997118],[0.1390272],[0.08802155],[-0.11869106],[-0.24654494],[-0.11373044],[0.11735831],[0.30582067],[-0.15132986],[-0.27947864]]},{"dense_3_W":[[-0.41748047,-0.5452961,-0.5681742,-0.31478232,-0.43341246,-0.50046074,-0.1333813,-0.5239057,0.18791445,-0.6105861,-0.53726876,0.11316518,0.5290968],[-0.08242217,0.49892414,-0.4914419,0.32127154,-0.5822968,-0.6094572,0.18559168,0.31101432,0.7411366,0.31846002,-0.39128235,0.6802514,0.6365301],[0.6492468,0.02211246,-0.12046828,0.28079885,0.2860496,-0.10623663,0.10433247,0.3697982,-0.68328637,0.6391152,0.44678408,-0.028312663,0.45253885]],"activation":"identity","dense_3_b":[[0.078321405],[0.037635524],[-0.057794243]]},{"dense_4_W":[[0.5587847,0.7765039,-1.1255592]],"dense_4_b":[[0.048529897]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47022x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47022x00x00x00x00x00x00'.json deleted file mode 100755 index 967dcf8d1f..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47022x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.000243],[1.0529355],[0.44031963],[0.04554594],[1.0481081],[1.0505339],[1.0517689],[1.0306543],[1.0114516],[0.9864613],[0.96286005],[0.045486752],[0.04548187],[0.04546514],[0.045314565],[0.045162555],[0.04484083],[0.044451322]],"model_test_loss":0.016144780442118645,"input_size":18,"current_date_and_time":"2023-08-12_12-48-27","input_mean":[[23.703514],[0.034525022],[0.0037587206],[-0.0066846693],[0.036115173],[0.035502695],[0.035573922],[0.038456824],[0.03878846],[0.037492014],[0.035617996],[-0.0066404915],[-0.0066419644],[-0.0066401316],[-0.006694763],[-0.0067848936],[-0.006970607],[-0.0071066907]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.018687818],[0.016889395],[-2.2628572],[-2.078596],[0.22971022],[-0.1767829],[-0.5167562]],"dense_1_W":[[0.011015955,1.0643084,-0.08839964,0.61551523,0.802623,1.5406702,-1.6393329,-0.07330995,0.22098303,0.5496796,-0.07165077,0.57465875,-0.49430174,-0.72913355,-0.028702782,0.2533353,-0.15451618,-0.014682099],[-0.0044485596,0.68300956,2.34839,-0.49447054,-2.7115552,-2.5957623,-3.4036458,1.1568989,5.159137,2.5940776,-0.9615852,1.2597148,0.4663126,-0.4115597,-0.54910094,-0.018557174,-0.6093785,0.19555537],[-0.38033494,0.6095696,0.27524653,-0.24040353,0.23970546,0.72473454,-0.19985196,0.05170179,0.37927815,0.008114709,-0.30030593,0.5968865,0.072596125,-0.31858274,-0.41960534,0.26154235,-0.09866176,0.15294196],[-0.3583878,-0.7227564,-0.2559942,-0.047408156,-0.23193003,-0.7996542,0.557878,-0.10742698,-0.4394683,0.09005993,0.26495668,-0.7439191,-0.013596186,0.88895196,0.092311434,-0.022404915,-0.17483388,0.011742477],[-1.1386592,0.20961168,-0.0043176794,-0.14611427,-0.13120638,1.3944597,-1.0419998,-0.39789963,-0.08476762,-0.36311617,0.42571318,1.3092103,-0.26345864,-0.98487866,-0.0447565,-0.3767902,-0.10429795,0.14397188],[1.1815095,0.06911906,-0.0023387522,0.08115236,-0.12113374,1.487969,-1.2359906,0.11289565,-0.58799416,0.07841065,0.22937942,1.0972705,-0.07823999,-0.92822057,-0.4054966,-0.18756558,-0.33272704,0.2668549],[-0.19750582,1.2739553,7.0663867,-0.5248582,-0.4676437,-0.08646342,-0.91660845,1.0469422,1.1008883,0.3525522,-1.6761202,0.9796133,0.77493626,-0.44570097,-0.3790537,-0.24817844,-0.04224263,-0.08521787]],"activation":"σ"},{"dense_2_W":[[0.56187254,-0.42941013,0.01137766,-0.5091996,-0.021960784,-1.0853531,-0.55602425],[-0.7135164,-0.39620182,-0.35796282,-0.24564448,-0.08940037,0.018869234,0.21817489],[0.5262834,0.37286675,0.54738665,-1.4483702,0.74003285,0.36226225,-0.4840184],[0.66549075,-0.45087525,0.5316808,-0.80598843,0.5375895,0.44839606,0.19927433],[-0.05242752,-0.47517085,-0.07394551,0.23638195,0.76435024,-0.7201021,-1.2908622],[0.20445137,0.27786765,0.6353812,-1.2159988,0.7916566,-0.03361323,0.14942108],[-0.29910564,-0.13706577,-0.66971123,0.5954099,-0.5241532,0.08504403,0.31102544],[0.2186948,0.13250604,0.14607616,-0.009396174,-0.4860835,-0.08648418,-0.5939958],[-0.18379676,0.37188196,-0.5983929,0.008835486,-0.5554737,-0.39572975,-0.17633566],[0.40148303,-0.3301877,-0.32109272,0.8163982,-0.18761033,-0.55294204,-0.4394005],[-0.18555163,-0.30746877,-0.8649402,0.3212118,0.37567982,-0.35336125,-0.40009186],[0.42191646,0.2480143,0.5938211,-0.47291356,0.24606346,0.3526983,-0.31585172],[0.30375394,-0.4357636,-0.67720544,0.18926817,-0.2186749,0.19559121,-0.15258849]],"activation":"σ","dense_2_b":[[0.0456926],[0.1021674],[-0.525961],[-0.2781079],[-0.179685],[-0.9191505],[0.018642724],[0.07845247],[0.06336037],[0.21135324],[-0.09867381],[-0.25866526],[0.27727693]]},{"dense_3_W":[[0.005986166,0.5403741,-0.5950544,-0.668431,0.3410047,-0.4509835,0.41055346,0.56165504,0.47017696,0.04962426,0.30859372,-0.4631947,0.19735102],[-0.548777,-0.34207267,0.29769439,-0.07678766,-0.18337654,0.3864849,0.09935212,0.41492525,0.2651904,-0.4132142,-0.055492,0.6352499,-0.0036086126],[-0.1508172,0.13540027,-0.39238226,-0.6953886,0.57532775,0.2929234,0.51378953,0.33914775,0.5232986,-0.16648121,0.079042025,-0.44329265,0.72198534]],"activation":"identity","dense_3_b":[[0.04064909],[-0.056400906],[0.02708405]]},{"dense_4_W":[[-0.9928628,0.7695461,-0.40275335]],"dense_4_b":[[-0.04485986]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47023x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47023x00x00x00x00x00x00'.json deleted file mode 100755 index 4d3ae8cfe8..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47023x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.189096],[1.2119626],[0.49706239],[0.047317218],[1.2048372],[1.20692],[1.2089139],[1.1869353],[1.1617409],[1.127547],[1.0964477],[0.04720443],[0.04723218],[0.047246177],[0.047100883],[0.046939258],[0.046583816],[0.046134617]],"model_test_loss":0.0164700448513031,"input_size":18,"current_date_and_time":"2023-08-12_13-15-10","input_mean":[[23.779161],[-0.013822137],[-0.002065226],[-0.0027149373],[-0.010493581],[-0.012193051],[-0.012818504],[-0.012930413],[-0.010893465],[-0.005386844],[-0.0016019325],[-0.0026636221],[-0.0026759957],[-0.0026916054],[-0.0028163292],[-0.0029443589],[-0.0030217492],[-0.003099767]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.6248422],[0.4383351],[0.0049929065],[-2.9431283],[0.008178566],[-0.051198818],[-0.33704558]],"dense_1_W":[[-0.8000218,-1.0995749,-0.2871293,0.5462917,0.24798232,-1.2576014,0.1120573,0.078140825,0.078286864,0.15174086,-0.01840363,-0.52815986,-0.05432176,0.34631014,-0.20628281,-0.14995483,0.07829511,-0.042495955],[1.6193608,-0.46763715,0.28946337,-0.2223544,0.35163045,-0.606444,0.984452,0.34925696,-0.08003834,-0.30489528,-0.18959466,-0.6525449,-0.3045237,0.5406548,-0.090693735,0.6568375,0.7551066,0.56893355],[0.020400103,0.33052164,3.5161345,-0.21798564,-0.87898314,-1.127264,-1.9201058,0.13413894,2.837898,1.4812523,-0.66593146,0.45540428,-0.012385356,0.13430928,0.21109414,-0.14471997,-0.4844812,0.03366415],[-0.86977047,1.0564649,0.306292,-0.13933228,-0.31024972,1.1149535,0.1641149,-0.005766936,-0.050841313,-0.06560041,-0.086284995,0.20279922,-0.04585891,-0.20554592,0.114430346,0.14967376,-0.021810979,-0.045283116],[0.00061570096,0.45353583,-0.009236617,0.26197684,-0.15322922,0.83636606,-0.8349571,-0.17852367,0.14262004,-0.05964174,0.04870579,0.69924206,0.4330304,-0.9156969,-0.4326727,-0.65043074,0.14345872,0.07251757],[0.0015624848,0.9121691,-0.02306211,-0.17766467,0.3675618,1.406637,-0.91108245,-0.26483488,0.007428613,0.17409417,0.12758283,0.22435105,0.11867643,-0.47856376,-0.003195762,0.21000656,0.26077518,-0.29852307],[-1.1143638,0.32679862,-0.2348363,0.5724334,-0.15143955,-1.033644,0.93523884,-0.40604407,0.0011522722,0.12635851,0.2240593,-0.24549077,-0.1502993,1.0182712,-1.1520041,-0.10360738,-0.0657126,-0.8226056]],"activation":"σ"},{"dense_2_W":[[-0.35284433,-0.2574711,-0.029361492,-0.49557316,-0.11526183,-0.2827134,-0.4111898],[0.03056212,-0.4830144,0.14822236,0.27505293,0.709112,0.4124182,-0.6306692],[-0.9140814,0.17214836,0.2355942,0.6127966,0.4447363,0.56893396,-0.3780424],[-0.72159797,-0.1386788,0.28826654,0.39564595,0.7098589,0.07965858,-0.09599504],[0.7131255,0.4191417,-0.11335002,-0.81645864,-0.16484027,-0.24157974,-0.1626869],[0.11402234,0.13955061,0.12694025,-0.046629976,0.011027189,0.7676317,-0.09719566],[-0.12212158,-0.15184937,-0.10101525,0.07340927,-0.24177536,-0.5750619,-0.3229692],[0.31239644,0.5398298,-0.12011592,-0.64138055,-0.556097,-0.6323519,0.41405684],[0.42244118,0.752209,-0.5100762,-0.5812268,-0.19271265,-0.061693292,0.4749355],[0.35658112,0.4356272,-0.6723626,0.1700935,-0.6141872,-0.49651685,0.69559157],[-0.00028722011,-0.30635557,-0.19579825,-0.09017295,0.15330125,-0.39068377,0.0518424],[0.30908525,0.26968578,-0.9460024,-0.6721539,-0.05254155,-0.96726763,-0.8004719],[0.5386026,0.24466284,-0.3876961,-0.35310513,-0.5629104,-0.62708277,0.7053968]],"activation":"σ","dense_2_b":[[-0.1009566],[-0.052083995],[-0.17170173],[-0.11832341],[-0.040780384],[-0.0032875277],[-0.06165029],[0.11283898],[-0.04587376],[0.04051942],[-0.27606243],[-0.3136743],[0.00120357]]},{"dense_3_W":[[-0.12000948,-0.07712079,-0.13579264,-0.5477244,0.12987608,-0.27466065,0.18847848,0.36536223,0.095779814,0.6490736,-0.54498273,-0.25738448,0.18985388],[0.2613838,-0.74475616,-0.71508867,-0.029044528,0.45442525,-0.2592899,0.40360647,-0.08311714,0.49941358,0.5649388,0.073403694,-0.15956575,0.47439378],[-0.3364592,0.5295699,-0.4562176,0.5927123,0.025007816,0.28039455,-0.4734172,-0.50012225,-0.26987627,-0.25010377,-0.22944938,-0.15876396,0.4559477]],"activation":"identity","dense_3_b":[[-0.04299677],[-0.057208654],[0.05739145]]},{"dense_4_W":[[-0.5825432,-1.227139,0.78172004]],"dense_4_b":[[0.05413455]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47050x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47050x00x00x00x00x00x00'.json deleted file mode 100755 index 73b1d0618c..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47050x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.311736],[1.1833621],[0.46748862],[0.043473817],[1.1803772],[1.1810178],[1.1803039],[1.1448357],[1.1118515],[1.0669984],[1.0288521],[0.043289315],[0.043316387],[0.043338254],[0.043359537],[0.04335068],[0.043099],[0.04268195]],"model_test_loss":0.02130388654768467,"input_size":18,"current_date_and_time":"2023-08-12_13-42-52","input_mean":[[23.338652],[0.0079169525],[0.011965741],[-0.0043622814],[0.0054793637],[0.0060081836],[0.0057728244],[0.010234134],[0.015633008],[0.018571485],[0.021591475],[-0.004419671],[-0.0044097584],[-0.0044071046],[-0.0044820793],[-0.004507606],[-0.004685093],[-0.0047487807]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.3424917],[-0.22007197],[2.7653508],[-0.08879859],[-0.51477855],[-0.545124],[2.8031893]],"dense_1_W":[[-0.0609116,0.24219239,-3.0795984,-0.10600801,1.926117,1.9883113,2.695181,-2.2749603,-4.703912,-1.4620117,1.3659627,-0.61915976,-0.5933105,0.5631315,0.53107154,0.16850716,0.5389666,-0.24403873],[-0.13675421,-0.28692976,-0.047750086,-0.07963782,-0.15478788,-1.52701,0.76644737,0.36206856,0.08041735,-0.07322048,-0.13415782,-0.81037486,-0.11634636,1.0861106,-0.058293134,0.28003043,0.11846962,-0.11565344],[0.95614064,1.0019612,0.53723675,0.06426713,0.024449164,1.2951865,-0.014162737,0.17224762,-0.29896966,0.004003529,-0.033126593,0.5333686,-0.043380257,-0.34817392,-0.0940334,-0.070693925,-0.056659807,-0.040717468],[-0.3698795,-2.043652,-0.001344297,0.2573092,-1.8309736,-1.4463769,-0.7664984,-0.48727417,-0.77685726,-0.765619,-0.8620695,-0.12925234,0.19212537,0.22146735,-0.42407393,-0.28144377,-0.39236894,0.47548348],[0.8419204,-0.5650975,0.036041167,0.65058583,1.710107,1.0682759,2.30751,4.404108,1.5041014,-0.48164627,0.92178214,-0.6536394,0.088804975,0.48443964,-0.22410193,-0.3742232,0.056062154,0.047145177],[-1.2325656,-0.30824685,-0.09048496,0.18950711,-0.4825,0.048707586,-0.18827212,-0.6238843,-0.15898828,-0.0016847495,0.20470282,0.78116095,-0.21980284,-0.42645526,-0.20192316,-0.20980175,0.06175255,0.42999753],[1.1973844,-0.61121106,-0.65272874,0.11695344,-0.415401,-0.8369048,-0.51655334,-0.46804002,0.1774671,0.034465495,0.11842057,-0.19437845,-0.21636976,0.14230467,-0.1306049,0.22070019,-0.014487319,0.1370136]],"activation":"σ"},{"dense_2_W":[[-0.09687541,0.41265634,-0.28903764,0.088248394,0.08749764,0.40536332,-0.40259215],[0.09616042,0.53485495,-0.52763003,-0.3675957,-0.4812057,0.5304369,-0.35900635],[0.47528854,0.027117088,-0.79976135,-2.041139,0.12766449,0.6291589,-1.348053],[0.007089686,0.65491384,-0.28227356,0.14037174,-0.116616175,0.4254773,0.25753963],[0.30368233,0.830298,-0.5528413,-0.41899738,0.5059065,0.70742816,-0.5321653],[-0.106924206,-0.9505898,-0.1433678,-0.7451343,0.26985407,0.19505453,-0.37276903],[-0.6210788,-0.9982259,0.2111701,0.25647947,-0.2557463,-0.050668027,0.27773225],[-0.29684657,0.39087462,-0.6303919,0.45115256,-0.24149868,-0.099998295,-0.36485362],[-0.96378434,-0.67800295,0.101591,-0.4826239,-0.7637202,0.9594377,-0.27190077],[0.8295861,-0.09165251,0.27433112,0.76305205,-0.17441471,-0.2059716,0.47888404],[0.5831719,-1.3856399,0.16508237,-0.44017437,-0.1796982,-0.51486045,-0.26369834],[-0.70064485,-1.0656925,0.99505454,-0.13768534,-1.1000327,0.32685453,0.07229443],[-0.3610345,-0.9261802,0.8907604,-1.1000993,-1.0780302,0.43730703,-0.8698188]],"activation":"σ","dense_2_b":[[0.0029676734],[-0.045690004],[0.052396797],[-0.11907807],[-0.03244056],[-0.010383539],[0.14556181],[-0.06368351],[0.117490895],[0.0279692],[0.0063737636],[0.1982034],[0.36711437]]},{"dense_3_W":[[-0.4897033,-0.08666579,0.6885498,-0.029216405,-0.5607586,0.6646527,0.6371779,-0.49990708,0.80433536,-0.6012616,0.66267055,0.3536834,0.7406547],[-0.21406044,0.1894386,-0.059286572,-0.25800148,0.36541036,-0.023487262,0.08215483,0.2643849,0.7693755,-0.3409327,-0.3719815,0.62649447,-0.1366564],[-0.54868925,-0.38931724,-0.37813,-0.21437772,0.025669921,0.5354064,-0.53577673,0.43504256,-0.14300491,-0.6100815,0.2980951,-0.44299504,-0.3803292]],"activation":"identity","dense_3_b":[[-0.0040670936],[-0.008865108],[0.0073812064]]},{"dense_4_W":[[1.2559222,0.3952422,0.23678719]],"dense_4_b":[[-0.005785818]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47060x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47060x00x00x00x00x00x00'.json deleted file mode 100755 index 066956c53e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017 b'8965B47060x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.720254],[1.4248189],[0.6346064],[0.043413434],[1.4171089],[1.4204099],[1.4220495],[1.3829275],[1.3424436],[1.2829355],[1.2256352],[0.043280665],[0.043307457],[0.043318037],[0.043207273],[0.043084644],[0.042780377],[0.04235212]],"model_test_loss":0.017869291827082634,"input_size":18,"current_date_and_time":"2023-08-12_14-12-09","input_mean":[[21.814978],[-0.044544768],[-0.0024178808],[-0.009240181],[-0.045137636],[-0.04497973],[-0.04478877],[-0.04410983],[-0.045231145],[-0.043119643],[-0.043177184],[-0.009214069],[-0.0092027215],[-0.0092002945],[-0.0092338],[-0.009313492],[-0.009387383],[-0.00947316]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.389111],[0.4858375],[-0.13127421],[-0.38854295],[-3.1610048],[-0.33462796],[-1.149649]],"dense_1_W":[[-1.602772,-0.53400826,0.37718666,0.3633788,0.33693865,0.68845004,-0.8066354,-0.59084105,0.07060837,0.27426994,0.15494016,-0.07353975,-0.25826493,-0.32263887,0.28983268,0.3546069,0.18318044,-0.42745438],[0.25555605,-0.46022877,0.010211284,0.3684016,0.29642805,-0.20792986,0.9199042,-0.0009176482,0.15137427,0.30636084,-0.16015714,-0.052834738,-0.27825084,-0.27992555,0.24953611,0.13372909,-0.36744606,0.06524456],[-0.014943542,0.0033767207,-0.01663711,-0.16835603,0.11114337,1.0834363,-0.5150133,-0.07263835,0.054830827,-0.16517083,0.22029305,0.49329266,-0.17962627,-0.29688638,0.09192479,-0.06749909,-0.072753765,0.10270321],[-0.0008402716,-1.1286653,-5.7245965,-0.021644374,1.5435878,-0.1730232,0.21411745,-0.47486955,-0.97386926,-0.5715368,0.8451933,-0.455989,-0.4467363,-0.082325645,0.7459095,0.6310687,0.36110288,-0.34151703],[-1.7693851,0.12620595,-0.3989256,-0.2882022,-0.45917684,-0.51895636,0.84001356,0.61877567,0.27147272,-0.19530535,-0.35681,-0.45012978,0.7122562,0.3551444,-0.45587432,-0.4327567,0.33414394,0.11296678],[-0.08414736,-1.0083802,-0.015756436,0.013720882,1.0453994,-1.1957791,0.71627206,-0.21035555,-0.19702181,-0.27536744,0.35988438,-0.14539826,0.1924023,-0.14444451,0.25051752,-0.033313595,0.12550475,-0.12158435],[-0.30154642,-5.557496,-0.14708285,-0.061846647,2.3995101,-0.1547433,-1.5738837,-4.107894,-5.171764,-1.1092714,-0.02171138,0.11659548,0.45198613,0.6176347,-0.48459208,-1.2427675,-0.49318025,1.0491029]],"activation":"σ"},{"dense_2_W":[[0.03774502,-0.16235852,-0.84784216,0.24940088,0.00461042,0.65833217,-0.11222489],[1.1341851,-0.064238384,1.1198534,-0.95495975,-1.2911308,-1.0256866,0.6400749],[1.062979,-1.3534148,0.47456717,-1.5896825,-0.21420188,-1.0324565,0.31096524],[0.078438394,-0.271086,0.58087903,-0.26364973,0.10504239,-0.92563856,-0.25989658],[0.24416082,-0.7104936,0.24994028,-1.219746,0.37427732,-0.9982437,-0.0085131265],[-0.09752925,0.21119414,-1.1002113,-0.13776001,0.37355924,0.17910865,0.53129876],[0.2012527,-0.11168886,-0.8083448,0.059142426,0.2023561,0.5704213,0.12255705],[0.64825,-0.12111593,-0.76845324,-0.24870408,0.4248867,1.1680412,-0.2043484],[1.7244234,-1.3934715,-0.04146303,-0.17682545,1.7285235,-1.6673733,-3.813261],[-0.48733664,-0.6287612,1.05426,0.05775865,-0.87263334,-1.0111203,0.60572374],[-0.28019178,0.5071182,-0.466659,0.078289345,0.31104136,0.71050084,-0.16471304],[0.30341744,0.039579187,1.2398592,0.29671758,-0.5292248,-1.2144855,-0.31690553],[-0.040978797,-0.28604105,0.5629664,-0.15134554,-0.59253997,-0.5422128,0.19325934]],"activation":"σ","dense_2_b":[[-0.07329691],[-0.0073756496],[0.11507728],[-0.0200944],[-0.35160002],[-0.13647649],[-0.11702968],[0.07018993],[-0.4881218],[-0.11002543],[-0.046954576],[0.07282092],[-0.06980713]]},{"dense_3_W":[[0.3841397,0.43480623,0.3392544,0.11891049,0.19847225,0.45567343,0.56124204,0.73655707,-0.103296585,-0.12169428,0.0068540676,-0.71867234,-0.40767854],[-0.45614606,0.21017289,0.55516654,0.61873233,0.33714756,-0.4300137,-0.45999125,-0.08619196,0.9222072,0.008902227,-0.15612483,0.7118131,-0.082317345],[-0.042307917,0.6266083,0.664274,0.6469083,0.16917458,-0.51057035,-0.20145637,-0.67773443,0.61834735,0.5064825,-0.2500228,-0.056062642,0.3220822]],"activation":"identity","dense_3_b":[[0.016107948],[-0.113635235],[-0.055587772]]},{"dense_4_W":[[-0.3492811,0.56186444,1.1551155]],"dense_4_b":[[-0.04331681]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42082x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42082x00x00x00x00x00x00'.json deleted file mode 100755 index fa23d9871e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42082x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.019431],[0.9383312],[0.43760064],[0.04085473],[0.92240274],[0.9266218],[0.9308925],[0.9144991],[0.8993299],[0.87902194],[0.856193],[0.04076221],[0.04078495],[0.04079549],[0.040720142],[0.040604606],[0.040340398],[0.04001449]],"model_test_loss":0.015206318348646164,"input_size":18,"current_date_and_time":"2023-08-12_16-07-29","input_mean":[[25.50595],[-0.011863799],[-0.0006739514],[-0.01594329],[-0.012065965],[-0.012642977],[-0.012979119],[-0.01383788],[-0.012668227],[-0.014262671],[-0.016552003],[-0.015838692],[-0.015853724],[-0.015880592],[-0.015935425],[-0.015941922],[-0.015968155],[-0.016021552]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.036452126],[0.08559556],[0.2897148],[0.075330995],[-0.38187677],[1.4539754],[-1.2161264]],"dense_1_W":[[-0.0060098697,-0.39788464,-0.0083788065,0.18333316,0.278688,-0.92364454,0.88050914,-0.16357976,-0.083575465,-0.16548778,0.17388147,-0.64590514,-0.2367544,0.16991502,0.39137343,0.3947005,-0.15660408,-0.03307207],[2.8630645,-1.2588997,-0.0027301412,0.24774393,-0.2915709,0.7063696,-0.41898602,0.093648784,0.3480123,0.08518327,-0.19690122,0.02904587,0.4258792,-0.48439965,-0.58783513,-0.51380473,-0.11631057,0.456209],[-0.017119301,-0.7335742,0.0014175244,0.5969601,0.050444994,-0.6665325,0.5107775,0.111380346,-0.09259335,-0.026180675,-0.011466796,-0.4973461,0.1700098,0.035120707,-0.12647136,-0.0991956,0.044152405,-0.060947783],[0.004678411,1.2740623,3.7182605,0.107325286,-1.2989601,-0.3152337,-1.0639912,-0.13160844,2.1075041,1.0793704,-1.4939084,1.1409113,0.07448943,-0.5013081,-0.29907212,-0.39650646,-0.21130306,-0.116951525],[2.8458567,0.54284513,0.0016173293,-0.17757091,0.05277462,-0.094486594,0.62712353,-0.31395078,0.1025354,-0.12772946,0.13789791,-0.20587224,0.3055044,-0.119795896,0.5939448,0.4397611,0.06556392,-0.37161782],[0.4724819,0.80122966,-0.00018380646,-0.039874755,-0.3928932,1.8747684,-1.233508,0.09610313,-0.13470712,-0.06360237,0.15746103,0.67920583,-0.096370995,-0.8378776,0.014750212,0.28160796,-0.1478646,0.080034226],[-0.47802755,0.48921135,-0.0002520188,-0.037732497,0.10487879,0.92998505,-0.55178314,0.10634122,-0.18135986,-0.10310874,0.21691601,0.4927082,-0.095634714,-0.4269393,-0.3520725,0.43727353,-0.1824048,0.10521066]],"activation":"σ"},{"dense_2_W":[[-0.7678551,-0.044020087,-0.9463613,0.1381405,-0.4766844,0.17481054,0.865753],[0.36592254,-0.46206722,0.4263325,-0.5770286,-0.38127115,-0.35710543,-0.46009374],[-0.77888083,0.19055568,-0.7574013,-0.24226372,0.006470128,0.7841768,0.6951729],[0.4839658,0.49723354,-0.119507566,-0.37833682,-0.2862369,0.13223429,-0.08261849],[0.1550176,-0.13229156,0.23890848,0.28497326,-0.06232947,-0.5918447,-0.87441015],[0.38908252,-0.46098205,0.042430878,0.0006829582,0.25034666,-1.0715038,-0.5407985],[-0.62666726,0.47684154,-0.19868156,0.43383852,-0.49297318,0.9425333,0.27851704],[-0.18181121,0.5257746,-0.7636084,0.6897081,-0.76064235,0.20353147,0.13215753],[0.76410335,0.19123517,0.21125565,-0.22053698,0.16143271,-0.004425321,-0.2898052],[0.6294419,0.17306042,0.1091528,-0.00499673,-0.28395087,-0.97709465,-0.25536087],[-0.28397334,-0.055312153,0.44325092,-0.39098385,-0.20454785,-0.043942228,-0.51369905],[-0.4919128,-0.10269968,-0.6502031,0.4973944,-0.42260522,0.057200216,0.23966748],[-0.5128312,0.38837132,-0.107127376,0.24325761,0.16999815,0.28076303,0.35485357]],"activation":"σ","dense_2_b":[[-0.02832953],[0.045545593],[0.037394777],[-0.047663357],[0.037933607],[0.098250054],[-0.06336312],[-0.08578499],[-0.00794813],[-0.05136867],[-0.0020242317],[-0.09399862],[-0.1000513]]},{"dense_3_W":[[-0.48297986,0.3544177,-0.45382679,-0.06326301,0.5731008,0.033288028,-0.3915376,-0.42120582,0.25898603,-0.29080692,-0.17612633,0.12559004,-0.19767617],[-0.6037485,0.5368198,-0.3116054,0.16574962,0.33300138,0.70383537,-0.4044081,-0.5238778,0.40293556,0.65038425,0.26341242,-0.5921214,0.081331424],[-0.3002974,-0.47011936,0.46762595,0.45630494,-0.06353013,-0.33025408,-0.35250518,0.18968482,-0.20597102,-0.1440317,0.03978579,0.48477307,0.10114584]],"activation":"identity","dense_3_b":[[0.06856954],[0.03152135],[-0.011259861]]},{"dense_4_W":[[-0.6018683,-1.0063373,0.005766461]],"dense_4_b":[[-0.035384744]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42083x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42083x00x00x00x00x00x00'.json deleted file mode 100755 index c04c4bf7ba..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017 b'8965B42083x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.785183],[1.3424761],[0.5159871],[0.047890432],[1.3260951],[1.331146],[1.3365234],[1.3069957],[1.2819953],[1.2447248],[1.2092956],[0.04772719],[0.04774223],[0.047755223],[0.047561523],[0.04740499],[0.047128234],[0.04665515]],"model_test_loss":0.01631096750497818,"input_size":18,"current_date_and_time":"2023-08-12_16-36-05","input_mean":[[24.84536],[-0.048694376],[0.0017105383],[-0.0076607447],[-0.043704547],[-0.044807203],[-0.046089165],[-0.04298986],[-0.042797346],[-0.040657774],[-0.038248837],[-0.007561775],[-0.0075660897],[-0.0075722965],[-0.0076475735],[-0.007697426],[-0.0077724564],[-0.0077436664]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.280903],[-1.7886032],[-4.637047],[-0.08578383],[0.010013872],[4.6856623],[-0.22121063]],"dense_1_W":[[-0.09450893,-0.6459062,0.060911775,-0.3847882,0.7519606,-1.8593575,0.8616294,0.053076338,-0.209784,-0.07385902,0.00047539294,-0.4523988,0.2974266,0.38510123,0.259752,0.08684495,-0.02447588,-0.0733537],[-0.6774607,1.2661867,-0.10200818,0.65671134,-0.047138035,0.6458983,-0.24165322,0.062084105,0.14131553,0.28091753,-0.06481851,0.2215787,-0.13829407,-0.5720354,-0.24476062,-0.09048865,0.05114956,0.00428825],[-1.9029608,0.34790626,0.2843667,-0.37467235,0.09965191,0.57280195,-0.17685397,-0.11966289,0.2557388,0.055247348,-0.2157288,-0.08949254,0.4247985,-0.16542377,0.18466538,0.19807269,-0.23189463,0.09547625],[-0.00062151457,0.1738365,0.17885163,-0.57136464,0.012507409,0.7827646,-0.87514424,0.27497044,0.32263565,-0.13115652,-0.28708053,0.9652118,0.20607184,-0.5144796,-0.47407618,-0.042873062,0.12893395,0.18263417],[0.025652306,-2.0052488,-6.667998,0.4208965,1.2458491,0.3907362,1.0876682,-0.3848656,-1.4246505,-0.61824685,1.1011258,-1.3024,-0.37421313,0.12721808,0.6561884,0.37722364,0.08510617,0.3396205],[1.99233,0.6377857,0.28082734,-0.385711,-0.23865217,0.99780643,-0.48828554,0.08000757,0.029273741,-0.082829274,-0.1007471,0.2732823,0.0831288,-0.6843401,0.6745747,0.19553038,0.15868916,-0.2637087],[-0.035898842,-0.044465996,0.013378123,0.08511469,0.28486708,1.4638215,-1.2811527,-0.0017351665,-0.13274787,0.10752207,0.10370681,0.5822642,-0.12452679,-0.58151734,0.121833816,-0.2511263,-0.25619733,0.2831056]],"activation":"σ"},{"dense_2_W":[[-0.8841406,0.4347669,0.84688157,-0.0004789553,-0.5473451,-0.39614245,0.6071275],[-0.59437585,0.033965513,0.24382767,0.5086613,-0.5668177,0.4027159,0.6990393],[0.27216327,0.11812625,-0.6145046,-0.052390628,-0.39457545,-0.293586,-0.3356249],[-0.66689086,-0.19540851,-0.3679948,-0.36721542,-0.4817769,-0.4075158,-0.67281103],[-2.0079339,-0.15370838,0.8236128,0.6912437,0.29243928,0.94582,0.35805795],[0.6160914,-0.4700829,-0.29550225,-0.45972148,-0.2371927,-0.22895168,-0.22462685],[0.21214539,-0.38577923,-0.15344645,-0.3005762,0.33333546,-0.36551368,-0.67323405],[0.26780415,-0.6526573,-0.26887926,-0.39421728,-0.63939315,-0.06335249,-0.06702983],[-0.64520854,-0.13833176,0.710947,0.49081513,-0.67323875,0.88580966,0.07329091],[0.70333093,0.27374974,-0.185739,-0.64055556,0.6837862,-0.8216412,-0.7543152],[-0.08852291,-0.24456227,0.64587975,-0.25254932,-0.8361469,-0.0998585,0.41330463],[0.76102114,-0.52449924,-0.39964664,-0.28608727,-0.010932956,0.20352012,-0.34879187],[-0.5587552,-0.061310817,0.3489882,0.6867392,-0.19598259,0.6264299,0.19196412]],"activation":"σ","dense_2_b":[[-0.3371589],[-0.34260237],[0.0060174274],[-0.14280829],[-0.79392904],[0.1485932],[0.10975139],[-0.21955685],[-0.25368217],[0.059160925],[-0.105888784],[0.061584476],[-0.27724692]]},{"dense_3_W":[[0.599121,-0.09533889,0.046242982,-0.34005862,0.9232934,-0.63216597,-0.14118026,-0.520665,0.07688401,-0.7621056,0.41081268,-0.507315,0.26893604],[-0.13292964,-0.5938322,-0.14970674,-0.35914317,-0.34032637,0.4124289,0.4949658,-0.009953369,-0.6471148,0.6008697,0.5047356,0.4261539,-0.49192414],[-0.40530923,-0.49001616,0.48234347,0.23525164,0.13179244,0.6979752,0.19944161,-0.3692451,-0.49022684,0.55492526,0.17020899,-0.2596992,-0.27337795]],"activation":"identity","dense_3_b":[[-0.018591681],[0.05460255],[0.024361271]]},{"dense_4_W":[[0.7731739,-0.2942781,-0.54992497]],"dense_4_b":[[-0.021991715]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42170x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42170x00x00x00x00x00x00'.json deleted file mode 100755 index c44df15868..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42170x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.6815405],[1.3625606],[0.58612674],[0.04494688],[1.3312421],[1.3441323],[1.3557953],[1.3301966],[1.3021425],[1.2688354],[1.2291747],[0.044845853],[0.044869147],[0.044881903],[0.044806324],[0.04471491],[0.044416413],[0.04393822]],"model_test_loss":0.010017327032983303,"input_size":18,"current_date_and_time":"2023-08-12_17-39-46","input_mean":[[22.628992],[-0.11303276],[0.007194183],[-0.0077724075],[-0.11107788],[-0.112366706],[-0.11259246],[-0.11006202],[-0.10841513],[-0.104063615],[-0.09847846],[-0.0077845864],[-0.0077784657],[-0.0077716475],[-0.007819506],[-0.007886005],[-0.0080318935],[-0.0081485715]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.21272992],[-0.40113866],[-0.046252824],[-1.1976674],[-1.8280349],[0.43455112],[0.41996923]],"dense_1_W":[[-0.014234041,-0.78265864,-0.13875955,0.18335098,0.23734437,-0.50521135,0.36379108,-0.4259525,0.4898528,0.0040126243,0.019784093,-0.032719463,-0.4327173,-0.12524551,0.7217114,0.05992928,0.002012295,-0.20088603],[-0.036329545,-0.9737573,-5.137863,0.083788216,-0.005417048,-0.17019805,-0.02595917,0.034362078,-0.2063752,0.23753147,0.70431274,-0.3613305,0.05551018,0.15823703,0.08872215,0.075007804,0.04234053,-0.056786302],[0.00834581,-0.96139866,0.014483826,0.055574536,0.22303146,-1.4104741,0.92028916,0.087765716,-0.16381508,0.3775856,-0.3001809,0.12152302,-0.42909965,0.40768436,0.0117414165,-0.14114279,-0.15148588,0.26370925],[-0.52212185,-0.03799507,0.24594627,-0.28721508,-0.13069189,0.75029343,-0.48417374,0.043601163,0.30521616,0.23167257,0.03514275,0.32121775,0.11313678,-0.6157623,0.16969404,0.1570377,-0.20692776,0.15328379],[-0.72681564,-0.06951357,-0.28516898,-0.08874456,0.046744134,-1.0358999,1.0505315,0.013021108,-0.5818019,-0.11940496,-0.08663402,-0.30453667,0.6163768,0.28448704,-0.41274244,0.1396545,0.027995694,-0.04543083],[1.1373413,-0.22728406,0.34642276,-0.19258007,0.7746351,-0.67045534,0.95286924,-0.21672118,0.0045977663,-0.18956426,0.669332,0.022881322,-0.15852845,-0.11712322,0.21890385,-0.047339663,-0.076035015,0.09771824],[1.158495,0.4386377,-0.3719728,-0.2144668,-0.28061992,0.37479827,-1.125051,0.20529382,-0.20885709,-0.18522696,-0.35365984,0.9139095,0.5455004,-0.16538139,-0.90117735,-0.37809762,0.024544928,0.43491235]],"activation":"σ"},{"dense_2_W":[[0.9442889,0.06396063,0.1758221,-0.9002739,0.51660156,0.6283171,-0.15372173],[-0.21146928,-0.46287906,-0.3174703,0.52997434,-0.60623443,0.4278871,0.5900774],[0.36982772,-0.58558965,1.3331947,-0.12588388,0.73645073,0.71320856,-0.82657343],[0.9362422,0.39615652,0.15127127,-0.60997945,0.20599456,0.57852656,-0.34932035],[-0.051511385,-1.3649589,-0.30547243,0.5103264,0.15643549,-0.6987231,-0.78192246],[-1.0683442,0.5136093,-0.5176573,0.054374628,-0.79540557,0.30752757,-0.2061963],[-0.09987685,-0.041346654,-0.9594419,0.56500435,-0.41152915,-0.21413708,0.30724752],[0.24056341,0.9189844,1.2736111,-0.57043445,-0.6264625,1.476869,-0.63796276],[-0.39368296,-0.5534738,-0.6872756,-0.3378118,0.019038709,-0.16970441,-0.6788282],[-0.43239704,0.4175175,-1.1101261,0.14615986,-0.51680034,-0.4460474,0.18916978],[0.34036997,-1.2931368,0.24365155,0.36805943,-0.8831002,-0.78154045,-0.9917771],[-0.32418334,-0.21353374,-0.8684678,0.71919113,-0.3519593,0.29612234,-0.24847104],[-0.6143994,0.334264,-0.738587,0.38311487,-0.8502191,0.24822249,0.52923447]],"activation":"σ","dense_2_b":[[-0.046749797],[0.15821725],[-0.14121938],[-0.00466868],[-0.21171582],[-0.12640443],[-0.01650508],[0.043904293],[-0.39722887],[-0.041803863],[-0.17979127],[0.04611048],[-0.08694865]]},{"dense_3_W":[[0.47707623,-0.55884546,0.3642584,0.61173815,-0.45111135,-0.58238584,-0.6464996,0.51249677,0.17997093,-0.21995978,-0.25227636,-0.19393432,-0.58519727],[0.41195044,-0.34169996,0.24929023,0.4966983,0.04403884,0.22156799,-0.3648181,-0.08629075,-0.32962176,-0.35790387,-0.23305754,-0.5900693,-0.55587316],[0.16219983,-0.60253245,-0.13929227,0.70285386,-0.39211234,0.26089627,-0.09964737,0.33340716,0.12721112,0.27053747,-0.23665811,-0.37967107,-0.61005354]],"activation":"identity","dense_3_b":[[0.047260348],[0.057699345],[0.0503478]]},{"dense_4_W":[[-1.0821502,-0.70280385,-0.16161306]],"dense_4_b":[[-0.045549482]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42171x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42171x00x00x00x00x00x00'.json deleted file mode 100755 index e36c7414c1..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42171x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.850636],[1.0534494],[0.559162],[0.039194528],[1.0216674],[1.0324214],[1.0434673],[1.0372584],[1.0196428],[1.0042849],[0.98527515],[0.039155982],[0.039141923],[0.03912828],[0.03902883],[0.03896556],[0.03880961],[0.03858737]],"model_test_loss":0.007366378325968981,"input_size":18,"current_date_and_time":"2023-08-12_18-05-25","input_mean":[[22.558586],[0.012600959],[-0.0025238749],[-0.0026826798],[0.012323804],[0.012055752],[0.012161658],[0.01208182],[0.013478406],[0.012696328],[0.0117868],[-0.0026575418],[-0.0026759468],[-0.0026921802],[-0.0026960133],[-0.0027045996],[-0.0027334057],[-0.0027859134]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[4.3723984],[-0.15515873],[0.11519163],[0.06005554],[3.4827287],[0.42637882],[-0.33662567]],"dense_1_W":[[1.635911,-0.8581116,0.60294753,0.22644173,0.56974345,0.537524,-0.28151554,0.49941906,0.39198443,-0.07235275,0.006073699,0.14474358,-0.32794192,0.13542445,-0.119024836,-0.14169936,0.3387417,-0.20942728],[-0.346328,-0.5516171,0.080080934,0.10132348,0.4069819,-1.2606146,0.53356946,-0.32096785,0.14152372,-0.19885544,-0.006135965,-0.4611887,0.13272883,0.46906894,0.044298,-0.22844265,-0.070147365,0.20264639],[-0.0017895487,0.4250715,3.6650927,0.09883716,-0.20037115,-0.10519589,-0.31081927,0.33351684,0.6235205,-0.24577214,-0.35088176,0.16477962,0.08359709,-0.12857589,-0.35176766,0.08673794,0.0882971,-0.0059149545],[-0.11156434,-0.07133895,-0.11842378,-0.2705628,0.3160349,-1.201357,0.64614654,-0.29452515,-0.03474319,0.040595938,0.13474983,-0.34016025,0.29270774,0.2156598,0.2662016,-0.095750175,0.18576562,-0.1266449],[1.566436,0.40248048,-0.5471031,-0.2949783,-0.33196628,-0.70656186,0.41840243,-0.17929772,-0.5059166,0.11792245,-0.014220853,0.08556844,-0.29646376,0.3219811,0.003027516,0.2374258,-0.16363016,0.069542915],[1.1214007,0.76452684,-0.106327794,0.3591528,0.45266876,-1.0236844,0.8478621,0.6426136,-0.08401936,0.3613498,-0.2025572,0.16258357,-0.3565566,-0.0661512,-0.29554963,0.25371164,-0.3117673,-0.017764365],[0.15459706,-0.6427235,-0.107100666,0.15153684,0.6515941,-1.4472166,0.28652865,0.64169884,-0.013493055,0.084728494,-0.08627843,-0.32101175,-0.511683,0.23642686,0.5705781,0.32341844,0.04121637,-0.35112992]],"activation":"σ"},{"dense_2_W":[[-0.7762452,-0.849805,-0.46875656,-0.74493283,0.18020831,-0.4340312,0.25214154],[-0.29184672,-0.7365605,-0.595678,-0.13487294,-0.027134769,-0.20032321,-0.112272106],[0.58472466,-0.82953453,-0.005004089,-0.5499627,0.17766191,-0.20011434,-0.5746712],[0.18799576,-0.08261969,-0.26112568,-0.27001104,-0.38785893,0.10126745,-0.7606747],[0.44626936,0.12008678,0.2681783,-0.8564858,0.13984889,0.1533924,-0.8285644],[0.034566738,0.8191327,-0.3085401,0.77344036,-0.120254815,0.10792034,0.12895963],[-0.74384415,0.62587434,-0.0201533,0.43589312,-0.37061056,0.17112038,0.5242522],[0.2502627,-1.4431168,0.52936316,0.5863533,-1.8113189,-0.40397888,-0.21871096],[-0.6663258,0.44417387,-0.7050019,0.6507446,-0.296155,-0.55173874,-0.3932162],[-0.3191022,-0.4508303,-0.6623701,-1.0217099,-0.26747382,-0.14080943,0.05274293],[0.7867121,-0.5575085,0.38432392,0.3111023,-2.326249,-1.2271587,-0.10263035],[-0.01625549,0.5269726,-0.6120971,0.53062654,0.41914165,0.58355737,0.03725023],[-0.14983092,-0.43453297,0.32586545,0.15301059,-0.298674,-0.38269258,-0.12950632]],"activation":"σ","dense_2_b":[[-0.2599826],[-0.23439017],[0.092643164],[0.010998941],[0.09755141],[-0.10229962],[-0.06416034],[0.17825136],[-0.17380705],[-0.22213228],[-0.01849935],[-0.037762668],[-0.034081236]]},{"dense_3_W":[[0.24201153,0.27176222,0.48346063,0.45460057,0.5518781,0.11765685,-0.45951,0.040261418,-0.32136354,0.42783323,0.2824862,-0.4817042,-0.3478935],[0.25385153,0.13409254,-0.61687577,-0.41602758,-0.31623435,0.6585921,0.4292418,-0.48805797,0.1712523,0.39033636,-0.45903277,0.52522135,-0.5536476],[-0.42142174,0.49712908,0.0066777696,0.19092213,-0.19024393,-0.51191115,-0.51730525,-0.145093,-0.37869886,-0.6067165,0.27452636,0.5235049,0.5219291]],"activation":"identity","dense_3_b":[[-0.0019366292],[-0.004374928],[0.023441652]]},{"dense_4_W":[[1.1235595,-1.012536,-0.048990816]],"dense_4_b":[[0.00054319843]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42180x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42180x00x00x00x00x00x00'.json deleted file mode 100755 index f6e6875fb6..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42180x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.5956964],[0.71566606],[0.40817738],[0.030724205],[0.697758],[0.7050867],[0.7110168],[0.7090755],[0.704616],[0.7050678],[0.7017272],[0.03057917],[0.030627273],[0.030674666],[0.030662438],[0.030695168],[0.030730452],[0.030547515]],"model_test_loss":0.005593742243945599,"input_size":18,"current_date_and_time":"2023-08-12_18-31-36","input_mean":[[18.236588],[0.10607195],[-0.03237979],[0.01414653],[0.10869373],[0.10751717],[0.10631519],[0.095033936],[0.09223452],[0.08335266],[0.075875334],[0.014149798],[0.014185712],[0.014213116],[0.014326014],[0.014364046],[0.014352649],[0.014447873]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.21198542],[-2.6553576],[0.20141259],[0.95158356],[-0.5720143],[0.39397573],[-0.4670486]],"dense_1_W":[[-0.00029343241,-0.49663246,0.017366314,-0.12524623,0.020472532,-0.89937484,0.38001934,0.084407,0.0400682,-0.055563126,-0.091518156,-0.057863355,0.076088704,-0.047266904,0.11677408,-0.11511501,0.08395411,0.07032127],[-1.1604841,0.50435513,0.10866094,-0.38009703,-0.067992724,0.8220403,-1.8998632,0.6885379,0.45261034,0.09571614,-0.39597392,-0.3781081,0.03911253,0.39478612,0.39906728,0.059939872,0.06685323,-0.2039767],[0.86580884,-0.6447551,0.06702498,0.3656542,0.49015638,-1.1621298,0.70610285,0.38969237,0.4859566,0.36371088,-0.5152764,-0.43576756,-0.3097063,0.059733965,0.5456647,0.20413095,-0.28141046,-0.13499509],[0.9506561,0.33130687,0.055115584,-0.35157964,0.1601246,0.5376464,-0.7747868,-0.28408384,0.09547507,-0.23935354,0.24678634,0.25146312,0.43105263,0.010345131,-0.64360464,-0.1637928,0.4655862,-0.011340331],[0.011468432,1.1100329,6.454579,-0.09630004,-0.09938363,-0.035011847,-0.51070076,0.32011735,0.28890565,-0.0070284377,-0.8069142,0.36875013,-0.10292811,0.04136438,-0.4851647,0.10500297,0.22695696,-0.022597108],[0.55722225,0.2913517,0.06907888,-0.1502978,-0.5804214,1.1116054,-0.7745691,0.1985203,-0.11460045,0.14750798,-0.1172053,-0.00924517,0.25824112,-0.13810264,0.19143151,-0.018714879,-0.36252472,0.21987407],[7.108331e-5,-0.16992536,0.5472812,-0.37839067,0.18227997,1.005237,-0.9246754,0.05019804,0.19119476,0.20836721,-0.09654861,0.2401787,-0.40744683,-0.31037423,0.24721394,0.035022534,-0.0010219115,-0.37515312]],"activation":"σ"},{"dense_2_W":[[0.031580374,0.32096317,0.08259337,0.48913407,-0.24779709,0.47663438,-0.27535772],[-0.7346924,-0.08216103,0.05271296,-0.2585462,-0.16613883,0.035694335,0.6171577],[0.37460434,0.7498522,-1.41457,-1.657875,-1.2513721,-1.2112695,0.19442175],[-0.43960452,0.89257705,-0.25445974,0.07596238,-0.4224754,0.4412636,0.714036],[-0.21586035,-1.074201,0.49453756,-0.54887825,0.26405144,-0.68578094,-0.7791566],[-0.38307914,0.5247953,-0.21214375,0.52114254,0.33317557,0.21650434,-0.05312382],[0.46901834,-0.32129788,0.8633818,-0.29700297,-0.2139187,-0.39682165,-0.5993696],[1.3140488,-0.8290484,1.0804474,0.47383633,-0.5198381,-0.58393943,0.035804532],[-0.22552004,0.030722179,-0.70003814,0.339238,-0.08206504,-0.425623,-0.1990634],[0.71316224,-0.49133265,0.12954167,-0.7012649,-0.14375544,-0.21532835,-0.18687665],[0.99007577,-1.001546,0.5625099,-0.7423299,0.2236182,-0.14007774,-0.33882037],[-0.5948786,0.55410933,-0.36279666,0.11258444,0.5546571,-0.18480037,-0.37986085],[-0.9709514,-0.048795592,-0.0681278,0.24821533,0.3230478,0.041420642,0.60907954]],"activation":"σ","dense_2_b":[[-0.08150623],[-0.09351969],[0.036499698],[-0.12114925],[0.1371385],[-0.17559104],[0.16320653],[0.39418298],[-0.25063452],[0.045626037],[0.14293382],[-0.19067796],[-0.14629959]]},{"dense_3_W":[[0.1686224,0.077352226,-0.7372458,0.54665744,-0.39950836,0.30807123,-0.34158686,-0.50262797,0.31327793,-0.1562205,-0.21310961,0.46808118,0.6072344],[-0.38100314,-0.32793987,-0.36607596,0.250266,-0.46443465,-0.37167656,0.50372356,0.51983595,-0.038650624,0.008295879,0.07703269,0.04023035,-0.12850939],[0.27967122,0.4289127,-0.5830814,0.40497577,-0.31304854,0.30774248,-0.46728247,-0.48856315,-0.5128953,-0.46290538,-0.5038767,0.021850327,0.48637435]],"activation":"identity","dense_3_b":[[-0.030914357],[0.019430986],[0.018790174]]},{"dense_4_W":[[1.097547,-0.026450653,0.49955416]],"dense_4_b":[[-0.025014628]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42181x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42181x00x00x00x00x00x00'.json deleted file mode 100755 index 2570b49139..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'8965B42181x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.209153],[0.56191576],[0.30280617],[0.029290121],[0.56198466],[0.5629255],[0.5632454],[0.5529423],[0.5457737],[0.5399884],[0.5333994],[0.029308232],[0.029312193],[0.029313201],[0.029210748],[0.029177375],[0.02916549],[0.029083245]],"model_test_loss":0.0059767006896436214,"input_size":18,"current_date_and_time":"2023-08-12_18-56-01","input_mean":[[21.154913],[0.010469119],[0.00451821],[0.020266687],[0.009149304],[0.0099420305],[0.010431521],[0.011106589],[0.013026866],[0.015419768],[0.018629367],[0.020197067],[0.020221224],[0.020262599],[0.020369908],[0.020377211],[0.02038677],[0.020427668]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.032562368],[0.2667309],[-3.3975918],[-0.16405424],[3.4655445],[-7.2675724],[-1.1106223]],"dense_1_W":[[0.2530883,0.53237253,0.022144921,-0.20935972,-0.5053756,1.1278487,-0.7458744,-0.03808766,-0.08444307,0.12516658,-0.025194744,0.5732315,-0.14615831,-0.35127425,-0.15609278,-0.081573084,0.2889299,-0.056264035],[0.34920308,0.17837015,-0.018961329,0.22636858,0.41322023,-1.1747947,0.8681209,-0.53292376,-0.44061154,0.23169354,0.09196306,-0.4216225,-0.040040225,-0.028847596,0.5770588,-0.04013367,0.15739974,-0.29588875],[-1.2440773,2.9741986,-0.015545401,0.6699104,0.10026246,2.3330846,2.2823873,-0.6999431,-3.0649312,0.6264743,1.9608381,0.023817599,-0.6748272,0.24278682,-0.4272999,0.48700577,-0.053938422,-0.14937739],[0.12704581,-0.74948984,-5.975789,-0.3972795,0.97803533,-0.7561826,0.34060618,-1.0813448,-0.4782963,0.5196659,0.56873465,-0.14966846,-0.20922862,0.39868122,-0.17166515,-0.09302081,0.5862183,0.30957884],[1.4973711,-1.017241,0.020719383,-0.7863886,0.08703435,0.023158638,0.9363649,0.34963033,0.030911481,0.08855366,-0.034877688,0.09213344,-0.2908485,0.6495234,0.08364163,0.039586175,0.41629386,-0.2841797],[-2.6902182,-1.454271,0.010997178,-0.28280547,0.757442,-0.34354633,1.3582447,-0.3404384,-0.058033567,0.22861616,0.13654716,-0.35976127,0.3847413,0.6788782,-0.13538547,-0.715732,0.10295989,0.2687211],[0.7631619,-3.5063555,-0.0073654596,-0.5252896,-2.02067,-3.7005508,-1.8967742,-0.3488098,-0.4290062,-1.0894184,-0.8274565,0.20361504,-0.06869336,-0.00241295,0.15396996,0.13525395,0.19794835,-0.16415168]],"activation":"σ"},{"dense_2_W":[[-0.48136654,-0.9834331,0.32757175,-1.0854254,-1.5122548,0.03486615,-0.36054364],[-0.54480904,0.4169905,-0.61831635,0.10131936,0.5399218,0.059965108,0.30036604],[-1.655585,0.38479826,1.2823216,0.40274566,-0.2841753,2.3214834,-0.7712572],[0.61412394,-0.25269333,0.42487213,0.27490515,-0.10738923,-0.2351683,-0.027205668],[0.016566647,-0.8527608,-1.2557126,-0.6651972,-0.2184166,-1.6755227,0.7370958],[0.87999916,-0.8127039,0.2320283,0.12997639,-0.026233492,-0.923599,0.28825673],[1.0059335,3.5542972,-2.7622373,0.606758,2.7553868,-3.272648,3.1044261],[1.2445208,-0.57529145,-0.018139282,0.16910729,-0.47984317,-0.32202503,-0.40446222],[0.59024185,-0.15905726,-0.0014694524,-0.13362607,0.05351007,-0.23868667,-0.34731996],[1.6630312,0.10935514,2.5811799,-0.5959014,1.0950274,-2.4247248,-0.32879606],[0.42110145,-0.5520846,-0.30354732,0.4258476,0.12350095,-0.42948973,-0.33731243],[-0.10480609,1.0622531,-0.70043504,0.7745802,1.81419,-0.5862416,0.9866968],[0.892946,-0.8087333,0.85307103,0.16791096,-0.089219026,-0.49379104,-0.23497693]],"activation":"σ","dense_2_b":[[-0.15048273],[-0.005168303],[-0.033159684],[-0.1512387],[-0.26582178],[-0.069072716],[0.8422594],[0.08777569],[-0.010337959],[0.4020618],[-0.13930158],[0.27973402],[0.022490095]]},{"dense_3_W":[[0.023880383,-0.64809823,-0.04122315,0.5025599,-0.37605396,0.44815058,0.2004994,0.12245838,0.060301386,-0.092283376,0.20429155,-0.4129402,0.1394047],[0.13174233,0.12339004,-0.77201855,0.41352215,0.20950833,0.6537427,-0.7955242,0.025324047,0.0014908814,0.63648015,-0.014125444,-0.052981257,-0.31764406],[0.73352814,-0.40766987,-0.43053687,0.12957405,0.37287924,0.381178,-0.84177256,0.78270406,0.44731426,0.5089168,0.26753783,-0.45765585,0.35287583]],"activation":"identity","dense_3_b":[[-0.03262107],[-0.05573517],[-0.069711655]]},{"dense_4_W":[[0.03428719,0.48351324,1.3998046]],"dense_4_b":[[-0.06378867]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json deleted file mode 100755 index e7ee2b96ae..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.59677],[1.2723572],[0.5889571],[0.044212513],[1.2523131],[1.2586851],[1.2638719],[1.2450465],[1.227399],[1.2008731],[1.1704836],[0.044007845],[0.044053588],[0.04408408],[0.044052377],[0.043957964],[0.043728314],[0.043399837]],"model_test_loss":0.007355204783380032,"input_size":18,"current_date_and_time":"2023-08-12_19-23-58","input_mean":[[22.276354],[-0.037774753],[-0.007627978],[-0.011369784],[-0.037570585],[-0.038871903],[-0.040346414],[-0.040468186],[-0.040564455],[-0.03907898],[-0.037528113],[-0.011408063],[-0.011410129],[-0.011406415],[-0.0112786535],[-0.011247568],[-0.011202381],[-0.011247169]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.5261913],[-3.268581],[-0.029488502],[0.19144095],[-0.13675566],[0.12416384],[3.4747343]],"dense_1_W":[[-0.05226453,-0.24290532,-0.006649759,-0.2001671,0.09439727,-0.8264187,0.89495164,0.10392995,-0.09171039,-0.025333034,-0.018208345,-0.0045733196,0.07264264,0.17861007,0.2659576,-0.2747786,-0.35005352,0.31092092],[-1.4148408,-0.5394024,-0.25498414,-0.19303249,-0.2991067,-0.4224668,1.5064957,-0.47802028,-0.10831802,-0.091429316,-0.19356096,-0.3577177,0.48197216,0.13847184,0.45745626,-0.6015107,-0.19103733,0.25586933],[-0.015936209,-0.49370927,0.019225124,0.28393698,0.3275402,-1.0504159,0.8342227,-0.47017115,0.261455,0.11170544,-0.2031133,-0.6536298,-0.1680887,0.4808763,-0.014751369,0.033018075,0.37287006,-0.33709157],[-0.058008436,0.2024408,0.010655787,0.08164171,0.07408095,0.9617647,-1.2104056,0.081101894,0.20298839,0.08843122,-0.038386825,0.12976207,0.15168756,0.2055462,-0.6481027,-0.41196758,0.44144708,0.039478734],[0.006327593,1.225342,5.0604053,-0.32776642,-0.7639897,0.25207078,-0.25701052,0.27489042,0.7114278,-0.030908214,-1.028742,0.5304315,0.58392227,-0.3043921,-0.20152508,-0.217611,-0.5092573,0.44345003],[-0.005554315,0.6300724,-0.008829019,0.120132565,-0.0025714925,0.65304613,-0.54008144,0.36489114,0.60639745,-0.013963489,-0.41547593,-0.08670717,-0.31030667,0.011262129,0.0887775,-0.084896035,-0.3349578,-0.08532151],[1.4905181,-0.054565854,-0.26902393,0.3803058,-0.16003686,-0.19756374,0.59131384,-0.33023885,-0.21001525,-0.16574259,-0.14300068,-0.40850276,0.3227794,-0.06551579,-0.043412447,-0.26335156,0.075089745,0.0049520573]],"activation":"σ"},{"dense_2_W":[[0.6818973,0.09662785,0.85118216,-0.5597033,-0.51376563,-0.54998875,1.1681647],[0.11423674,1.5319918,0.5061838,-0.93979394,-0.83879524,-0.30968133,-0.8372116],[0.10013085,0.99290025,0.58343273,-1.0841141,-0.051542744,-0.5877158,-0.34524262],[0.30525035,2.2245643,0.78550303,-1.3862584,-0.86583656,-1.0520891,-0.75581723],[0.42648727,0.535297,0.8396946,-1.0172952,0.33770114,-1.0176997,-0.2623012],[-0.8693874,-0.047947355,-0.5417374,0.7271871,0.28763005,0.6387064,-1.211415],[0.24115744,1.5529282,0.49222645,-1.2373098,-0.4833875,-0.2019102,-0.48312268],[0.067739554,1.5064629,0.62205225,-0.7509757,-1.1738783,-0.25657117,-0.88183194],[-0.8212304,-0.18271463,-0.057214897,-0.032312606,0.24952747,-0.11964027,-1.2044641],[-0.93778396,0.48313844,-0.7947098,0.005431058,0.4053761,0.51689285,-1.1750771],[-0.97015196,0.19310886,-0.8617701,0.16075231,0.02563181,0.19641571,-0.2102881],[-1.4093407,1.1116021,-1.282566,0.67514616,0.7852251,0.6313887,-1.5295231],[-0.7758126,-0.17416649,-0.65078825,0.99865323,-0.19658208,0.2925777,-0.52684647]],"activation":"σ","dense_2_b":[[-0.007298762],[-0.5215708],[-0.26419812],[-0.39559385],[-0.1565479],[-0.04413851],[-0.48452112],[-0.63588786],[-0.060304374],[-0.08904473],[0.00323588],[0.005885602],[0.16125442]]},{"dense_3_W":[[0.6738338,0.24916402,0.48290968,0.9055114,0.4307571,-0.6490499,0.77687776,0.041201606,-0.46112925,-0.6019568,-0.7511755,-0.5311844,-0.9066927],[0.55784255,-0.05097351,0.6607086,0.01611087,0.48693258,-0.5370103,-0.2871033,0.40592095,-0.09984769,-0.1430968,-0.6162407,-0.5603644,-0.298156],[0.056438137,-0.6330188,-0.16844268,0.7197222,0.15123138,0.111305945,0.41622633,0.04650888,0.45203698,-0.6876475,0.39633313,-0.6461186,-0.060092986]],"activation":"identity","dense_3_b":[[-0.07432213],[-0.06564714],[-0.075471886]]},{"dense_4_W":[[-0.7008827,-0.1666988,-0.049054958]],"dense_4_b":[[0.071705334]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json deleted file mode 100755 index b61e726f55..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.78665],[1.1481314],[0.5406096],[0.039362922],[1.122932],[1.1308159],[1.1390376],[1.132657],[1.116679],[1.0969441],[1.0693002],[0.03927925],[0.039297566],[0.03930563],[0.0391093],[0.038840305],[0.03844836],[0.03801854]],"model_test_loss":0.006799423601478338,"input_size":18,"current_date_and_time":"2023-08-12_19-50-55","input_mean":[[22.356323],[-0.06985197],[0.00034995607],[-0.006157977],[-0.06978653],[-0.070587754],[-0.07151841],[-0.06944062],[-0.0665041],[-0.06379645],[-0.056661922],[-0.006219425],[-0.0062195924],[-0.0062180334],[-0.0062626824],[-0.006254376],[-0.0062909345],[-0.0063469317]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.26157844],[-3.8585093],[-0.056915253],[0.4083386],[0.12701957],[3.294551],[-0.011678797]],"dense_1_W":[[-0.017985545,-0.8749716,-0.05120776,0.67056817,0.1291728,-0.97086567,0.46367484,-0.20084848,0.33947694,0.118452,-0.07002966,-0.34398422,-0.027073678,0.5324926,0.094694346,0.5049914,0.31055605,-0.0054265293],[-1.4531353,0.09739576,-0.27593565,-0.3858397,0.09826383,-1.2416679,1.3741181,-0.5542574,-0.5062809,0.07726387,0.020567052,-0.49037158,0.21178146,0.7057941,0.033919472,0.1661194,-0.23747294,0.034861527],[-0.0022317865,1.2110817,5.054823,-0.3174173,-0.5742262,-0.15558177,-1.1665634,0.4472988,0.7720721,0.88218236,-1.1828778,0.6001719,-0.02098756,-0.3855406,-0.040552955,0.013535376,-0.0024735162,0.12027036],[-0.11180433,0.16049975,0.03677955,0.12961647,-0.2533068,1.1377895,-0.8505473,0.22427894,-0.13692026,-0.008696595,0.07835157,0.09832897,-0.14512521,-0.122960515,-0.024571015,0.11796106,-0.04595939,-0.025691045],[-0.3685039,-0.23575602,0.066452056,-0.07549508,0.41795194,-0.64417434,0.42375267,0.11620539,-0.27086356,-0.21933734,0.3035312,-0.105002984,-0.06251225,-0.01299668,0.26163852,-0.068665646,0.29290092,-0.22712018],[1.2734846,0.058355737,-0.24286984,0.37113938,-0.109489724,-0.5431782,0.74100715,-0.44564164,-0.23814303,0.03617263,-0.045741204,-0.4850852,0.37123144,-0.04264438,-0.179189,0.18089756,-0.20485662,0.024584953],[-0.008104353,-0.44774678,0.017182589,0.25728852,-0.18980739,-1.1090665,1.0207343,0.018984688,-0.23286112,0.07714398,-0.066708885,-0.42167252,0.033037923,-0.10394543,0.2788337,0.29151297,-0.11658049,-0.12395523]],"activation":"σ"},{"dense_2_W":[[-0.006371241,0.07629968,0.4152738,0.45680737,-0.399096,-1.0571772,-0.77203304],[-0.114975244,-0.78080434,0.33340687,0.5302852,-0.30048347,-0.95070535,-0.059019156],[0.0917907,-0.6346803,-0.03395308,0.27547774,-0.5208018,-0.56345195,-0.42710516],[-0.53994197,-0.08138468,-0.10966242,1.0073916,-0.22134155,-0.4202999,-0.558325],[-0.0911323,0.1374469,-0.05927406,-0.18155636,0.46053857,0.037110776,0.6041021],[0.044924278,1.207312,-0.80209786,-1.0643513,-0.19404407,-0.4108685,0.552001],[-0.20629992,0.87369746,0.38171571,-0.8638534,0.297487,0.10098056,0.809521],[-0.112105414,0.162961,-0.2513493,-0.67849934,0.5619054,0.33094102,0.75464505],[0.27615786,0.43389356,-0.113371626,-1.0247736,0.27918342,-0.2875816,0.69900244],[0.09716652,-0.2904934,0.36968207,0.40281,-0.42739582,-1.1725587,-0.46363854],[0.013255812,-0.4462732,0.1877262,0.54117006,0.09497548,-0.9675889,-0.5686861],[0.2776247,-0.28995666,0.21805735,-0.6418641,-0.6156117,0.044422686,2.309031e-5],[0.26508242,0.77385896,0.0650336,-0.37672806,0.4043684,0.22012536,0.032721337]],"activation":"σ","dense_2_b":[[-0.10330615],[-0.033679716],[0.045983385],[0.11898316],[-0.08782593],[-0.23800431],[-0.1865168],[-0.00038356465],[-0.15165646],[-0.14285177],[-0.032520227],[-0.14164776],[-0.17053805]]},{"dense_3_W":[[-0.45539868,-0.3461434,-0.62710863,-0.75514674,0.14802113,0.7396569,0.13793553,0.5599326,0.21306054,-0.16648014,-0.70004004,-0.02903243,0.519504],[-0.3650457,-0.3078859,0.5707353,0.12494614,-0.4517208,0.6094919,-0.27713495,-0.5677946,0.530929,0.026477134,0.34963655,0.25523546,0.07211842],[0.40082094,0.29107258,0.15391554,0.028763723,-0.07464035,-0.20093055,-0.6449461,-0.21919955,-0.18354571,0.67392844,0.4189149,-0.19322155,0.3498275]],"activation":"identity","dense_3_b":[[-0.002849253],[0.04010156],[-0.008000429]]},{"dense_4_W":[[-1.1442624,-0.018074226,0.46292245]],"dense_4_b":[[0.00046221056]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json deleted file mode 100755 index cbba3e3e97..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.339975],[1.3256136],[0.593127],[0.04754541],[1.3010378],[1.3100988],[1.3191553],[1.2989383],[1.2751849],[1.242973],[1.2088765],[0.047443245],[0.04748061],[0.04751091],[0.047400266],[0.047291804],[0.0470829],[0.04672949]],"model_test_loss":0.007941454648971558,"input_size":18,"current_date_and_time":"2023-08-12_20-18-02","input_mean":[[22.804787],[-0.0012492489],[0.0049283556],[-0.0027200934],[-0.0009171635],[-0.0005450689],[-0.00045307644],[0.0014277239],[0.0042266008],[0.004571549],[0.007173938],[-0.002649595],[-0.0026737156],[-0.002687819],[-0.0027264915],[-0.0028076714],[-0.0028791525],[-0.0030240817]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.05866234],[4.095448],[0.05124582],[-4.5607123],[-0.5631151],[0.019527452],[-0.044129238]],"dense_1_W":[[-0.030550428,-0.08043591,0.08307903,0.24843186,0.23929211,0.71641713,-0.8338393,0.16555603,0.2527681,-0.11340044,-0.034163836,0.21635275,0.48766017,-0.4958458,-0.12009069,-0.45047837,-0.40487534,0.5188204],[1.3933464,0.39291653,0.20624635,0.28392497,-0.20537527,0.33041698,-0.82583904,0.5374484,0.5927526,0.05136005,0.06089886,0.0043515163,-0.0073857335,-0.6039868,0.1363052,0.13789289,-0.076400414,-0.2556218],[0.00040147355,-1.2506115,-4.6456604,0.022542994,0.6865295,0.030435719,0.6394426,0.289509,-1.2726502,-0.48925576,1.074512,-1.0973631,-0.17780465,0.30962852,1.0192771,0.8037391,-0.07365006,-0.7483875],[-1.4990337,0.4968039,0.22349183,0.32746932,0.12910442,0.20665137,-1.306896,0.6917486,0.79503983,-0.16803351,0.15006495,0.06984487,-0.42613754,-0.23034474,0.035791446,0.18769096,-0.095758244,-0.27291724],[0.17470996,0.32795563,0.034444466,0.06723942,-0.6096647,0.8110515,-0.2520832,0.11456141,-0.15719128,0.21490517,-0.105078675,0.40423924,-0.10924174,-0.4147324,0.01310793,0.060144518,-0.13492018,0.059378713],[0.006133638,-0.3088513,0.04955513,0.17181134,-0.07184565,-1.4350437,1.1074777,-0.13354936,0.06834596,0.08551515,-0.19919638,-0.08143802,-0.55520076,0.52157044,0.25806877,-0.13898116,-0.09956009,0.13659504],[-0.508209,0.31000626,-0.037681013,-0.057895504,-0.75460684,1.1465745,-0.8317998,0.35057747,0.09632918,-0.20959972,-0.16074719,0.056147385,0.076875456,0.13462108,-0.33426112,-0.027258357,0.3241483,-0.0732327]],"activation":"σ"},{"dense_2_W":[[0.25001925,-0.5711229,-0.88617605,-0.18417396,0.33657238,-0.07999938,0.10933263],[-0.015448602,-0.8196552,-0.31138465,-0.77860475,-0.6738751,-0.08348504,-0.19269453],[-0.41236618,-0.9773098,0.30927274,-0.60864997,-0.016705617,0.75516015,-0.3620944],[0.51392204,-0.35382575,-0.71654284,0.69806784,0.35409018,-0.7125174,-0.3585419],[-0.34544718,-0.212541,-0.46838158,-0.348286,-0.4673545,0.73423237,-0.7466479],[-0.2571807,-0.87686163,-1.0323783,-0.3470508,-0.44749308,-0.8353898,-0.72766614],[-0.8385732,-0.82968605,0.104628935,0.20757905,-0.32339612,0.497941,-0.26445195],[-0.80247515,-0.6636023,-0.5110591,0.2453179,0.20732372,-0.01901174,-0.82556474],[-0.76035863,0.0074476735,0.33188587,-0.31674412,-0.50591946,0.853444,-0.20236208],[0.0013595351,1.0197767,-0.6925592,0.45688447,0.60580957,-0.26385808,-0.050980914],[0.06841057,0.7079414,-0.087536745,0.8707849,0.67308784,-1.2102008,-0.31384364],[-0.089014076,0.22765215,-0.22885361,1.1801783,0.64802265,-0.72977227,0.076044604],[-0.2654659,-0.74361503,0.40524837,-0.32977498,-0.7657364,0.167108,-0.52621794]],"activation":"σ","dense_2_b":[[-0.4408888],[0.090220116],[0.09630298],[-0.30440426],[0.0277946],[-0.4173861],[-0.08740925],[-0.4363536],[0.07060309],[0.0055395924],[-0.32225478],[-0.42043456],[0.027541628]]},{"dense_3_W":[[0.009158828,-0.64987886,-0.32672417,0.33792084,-0.6813809,-0.12942642,0.0065088505,0.36009103,-0.46551788,0.650782,0.3398156,0.33237734,-0.29790145],[0.17885834,0.018317161,-0.103069186,0.0333603,-0.009732622,0.43167624,-0.27477983,-0.29342014,-0.64711416,0.37721634,0.38430053,0.1257458,-0.2783452],[-0.06386373,-0.34565896,-0.5648887,-0.14779678,-0.1418012,-0.085997246,-0.26618838,-0.57671523,-0.24667156,-0.3074685,0.5998481,0.28325394,-0.39654872]],"activation":"identity","dense_3_b":[[0.06877291],[0.064048566],[0.089000046]]},{"dense_4_W":[[1.4214735,0.3623055,0.6621128]],"dense_4_b":[[0.07191435]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json deleted file mode 100755 index 0380b8728e..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.323066],[1.4018469],[0.567659],[0.04745886],[1.371474],[1.3818233],[1.3930135],[1.3780496],[1.353553],[1.3199772],[1.2810564],[0.047208063],[0.047284752],[0.047346227],[0.047340184],[0.04724789],[0.04699337],[0.046616953]],"model_test_loss":0.009241282939910889,"input_size":18,"current_date_and_time":"2023-08-12_21-15-20","input_mean":[[22.710884],[-0.02667767],[-1.9947951e-5],[-0.0022435884],[-0.024858162],[-0.025795942],[-0.027008465],[-0.025401326],[-0.024992129],[-0.02418946],[-0.022016376],[-0.0023103587],[-0.0022975747],[-0.0022888356],[-0.0022831862],[-0.002328815],[-0.0024200957],[-0.0025149914]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.02660969],[1.042771],[-0.033824593],[1.3177401],[1.2243396],[-1.3144829],[-0.029618222]],"dense_1_W":[[-0.042961396,0.8769499,-0.0041193925,-0.28560525,-0.20101343,1.1051995,-1.3274776,0.1784311,0.15195456,-0.25092003,0.06740475,0.2186879,0.265752,-0.15826978,-0.30693996,-0.28658256,-0.040432233,0.227988],[1.1160629,-0.5995385,0.025996689,-0.15590227,0.013243591,0.6837929,-1.4657838,0.23292334,0.066290066,0.086385906,-0.117085874,0.44104484,0.1790555,-0.29690143,0.2645984,-0.15013884,-0.1352086,0.2450129],[-0.02550995,0.11425251,-0.048323117,-0.21157871,0.07942085,1.3628405,-0.7377691,0.13772115,0.07743978,0.10179341,0.021651335,0.009930128,0.03140351,0.24963082,-0.17956105,-0.049760547,-0.19708844,0.121905],[0.50287706,-0.59522426,-0.072128914,-0.17238382,0.056527812,-0.6922978,0.4801964,-0.17814112,0.054864608,-0.046747845,-0.015958516,0.41250488,0.111997865,-0.242329,0.1574411,-0.18989699,-0.24354196,0.31047294],[1.2728062,0.9029083,-0.02995525,-0.11530327,0.19549532,-0.72583985,0.97019637,-0.023350935,-0.13342142,-0.09830459,0.11504367,0.004033683,-0.5631423,0.33631292,0.20850284,-0.13248868,-0.19359264,0.02700284],[-0.5022331,-0.4029477,-0.07267978,-0.032978907,0.123317115,-0.6608719,0.2172116,-0.2220228,0.036327496,0.036248263,-0.05348906,0.4633486,-0.45709947,0.35074022,-0.29431617,-0.015300724,-0.047331363,0.17334145],[-0.005675072,-1.177238,-4.175773,-0.33227032,0.593491,0.33732134,1.1989933,-0.018660717,-1.6915731,-0.8134577,1.1082839,-0.6968372,0.13508995,0.6501428,0.17571086,0.43262443,0.23011513,-0.2609291]],"activation":"σ"},{"dense_2_W":[[0.51582694,0.3121973,-0.20595367,-0.63976544,-0.6190774,-0.11476523,-0.161778],[0.45226112,-0.5900978,0.6664454,-0.98015857,-0.76075673,0.20415324,-1.0172082],[-0.049352575,0.030535527,0.5126004,0.26862317,-0.54523516,-0.68212223,-0.4634505],[-0.83752614,-1.6723628,-0.9174441,0.15394925,-1.029886,0.93452585,1.3628161],[0.738823,0.61842084,0.71415186,-0.6888037,0.3717006,-0.7639032,-0.1672679],[-0.1399503,-0.10095283,-0.25007892,0.39840633,-0.08607292,-0.25998384,0.64788043],[-0.40224734,-0.39391443,-1.0630914,0.5171268,0.2898641,0.81633,0.23264134],[0.609244,0.6181232,-0.078675106,-0.6184327,-0.21231276,-0.59661895,0.102545284],[-0.1669277,-0.58635,-1.1015649,0.32143387,0.4936339,0.83028847,-0.030035142],[-0.77541274,0.023090886,-0.23716073,-0.05367684,0.49773395,0.6787877,-0.16148227],[0.47024024,0.56257,0.45200762,-0.5773873,-0.18297487,0.20356469,-0.52002436],[-0.8596537,-0.06697396,-0.8024254,1.0830293,0.670211,0.6720701,-0.12708642],[-0.9127519,-0.6879708,-1.4161041,0.90650314,0.4792091,0.8929421,-0.01189748]],"activation":"σ","dense_2_b":[[-0.0045747017],[-0.077190444],[-0.013206014],[-0.31438816],[-0.02210615],[-0.08498061],[-0.032835722],[0.025921185],[-0.028608063],[-0.055094685],[-0.04353595],[-0.02340338],[0.2846957]]},{"dense_3_W":[[-0.2833135,0.49971643,0.15789203,-0.111222304,0.68173003,-0.12306065,-0.61054754,0.4364152,-0.17824891,-0.3612262,-0.08212228,0.32567462,-0.21418424],[0.30719173,0.6395363,0.45663902,-0.17605212,-0.032707606,0.09329482,-0.21607205,0.60278416,-0.2559459,-0.30606645,0.6160812,-0.65490466,-0.6537213],[-0.6911255,-0.28356558,0.35187447,0.69251335,-0.65796524,0.4204575,0.1600814,-0.36455095,0.5097029,0.23778544,0.05235907,0.61762905,-0.26800236]],"activation":"identity","dense_3_b":[[0.018074159],[0.02200104],[-0.036768977]]},{"dense_4_W":[[0.5857301,0.756474,-0.43159783]],"dense_4_b":[[0.022468269]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022.json deleted file mode 100755 index 7faefe92f7..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2022.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.322998],[1.4015561],[0.56837523],[0.047588255],[1.3709389],[1.3817663],[1.392611],[1.3754411],[1.3496559],[1.3185683],[1.2769405],[0.047354497],[0.047422595],[0.04747648],[0.047421742],[0.04731572],[0.04706673],[0.046611268]],"model_test_loss":0.009539897553622723,"input_size":18,"current_date_and_time":"2023-08-12_20-46-44","input_mean":[[22.711828],[-0.026689535],[0.0019039834],[-0.0023329535],[-0.024924988],[-0.026026027],[-0.027174095],[-0.025406003],[-0.025057424],[-0.02285188],[-0.021524802],[-0.002410757],[-0.0023985708],[-0.0023895558],[-0.0023493334],[-0.0024011184],[-0.0025043534],[-0.0025892218]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.5169857],[-0.019987362],[-3.749348],[0.010026661],[-0.07288319],[0.014374224],[0.010394186]],"dense_1_W":[[-1.2820761,0.20072974,0.28769934,-0.07435872,-0.10807912,0.6839909,-1.0163846,0.37361157,0.5963772,-0.31447622,0.15329885,-0.29130152,-0.0077871936,-0.13540648,0.14956757,0.20259517,0.4827459,-0.44082355],[-0.008706593,-0.7106983,0.03615078,0.13008897,0.39616287,-1.198108,0.67986196,0.049107697,-0.19745559,0.070653826,-0.037179824,-0.00992897,0.018150264,-0.28345117,0.20144904,0.027271744,-0.083591945,-0.0077789472],[-1.3841774,-0.2729697,-0.30312338,0.5021227,0.23227558,-0.45030138,0.8180279,-0.7582951,-0.41165656,0.3703149,-0.16755953,0.225867,0.30567566,-0.33227664,-0.07867405,-0.69357836,-0.29660326,0.48716295],[-0.0034431356,1.3253504,4.6872225,0.084131904,-0.59782314,-0.17502293,-0.47418714,-0.65568554,1.4080468,0.6040854,-0.9347265,0.4309358,0.28160667,0.031666335,-0.7668144,-0.26228446,-0.5334342,0.37789625],[-0.0055039516,-0.13755332,-0.12223849,-0.0004576334,0.25474504,-0.90248924,0.681393,0.083114035,-0.14821497,0.05615389,-0.06942857,0.052075684,-0.45403334,0.34004426,-0.10621758,0.33911383,0.07355,-0.19579107],[0.0022961085,0.30488324,-0.012825079,0.15088055,0.25583294,0.82652,-0.5459587,0.006714368,-0.06636212,-0.011478057,0.13315733,-0.13348693,0.26344913,-0.5412785,0.04283553,-0.078943126,-0.052557122,-0.14758898],[0.007984359,-0.050624616,-0.18312733,-0.16847509,0.16566466,0.73899466,-1.2472594,0.7888025,-0.095765956,0.24871819,-0.35101566,0.25908372,0.4248216,-0.13882114,-0.539588,0.09347688,0.009110203,0.12744854]],"activation":"σ"},{"dense_2_W":[[0.047095604,-0.786255,-0.43614712,-0.1504697,-0.13834186,-0.024430595,0.0504824],[0.2510971,0.02496833,-0.60852563,-0.27171785,-0.44349307,-0.37497228,0.2656754],[0.28042302,-0.2812965,-0.31852126,0.30789006,-0.85707706,0.3475367,0.22547512],[-0.6652303,0.2685998,0.56206954,-0.054037236,1.0446018,-0.94967777,-0.26615182],[0.23373616,0.18673655,-0.45725107,0.29477727,-0.89968127,0.6454618,-0.22106493],[0.054909028,0.77692455,0.18391721,-0.56115776,0.6095855,-1.0184323,-0.054039475],[-0.84752804,0.4618774,0.51274276,-0.06157674,0.38322848,-0.5445789,-0.17847438],[-0.8735806,0.71639836,0.74420905,0.16857065,0.51909196,-0.18970433,-0.87218684],[-0.09599941,-0.16308807,-0.72261167,0.5550224,-0.5297689,0.14774127,0.56100655],[0.30483237,0.093027264,0.029969638,0.47540987,-0.028077623,0.3474491,0.4557833],[0.60824394,-0.52072644,-0.110552855,0.2341221,-0.5425136,-0.15664087,0.18335746],[0.008110846,-0.3940828,-0.4749819,0.22577456,-0.6206534,0.53349996,0.64064765],[-0.74949837,1.0148553,0.08895356,-0.13594577,1.1833395,-0.5525545,-0.9272946]],"activation":"σ","dense_2_b":[[-0.1841836],[-0.052291494],[0.004210325],[0.03117083],[-0.052975487],[-0.009141316],[0.013354279],[-0.12768534],[0.007850721],[-0.096758544],[-0.02351333],[0.018209793],[0.07525378]]},{"dense_3_W":[[-0.0678166,0.21374278,0.4509247,-0.2507948,0.084760554,-0.25701937,-0.32002988,-0.6438867,0.6636694,-0.3464606,0.4619562,0.6215613,-0.7515956],[0.33497885,-0.19614214,0.75088036,-0.6965934,0.5644902,-0.62339765,-0.6473526,-0.04877687,-0.393787,0.60633105,0.18677856,0.23221537,-0.17749654],[0.24782819,0.56990445,0.7100961,-0.45507297,-0.18671395,-0.074338615,0.12664238,-0.111063465,-0.045501217,0.53268576,-0.52613497,0.3934995,-0.4127442]],"activation":"identity","dense_3_b":[[0.042554773],[0.03558463],[0.009918687]]},{"dense_4_W":[[0.7852306,0.58427215,0.16980867]],"dense_4_b":[[0.036531795]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42103x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42103x00x00x00x00x00x00'.json deleted file mode 100755 index 1b9584e460..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42103x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.390216],[0.84026754],[0.39660537],[0.037251078],[0.83123314],[0.8328986],[0.8354399],[0.822756],[0.8147103],[0.80181575],[0.78955364],[0.037153445],[0.037165854],[0.037180226],[0.03709188],[0.03697379],[0.036808748],[0.03657089]],"model_test_loss":0.007443552371114492,"input_size":18,"current_date_and_time":"2023-08-12_22-11-54","input_mean":[[24.564423],[-0.06033352],[0.0029696382],[-0.0023700444],[-0.06267781],[-0.062956646],[-0.063214496],[-0.06121789],[-0.061873104],[-0.061438877],[-0.056952965],[-0.0024559235],[-0.002469215],[-0.0024863363],[-0.0025515505],[-0.0025991164],[-0.002534291],[-0.0024238043]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.4287386],[0.019522702],[1.9977351],[-0.22490804],[-0.00035819423],[-1.3152059],[-2.3214567]],"dense_1_W":[[2.235888,-0.26963252,-0.03326692,-0.9078663,-0.48077253,0.22492908,-0.74574095,0.02163033,0.6287117,-0.25593862,0.09319266,0.390934,0.1455112,-0.0051882155,-0.2294125,0.2772641,0.3833548,-0.17655341],[0.004162867,-1.5029143,-5.1802254,1.005789,1.1220849,-0.0038114812,1.1423911,0.71593577,-1.1323463,-0.51543945,0.057678428,-1.4371938,-0.40754506,0.74080026,-0.4787524,-0.1676612,0.6316797,0.10258097],[0.61579907,1.0638666,0.04497473,0.09790652,-0.4580042,0.9214267,-0.55226237,0.22255155,-0.25152695,-0.018994743,-0.007784131,0.26833034,-0.3185435,-0.3745735,0.38645062,0.03690509,0.07226961,-0.15759337],[-0.0004868086,0.7452519,-0.03411571,-0.44577497,0.2982549,0.91406643,0.0184842,-0.18046862,-0.3266196,0.34877545,0.17070878,-0.03970848,-0.042621415,-0.27128893,0.15533158,0.07834085,0.19639981,-0.056854397],[-0.012567584,0.03624396,-0.022384563,-0.15523447,0.24661978,-1.2377284,1.1350765,-0.25249532,-0.41498,-0.020347659,0.095791966,-0.7473384,-0.26062834,0.5146696,0.54036754,0.4569565,0.22637187,-0.22997549],[-2.1634111,-0.916687,-0.03673605,-0.120667666,-0.4033444,0.7786477,-0.820325,-0.012360253,0.54780203,0.06107094,-0.004244052,0.3578701,0.32064012,-0.44154793,-0.6163029,0.25897467,-0.08404478,0.20366065],[-0.6153432,0.9540124,0.04409643,0.20857342,-0.50645894,1.0762684,-0.49672195,0.107468456,-0.2148415,0.042631213,-0.024798885,0.28167915,0.2179913,-1.0020694,0.40323436,-0.11873269,0.08794277,-0.07572256]],"activation":"σ"},{"dense_2_W":[[-0.20823282,0.30093265,-0.029201774,-0.5920709,0.8807932,0.014832234,-0.7206485],[-0.2707333,-0.5349684,0.03885923,0.4568763,-1.0975108,0.52590406,0.56699604],[-0.1763585,-0.044517048,-0.7223775,0.46382907,1.3813398,-0.90656126,-0.46228075],[0.4402428,-0.08579828,0.62238526,-0.026679713,-0.23692939,0.5986996,-0.044020038],[-0.11785757,0.55059844,0.21553627,-0.38685504,0.37269825,-0.05641884,-1.0433837],[-0.073115595,-0.13483381,-0.57452166,-0.34301227,1.1377032,0.18396655,-0.65384805],[-0.06759611,0.40847486,-0.54294467,-0.6230027,0.5551045,0.12885416,-0.6015846],[-0.1075689,-0.82133925,-0.4100264,-0.5740279,0.077124596,-0.84148127,-0.35156497],[0.43155265,-0.44616547,0.5199837,-0.24253757,-0.28942013,0.07995831,0.80747086],[0.5655305,-0.6049346,0.7769178,0.6401317,-0.036156356,0.12338241,-0.09606122],[-0.11682955,0.37032342,0.6814937,0.08761088,-1.1991022,0.3395861,0.4455738],[-0.061593946,-0.10245612,-1.1362522,-0.90115947,-0.10694025,0.27360564,-0.38288185],[-0.85389346,0.7123888,-0.9063807,-0.5282727,0.84775126,0.14558455,0.10813089]],"activation":"σ","dense_2_b":[[0.09443781],[-0.22529183],[0.0031277924],[-0.038756464],[0.06911136],[0.16423716],[0.047135442],[-0.06203192],[-0.09895892],[-0.08908262],[-0.30888662],[-0.045908593],[-0.13323098]]},{"dense_3_W":[[-0.28149396,-0.09962505,0.47546953,-0.31420928,0.2905342,0.266794,0.43754667,0.3859919,0.06822508,0.23275743,-0.6660929,0.19498697,0.3011593],[-0.13796176,0.40359095,0.29825932,0.018519647,-0.59591174,-0.73205596,-0.19215392,0.27951568,0.3280459,0.19260992,0.36450627,-0.50515145,-0.546314],[0.399765,-0.5717706,0.59745455,-0.24058248,0.049411856,-0.11578697,0.25948843,0.5037258,-0.33800462,-0.35749623,-0.026326528,0.09737147,-0.09119536]],"activation":"identity","dense_3_b":[[-0.10628814],[0.07634368],[-0.05583109]]},{"dense_4_W":[[-0.31794876,0.80048394,-0.76268446]],"dense_4_b":[[0.06573924]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42162x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42162x00x00x00x00x00x00'.json deleted file mode 100755 index 4c63096684..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42162x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.153396],[1.1424059],[0.5273411],[0.0418866],[1.1337891],[1.1363932],[1.139454],[1.1177284],[1.1015002],[1.0786083],[1.0526011],[0.04153589],[0.041622877],[0.04170686],[0.041838918],[0.04179161],[0.04151654],[0.041096594]],"model_test_loss":0.009716987609863281,"input_size":18,"current_date_and_time":"2023-08-12_22-38-30","input_mean":[[24.196396],[-0.016029745],[0.028096095],[-0.0038994509],[-0.022461733],[-0.0211682],[-0.018945228],[-0.009469113],[-0.006013518],[-0.0003690735],[0.00038850226],[-0.003962722],[-0.003939994],[-0.003924277],[-0.0039717006],[-0.004034121],[-0.004135311],[-0.0043619256]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.06441673],[2.26378],[-0.10552989],[0.33980003],[-0.04298246],[-0.098494254],[2.4262064]],"dense_1_W":[[-0.020790633,0.451921,-0.13652684,0.12763585,-0.031029783,1.2042981,-0.5776046,-0.1012677,0.17831358,-0.05581121,-0.06692354,0.54666835,0.40911138,-0.8721234,-0.39267784,-0.08157101,-0.4079901,-0.2989372],[0.5509748,0.9363097,0.059841122,-0.4140256,-0.41639903,0.33078,-0.40445128,0.36929476,0.018607832,0.00700337,-0.0038795248,0.7061042,-0.23580593,-0.48158726,0.12674259,-0.06382707,0.43820915,-0.17950895],[0.018348062,0.6468131,0.0042748065,0.16133198,-0.015959706,0.9301354,-0.20905271,-0.29754588,-0.28253144,-0.119799875,0.3632876,0.3290482,-0.18916254,-0.41337168,0.0010071574,-0.15450883,0.20074505,-0.026081141],[0.006989476,0.27034685,6.5836134,0.55647486,-1.4171077,-1.1925769,-1.0201753,0.29032436,1.358197,1.2209818,0.37050742,0.6416425,0.6711937,-0.31485364,-0.34857285,0.17685159,-0.7824757,-0.4657348],[-0.004080293,0.029588899,1.3128351,-0.36318135,-0.11356612,0.5806577,-0.36066183,0.4649574,0.5240905,-0.05959767,-0.91840315,0.62454647,0.050267532,-0.14082994,-0.2595877,-0.31785563,-0.02562985,0.34429887],[0.034001444,-1.9677832,0.15466869,-1.0032327,-0.30988127,0.71767926,-0.89187795,0.6676458,0.9369056,0.2786462,-0.53612363,0.7342473,0.12932669,-0.29018465,0.3984834,0.23467675,-0.1234937,0.84723073],[0.47908032,-0.5793737,-0.05230327,-0.0138418805,0.2010647,-0.5434213,0.59695786,-0.19498722,-0.2230812,-0.15169947,0.102158435,-0.18281807,-0.1266235,0.3866273,-0.04928129,0.37241444,-0.2728808,-0.01607883]],"activation":"σ"},{"dense_2_W":[[0.12734035,0.5242563,0.6692459,0.2905278,0.0014169036,0.29576495,-0.61192167],[-0.12615293,-1.2116686,-1.2169276,-0.08875717,0.3729457,-0.5249831,0.34974018],[-0.9393932,-0.38383678,-0.8133937,0.24458236,-0.24640957,0.16986968,0.9259673],[-0.28856096,-0.31797957,-0.9315826,0.04405637,-0.012435744,-0.11371028,0.5239803],[-0.17659293,0.15572147,0.07663236,0.62253284,0.64720607,0.19781266,-1.2869947],[-0.7894623,-0.90204525,-1.0353638,-0.03617179,0.39140046,-0.0017340467,1.1151788],[-0.32219446,-0.49881086,-0.56797916,-0.5200566,0.049211055,-0.27014527,-0.47646534],[0.3827617,0.09625169,0.6359473,0.20220737,0.0765475,0.69139665,-0.014074824],[-0.8888096,-0.9244012,-0.20213692,0.16941886,-0.42035094,-1.047354,0.65089625],[-0.073977485,-0.9904051,0.21814822,-0.85800076,-0.380841,-0.41185415,-0.34316978],[0.50580156,-0.14019777,0.41091344,0.45879292,0.5243499,0.04470857,-0.118686885],[-0.91301054,-0.10051312,-0.76313204,-0.36933228,0.123890385,-0.41707304,1.4737208],[0.48200563,0.30155873,0.6166662,-0.19214527,0.3604119,0.848134,-0.66118497]],"activation":"σ","dense_2_b":[[-0.06378894],[-0.063377954],[0.21705978],[-0.124884605],[-0.31138632],[0.15949029],[-0.06504713],[-0.06639504],[0.29782426],[-0.05916866],[-0.19573724],[0.39589995],[-0.13240384]]},{"dense_3_W":[[-0.4349006,0.30896667,-0.45529953,0.1588749,0.6099583,-0.048744787,0.14831127,-0.09553297,-0.5638598,0.47571346,0.3784129,-0.65802926,0.6003008],[-0.2129697,0.480156,-0.606263,0.4075848,-0.41933286,0.38288692,0.22861128,-0.4790269,0.32494992,0.45159003,0.52394915,-0.10827983,0.009361509],[0.5089469,-0.5202948,-0.5322368,-0.31337965,0.3283847,-0.80532163,-0.12003918,0.3517128,-0.7536064,-0.36008325,0.43078935,-0.49509677,0.43837455]],"activation":"identity","dense_3_b":[[-0.009116715],[0.03737127],[0.07403617]]},{"dense_4_W":[[0.08990676,0.013356972,1.3498625]],"dense_4_b":[[0.06698501]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42163x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42163x00x00x00x00x00x00'.json deleted file mode 100755 index 98c89380a7..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017 b'8965B42163x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.507092],[1.2815679],[0.4975071],[0.04506459],[1.2720965],[1.2750745],[1.2772884],[1.2503124],[1.2223599],[1.1884838],[1.1560506],[0.045019273],[0.045028828],[0.045024503],[0.04477106],[0.04448406],[0.044080965],[0.04363627]],"model_test_loss":0.013042495585978031,"input_size":18,"current_date_and_time":"2023-08-12_23-07-05","input_mean":[[21.98877],[-0.12335238],[-0.016078657],[-0.0077544143],[-0.121013075],[-0.122396156],[-0.12400471],[-0.12926798],[-0.13365853],[-0.13634436],[-0.13445592],[-0.0078579085],[-0.007848383],[-0.007836665],[-0.007821644],[-0.007856283],[-0.00794595],[-0.00799864]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.41238108],[-0.15647191],[-3.19432],[1.3473346],[0.72033656],[0.011768298],[3.205428]],"dense_1_W":[[-0.027973145,1.7576972,4.767511,-0.4176633,-0.96818715,0.33926827,-1.0864245,-0.23734152,0.9877473,0.7952857,-0.8853347,0.93019867,0.32556108,-0.028436413,-0.0046930364,-0.50567764,-0.89116305,0.34441304],[-0.3286742,0.7296152,0.15975942,-0.23465723,0.054107532,1.2600936,-1.2999637,0.3027219,0.21823524,-0.3015546,0.21093197,0.35624585,0.20739715,-0.53436106,-0.06674817,0.018904384,0.45141223,-0.23347045],[-1.2369081,0.5949384,0.27328587,0.05338651,0.4156267,0.92539907,-0.40590262,0.5744456,0.15448196,0.049225725,0.112136096,0.061936796,0.36455524,-0.20739433,-0.5574245,0.020741934,0.3043354,-0.060525723],[1.3975302,-0.2660883,-0.2528151,0.12209471,-0.45779967,0.37982872,-1.2621626,-0.12645462,-0.08675239,-0.024192654,-0.16114336,0.3574039,0.14576891,-0.5411478,-0.4881046,0.29857686,0.3050295,-0.16263439],[0.0261585,-2.65415,0.1102068,-0.6355408,-0.6825635,-1.95765,-0.7815007,-0.8075244,-0.2593319,-0.6009522,-0.52111167,-0.20022257,0.03889839,0.62920535,0.33383593,-0.2175719,-0.4684548,0.3459961],[-0.0150678735,-0.58271044,0.0061610206,0.074883945,0.10804738,-1.421328,0.79250294,0.15533687,-0.24172942,-0.074691884,0.00076515594,-0.6798396,0.08621879,0.7514697,0.10140082,0.41893494,0.28425518,-0.33354664],[1.1115061,0.61985224,0.30767944,-0.09303943,-0.12909113,1.6447747,-0.4437529,0.77997494,0.2406031,0.19338164,-0.04269769,0.74130315,0.023670241,-0.60373497,-0.42885965,0.09291059,0.30503675,-0.0505794]],"activation":"σ"},{"dense_2_W":[[-0.03447381,0.61961925,0.46783054,0.008025974,0.034218326,-0.785008,-0.2436927],[-0.34576592,0.38208163,0.9075677,0.4188659,-0.6523994,-0.6328571,0.014269962],[-0.028170645,0.8463806,0.044915676,-0.021030001,-0.27790257,-0.61671126,-0.099155694],[-0.8248011,-0.376545,0.11962283,-0.8207945,-0.021737516,-0.06406078,-0.106754884],[0.424725,0.6510974,0.31296447,-0.26330495,0.11321596,-0.8308737,0.19026594],[0.16454563,-0.45808515,-0.61525315,-0.2313238,0.42379624,0.49528188,-0.15805322],[-0.74735767,0.06545445,0.26230517,-1.1391616,0.6482181,-0.25901437,-1.0564803],[-0.17673826,0.0071658455,-0.8479469,-0.26447105,0.51856095,0.9599089,-0.22698504],[0.07695655,-0.6020192,-1.0648273,0.57120943,-0.60580045,0.48599684,-0.74983746],[-0.18215203,-0.03673277,-0.69181716,-0.50174606,-0.3967317,1.0757489,0.10837832],[-0.2219305,0.5985485,0.3430551,0.27103543,-0.28647742,-1.2267803,0.3110115],[0.23252928,0.35021362,0.506134,0.11031795,0.09378154,-0.5229496,-0.49675792],[-0.894196,-0.11130605,-0.021763802,-0.79576594,0.048987858,-0.18540877,-0.7740312]],"activation":"σ","dense_2_b":[[0.059486043],[-0.29280654],[0.011379277],[-0.07390214],[-0.06469096],[-0.07824884],[-0.121937186],[-0.020077355],[-0.14607991],[0.071507566],[-0.04043437],[-0.32625166],[0.005049509]]},{"dense_3_W":[[-0.21808244,-0.08183334,-0.6193853,0.14346945,-0.64549166,0.034775525,0.62263674,0.60656494,0.05402613,0.4803536,-0.057502307,-0.57187694,0.48039675],[0.20010938,0.29857892,0.29031074,-0.4493723,-0.27534932,-0.4271697,-0.3127123,-0.31985202,-0.5051126,-0.20012727,0.63287383,-0.42268178,-0.5962557],[0.7221426,-0.17602918,-0.24287237,-0.1045422,0.59664446,-0.3091623,-0.07306638,-0.6027462,-0.04207753,0.22870076,0.12455155,-0.058088508,-0.5303505]],"activation":"identity","dense_3_b":[[-0.026025277],[0.054520532],[0.04151487]]},{"dense_4_W":[[-0.88442326,0.62185794,0.34921297]],"dense_4_b":[[0.04022765]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42170x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42170x00x00x00x00x00x00'.json deleted file mode 100755 index 3009213f5c..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42170x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.505826],[1.3050952],[0.6105025],[0.049911283],[1.2774526],[1.2882336],[1.2985959],[1.2796075],[1.2540187],[1.2308307],[1.2028455],[0.049641605],[0.049726453],[0.049802125],[0.049885124],[0.049843974],[0.049564064],[0.048945032]],"model_test_loss":0.008349043317139149,"input_size":18,"current_date_and_time":"2023-08-13_00-13-34","input_mean":[[23.119398],[-0.014665721],[0.002875712],[0.0022761677],[-0.016781015],[-0.015601292],[-0.015216634],[-0.012974441],[-0.008985644],[-0.0026411372],[-0.0011595195],[0.0021324658],[0.002156456],[0.0021819477],[0.0022379826],[0.0022811887],[0.0022112585],[0.0020355321]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.04593338],[-0.40499118],[-1.7993592],[-0.11991043],[2.4969063],[-0.08359504],[0.15138367]],"dense_1_W":[[-0.0020456694,-0.15232417,-0.05632091,-0.37705573,0.022051271,-0.8565281,0.39108163,0.056849197,0.05130677,-0.05407012,0.001970357,-0.22110374,-0.05739019,-0.06787392,0.8160874,0.24165699,0.05984952,-0.26877397],[-0.059527796,-1.783515,-5.029247,0.35492274,0.46516266,-0.4962219,0.74547374,-0.1391693,-0.44948098,0.77305996,0.5585137,0.21553893,-0.4055475,-0.05447692,0.26631886,0.058942422,-0.016789235,-0.27207494],[-0.76922256,0.6301251,0.22935481,-0.025813706,-0.33578226,0.67003363,-0.88640255,0.46430328,0.027061734,-0.1746217,-0.0022712015,0.16300617,0.0046104635,-0.4206955,0.33701143,0.087930895,0.08343968,-0.18054911],[0.0011171654,-0.58213556,-0.021455938,0.26902542,0.37316513,-1.3450648,1.1398438,0.1091337,-0.28341073,-0.118193135,0.124231465,0.05864356,-0.6355348,0.1833971,0.3096016,0.34548208,-0.011865895,-0.18107612],[0.87095094,0.6937185,0.29325077,0.020749068,-0.025415676,0.699841,-1.3742945,0.7242314,-0.06749853,-0.070331104,-0.0636034,0.06533873,-0.16280279,0.042507485,-0.029019153,0.26980522,-0.09153442,-0.093001485],[-0.31021908,-1.142416,0.11011055,0.43387893,0.5260836,-1.5303199,0.5066911,-0.27706015,0.39043495,0.15309733,-0.28572637,-0.22430675,0.061929535,-0.06383185,0.13644171,-0.50511664,0.041031726,0.31161213],[1.0897267,1.1825744,-0.14236324,0.063672036,0.06294053,-0.3706379,1.0601782,0.5527051,-0.27595088,-0.113671936,0.13686246,0.17960225,0.20145352,-0.13296105,-0.40037417,-0.01056886,-0.13461137,-0.055430967]],"activation":"σ"},{"dense_2_W":[[-0.19825721,-1.1104169,0.98295814,-0.30515158,-0.34692875,-0.6190782,-1.297581],[0.24416888,0.3588734,0.103677236,0.240873,-0.813537,0.07612628,-0.08107244],[-0.5474003,-0.28213567,0.1666674,-0.42624155,0.64944845,-0.26346406,-0.14706588],[0.1518272,-0.21466658,-0.17855105,0.013723676,-0.58607084,0.6483515,0.43216375],[-0.6230994,-0.08837661,0.33257806,-0.85847354,0.36574784,0.04634162,0.05514991],[-0.8296199,0.77100873,-0.939359,-0.8922866,0.084815726,-0.6143975,-0.10045844],[0.4623184,0.1270895,-0.16754854,0.15027253,-0.4147221,0.39358157,0.57891953],[-0.08295878,0.5129586,0.06648533,0.40620163,0.24548061,0.40838754,0.21267301],[-0.23169038,0.43309572,-0.070394635,0.019800762,-0.65996474,0.6055871,-0.12044358],[-1.0342672,-1.0465121,3.6257296,-0.50793505,0.29782388,-1.7741984,-1.0927168],[-0.19204512,-0.32931063,0.18198438,0.8573456,0.06693234,0.6510411,-0.32572392],[-0.4673864,0.10762463,0.07421527,-0.38329086,0.7058981,-0.927119,0.115484424],[-0.42056227,-0.11796782,0.49156794,-0.7097843,0.6934195,-0.5626611,-0.34439513]],"activation":"σ","dense_2_b":[[0.11909162],[-0.07600877],[0.10223283],[-0.031305008],[0.09945486],[-0.17963581],[-0.061995212],[-0.07555241],[-0.102682784],[-0.05191523],[0.024158236],[0.076784156],[0.23109515]]},{"dense_3_W":[[-0.14342636,-0.72422844,0.40396285,0.1636829,0.18247479,0.0045734644,0.057036284,0.36054525,0.31516632,0.5773821,-0.34730205,0.015506951,0.8143722],[-0.22141175,0.0249754,0.18519108,-0.5960891,0.10534475,-0.34004185,0.30922064,-0.64269876,-0.39353377,0.61196244,-0.6038087,-0.2218613,0.8060632],[-0.8372558,0.52254903,-0.14625306,0.0066804006,-0.65099746,-0.46298012,0.46928817,0.3031862,0.21476059,-0.113657326,0.57816565,-0.66892457,-0.68522847]],"activation":"identity","dense_3_b":[[-0.08646373],[-0.0014501116],[0.010766292]]},{"dense_4_W":[[0.20907876,0.4356881,-1.1967267]],"dense_4_b":[[-0.009264721]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42171x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42171x00x00x00x00x00x00'.json deleted file mode 100755 index ba9f61741d..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42171x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.125968],[1.2157676],[0.56877077],[0.046634678],[1.1819986],[1.1939226],[1.2050095],[1.1772536],[1.1490384],[1.1173652],[1.0877764],[0.046458516],[0.0464915],[0.046519432],[0.046424575],[0.04630696],[0.045947377],[0.045457695]],"model_test_loss":0.012017198838293552,"input_size":18,"current_date_and_time":"2023-08-13_00-43-28","input_mean":[[23.038973],[-0.011042334],[0.015974972],[-0.0052252584],[-0.012621144],[-0.012206042],[-0.011473829],[-0.00436382],[0.0011708968],[0.011603617],[0.018078573],[-0.0053275926],[-0.0052903076],[-0.0052520954],[-0.00510947],[-0.005104932],[-0.005200319],[-0.0053668055]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.16457097],[-0.11783356],[-0.16341795],[3.2603662],[-0.11788801],[1.6720974],[-1.0769079]],"dense_1_W":[[-0.008061046,-0.295763,-0.04102052,-0.44582197,0.39850467,-1.5092795,0.88803405,-0.14117628,0.17673199,0.06661456,-0.08764483,-0.07910116,0.064918116,-0.28363875,0.80435836,-0.029273244,0.083623365,-0.0926666],[0.011789304,-0.77010036,0.030322142,0.47716776,0.3228661,-0.5643698,-0.085420124,-0.41520515,0.04144654,0.18603072,-0.072190225,-0.2096561,0.25008512,0.047287993,0.78376484,-0.09255421,-0.073869705,-0.38755554],[0.006866006,-0.39707738,0.047982275,-0.09235436,0.2033491,-1.5095443,0.76461095,0.12706165,0.05459054,-0.31473687,0.017124869,-0.15846905,0.28620297,-0.29356283,0.010996088,-0.26782978,0.30223924,0.19818383],[1.3136203,0.7605802,0.22921574,0.06950313,-0.27827767,0.22789046,-1.1831415,0.2888181,0.45472026,0.30679116,-0.029124122,0.3591454,-0.12775579,-0.19236758,0.06478377,-0.32875076,0.39650252,-0.22568668],[0.021136647,-0.8797861,-3.4817855,0.9336127,-0.29945964,-0.40648848,1.0025306,-0.4041235,-0.4894749,0.32140172,0.98608655,-0.13395874,-0.5486662,0.09900147,0.16774903,-0.088785864,-0.46660814,0.12422624],[0.9725118,-0.5041138,-0.16343966,0.08840967,0.2979326,-0.2553426,0.70889497,-0.26950783,-0.24307638,-0.10193795,-0.11072658,0.07021681,-0.61530876,0.015428448,0.33534184,0.2460765,-0.04016938,-0.10249991],[-1.8274829,-0.48919293,0.2956331,0.39662004,0.3197019,-0.5691079,0.461544,0.13920702,0.03986025,0.75838494,0.20281333,-0.204162,0.19350567,-0.25525728,0.18195486,0.062684454,-0.19634059,-0.13966343]],"activation":"σ"},{"dense_2_W":[[-0.46026543,-0.608524,0.043432627,0.47561055,0.066570684,-0.41968626,-0.6702784],[-0.25002444,0.014399548,-0.84623957,0.022399414,-0.2874369,-0.7324391,0.20420226],[0.36980322,0.15331481,-0.09735177,-0.85721236,0.24727485,0.24951531,0.50254786],[-0.8673788,-0.17667994,-0.68422544,-0.1418402,0.18743204,-0.44421887,-0.13782015],[0.04130671,0.52854437,0.24590105,-0.88267916,0.22531076,0.38659257,-0.17606324],[0.47478884,0.31884965,0.3388871,-0.9468022,0.5066021,0.0700175,-0.5095112],[-0.113112666,0.25730982,-0.9881957,-0.13247137,-0.033958793,-0.93955487,-0.48982602],[-0.04127802,0.087856285,0.5223571,0.24392658,0.39105633,0.49048007,-0.34004813],[-0.31157398,-0.13790639,0.34548154,0.029981874,-0.55449915,-1.4152876,0.07108483],[0.53556556,-0.18784468,0.8590173,0.0057014013,-0.19763845,-0.011888355,0.5876402],[-0.48912835,-0.36501917,0.115229115,0.32207936,-0.6014716,-0.7109084,0.3919979],[0.55365634,0.6837242,0.3347094,0.0687382,-0.3462548,-0.11737208,0.63489527],[-0.256118,0.059573215,-0.7375444,0.06857301,-0.15573148,-0.7817235,-0.32100102]],"activation":"σ","dense_2_b":[[0.14656128],[0.087247714],[-0.28482375],[0.10210237],[-0.26355878],[-0.3669566],[0.15538138],[-0.17240496],[0.09014895],[-0.113779716],[0.14317818],[-0.071496926],[0.0718679]]},{"dense_3_W":[[0.6229111,0.31968972,-0.28705767,0.11074303,-0.087110974,-0.48348424,0.6785927,-0.21872982,0.61053604,-0.4666131,0.5098173,-0.06363553,0.3394026],[0.084205516,-0.3369105,0.17392462,0.37095436,-0.38174987,0.6008199,-0.80774736,0.06431271,-0.50171995,-0.010040611,-0.4184066,-0.22164747,-0.5402119],[0.7551455,0.14914666,-0.12843245,0.7057249,-0.5243644,-0.43565202,-0.35526338,-0.08234922,-0.33515534,-0.21625134,-0.07045235,-0.556805,-0.119567014]],"activation":"identity","dense_3_b":[[0.0821533],[-0.058999702],[0.09296355]]},{"dense_4_W":[[1.1875242,-0.45130086,0.9210134]],"dense_4_b":[[0.08483955]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42181x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42181x00x00x00x00x00x00'.json deleted file mode 100755 index c5393c2cfd..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'8965B42181x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.851226],[1.0239326],[0.42911518],[0.03646196],[1.0106101],[1.0142277],[1.0175295],[1.0065211],[0.9916179],[0.9649314],[0.936436],[0.036384404],[0.036382284],[0.0363779],[0.03632052],[0.036259472],[0.036110133],[0.035911527]],"model_test_loss":0.014339322224259377,"input_size":18,"current_date_and_time":"2023-08-13_01-37-39","input_mean":[[18.550402],[0.06708315],[-0.003807479],[-0.0036194513],[0.068546236],[0.06752569],[0.067004055],[0.06809232],[0.0652104],[0.06113437],[0.0540162],[-0.0034877174],[-0.00351821],[-0.0035523246],[-0.0035503684],[-0.00347457],[-0.0034314597],[-0.003328863]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.058229167],[0.03463576],[0.4540118],[1.0585605],[0.82972604],[0.01061339],[-0.5384203]],"dense_1_W":[[-0.0014019154,0.37237298,6.008196,0.10171012,-1.7093086,0.036843814,-0.20425557,0.1546206,1.5322132,0.7762833,-0.7004276,0.312089,0.124471225,-0.10561013,-0.39252156,-0.061603494,0.14343801,0.048062187],[0.0053725736,0.83909684,-0.0058439635,-0.038102146,-0.6833011,1.3762548,-0.708113,-0.18666978,0.28403822,0.08537209,-0.20133755,-0.044063088,-0.053310566,0.03235708,0.1398986,-0.097352564,0.09996585,-0.05572039],[-0.009760258,1.0888057,-0.07141774,-0.47450888,-0.5601016,-0.01604505,-0.34092116,-1.0678765,-0.96493465,-0.7642926,0.8836851,0.19161814,0.06547918,-0.6535186,0.62695867,-1.0349063,-2.439145,-2.184206],[0.38358867,0.6065362,0.0034230966,-0.3828624,-0.75266975,0.75344396,0.07208741,-0.2282329,0.0915009,-0.26476312,0.2233056,0.0923892,0.22786996,-0.26453176,0.20961368,-0.105665825,0.098848045,-0.0052204602],[0.381848,-0.5390429,-0.00251121,0.20975311,0.26914105,-0.78149796,0.5001158,-0.06125975,0.40894818,-0.08970213,-0.18330403,-0.053460885,-0.57413,0.7126597,0.09718345,-0.40182889,0.18284002,-0.04926136],[0.0041610664,1.9413497,-0.9496216,-0.33759737,-0.95122117,-1.5848461,1.3404186,-0.7097838,-0.8721945,-0.06395329,0.80500317,-0.93806756,-0.47362727,0.22262034,1.3678228,0.64397407,-0.2728229,-0.33648926],[0.07239537,-2.7810628,-0.00035733246,-0.39048576,-1.7811499,-1.8262695,-1.4524763,-1.5749454,-1.0985239,-0.97433126,-0.9762156,0.10516947,0.041831885,0.557803,-0.3139855,-0.11231197,-0.24730888,0.28285852]],"activation":"σ"},{"dense_2_W":[[0.88501614,0.7960339,-0.0854282,1.473172,0.73403573,-0.030489994,-1.0748231],[-0.012086651,-0.61050624,0.18473598,-0.7041298,0.37165922,0.31777894,0.18531682],[0.3662147,-0.029098487,0.76151365,-0.13395014,-0.36695877,-0.49297136,0.38819385],[-0.35389823,-0.3027185,0.12915866,-0.13196456,-0.059434127,0.3337308,-0.5366898],[-0.68380296,0.7094547,0.3467085,0.62269133,-0.8350407,-0.20502584,0.26055062],[-0.34221599,0.09894911,-0.22930774,-0.48179337,0.20150964,-0.77290064,0.09458423],[-0.36280394,-0.65553576,0.14078282,-0.3023727,0.36085516,0.2819732,-0.43386218],[-0.19083975,-0.34192124,-0.43045238,-0.62081045,0.30931103,0.030700095,0.38528338],[-0.12913164,-0.05824346,-0.19918932,-0.6585686,0.64329416,-0.39228633,0.38834023],[-0.06803785,-0.71117616,-0.09132568,-0.98075783,0.06334288,0.49681652,0.34164643],[0.2180745,0.36604738,0.06154819,0.24362233,-0.8302129,-0.26283228,-0.009614421],[0.90993303,0.8324408,-0.153028,-0.3565887,-2.4188988,-0.39102378,-0.83334637],[0.49228296,1.0891999,0.14682251,0.06525131,-2.3566296,-0.27929735,-0.59872884]],"activation":"σ","dense_2_b":[[0.026272422],[-0.027382316],[-0.06374873],[-0.0018913196],[-0.10611498],[-0.28934753],[0.048449446],[-0.029426448],[0.03910206],[-0.061729193],[-0.17011756],[-0.19914334],[-0.35818344]]},{"dense_3_W":[[0.24681666,-0.43185285,0.43248656,0.446498,0.33516178,0.33663905,-0.33765137,0.12410014,-0.0055404617,-0.5735319,0.17945813,0.35185724,-0.14598772],[0.53883415,-0.66247576,0.09985266,-0.6038839,0.5757858,-0.11846804,-0.5524721,-0.14494437,-0.50289154,-0.5902578,0.45613047,0.08691653,0.45961568],[-0.016912147,-0.4347032,-0.2132421,0.42222002,0.053901196,0.26849094,-0.52274466,0.45093128,0.11547074,0.5519499,0.23178731,-0.7015563,-0.14213508]],"activation":"identity","dense_3_b":[[-0.047897134],[-0.038441896],[0.028599853]]},{"dense_4_W":[[0.7028314,1.0645722,-0.27114505]],"dense_4_b":[[-0.04197308]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json deleted file mode 100755 index d92c39429b..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01200x00x00x00x008965B0R02200x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.6717544],[1.0947602],[0.46523303],[0.04071385],[1.0781838],[1.0831677],[1.0886382],[1.0836236],[1.0735654],[1.0567871],[1.0353881],[0.040535703],[0.04058452],[0.04062954],[0.040666204],[0.040554516],[0.040246446],[0.03986381]],"model_test_loss":0.006968128960579634,"input_size":18,"current_date_and_time":"2023-08-13_02-03-42","input_mean":[[25.24135],[0.03279265],[-0.008847487],[0.006320684],[0.035298277],[0.03512001],[0.033641964],[0.029695673],[0.029064743],[0.02506108],[0.02039471],[0.00622451],[0.0062250104],[0.0062315515],[0.006241794],[0.006244377],[0.00616693],[0.0059778835]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.4494311],[-0.19496632],[-0.26350814],[-0.56510746],[-0.21877296],[-1.3355609],[-0.29426798]],"dense_1_W":[[0.5206159,0.10576821,-0.11247911,0.20491163,0.33990794,-1.2525518,1.0583574,-0.34753868,-0.06646643,-0.14601575,-0.14929412,-0.29487255,-0.06879391,0.50932205,0.11869424,-0.58628404,-0.042017702,0.17407125],[-0.031322703,0.5768025,-0.0025023601,-0.21647467,-0.082024425,0.88715947,-0.71050763,-0.072764166,-0.051216543,0.09057434,0.05977775,0.19192873,0.29378706,-0.26843268,0.13159594,-0.41493884,-0.08635731,0.19498013],[-0.035252336,-0.9459374,-4.970837,-0.084247485,0.27099663,-0.059329633,0.52409726,0.007877367,-1.1663415,-0.26411596,1.3571975,-0.31273174,-0.3185127,0.23015912,0.062651314,-0.25624627,0.57898873,-0.027787916],[-0.0215698,-0.50061035,-0.0036015501,0.046023894,0.2602722,-0.871437,0.46986884,0.06857351,0.1074371,0.086234815,-0.19308428,-0.04312489,0.029021757,-0.003684175,0.14100845,0.042754482,-0.21663295,0.14043325],[-0.9751645,-0.12289358,-0.1406582,0.13687797,-0.35888916,0.6194974,-0.6489919,0.38132963,-0.07326873,0.23100159,-0.6815848,-0.007814461,0.26971263,-0.07363272,-0.1855483,-0.18125555,-0.049100105,0.115237534],[-0.50956905,0.48556384,-0.10785587,-0.2540192,-0.032906525,-0.49255675,0.41026026,-0.14745457,-0.5306201,-0.008835799,-0.08571492,-0.25413102,-0.05079176,0.53850764,0.27346227,-0.18674931,-0.07856052,0.025163196],[-1.0250858,-0.32162967,0.13932756,0.28023055,0.23404084,-0.4745412,0.6844042,0.0050328784,-0.06439692,0.17258103,0.4165711,-0.16924205,-0.4714274,0.1771986,0.08547189,-0.1035464,0.5452405,-0.35472986]],"activation":"σ"},{"dense_2_W":[[1.1859789,-0.51215285,0.9208667,0.011160324,-0.26782367,0.1654521,-0.27158707],[-0.12362681,-1.2787738,0.076242216,0.5843017,-0.26689935,1.0748321,-0.3880148],[-0.40252876,1.0881231,0.25295937,-0.93297756,0.32773137,-0.5535702,-0.67666596],[-0.7580509,0.71760464,-1.0216886,-0.1978493,0.4836637,-0.17133161,0.036033805],[-0.75000304,0.63558036,0.32057714,-1.0511792,-0.3177557,-0.044755217,-0.11034487],[-0.5645773,0.27898332,0.47402716,-0.738025,0.3021792,-0.9873278,-0.7891343],[0.11762674,0.73939085,-0.3103913,-0.98226845,0.64397097,-0.80232793,-0.652079],[-0.9045628,0.8587723,0.80991477,-0.8700875,-0.65929556,-0.4393104,-0.4573712],[-0.8187899,0.97374254,-0.38434175,-0.96596724,0.19627793,0.10464935,-0.12969106],[-0.04873503,0.14666314,-0.10507614,-0.78823173,-0.57198745,-0.65050966,-0.39800155],[-1.3525742,0.27251542,-0.61843866,0.19277906,0.55250853,-0.57587695,-0.25846016],[0.09460951,-1.0067326,0.18680768,0.6701155,-0.7826965,1.0157732,0.62720263],[-0.056878928,-0.9902501,0.07337474,0.5947333,-0.14998591,0.9698875,-0.47638628]],"activation":"σ","dense_2_b":[[-0.08574547],[-0.25192508],[-0.1600956],[-0.2021993],[-0.12500837],[-0.014394304],[0.12166485],[-0.097488604],[-0.09498941],[-0.23732203],[-0.0033244065],[-0.18101275],[-0.42470968]]},{"dense_3_W":[[0.70182776,0.90544015,-0.27932724,-0.49617624,-0.51897824,-0.6904145,-0.59277976,-0.5324393,-0.26049465,0.16030513,-0.42422092,0.3099378,0.20038018],[0.46004465,0.14226505,-0.016798219,0.26416388,-0.23000899,-0.043261927,-0.18217951,-0.56936485,0.18854964,-0.40769655,-0.5120887,0.026711667,0.48702645],[-0.44730246,0.035538714,0.6696084,0.078126684,-0.28074992,0.32122174,0.87967885,0.15473741,0.48827088,0.37981582,0.6514756,-0.90970725,-0.3196454]],"activation":"identity","dense_3_b":[[0.14994316],[-0.13599911],[-0.09733387]]},{"dense_4_W":[[-0.89249825,-0.056084827,0.3851996]],"dense_4_b":[[-0.14319709]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json deleted file mode 100755 index 23317a11ef..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01300x00x00x00x008965B0R02300x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.1625595],[1.2922298],[0.62139535],[0.04567073],[1.2632741],[1.2715808],[1.280602],[1.2693822],[1.2542087],[1.2247165],[1.1909277],[0.045397192],[0.045449946],[0.04549305],[0.04545042],[0.045387167],[0.045147583],[0.044744927]],"model_test_loss":0.007525489199906588,"input_size":18,"current_date_and_time":"2023-08-13_02-31-54","input_mean":[[23.119978],[-0.008106127],[-0.0062186965],[-0.0048029637],[-0.007028825],[-0.0070267622],[-0.007759125],[-0.008229643],[-0.0065412563],[-0.0032345948],[-0.0015808723],[-0.0049269847],[-0.004904426],[-0.004871379],[-0.0047452976],[-0.0047200844],[-0.0047071795],[-0.004768657]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.01577489],[-0.036651418],[-0.53623146],[-0.43403396],[4.226777],[0.031024184],[-4.773621]],"dense_1_W":[[0.005327244,-0.8355596,-5.362093,-0.048572045,0.7178633,0.06106064,0.8468096,-0.2571259,-1.327196,-0.44217587,1.058469,0.056455363,0.14608839,-0.098923415,-0.23918279,0.04020538,0.23786233,-0.12770446],[-0.010223876,-0.72655255,0.016186269,-0.11808472,0.2876596,-1.2712218,0.5667468,-0.06084051,0.22512656,0.3755652,-0.40249628,-0.25125036,-0.21778338,0.5746524,0.078327455,-0.24237496,0.3175813,-0.17065156],[-0.6298655,-0.17408815,0.042584803,-0.12974305,-0.13674054,-0.59153414,1.1252804,-0.2748757,-0.054158274,-0.23418744,0.4553317,-0.65346336,0.012844898,0.62550545,0.32781297,0.10481739,-0.13386554,-0.13798119],[0.114467114,0.24316245,-0.021615224,0.023694778,-0.035225637,-0.8642168,0.8294254,-0.25606933,-0.040379446,-0.3500701,0.15988775,-0.56249446,-0.18230355,0.151895,0.51403975,0.42919087,0.06891423,-0.40883803],[1.7820107,-0.8729092,-0.18928063,0.09309557,0.3607095,-0.41220948,1.5652144,-0.46717206,-0.41226682,0.0013491283,-0.41942984,-0.089314334,0.004005952,-0.0747852,0.009556638,-0.010365505,-0.1098569,0.17348874],[0.0044284705,0.6163098,0.00083640264,-0.094127156,-0.18054871,0.9881279,-1.0137135,0.20937717,0.24207658,-0.08428015,-0.07552825,0.14980052,0.254931,-0.3509042,-0.14109994,-0.101399794,0.15016933,-0.14891316],[-1.9707493,-1.1365594,-0.2105259,0.37518528,0.6739353,-0.65524983,1.7848158,-0.51781315,-0.5952709,0.22437507,-0.5128836,-0.91568863,0.3721105,0.59358186,-0.64745224,0.10847048,-0.029750574,0.1424494]],"activation":"σ"},{"dense_2_W":[[0.1586283,0.49743327,-0.28523076,0.49164057,0.5328539,-0.36973375,0.12624636],[-0.48587608,-0.2487463,-0.402463,-0.3060397,0.36550063,0.62413186,-0.34166646],[-0.061889086,0.13580354,-0.05768418,0.19577123,0.74825233,-1.5275799,0.7398382],[-0.065775804,-0.68621314,0.34632745,-0.27306333,0.108429216,0.30584174,0.09895851],[0.062699154,-0.16094007,0.20373204,0.34869027,-0.24647439,-0.14964825,0.15067333],[-0.52050513,-0.28144282,-0.36549205,0.21830845,0.17705248,0.3885603,-0.4208156],[0.65049803,-0.7067532,-1.0366768,-0.71617734,-0.26613158,0.028896019,-0.6025038],[0.040614616,-0.5860749,0.0055378075,0.17320454,-0.3445164,-0.19920291,-0.76159173],[0.022094827,0.30371666,0.29163453,0.4747085,0.30273658,-0.80259377,0.18885104],[-0.5191858,-0.3626201,0.04160303,-0.24516961,0.25270674,0.3344741,-0.085464925],[-0.51586235,0.04108749,0.4809453,-0.68286794,0.22329661,0.64296246,-0.6787596],[0.71542096,0.24909717,0.18110462,-0.456406,1.59483,-0.40047887,-0.29970673],[0.09926485,-0.012050363,-0.00902432,-0.5706574,-0.62320197,0.99470526,-0.5348278]],"activation":"σ","dense_2_b":[[-0.28907308],[0.14058612],[-0.22265932],[-0.031506367],[0.011181118],[0.09338642],[-0.19179444],[0.025182663],[-0.16790742],[0.019717962],[0.025871284],[-0.48104918],[0.13777581]]},{"dense_3_W":[[0.39214996,-0.45933616,0.5931434,-0.14438477,0.025445614,-0.21986714,-0.4073649,-0.526483,0.32142904,-0.43845606,-0.5522683,-0.45861238,-0.23599972],[0.3541214,-0.12390408,0.65992594,-0.17913954,0.17470582,0.14348052,-0.46156922,0.09727183,0.47791806,-0.44638395,-0.35680237,0.28284937,-0.6322599],[-0.53958935,0.40429562,-0.25718197,-0.016856665,0.27269888,0.5572323,-0.11033956,0.29808432,-0.63412243,-0.18738142,-0.13287298,-0.55771834,0.74253505]],"activation":"identity","dense_3_b":[[-0.011752912],[-0.028205017],[0.029930305]]},{"dense_4_W":[[-0.4310748,-0.71519667,0.99503374]],"dense_4_b":[[0.028201103]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json deleted file mode 100755 index 854e30f3d9..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019 b'x028965B0R01400x00x00x00x008965B0R02400x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.595562],[1.3557196],[0.6436131],[0.045093063],[1.3374771],[1.3439865],[1.3497798],[1.3293898],[1.3081594],[1.2773685],[1.2442381],[0.044867057],[0.044940565],[0.04499815],[0.04493182],[0.04476657],[0.044359777],[0.043740414]],"model_test_loss":0.00823762733489275,"input_size":18,"current_date_and_time":"2023-08-13_02-59-30","input_mean":[[22.373413],[-0.041675597],[0.0139935],[-0.0017189209],[-0.04186074],[-0.041701995],[-0.04159802],[-0.031264056],[-0.02419872],[-0.014140531],[-0.0053126486],[-0.0018288051],[-0.0017968336],[-0.0017687711],[-0.0016978089],[-0.0016784823],[-0.0017457763],[-0.0018253779]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.2825171],[0.29270795],[-0.14191557],[4.8880744],[4.643753],[-0.022068096],[0.0074948124]],"dense_1_W":[[0.0032524515,-1.6502666,-5.143319,-0.08653302,0.74940306,0.079409406,1.0887363,0.55024517,-1.8755168,-0.37473255,1.0061337,-0.0072490247,-0.48503035,0.05145903,0.46511993,0.12256152,0.18945718,-0.26970908],[-0.5688282,0.3378242,-0.0820345,-0.35314164,-0.569916,-0.80707407,0.8573667,-0.4934631,-0.2502392,-0.106414326,0.23248182,-0.14921708,-0.1386045,0.47708175,0.50700176,0.44248942,0.027855754,-0.38461936],[0.21959259,-0.71326935,-0.07979012,0.34530672,0.636172,-1.2988864,0.6678013,-0.25917116,0.09184474,-0.032171894,0.1220121,-0.3971508,-0.46033743,0.8975076,0.10354636,0.072543696,-0.05976872,-0.14628923],[1.9510422,0.3866497,0.3618337,-0.12621135,0.20156476,0.15090744,-0.80365545,0.43618965,0.8912262,-0.21278769,0.53434885,0.22536062,0.21662591,-0.8340567,0.9400496,-0.24009539,-0.18682937,0.011327647],[1.9101932,-0.09988753,-0.35090855,-0.0016594501,-0.08788997,-0.25584847,0.5387623,-0.55900645,-0.7354033,0.11941465,-0.518064,-0.06519748,-0.0017339309,0.3745017,-0.6524051,0.06342098,0.34091005,-0.067744955],[-0.006107121,-0.09839651,-0.012231088,0.30222625,0.07460135,1.6269959,-1.7014208,0.03040909,0.22550346,0.044197246,0.0017101751,0.50942785,-0.16438055,-0.020442167,-0.1508841,-0.29599234,0.049566567,-0.19760182],[-0.020232651,-1.0527381,0.08056227,0.20597994,0.33630684,-1.5990256,0.97233945,-0.28341347,0.16153534,0.3039094,-0.3701453,-0.06703333,-0.18289685,0.3205004,0.21156645,-0.1997296,0.00204575,-0.10895797]],"activation":"σ"},{"dense_2_W":[[-0.57049316,-0.47958663,0.20998815,0.5900954,0.1954957,1.0093216,-0.37459356],[0.0711123,-0.05547968,0.24755229,-0.36353877,0.09672807,-0.2401484,0.6095298],[0.51119304,0.41856906,0.05460875,-0.19852686,0.20700233,-0.63960356,-0.03614955],[-0.44700778,0.22197174,-0.80856746,0.64109397,-0.5748055,0.7630393,-0.5093563],[-0.119287774,0.29882818,0.78802735,-0.5391423,-0.01341688,-0.67587036,0.41711807],[0.18750283,-0.7311276,-0.3832002,0.37338614,-0.50132436,0.13879292,-0.27468982],[0.2099454,0.06710706,0.49674693,-0.27869275,-0.057731844,-0.3134266,0.05398349],[-0.34767157,0.12649035,-0.82919586,0.03299373,-0.30653405,0.2602203,0.034945954],[-0.19299687,0.18560947,0.3825491,-0.08262691,-0.022920206,-0.03981069,0.5391385],[0.06231773,-0.6864966,-0.21304713,0.72882277,-0.8002371,0.68702626,-0.5636007],[-1.1283545,0.66055053,-0.60280657,-0.44466072,-1.1954936,-0.02034466,0.1492789],[0.054777786,0.22702163,-0.23401575,0.25109196,-0.7091251,-0.12651615,-0.074743904],[-0.23125705,-0.038868073,-0.0094622,-0.45092142,-0.56356156,0.11221505,-0.08776925]],"activation":"σ","dense_2_b":[[0.1788275],[-0.029162887],[-0.05410552],[0.14040445],[-0.05081904],[0.03014496],[-0.0008108878],[-0.2395291],[-0.0013514905],[0.25322255],[0.14901285],[-0.2634512],[-0.23830526]]},{"dense_3_W":[[-0.5489028,0.18956307,0.20569573,-0.6213917,0.7467413,-0.54990596,0.4036336,-0.026636245,0.5315489,-0.5165829,-0.7388474,-0.1318045,-0.034361653],[0.380212,0.4771973,-0.44244605,-0.54885596,-0.39711758,0.59357476,0.23979527,0.008609023,0.44370395,0.27729112,0.04513358,0.52764195,-0.15440719],[-0.27805048,0.48927543,0.31558773,-0.2270046,0.21011017,0.098380476,0.47707695,-0.25754115,0.26487526,0.0036550455,-0.24167007,0.37545148,0.19212462]],"activation":"identity","dense_3_b":[[0.028461946],[0.00041110683],[0.007205736]]},{"dense_4_W":[[-1.1770037,-0.121750355,-0.17705767]],"dense_4_b":[[-0.025750196]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019.json deleted file mode 100755 index 771d0d0b45..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2019.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.56172],[1.5150591],[0.61463565],[0.048025005],[1.4822352],[1.4941419],[1.505296],[1.4785786],[1.4448495],[1.4001503],[1.3552352],[0.047890753],[0.047929697],[0.047957852],[0.0478742],[0.047784578],[0.047500774],[0.04700782]],"model_test_loss":0.013011353090405464,"input_size":18,"current_date_and_time":"2023-08-12_23-45-39","input_mean":[[22.329546],[-0.045605175],[0.01592502],[-0.0018784865],[-0.045549437],[-0.045191955],[-0.044704963],[-0.035537414],[-0.026267633],[-0.0157286],[-0.00838497],[-0.001896298],[-0.0018774128],[-0.0018634307],[-0.0018498951],[-0.0018851961],[-0.0019609453],[-0.0019896321]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-4.30314],[-0.14142546],[-0.013767572],[1.194878],[-1.2208039],[-4.3557434],[0.08794612]],"dense_1_W":[[-1.8972677,0.9672059,0.25824386,0.0828847,0.3341447,0.69297504,-1.9695483,0.038245548,1.0612612,0.13501422,0.27874982,-0.09969699,0.0374315,0.48933214,-0.011004679,0.017130712,-0.2716565,-0.23346075],[-0.007528385,2.1774812,-0.114808366,-0.39051452,0.7741447,1.1673083,0.13397868,0.44196582,0.9315971,0.6791667,0.5054393,0.15570343,0.23017462,-0.031832017,-0.076586366,0.25111264,0.24159965,-0.33496174],[0.0030608005,1.4381056,0.11511048,-0.7743296,-0.7203884,1.597554,-0.99584186,0.5960368,-0.19229466,-0.2975349,-0.011686272,0.49059817,0.1897865,-0.60492635,-0.6754905,0.101577304,0.31291947,0.25055414],[-1.0824282,-0.3043732,0.008584764,-0.018848956,-0.2089088,-1.0749328,1.0982482,-0.045640092,0.044488285,-0.11731847,-0.026736904,-0.57326096,-0.046581715,0.0950547,0.23073886,0.3822833,-0.2204155,0.1618918],[1.0632011,0.031152897,0.009230802,-0.39440817,0.18390684,-1.6168276,0.77715576,-0.050903037,0.16450162,0.124611534,-0.24373147,0.17009573,-0.5080612,-0.038760606,0.6419307,-0.1795093,0.24181002,0.07538436],[-1.9245406,-1.2917063,-0.26165596,0.39217517,-0.32974318,-0.9253293,2.608757,0.04103854,-1.2233304,-0.3679585,-0.086496115,-0.66351557,0.284825,-0.11610917,-0.6876215,0.44495583,0.12274311,0.21472873],[-0.0011509256,1.924439,4.888321,-0.34858927,-1.0936936,-0.2615667,-0.22090028,0.51795596,1.1996402,-0.060851824,-1.5311006,0.81339735,-0.17505,-0.25228173,-0.29199755,-0.48492575,0.2323905,0.3359508]],"activation":"σ"},{"dense_2_W":[[-0.04723237,-0.5713439,-0.44814402,-0.3774354,0.23023804,-0.20165691,-0.4617632],[0.81059057,-0.33529666,0.6886719,-0.47035518,-0.55307055,-0.28818864,0.12439424],[-0.11119899,0.1494808,-0.64621824,-0.3822803,-0.10293467,-0.13095938,-0.5011403],[-0.7855487,-0.074596755,-0.277924,0.6098594,0.39072365,0.54389304,-0.04757158],[-1.0348403,-0.13555157,-0.79879016,0.699813,0.8297562,0.72075176,-0.1580287],[-0.12593223,-0.5242968,0.0027506559,-0.9838703,-0.14292116,-0.21127757,-0.4181084],[0.6277679,-0.06471201,0.2519138,-0.44575757,0.0035869328,-0.8165587,-0.14451581],[0.60958606,0.1644053,0.5917127,-0.34198347,-0.19222917,-0.6290825,0.20473154],[-0.29616356,-0.008838329,-0.56584114,-0.01621055,0.6894716,0.5036691,-0.23140316],[0.3176332,0.55119896,0.49262676,-0.6794437,-0.6079304,-0.71099347,0.47087783],[-0.001160002,0.21010941,0.29942355,-0.37181187,0.101982266,-0.29694918,0.7613698],[-0.57210505,-0.40474287,0.14816071,0.5515802,0.71525896,0.29420164,-0.41057208],[-0.031878855,0.1834812,-0.557275,-0.16315645,0.73640525,0.5667018,-0.106642045]],"activation":"σ","dense_2_b":[[-0.28198278],[-0.031724684],[-0.2700433],[-0.14344712],[-0.0712461],[-0.207197],[-0.1985745],[-0.07992782],[-0.09112537],[0.012330677],[0.035785448],[0.029941175],[-0.07723248]]},{"dense_3_W":[[-0.41012377,-0.0750153,-0.51992136,-0.575433,-0.15829727,0.14711393,-0.2113123,0.6098498,0.2744829,-0.19297485,0.11055155,0.11664247,-0.42073438],[-0.42603567,-0.2637008,-0.4624474,0.37126887,0.3297134,-0.24870478,-0.71104676,-0.42295957,0.09491146,-0.68906903,-0.06497983,0.4588389,0.36360323],[0.0015361789,-0.27568248,0.044544894,-0.35505277,0.5103815,0.18121512,0.29294804,0.0725655,0.60120976,-0.026808323,-0.29816794,0.5696804,-0.28550223]],"activation":"identity","dense_3_b":[[0.050192077],[-0.035694942],[-0.053834025]]},{"dense_4_W":[[0.8585161,-1.0563794,-0.6090095]],"dense_4_b":[[0.04216754]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42172x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42172x00x00x00x00x00x00'.json deleted file mode 100755 index f40d2fa792..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42172x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.412672],[1.1979997],[0.6317731],[0.044134922],[1.1613084],[1.1757178],[1.1884606],[1.1675756],[1.1450535],[1.1208285],[1.0900035],[0.043903794],[0.043967567],[0.04402576],[0.044101108],[0.044096585],[0.043959502],[0.04365427]],"model_test_loss":0.009366453625261784,"input_size":18,"current_date_and_time":"2023-08-13_04-00-19","input_mean":[[22.805677],[0.042888522],[-0.002057468],[-0.017817942],[0.045564543],[0.04457066],[0.04343476],[0.04418247],[0.042020433],[0.034090705],[0.033118203],[-0.017768152],[-0.017786173],[-0.017803175],[-0.01795426],[-0.017958898],[-0.018003935],[-0.018080201]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.110753275],[-3.7608747],[0.0069373823],[-0.4614981],[-3.301801],[-0.014949581],[0.13146858]],"dense_1_W":[[-0.0036052228,-0.9134565,0.011775863,-0.104338825,0.50702333,-1.3347127,0.43979335,0.32727206,-0.3549518,0.1707619,-0.06355575,-0.42169005,0.11168042,0.32078785,0.16003191,0.22976972,-0.3087875,0.02821579],[-1.5740833,-0.5183325,-0.25200287,-0.1016893,0.21293215,-0.26341066,0.8987055,-0.7441156,-0.34343657,0.10333513,0.015100161,-0.025416875,-0.34263033,0.3139959,0.31424755,-0.0986391,-0.1432429,0.2556411],[0.012172019,0.7366857,4.0765634,0.5199466,0.5682854,0.4320513,-1.0643913,-0.4115053,0.25080773,0.15999946,-0.6883774,0.4775558,-0.14264597,0.25075626,-0.79590684,-0.5458843,0.14667971,0.2089872],[-0.006554994,-0.65382326,-0.0152408695,0.45012295,0.43787235,-1.2492634,0.96254647,-0.0071797133,0.20040128,0.052020404,-0.12437481,-0.55438083,-0.17110933,0.1521984,0.3463892,-0.29791614,0.38824236,-0.24384183],[-1.5182815,0.36061874,0.24495271,-0.28876624,-0.054025646,0.09653467,-0.6130963,0.58099127,0.13013393,0.15593274,-0.05823013,0.42072526,0.30042237,-0.8197303,0.4167901,0.12898338,-0.19402294,-0.1354475],[-0.0022215121,-0.35342693,0.05437431,0.07748616,0.15085074,-0.74330544,0.8852311,-0.09556112,0.18634337,-0.15945065,-0.00033352937,-0.1618802,-0.19378874,0.112232834,-0.2201298,0.32024163,-0.07431912,0.20214744],[-0.012104868,0.06879351,0.20518698,-0.3500171,-0.54368746,0.8862013,-0.4934571,0.2377762,0.40319738,-0.15937808,-0.36041725,0.014896415,-0.16455528,-0.76308006,0.1687108,0.33528942,0.39151073,0.23726699]],"activation":"σ"},{"dense_2_W":[[0.40863213,1.09518,-0.25529328,0.31099716,-0.23821151,-0.1252298,-0.5552002],[-0.42047146,-0.4827329,0.2864231,-0.765981,0.47332808,-0.15582423,0.40268713],[0.63550895,-0.029280502,0.17191784,1.1201406,0.10288998,0.7509795,-0.70378363],[0.15874045,0.1510755,-0.3895043,0.6858349,0.16745095,0.3997049,-0.4700419],[-0.29952693,0.22967328,0.2863864,-0.810409,0.6171967,-0.8057256,0.08393511],[-0.6486345,-0.023099914,0.4675164,-0.6659177,0.25236258,-0.71584076,0.3096002],[0.71282494,0.33055237,-0.11847034,0.60865057,-0.772154,0.49154654,-0.5714387],[-0.78605217,-0.00037871118,-0.3303249,-0.6224991,-0.14092278,-0.09522645,-0.30699593],[0.8150833,-0.19859204,-0.2607902,0.5500899,-0.53263944,-0.09620078,-0.07882722],[-0.6767907,0.010670528,0.32155117,-0.08829821,0.5477537,-0.07313992,-0.5654307],[-0.09579456,-0.42669368,0.27080974,-0.6856269,0.4908146,-0.70633966,0.13399492],[0.45092934,-1.0722996,-0.5651186,-0.8076614,-0.44906232,-0.43937942,-0.30797964],[0.330296,-0.6318943,0.30196452,0.08447742,0.35562196,-0.72430176,-0.7196764]],"activation":"σ","dense_2_b":[[-0.10103021],[-0.07237988],[-0.10848336],[-0.036251254],[-0.06057428],[0.2591175],[-0.13453443],[0.038662404],[-0.03901396],[-0.10080519],[0.21275711],[-0.16303454],[-0.122491874]]},{"dense_3_W":[[-0.438746,-0.2728812,0.045525227,-0.3864609,0.36935923,0.21368839,-0.5939579,0.16156128,0.114174105,0.013049866,-0.008147875,-0.4032706,0.18928905],[-0.54620934,0.5383141,-0.4279512,-0.4393462,0.6210919,0.52767473,-0.47722214,0.66437435,-0.2349947,0.24046247,0.7181641,0.4821915,0.1510222],[0.63923234,0.064001255,0.62742436,0.21747853,-0.37516952,-0.08939772,-0.07508889,-0.52245426,-0.36398694,0.08213987,-0.6971847,-0.47528505,0.28324062]],"activation":"identity","dense_3_b":[[-0.016175348],[-0.045647956],[-0.029259264]]},{"dense_4_W":[[0.4314022,1.2294345,-0.15208964]],"dense_4_b":[[-0.03797295]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42182x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42182x00x00x00x00x00x00'.json deleted file mode 100755 index 7e99b3ee34..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'8965B42182x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.038209],[1.09115],[0.58841705],[0.04120297],[1.0650965],[1.0757538],[1.0846869],[1.0705407],[1.0502529],[1.0200819],[0.9942558],[0.041278385],[0.041227303],[0.041172404],[0.04093896],[0.04077007],[0.040474173],[0.04011864]],"model_test_loss":0.008322028443217278,"input_size":18,"current_date_and_time":"2023-08-13_04-26-29","input_mean":[[19.35511],[0.030055698],[-0.016438086],[0.010118738],[0.034582045],[0.03268271],[0.030520633],[0.024380086],[0.01949945],[0.009070484],[0.0008187817],[0.010378993],[0.0103315525],[0.010291569],[0.0102992],[0.010390825],[0.010437563],[0.010471735]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.71080106],[-0.39767665],[-1.0195663],[-2.4454567],[2.2261577],[-0.09989114],[0.12794948]],"dense_1_W":[[-0.6734729,-0.28932476,0.0138231935,0.6177876,-0.15232189,-1.1696538,0.730194,0.022715418,0.6191517,-0.14222449,-0.26050287,-0.4294454,-0.33338618,0.43053976,0.0796189,-0.26277167,0.2849497,-0.15557633],[-0.05414103,-2.266047,0.00613671,0.03952902,-1.5264792,-1.9569396,-0.6220431,-1.4173054,-0.75115013,-0.51321524,0.081751466,-0.010653298,-0.18178755,0.30361202,0.1966698,0.10920531,-0.1763718,0.46204364],[0.59744245,-0.45304865,0.01262204,0.17445521,-0.24134386,-1.0839043,0.67658186,0.4959112,0.036302716,0.21944934,-0.37493265,0.031681668,-0.380639,-0.016364183,0.47792554,0.2549743,-0.2674703,-0.011161444],[-0.6851998,-0.400606,-0.49484125,-0.214028,-0.1954561,-0.20455971,0.19458835,-0.62406296,-0.24194877,-0.17115325,0.3458003,-0.38039616,-0.19315414,0.7750066,0.27001703,-0.032702632,0.17871174,-0.09447013],[0.68511105,-0.46930492,-0.49280137,0.10116556,-0.2338568,-0.67072135,0.66908896,-0.36548007,-0.45608816,-0.055914342,0.27099574,-0.15043867,-0.3710818,0.33710575,0.39674795,-0.10886804,0.23883794,-0.13643274],[0.029596586,-1.8378116,-4.835868,-0.117306955,0.68529356,-0.2723494,0.8876275,-0.08609639,-0.17212754,-0.0016869277,0.6372433,-0.34045476,-0.32072458,0.5590455,0.019711575,0.08534893,0.22889003,-0.008147916],[0.12550998,-0.5612814,-0.015401064,-0.12878568,1.311814,-1.4296403,1.0471376,-0.05140145,-0.37987107,0.057461046,0.23428072,0.10266636,-0.17472467,0.22596104,-0.0015113074,-0.029831069,-0.23511468,0.16630976]],"activation":"σ"},{"dense_2_W":[[-0.16429533,-0.37868544,-0.86968327,0.038888782,-0.6123927,0.0023984741,-0.057672873],[-0.8476257,-0.29583248,-0.67205304,-0.36270946,0.27317914,0.37164906,-0.2357329],[0.4565083,-0.055655904,0.442506,0.36896625,0.50816137,-0.031650446,-0.08521712],[0.9475783,-0.42539543,0.16942857,0.6493747,-0.1678662,0.084014334,0.41585678],[0.19024913,-0.35226712,-0.28252858,0.41698533,-0.87595725,-0.58208317,-1.0035533],[0.7211048,0.63076013,0.3922959,1.2696142,-0.70998734,-0.14198317,0.2581067],[-0.83778936,-0.04513129,-0.14693034,-0.14507426,-0.40756947,0.13452101,-0.7361817],[-0.29602185,0.040760204,-0.41493273,-0.40465754,-0.08350711,-0.33569443,0.19498646],[-0.15095061,0.33132613,0.5001891,-0.11200301,0.5794387,0.57178,0.43034536],[-0.67328364,-0.6793664,-0.3576356,0.018860316,-0.34526905,0.2174788,-0.77950203],[0.3714874,0.3679473,-0.5132016,-0.37143388,-0.82780284,-0.5017991,-0.6383511],[-0.10127275,0.23966174,-0.2606357,-0.6428221,-0.50568867,-0.20557041,-0.23762174],[0.020065116,-0.2712377,0.249374,-0.14273904,-0.64751804,-0.7200119,-0.34964135]],"activation":"σ","dense_2_b":[[0.012003523],[0.0066150334],[-0.19111954],[-0.22128096],[-0.17908531],[-0.7933061],[-0.027471995],[0.122777395],[-0.33527485],[0.06287324],[0.14836572],[0.06252556],[0.09372547]]},{"dense_3_W":[[-0.23665334,0.723523,-0.63925576,-0.6986978,-0.17180254,0.12065741,0.11170402,0.09213536,-0.72547287,-0.060505576,-0.07866674,0.598629,0.61649084],[-0.5524962,-0.6655416,0.49857664,0.40452972,-0.23933083,0.37202802,-0.18277252,-0.3782749,0.18721648,-0.7559194,-0.61349714,-0.63339907,-0.47192994],[-0.59970725,-0.032464698,0.5048768,0.3264773,-0.12589443,0.22296196,-0.11026481,-0.4933927,0.17230077,0.19409345,-0.5158414,-0.41455555,-0.16241634]],"activation":"identity","dense_3_b":[[-0.030606706],[0.07558715],[-0.078843266]]},{"dense_4_W":[[0.48447892,-1.2192938,-0.18857154]],"dense_4_b":[[-0.0684882]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json deleted file mode 100755 index e44065aaf6..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022 b'x028965B0R01500x00x00x00x008965B0R02500x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.7215185],[1.5296972],[0.6329213],[0.048140034],[1.5023713],[1.5115433],[1.5213315],[1.4992337],[1.4733845],[1.4334533],[1.382772],[0.047901835],[0.047970153],[0.04804064],[0.048103515],[0.048074424],[0.04788978],[0.047572568]],"model_test_loss":0.007313914597034454,"input_size":18,"current_date_and_time":"2023-08-13_04-58-50","input_mean":[[24.426073],[0.0035376903],[0.010450098],[-0.0058580884],[-0.0003155768],[0.0006170886],[0.000841817],[0.008119883],[0.013678599],[0.016964255],[0.018914642],[-0.005899203],[-0.0058827517],[-0.0058742235],[-0.00586261],[-0.005887352],[-0.006023831],[-0.006199134]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.9262018],[0.6111764],[-0.21979779],[-0.08344832],[0.022952111],[2.2652647],[-0.055222925]],"dense_1_W":[[0.9477257,-0.010930782,0.2693092,-0.45176712,0.17638065,1.0103005,-1.1566194,0.1956058,0.48887056,-0.27086145,0.17099643,0.25299495,0.017165674,0.022744065,-0.2071281,0.51604414,-0.05360476,-0.08305532],[1.0653174,-0.19370075,-0.025619261,-0.07976432,0.21888945,-0.01620505,1.3145335,0.19960856,-0.16116017,-0.078303546,0.18846263,-0.4369984,0.07841701,0.5242291,0.21971513,-0.06500557,-0.6251961,0.35055155],[-0.010343126,-1.5992315,-5.575023,0.1296738,0.96921855,0.65707296,0.41981772,-0.39755943,-0.6237099,-0.5377202,0.82652205,-0.46393546,-0.0025167326,0.041792773,0.53836185,-0.20812295,0.23478688,-0.22422998],[-0.06835915,-0.6826863,-0.015550686,-0.1606268,0.49856377,-1.4255869,0.9663564,-0.13549313,0.11399871,-0.09810915,0.016424825,-0.27376917,0.32651708,-0.062065434,0.25883147,0.07828936,-0.12748928,-0.020732597],[0.1960928,0.63389885,-0.03986251,-0.14436735,0.3994569,1.0923187,-1.275591,-0.005756016,-0.022560176,0.09950554,0.08471099,0.21786727,0.053738844,0.26008365,-0.37622976,-0.28200307,-0.0041179312,0.25905907],[0.88009626,-0.059545647,-0.22990677,0.07681021,-0.3075392,-0.30781925,0.5865939,-0.20266494,-0.2824905,0.08512942,-0.08384962,-0.23466583,0.10275819,0.017015647,0.14026842,-0.11592076,0.022960545,-0.014085652],[-0.0016292254,-0.029161997,0.011123573,0.08816466,0.2067326,-1.0287801,0.82265383,-0.50439996,-0.41555846,0.018268801,0.21765414,-0.426295,0.08660844,0.20978588,0.32856998,-0.16593574,0.3182436,0.065723486]],"activation":"σ"},{"dense_2_W":[[-0.661899,0.42421028,0.1291513,0.5268525,0.27374566,0.14350797,0.048248857],[-0.11925823,0.11275892,-0.41860747,0.54141617,-0.53575426,0.08692167,0.5685374],[-0.47604066,0.40048516,-0.20540014,0.2697244,-0.59070647,0.4921443,0.2070969],[-0.32401973,-0.38705194,0.27830896,0.67634106,-0.7964134,-0.31952748,0.38753203],[0.24913147,-0.6288573,-0.30587563,-0.6941863,0.49562398,-1.0631434,0.14025775],[0.38366526,0.10850745,-0.16820778,-0.61344117,0.7374608,-0.6747489,-0.4225247],[-0.92967755,-0.35374784,0.19986466,-0.42288387,0.06183304,0.25832188,-0.25597203],[0.37240422,-0.8985459,-0.7266072,-0.50966,0.232016,-1.608445,-0.05613529],[-0.48152244,-0.6014514,0.05382254,-0.49254656,-0.49155635,-0.2361675,-0.46588454],[0.1545446,-0.4907671,0.5083054,-0.2939329,-0.4241678,-0.30181906,0.023612102],[0.5494282,-0.58802557,0.2443711,-0.25153464,1.2320807,-0.1922564,-1.3002108],[1.0176622,-0.21668118,-0.57886964,0.23822442,0.5329754,-0.22148608,-0.86639875],[-0.64741355,-0.27867457,-0.3316186,0.47602695,-0.22179708,0.23058596,-0.22336796]],"activation":"σ","dense_2_b":[[-0.014282428],[-0.015652178],[-0.049183264],[-0.036203776],[-0.056914896],[0.044381518],[-0.24765426],[0.18313628],[-0.24192591],[-0.027628785],[0.10131799],[0.16464141],[-0.029622875]]},{"dense_3_W":[[-0.30585924,-0.29776183,0.017245587,-0.13364966,-0.03414496,-0.038568087,-0.4033021,0.49503553,-0.28328845,0.058581755,-0.52184415,-0.048386358,0.3499786],[-0.4463572,-0.28294104,-0.3023481,-0.6776053,0.3948947,0.5377114,-0.4929832,0.6458604,-0.41316226,-0.25560462,-0.017290222,0.52392954,-0.13529858],[-0.31588498,-0.4325672,0.013085138,-0.35966408,0.3466711,0.64089996,0.41701752,0.48426676,0.4087031,-0.117455825,0.54724884,0.014698518,0.3365335]],"activation":"identity","dense_3_b":[[0.03199178],[-0.015016341],[-0.030428993]]},{"dense_4_W":[[-0.47214445,1.2712222,0.7399426]],"dense_4_b":[[-0.017716983]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45070x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45070x00x00x00x00x00x00'.json deleted file mode 100755 index 1d00c216e5..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45070x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.280848],[1.1441286],[0.49247316],[0.043405242],[1.1318773],[1.1372043],[1.1416951],[1.1172512],[1.0926574],[1.0570114],[1.0212463],[0.043282885],[0.0433304],[0.04336672],[0.043335043],[0.043221824],[0.042944487],[0.042431764]],"model_test_loss":0.016205428168177605,"input_size":18,"current_date_and_time":"2023-08-13_05-56-46","input_mean":[[22.453661],[-0.009690426],[0.0065032323],[-0.011651958],[-0.011165308],[-0.010400566],[-0.010001306],[-0.006500233],[-0.0026201021],[-0.00101425],[0.0021699886],[-0.011677432],[-0.011668723],[-0.011660133],[-0.011728811],[-0.011773433],[-0.011841056],[-0.011894497]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.45916697],[0.17990263],[2.2869246],[-0.1486742],[2.143754],[-0.3825331],[0.16539572]],"dense_1_W":[[0.10585518,-0.46735394,-0.009863335,-0.021381542,-0.4244482,-1.2823756,1.3433533,-0.017593514,0.100421146,0.03068365,-0.19143356,-0.8520446,0.08467846,0.82457775,0.26455942,-0.011366051,0.06678089,-0.16026749],[-0.06685822,-1.7700669,0.11150118,-0.28181335,-1.0776445,-2.2213879,0.06633769,-0.15360656,-0.8972572,-0.9021122,0.29181656,-0.7535559,0.32498777,0.30637822,-0.28905466,-0.0010783104,-0.22794016,0.15364477],[1.2818815,0.109987624,0.2811549,-0.068773136,0.79602146,1.4748589,-1.2838098,0.6895842,0.17164242,-0.20557097,-0.15411322,0.64261883,-0.10280259,-1.076077,0.26151523,-0.14356074,0.22765741,-0.1712026],[0.00041574636,-0.8197861,-7.5684586,-0.20047867,1.8402718,1.5231626,1.8098993,-0.22563997,-3.465762,-1.2912288,0.45179537,-1.9075481,-0.4387407,0.33126295,0.9639218,0.17788078,0.9106507,0.21989372],[1.3135848,-0.7858198,-0.29094377,0.46257696,-0.6470547,-1.1060529,0.93220985,-0.29039016,-0.13737987,0.22807792,0.091788515,-0.4748053,0.29867622,0.10891013,0.1858073,-0.2401894,0.0743765,0.03681374],[0.17066078,0.8237773,0.015143466,-0.29137167,0.4125562,0.54849124,-1.2481003,0.22669321,0.16218764,0.29865333,-0.25207785,0.55817974,0.21856284,-0.39747208,-0.28270063,-0.124221325,-0.20349917,0.31628203],[0.009792184,1.0716915,2.69444,-0.35925958,-0.23096997,0.36079913,-0.89602,0.5258335,0.7044103,0.23169777,-1.0493258,1.1821613,0.088788554,-0.035593744,-0.9683611,-0.04424868,-0.010434928,-0.043576322]],"activation":"σ"},{"dense_2_W":[[0.88951546,-0.42895758,0.10749227,-0.3381338,0.09804924,-0.3220585,-0.34573475],[-0.17474814,-0.7170482,-0.4465272,-0.64623255,-0.80796534,0.3396964,0.07690326],[-0.5762065,-0.6574665,-0.29811725,-0.5354601,-0.6161121,-0.66814727,-0.2610467],[-1.3073108,0.15640761,-0.30923235,-0.17911297,-0.16084199,0.69541067,-0.20413654],[0.90569836,0.4278247,-0.25071362,-0.5082455,0.06064604,-0.63132465,0.46831772],[-0.094200686,-0.14353256,-0.27645656,-0.27311286,-0.14429812,0.091689125,-0.28688306],[-1.1108559,-2.1028638,2.165349,-0.4345446,1.483305,1.620506,0.45829046],[0.09066979,0.10443071,-0.6832421,0.356451,-0.74987555,-0.29007706,-0.6587826],[-1.3760568,0.9482072,-0.18900378,-1.0709974,0.0681376,1.1254492,0.5331122],[-0.07830287,-0.39997748,-0.14344335,0.5135632,-0.47504225,0.22800393,0.12365315],[0.63020027,0.13533631,-0.3766346,0.527763,-0.6002866,-0.6792991,-0.053642306],[-1.2443005,-0.5468849,-0.62122345,0.013166506,-0.86239994,0.025351316,0.6255306],[-0.8236448,-0.8727682,-0.48299453,-0.04941957,-0.7763088,0.8878766,-0.12215169]],"activation":"σ","dense_2_b":[[0.0247172],[-0.06766249],[-0.24181516],[0.13942689],[-0.0052647507],[-0.0077950996],[0.6178939],[-0.27566597],[0.032193415],[0.014206651],[-0.071907036],[-0.05319885],[-0.047229856]]},{"dense_3_W":[[0.47991514,-0.21854271,-0.1804915,-0.48911753,-0.10791347,0.23705998,-0.4666875,-0.48106343,0.2307863,-0.26415148,0.40653455,-0.6642067,0.26701903],[-0.28657764,0.53769946,-0.40891734,-0.02096517,0.2780794,0.44527766,-0.24414495,0.3990269,0.20819953,-0.3683124,-0.29138583,-0.5663968,0.52042514],[-0.3011377,0.5968053,-0.0044070026,0.30039677,-0.6778224,-0.44649825,0.21434684,-0.3961862,0.7583285,-0.32607108,-0.66463107,0.40846905,0.67910755]],"activation":"identity","dense_3_b":[[0.035978876],[-0.011928141],[-0.029860198]]},{"dense_4_W":[[-0.5814999,0.06673667,1.1037177]],"dense_4_b":[[-0.030712485]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45080x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45080x00x00x00x00x00x00'.json deleted file mode 100755 index fcae3d72da..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45080x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.146588],[0.95418143],[0.43340117],[0.03905011],[0.9479113],[0.9499558],[0.9510725],[0.94235235],[0.9326399],[0.91747427],[0.90183586],[0.039001305],[0.03900259],[0.03900094],[0.03879979],[0.0386242],[0.038319785],[0.037957985]],"model_test_loss":0.011259999126195908,"input_size":18,"current_date_and_time":"2023-08-13_06-22-55","input_mean":[[24.366568],[0.0021789675],[0.0025915417],[-0.0051793563],[0.00033371797],[0.000241019],[0.00014475512],[0.0025261848],[0.007706368],[0.008204942],[0.0068165124],[-0.0052624918],[-0.0052542],[-0.0052515985],[-0.0052647493],[-0.0052907555],[-0.005419828],[-0.0056095705]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.7336471],[0.02469658],[0.35684168],[-0.3532868],[-1.130788],[-0.080318995],[-1.5789121]],"dense_1_W":[[-0.64860713,-0.5713194,-0.0010171949,-0.8196765,0.5477699,0.7899214,0.23730105,0.33738092,0.032365516,0.044066656,0.112801746,0.04844126,0.52755666,-0.16293125,0.2042048,0.385338,-0.20983423,0.022781417],[0.01108318,0.46447736,0.031032741,-0.6179811,0.24768326,0.91782635,-1.3839803,0.19786762,0.18436638,0.3508326,-0.30270633,0.1014005,0.5165744,0.25080827,-0.654024,-0.83023304,-0.030366233,0.38658044],[1.1167343,-0.5371559,8.987758e-6,-0.21433865,-0.07572796,0.5795516,-1.3121548,-0.58627963,0.30778974,-0.009247612,-0.023929322,0.62669486,-0.02801999,-0.54888064,-0.2571279,0.40885362,0.01660022,-0.031134106],[-0.07193165,1.1033614,4.970244,-0.30471626,-1.0119324,-0.46201298,-0.7883615,-0.069143996,1.3630129,0.77040046,-0.84834325,1.7408925,-0.05897951,-0.097375624,-0.20112686,-1.0965652,-0.44313067,0.49282008],[-1.170487,-0.874422,-0.00026626769,-0.28228784,-0.088807434,0.43260026,-1.0325773,-0.096812546,0.17837521,0.109854095,-0.14968073,0.12017141,0.53054005,-0.51490897,0.024915364,0.15639779,-0.2467258,0.1595003],[0.022389904,1.0608602,-0.00092857826,0.28875074,0.21020184,0.5167493,-0.5882544,0.021157121,0.032180592,-0.2136807,0.19360738,0.55395454,-0.30576155,-0.51958877,-0.11451182,0.04725566,0.11142395,-0.04842062],[-0.7362178,-1.3755006,0.00096091843,-0.22289632,-0.1438102,-0.9025203,1.0324214,-0.18327402,0.08280124,0.023658695,-0.08867019,0.047302973,0.25789154,0.040970705,0.12989049,-0.39808056,-0.12234827,0.25104594]],"activation":"σ"},{"dense_2_W":[[0.78154695,0.21511142,-0.43714777,-0.030767908,-0.009173835,0.7183903,-0.14342828],[-0.54066896,-0.20156115,-0.35385814,-0.26441637,-0.02107599,-0.84845865,0.29214594],[0.3124417,0.21180186,0.063465446,-0.20406622,0.40963924,0.59125894,-0.7869325],[-0.7548771,-0.43420765,-0.02560193,0.41974467,-0.51081544,-0.7608768,0.20380737],[0.1265696,-0.17943808,-0.43707883,-0.28236973,-0.8968599,-0.34403643,-0.035097532],[-0.101388685,0.3316813,-1.1519573,-1.6520184,0.3636926,-0.7423692,1.2117586],[0.15023874,0.345581,-0.46650666,0.11859452,-0.2518907,0.79158175,0.23256831],[-0.10569177,0.5604173,0.68333226,0.8951173,0.042214226,0.38135228,-0.8231335],[-0.8847682,-0.68416154,0.4569707,0.47695133,-0.38582966,-0.57144934,0.7719593],[0.27912247,0.13382833,-0.7093698,-0.68917704,-0.6986833,-0.71800274,0.44724673],[-0.24284345,-0.20109548,-1.1195686,-0.67754227,-0.48026723,-0.24137561,-0.04529532],[-0.038835,-0.9078514,0.17316182,0.119565316,-0.9398113,-0.016460646,-0.50889707],[-0.50108016,-0.11253731,0.23106413,0.06696553,-0.15908737,-1.1488036,0.34958452]],"activation":"σ","dense_2_b":[[-0.1418599],[-0.19710542],[-0.110050105],[0.1076101],[-0.12195556],[-0.021285616],[-0.07804289],[-0.14162357],[0.061964434],[-0.079768986],[0.12962815],[-0.0064196354],[-0.016493268]]},{"dense_3_W":[[-0.72732776,0.14124086,-0.20111452,0.42510116,0.15858391,0.57676667,-0.5278801,-0.6789197,0.5398626,0.54049456,0.6322282,0.3313076,-0.17548639],[-0.21989414,-0.5007377,0.73611426,-0.5268293,-0.031320885,-0.20501229,0.061116677,0.49025694,-0.24863736,0.5271555,-0.5499532,-0.14880382,-0.44022956],[-0.7556335,-0.42262074,0.31918573,-0.032287117,0.20668483,0.54373014,0.04109339,-0.082154974,0.545164,0.57818425,0.51500225,0.51791734,0.3929478]],"activation":"identity","dense_3_b":[[-0.06250194],[0.06764598],[-0.09165578]]},{"dense_4_W":[[-0.7602953,0.7817076,-0.72182196]],"dense_4_b":[[0.06962905]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45082x00x00x00x00x00x00'.json b/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45082x00x00x00x00x00x00'.json deleted file mode 100755 index d639277c31..0000000000 --- a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018 b'8965B45082x00x00x00x00x00x00'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.3108945],[0.9977488],[0.42284822],[0.037617117],[1.0103788],[1.0064898],[1.0015848],[0.96092135],[0.9357677],[0.9055774],[0.8795561],[0.037663084],[0.037589002],[0.037515257],[0.037092976],[0.03673727],[0.03622884],[0.03562327]],"model_test_loss":0.015439342707395554,"input_size":18,"current_date_and_time":"2023-08-13_06-49-13","input_mean":[[29.371658],[0.12545165],[-0.0012615778],[0.0063813236],[0.12261632],[0.12388965],[0.12581488],[0.12562975],[0.12590235],[0.12706079],[0.12586853],[0.0063036233],[0.0063308002],[0.006360097],[0.00641069],[0.0063860607],[0.006380691],[0.0061025573]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.0672929],[-0.002385034],[0.046296448],[0.73421615],[-0.6588893],[-1.5203205],[1.178525]],"dense_1_W":[[0.0065662013,-0.6906884,-8.1669035,-0.22963533,1.287303,0.5623414,0.97596943,0.16876543,-1.4308753,-1.2607023,0.13512084,-2.2520604,-1.0734065,-0.38555807,1.2478017,1.5954043,1.0332317,0.11683866],[-0.0008281875,-0.12043914,0.46533456,-0.1880658,0.27793694,0.32328263,-0.9494933,0.4474304,0.47546932,0.075196765,-0.5856884,0.67132443,-0.33427218,-0.5053345,0.52054983,-0.190718,-0.0054882555,0.030913128],[0.004268137,0.87534344,-0.0032283473,-0.4999181,0.051706053,1.3251885,-1.0996927,-0.11573633,0.022052824,0.030778117,0.095333256,1.2366601,0.09371897,-0.86040866,-0.4691007,0.45319134,-0.14319059,0.20172225],[-1.4501123,-0.6050599,0.0043176105,0.12684159,0.17847362,-0.49170303,0.61515486,0.041966554,-0.15754142,-0.12259134,-0.02399008,-0.122417435,-0.5506387,-0.10183553,0.4896619,0.68033147,0.18162476,-0.11971624],[1.4376184,-0.5808021,0.004164574,0.04148571,0.017012099,-0.06272477,0.43186155,-0.13221015,-0.15635422,-0.038162798,-0.035955418,-0.5861744,-0.56593215,0.43877664,0.59369725,0.7450232,0.041334633,-0.12955528],[-0.1895313,0.7552585,-0.0040314286,-0.048676625,0.5563838,1.239188,-0.71320075,0.004504845,0.09257285,0.088156074,0.09986293,0.47695497,-0.39355606,-0.7343243,-0.06684374,0.1638444,-0.09659141,0.051680643],[0.14741042,0.5720669,-0.0017892478,0.07270701,0.6063258,0.8279095,-0.346793,-0.025372941,0.23078395,-0.065968886,0.13636668,0.4493458,-0.5984418,-0.52184445,-0.11649629,0.032802615,0.11504312,-0.050546043]],"activation":"σ"},{"dense_2_W":[[-0.8641727,0.50495005,0.40094075,-0.34386104,-0.5465309,1.390671,-0.37600058],[0.11031162,-0.6909326,-0.5312116,0.61976224,0.24802525,-0.16967447,-0.14283815],[-0.8193451,-0.1972297,-0.214771,-0.73892933,-0.30986032,0.15499435,-0.501575],[0.5308305,-0.24228737,-0.016963648,-0.43746594,0.35429764,0.046517015,-0.042451978],[-0.22441098,-0.120023474,-0.49286667,-0.018089095,0.29138842,-0.5673456,-0.48546997],[0.13753492,-0.1153832,-0.55610204,0.15406573,0.006365648,0.17939411,-0.6658586],[-0.65625983,0.09770354,0.78839475,-0.38033855,-0.27879944,0.659594,-0.27876693],[-0.3875123,0.5326739,0.75927013,-0.44852605,-0.32855642,-0.25641,0.7448988],[0.5429655,-0.13947411,-0.4124438,0.27981234,0.3692258,-0.5504224,-0.14990781],[0.106620625,-0.45364022,-0.6481817,0.6618234,-0.06181281,-0.22667481,-0.30472475],[-0.5421591,-0.2735785,0.92352885,-0.058677003,0.48104942,0.3428449,2.177085],[-0.1457072,-0.10735246,0.016251013,0.42414185,0.43490586,-0.6780911,-0.6813793],[0.06390021,0.47467482,0.009300271,-0.14595152,-1.045413,0.53024256,0.597365]],"activation":"σ","dense_2_b":[[-0.6563135],[0.040393732],[-0.24838637],[-0.0036740543],[0.15817301],[-0.25935638],[-0.4186771],[-0.058852207],[0.024473231],[0.120795585],[0.114583485],[0.12427014],[-0.21818934]]},{"dense_3_W":[[0.46204138,0.5743686,0.6254067,0.2262725,0.5390763,0.086523645,0.22651961,-0.07199567,0.16185366,0.031094545,-0.34022743,-0.4233551,-0.067053996],[-0.2599459,0.352036,-0.20220354,0.19399881,0.23690616,-0.14081447,-0.55412626,-0.6064963,0.34574237,0.33883986,-0.18335809,0.6122457,-0.54077035],[0.77093464,-0.4317505,-0.47253096,0.28200352,-0.36024985,-0.5413245,-0.50765145,0.5250093,-0.31016317,-0.49643394,0.35564622,0.0021692468,0.07358482]],"activation":"identity","dense_3_b":[[0.007873758],[0.034414034],[-0.0254829]]},{"dense_4_W":[[-0.17727825,-1.1712774,0.5170622]],"dense_4_b":[[-0.03209859]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016.json b/selfdrive/car/torque_data/lat_models/TOYOTA_AVALON.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2016.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_AVALON.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA_AVALON_2019.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2019.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_AVALON_2019.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022.json b/selfdrive/car/torque_data/lat_models/TOYOTA_AVALON_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA AVALON 2022.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_AVALON_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018.json b/selfdrive/car/torque_data/lat_models/TOYOTA_CAMRY.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2018.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_CAMRY.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021.json b/selfdrive/car/torque_data/lat_models/TOYOTA_CAMRY_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA CAMRY 2021.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_CAMRY_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018.json b/selfdrive/car/torque_data/lat_models/TOYOTA_CHR.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA C-HR 2018.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_CHR.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022.json b/selfdrive/car/torque_data/lat_models/TOYOTA_CHR_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA C-HR HYBRID 2022.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_CHR_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_COROLLA.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA COROLLA 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_COROLLA.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA_COROLLA_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA COROLLA TSS2 2019.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_COROLLA_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_HIGHLANDER.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_HIGHLANDER.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020.json b/selfdrive/car/torque_data/lat_models/TOYOTA_HIGHLANDER_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA HIGHLANDER 2020.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_HIGHLANDER_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA MIRAI 2021.json b/selfdrive/car/torque_data/lat_models/TOYOTA_MIRAI.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA MIRAI 2021.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_MIRAI.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA PRIUS 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS TSS2 2021.json b/selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA PRIUS TSS2 2021.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA PRIUS v 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS_V.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA PRIUS v 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_PRIUS_V.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_RAV4.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_RAV4.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017.json b/selfdrive/car/torque_data/lat_models/TOYOTA_RAV4H.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2017.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_RAV4H.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019.json b/selfdrive/car/torque_data/lat_models/TOYOTA_RAV4_TSS2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA RAV4 2019.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_RAV4_TSS2.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022.json b/selfdrive/car/torque_data/lat_models/TOYOTA_RAV4_TSS2_2022.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA RAV4 HYBRID 2022.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_RAV4_TSS2_2022.json diff --git a/selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018.json b/selfdrive/car/torque_data/lat_models/TOYOTA_SIENNA.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/TOYOTA SIENNA 2018.json rename to selfdrive/car/torque_data/lat_models/TOYOTA_SIENNA.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020800'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020800'.json deleted file mode 100755 index aee9fbdaff..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020800'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.774439],[0.68836546],[0.39663407],[0.035043336],[0.67726237],[0.6812185],[0.6851642],[0.67571765],[0.6658719],[0.65097946],[0.6362429],[0.034919888],[0.034944225],[0.034970142],[0.034958802],[0.035017386],[0.035055906],[0.03502549]],"model_test_loss":0.007673596031963825,"input_size":18,"current_date_and_time":"2023-08-13_08-08-06","input_mean":[[26.031902],[-0.060294222],[0.00040313246],[-0.011659955],[-0.05902993],[-0.060128476],[-0.06107497],[-0.059999887],[-0.05612731],[-0.05281684],[-0.044799715],[-0.011695448],[-0.011712971],[-0.011732531],[-0.011664448],[-0.011644356],[-0.01155927],[-0.011499585]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.049030554],[-0.10284916],[2.1669703],[-0.7598165],[-1.5671357],[-1.0467316],[-0.21518126]],"dense_1_W":[[0.0015833939,0.3628037,-1.1379211,0.41206348,-0.3174675,-1.0719817,0.55315006,0.16118664,-0.72761345,0.085280344,0.51755583,-0.20497443,-0.31990555,0.07199009,-0.022201924,0.29279125,0.027291393,-0.22479561],[-0.22103259,-2.2058318,0.0018786002,-0.12338179,0.040423285,-0.77381456,-0.7999449,-0.89398247,-0.15317886,-0.14315447,0.18191607,-0.29653367,0.16505532,0.51925987,-0.23665445,0.14255223,-0.024358846,-0.018557316],[0.71575314,0.8240314,0.008927517,-0.42483628,-0.3114511,1.1394252,-0.5804155,0.11425652,0.18163292,0.13206053,-0.13476585,-0.11367035,0.26001,-0.5135676,0.54607356,0.48701724,0.28660864,-0.51631993],[0.66036284,0.59087783,-0.00230013,-0.2067205,-0.6735332,1.4597267,-0.45294723,-0.19073394,-0.2648436,-0.03875138,0.19050239,0.4679514,0.035935957,-0.15239997,-0.27455324,-0.70898926,-0.09578253,0.44405428],[-0.45520136,1.0866009,-0.0010808597,-0.14738974,0.096503034,0.46348053,-0.5462861,-0.075428344,-0.10546405,0.13248663,0.0108337905,0.44465065,-0.50142854,-0.17432131,0.08642302,0.38780424,0.2626273,-0.33542085],[0.7531839,-0.15485106,-0.00046390522,0.49195373,0.10571833,-0.8325452,0.35377154,-0.08773462,0.0057901233,-0.033657778,-0.024466574,-4.581234e-7,-0.05356497,-0.40087822,0.60264814,-0.18609272,0.31572378,-0.23848133],[0.06056683,-0.64557314,-8.907912,0.30529982,-0.09389138,-0.5915903,0.25837407,-0.05178803,0.11875724,0.40244415,1.1496543,-0.26229003,-0.46595177,-0.2651267,0.81698227,0.4063907,0.031472377,-0.27899668]],"activation":"σ"},{"dense_2_W":[[0.3929737,0.3355438,-0.24939334,-0.8681119,-0.47513258,0.7011935,-0.2938572],[-0.19074927,0.28745645,0.5773505,0.73283035,0.6470788,-0.24172986,-0.268829],[0.29614463,-0.3138745,-0.28980806,-0.0015691076,-0.111617155,0.232167,-0.67932785],[-0.7735293,0.051889855,1.011741,1.6678485,0.8912051,0.70964855,-1.0375358],[-0.5269584,-1.0374653,-0.4922506,-0.34657186,1.5273697,-1.3772768,-0.5722175],[0.615394,-0.06539898,-0.45568255,-0.20143689,-0.47749588,0.86022294,-0.21714544],[0.38749975,-0.022513922,-0.14868331,-0.25780904,-0.23281977,0.06569774,-0.25363374],[0.5056675,-0.32965812,0.019247672,-0.17208679,0.2147651,-0.095847994,0.45504293],[-0.16795017,0.27483287,-0.67279655,-0.41054696,-0.32219192,-0.067795895,-0.111805394],[-0.6812337,-1.2262623,0.059217807,0.2936333,0.25215864,-0.6689207,0.5118572],[-0.7462057,0.03548215,-0.48534322,-0.59371406,0.69966376,-1.1789167,-1.1984698],[0.066431336,0.2048392,-0.46290568,-0.10662247,-0.66402173,-0.15764749,-0.41801584],[-0.4591004,0.023616942,-0.31438425,-0.7513188,-0.28229564,-0.5397509,-0.2550711]],"activation":"σ","dense_2_b":[[0.14723389],[-0.13598567],[-0.113603],[0.3382584],[-0.26982328],[0.071502306],[-0.027666062],[-0.09013021],[0.0439448],[-0.4045584],[-0.16309273],[0.021524023],[-0.31809625]]},{"dense_3_W":[[-0.37160635,0.6519445,-0.2852499,0.3879301,0.13172154,-0.12497152,-0.57542557,-0.17398404,-0.6902231,-0.038447704,0.6596773,-0.16343056,-0.37051415],[-0.29400083,-0.2377071,0.08535129,0.26676917,-0.5493988,-0.351432,0.47058952,0.5485086,0.056337833,0.5403655,0.17921905,-0.11200504,0.41892666],[0.69202274,-0.34028688,-0.19272918,-0.38122672,-0.43775746,0.66532624,-0.38657436,-0.32455662,0.3592691,-0.45225328,-0.18025218,0.19789042,-0.41285962]],"activation":"identity","dense_3_b":[[-0.019216945],[-0.0018677257],[0.040205568]]},{"dense_4_W":[[0.8999063,-0.10676796,-0.8298675]],"dense_4_b":[[-0.022871539]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002MB4092M7N'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002MB4092M7N'.json deleted file mode 100755 index d0890c1ab4..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002MB4092M7N'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.2229753],[0.7611405],[0.44096765],[0.032897122],[0.7546119],[0.75747573],[0.7597603],[0.74507344],[0.73157114],[0.7157408],[0.70553976],[0.03276775],[0.032820396],[0.032851215],[0.0328969],[0.032961197],[0.03302519],[0.03315028]],"model_test_loss":0.014566068537533283,"input_size":18,"current_date_and_time":"2023-08-13_08-33-26","input_mean":[[24.0553],[0.05153281],[0.015448316],[-0.014650657],[0.04650553],[0.04824544],[0.049862176],[0.0546265],[0.053556256],[0.05162971],[0.04806687],[-0.014739772],[-0.014722749],[-0.014703085],[-0.014610224],[-0.014595721],[-0.014765067],[-0.014981542]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.16389364],[-0.09017541],[-1.1647506],[-0.6587049],[-0.060985837],[-0.21915653],[-0.11024977]],"dense_1_W":[[0.001650034,-0.92548645,0.0649104,0.028528351,0.5250701,-0.5574239,0.38432446,0.10459642,-0.35498068,-1.078298,0.8481259,-0.27305496,0.002911391,0.3782357,-0.14095218,0.0827578,0.32712424,-0.23005211],[0.0902557,0.32735464,-2.28293,-0.66071206,1.7252614,-0.43295604,0.38447145,-1.2641565,-1.1254754,0.601649,-0.22029242,-0.06569076,0.2504662,-0.36702126,0.3171216,0.8626499,0.028089207,-0.43380517],[0.5821453,0.15223487,2.6885037,-0.17222582,0.15152413,-0.9019428,0.38670883,-0.23797712,0.06278605,0.09316208,0.33182064,-0.1686998,-0.39460248,0.06328239,0.59990156,0.52030545,-0.05340852,-0.37717444],[0.38206068,-0.0565225,-2.2878838,0.27850866,-0.07075595,0.79982686,-0.42363936,0.40338862,-0.26033697,-0.11626149,-0.30429554,0.26288483,-0.033476517,-0.5080968,-0.3249822,0.20929106,0.270843,-0.18540776],[0.023973651,-1.1213268,2.1238108,-0.024581453,1.0142306,0.6209359,-1.075154,0.48566073,0.18506725,0.013205165,-0.1463418,0.35358152,-0.15770157,-0.08743086,-0.30606773,-0.042505883,0.46283403,-0.18692932],[-0.0021915815,-1.1354867,-0.06360406,0.447425,0.4746199,-0.28277287,-0.023870196,0.34384865,0.21172099,0.1064795,-0.13672785,-0.19995657,0.14958183,-0.23914275,0.06216524,-0.12911916,-0.055552065,0.043550123],[0.0017299546,0.8092503,0.05173706,-0.16951394,-0.479756,1.210766,-0.70967305,-0.10443872,-0.42421815,-0.4633462,0.4819916,0.41747493,-0.20445484,-0.2810944,0.10567981,0.15402447,-0.109205164,0.025440434]],"activation":"σ"},{"dense_2_W":[[-0.39135623,0.27202022,-0.6013986,-0.64582634,-0.6761625,-0.034833696,-0.47770235],[-0.6643015,-0.07582451,0.28175977,-0.17720482,-0.13394056,-0.57026803,-0.20838319],[-0.76068735,-0.03635872,-0.32094952,0.3875149,0.0033950128,-0.11746398,0.11166597],[0.09897547,0.34849387,0.34470668,0.32905695,-0.39746615,0.6536501,-0.73582923],[0.3257729,0.8186221,0.462827,0.206003,-0.791141,0.5543548,-0.55780596],[-0.59339374,-0.5604979,-0.37463582,0.15022774,0.08227588,-0.12084131,-0.72836936],[-0.10631841,0.64733845,-0.19081868,-0.8196671,-0.5185302,0.57588714,-0.8418388],[-0.28855416,-0.40788642,-0.22638142,0.039785244,0.42720664,0.08895065,-0.114857286],[0.7554024,0.09335394,-0.038691644,-0.51206696,-0.6964066,0.79751784,-0.5822203],[-0.36288157,-0.37563536,0.41425094,0.264427,0.41743213,-0.2764543,0.64417255],[-0.8176743,-0.010832012,-0.41458604,0.18923777,0.2012841,0.009667026,0.6762643],[0.11934642,-0.5864817,0.16600628,0.28051364,-0.13105674,0.22044942,-0.019528905],[0.5533989,0.66445804,0.31221595,-0.68456656,-0.24079095,0.7768225,-1.3347878]],"activation":"σ","dense_2_b":[[-0.31197193],[-0.031413633],[0.03965752],[-0.061369944],[-0.108691074],[-0.34241664],[-0.31260058],[0.0052420176],[-0.0034803348],[-0.009040426],[0.032145865],[-0.013744207],[-0.12510912]]},{"dense_3_W":[[0.2274993,0.5665878,0.22904979,-0.31244048,-0.177466,0.39304316,0.46666682,0.5655463,-0.40834668,0.123042084,0.28890088,0.24861963,-0.33083183],[0.5515104,0.4236585,-0.41383946,0.38279107,0.3648294,0.033724736,0.594795,-0.03362508,0.5668787,-0.33538687,-0.6832093,0.13241947,0.26189715],[-0.57273656,-0.6574504,-0.62127274,0.5114571,-0.2834754,0.5221384,0.058243714,-0.15925437,0.34103858,0.34175843,-0.36275822,-0.4356808,0.04839572]],"activation":"identity","dense_3_b":[[0.039760787],[-0.06425814],[-0.035501104]]},{"dense_4_W":[[0.95254374,-1.5316479,-0.5766585]],"dense_4_b":[[0.0464274]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002NB4202N7N'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002NB4202N7N'.json deleted file mode 100755 index f93202e113..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN b'xf1x875WA907145M xf1x891051xf1x82x002NB4202N7N'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[11.96429],[0.48755237],[0.3202853],[0.016136056],[0.47789466],[0.4800027],[0.4825725],[0.4900211],[0.4979344],[0.50082195],[0.509806],[0.015823891],[0.015903281],[0.015982913],[0.016349215],[0.016593793],[0.016913936],[0.017299606]],"model_test_loss":0.006491394247859716,"input_size":18,"current_date_and_time":"2023-08-13_08-58-34","input_mean":[[23.908133],[-0.009390707],[-0.004253836],[-0.025968479],[-0.00612068],[-0.007160293],[-0.007376146],[-0.009109003],[-0.0076243],[-0.0026939402],[0.0045118434],[-0.026125945],[-0.026092473],[-0.026057927],[-0.025872864],[-0.02570859],[-0.025540205],[-0.025320645]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.41294238],[-2.7690372],[-0.18349741],[-0.10760971],[-2.6992774],[0.32752463],[-0.67742026]],"dense_1_W":[[-1.3586515,-0.43871593,-0.060125872,0.14131355,0.91296524,-0.27596986,0.2190367,0.41157725,0.029709097,-0.2607309,-0.050010905,-0.11755934,-0.22254317,0.17312372,-0.3761272,-0.45554724,-0.2239468,-0.2360416],[-1.5048568,-0.7412387,-0.104529426,0.18972115,-0.04966916,-0.31632864,1.5387456,-0.68554825,-0.047455277,-0.09145563,0.011231757,0.1552257,0.14442553,-0.19027676,-0.3082216,-0.048122175,-0.08658755,0.17344293],[-0.06806865,-0.28421763,-0.061045542,0.29776254,0.017410226,-0.6256607,0.3693766,0.09203255,-0.20777148,0.16598798,-0.031423636,-0.14880905,-0.050573036,-0.18030158,0.34338558,-0.010559312,-0.1716994,0.0015558694],[-0.021257099,0.4201582,0.10567662,0.098136276,-0.5245343,1.1510786,-0.21176715,0.25107303,-0.10454084,0.2301715,-0.24894434,0.3596001,-0.34517595,0.058510073,0.0818201,-0.26276216,-0.14658763,0.21273282],[-1.5012898,0.6668104,0.10121657,-0.25168574,-0.0037740553,-0.2010022,-0.75998825,0.4218689,0.24208617,0.044093963,-0.037556846,0.1966981,-0.110668525,-0.14782344,0.35860345,-0.21139877,0.30253902,-0.16673942],[-1.2461659,-0.7911809,0.035795726,0.73150784,0.696571,0.49404347,0.11756719,0.5757391,0.09980145,0.16326262,-0.19388047,-0.6046584,0.21638776,-0.4022077,-0.12755662,-0.10812808,-0.34516883,0.16070507],[-0.19035971,-1.7321862,-5.0254865,0.22558816,0.1942134,-0.44183806,0.40744686,0.513804,-0.21384099,0.681004,0.10350117,0.047648296,-0.14447348,-0.0847752,0.09760403,-0.26012734,0.45971102,0.06473803]],"activation":"σ"},{"dense_2_W":[[-0.34405056,0.87975556,-0.11178791,-0.9415903,-0.22488657,0.38250393,-0.22682497],[0.6375331,-0.9361189,-1.0352612,0.23702581,-1.3226422,-0.70677704,0.60978687],[0.59013045,0.67570806,0.65553236,-0.24382202,-1.3824764,-0.136895,-0.021328399],[-0.91779196,-0.4002371,0.15189488,-0.1415177,-0.14752227,0.1649123,-0.6430806],[-0.25153294,0.27459243,-0.054157175,-0.5623544,-0.3548548,0.07935024,0.17336936],[-0.2654553,-0.39781526,-0.39670828,0.5024505,0.8163613,0.09423658,-0.06174219],[-0.439626,-0.122389056,-0.4051925,0.7102208,0.21351016,-0.21359682,-0.043064147],[-0.24681723,-0.75991267,-0.5213269,0.61109763,0.6579795,0.31300342,-0.19012727],[-0.32835272,0.27643317,0.80610013,-0.48940447,-0.6658583,-0.08905346,0.40121162],[0.014117802,1.0277611,0.9433537,-0.52780867,0.21137868,0.18057697,-0.51537097],[0.4187044,-0.18805541,-0.8279012,-0.13557853,0.1907715,0.12131266,-0.30106992],[0.16725653,0.75205564,0.8238714,-0.19580607,-1.0709527,-0.43005282,-0.1344186],[0.4120912,-0.67633796,-0.3733059,0.31897324,0.7961127,-0.1235923,-0.5691213]],"activation":"σ","dense_2_b":[[0.0015434292],[-0.42678097],[-0.12843466],[-0.2722911],[-0.17105557],[-0.11514613],[-0.06279293],[-0.019363822],[-0.009035881],[0.106273174],[-0.05945216],[-0.123012476],[-0.058660183]]},{"dense_3_W":[[0.6179223,0.6908968,0.23002878,0.16771492,-0.38249567,0.44911724,0.23442027,-0.46552494,-0.45699558,-0.35989794,-0.40735313,-0.31366763,-0.05994278],[0.32953018,-0.25569904,0.31176892,-0.058506478,0.055031825,-0.5803407,-0.41470534,-0.7076998,0.7423508,0.2604255,-0.3739903,0.5488002,-0.43356815],[-0.05421326,-0.34172624,0.28983295,-0.522155,0.034952227,0.36832595,0.34097177,0.4830782,-0.7160004,-0.70392597,0.16239382,0.029896518,0.6162823]],"activation":"identity","dense_3_b":[[0.12146979],[0.06732302],[-0.06318822]]},{"dense_4_W":[[0.04596985,-1.108794,0.22253986]],"dense_4_b":[[-0.060146004]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B60924A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B60924A1'.json deleted file mode 100755 index aed7db5c78..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B60924A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.683442],[0.98865986],[0.47218922],[0.03871906],[0.9749567],[0.97964174],[0.9846377],[0.96558553],[0.9452397],[0.9233499],[0.8986563],[0.038632676],[0.038636968],[0.038635172],[0.038416203],[0.03809765],[0.03765577],[0.03724798]],"model_test_loss":0.012059486471116543,"input_size":18,"current_date_and_time":"2023-08-13_09-53-13","input_mean":[[24.93752],[-0.045939222],[-0.016389137],[-0.004302249],[-0.041963723],[-0.043094873],[-0.044972997],[-0.049667895],[-0.05290968],[-0.058309894],[-0.05893371],[-0.004446903],[-0.0044335183],[-0.004419059],[-0.0043945634],[-0.0043718517],[-0.004439213],[-0.0045372355]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.1140616],[0.025871063],[0.2243207],[-0.46016932],[-1.4698206],[-0.71150887],[0.21343042]],"dense_1_W":[[0.50331783,0.11694233,-1.5816242,-0.32721916,-0.41283622,-1.0465689,0.7585539,-0.07061255,0.17088029,0.16865654,0.27171412,-0.29783547,0.005930493,0.8796375,-0.18076001,-0.22494902,0.14086941,0.02350371],[0.39964604,-0.06841097,1.284112,0.081528254,0.715496,0.9111793,-1.1611114,0.26898384,-0.17206313,-0.35275218,-0.06688733,0.2690601,0.17759158,-0.6246783,0.03650214,0.11638598,-0.18206348,0.107519194],[0.24504289,0.89508206,0.016166057,-0.112143464,-0.7020446,1.0947877,-0.17686859,-0.15869354,0.05293,0.12103868,-0.0552494,0.031484745,0.34501955,-0.08349311,-0.5022218,-0.09982318,0.2693678,-0.010383809],[0.007931579,3.6076553,0.031299092,-0.0632944,-0.36807698,0.44875357,0.65344036,1.8584886,2.0649836,0.52160025,-1.4293678,0.3685855,-0.015850615,-0.6611801,-0.09302336,0.15269071,-0.34181482,0.22311872],[0.27789986,0.4345057,1.7105428,0.3809664,0.23606543,-0.53605545,0.77079517,-0.18572022,0.029536983,-0.08425826,-0.53436494,-0.47137046,-0.49002567,0.6303357,-0.05725936,0.14865646,-0.024520583,-0.13768268],[-0.24115954,1.279325,0.006372729,0.082450144,-0.51617074,0.56547415,-0.2152657,-0.20878896,0.27892676,0.005575542,-0.08203108,0.26797956,-0.1609261,-0.31879193,0.0687177,-0.12210038,-0.02824459,0.04868769],[0.5532259,-0.31703275,-1.3693326,-0.39785337,-0.45586273,0.51413405,-0.8438991,0.35914817,0.0845233,0.27229154,0.1630712,0.5866208,0.14001441,-0.53064567,0.0022326964,0.3564542,-0.22063065,0.098910645]],"activation":"σ"},{"dense_2_W":[[0.07933149,0.24055447,0.4976298,0.04625589,0.39628196,-0.31187287,0.10486112],[0.16486526,-0.4745025,-0.41495293,-0.58882856,0.45950136,-1.0270692,-0.14418496],[-0.2165068,-0.40877748,0.31806844,-0.43342555,-0.16252048,-0.20286933,-0.24733812],[0.6930096,-0.32642758,-0.89015126,0.17958382,0.9937355,-1.6690918,-0.038145885],[-0.7482682,0.5658933,0.9042878,0.021569345,-0.48649457,0.5340851,-0.027348604],[0.67918,-1.904818,-0.8380397,-0.051741455,-0.28229547,-0.7634411,-1.8948066],[0.3247175,0.31701854,-0.2781933,0.43401104,0.49560198,-0.2726791,0.032593645],[-0.37467694,-0.03656642,-0.33198854,-0.31007978,-0.43297952,-0.59289163,-0.22284593],[1.024911,-0.6805027,-0.19422202,-0.32719725,0.83347833,-1.039209,0.82521194],[0.36815783,-0.5916512,-0.83911014,0.0574501,0.110373095,-0.5765434,-0.51522857],[-0.62331885,-0.17632262,0.8677081,-0.0120098395,-0.27507105,0.591978,0.29510972],[-0.2604249,0.23846155,0.89924765,0.49570164,-0.570918,0.73513013,0.07734572],[-0.08252068,-0.20023943,-0.6037063,-0.68478596,-0.30307132,-0.5236618,-0.34129605]],"activation":"σ","dense_2_b":[[-0.037471402],[0.020133492],[-0.030062372],[0.18862785],[-0.16345033],[0.6310636],[-0.04814403],[-0.13305083],[0.30672064],[0.09021095],[-0.015109793],[-0.09782],[-0.08616344]]},{"dense_3_W":[[0.00968849,-0.4974434,0.057221804,-0.05612671,0.44181606,-0.7102969,-0.08313611,-0.41528141,-0.5589184,-0.6598731,0.27019504,0.59793496,-0.1394197],[-0.18780659,0.013776527,0.097994566,0.082103886,-0.21989425,-0.19045697,0.17197673,-0.5449254,0.16991271,-0.09662889,-0.60549957,-0.5836056,0.31347692],[0.12937143,0.41864458,0.19149177,-0.6325805,-0.38940874,0.26463097,0.3983454,0.44313705,-0.57387125,-0.6276399,0.22248751,0.2585914,-0.04698139]],"activation":"identity","dense_3_b":[[0.031332195],[-0.011427722],[0.02366233]]},{"dense_4_W":[[1.1474994,-0.26583225,0.42394185]],"dense_4_b":[[0.028095849]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B6G920A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B6G920A1'.json deleted file mode 100755 index 8635448275..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x873QF909144B xf1x891582xf1x82x0571B6G920A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.9049487],[0.8561191],[0.4504596],[0.038353253],[0.84595364],[0.8492535],[0.8529379],[0.8561067],[0.85435045],[0.85641384],[0.85120344],[0.038395345],[0.038383085],[0.038364075],[0.038244415],[0.038174238],[0.038057357],[0.037874334]],"model_test_loss":0.007408166769891977,"input_size":18,"current_date_and_time":"2023-08-13_10-20-32","input_mean":[[22.704159],[-0.05434947],[-0.028899634],[-0.014197077],[-0.047043595],[-0.04961061],[-0.051511772],[-0.064129874],[-0.073261425],[-0.082883425],[-0.0892596],[-0.013961674],[-0.014019979],[-0.014073931],[-0.014204705],[-0.014272569],[-0.014375915],[-0.014562678]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.120744884],[-2.1077828],[-0.06055612],[0.39443776],[-0.22368135],[-0.65588754],[-2.6387818]],"dense_1_W":[[-0.88690495,-0.25811425,0.008988815,0.13833122,-0.08116928,-0.4481129,0.35815176,0.26801386,0.28154677,-0.40463963,0.053177662,-0.24901138,0.1963489,-0.17850944,0.4205931,-0.2479545,-0.09116836,0.04012526],[-1.2232169,0.21496952,-0.34511173,0.2337797,0.55760974,-1.4960742,0.57970977,0.05764135,0.00652666,-0.002710308,-0.022491196,-0.34730065,0.12834378,0.3231942,-0.5951289,-0.18041079,0.5969328,-0.17919765],[-0.013577242,0.72050744,0.043851886,0.08763659,-0.10938563,0.81028354,-0.49421427,-0.055606507,0.39534506,-0.21660888,-0.0038955023,0.6321912,-0.21082307,-0.73846775,-0.11770506,-0.23157798,0.33104023,0.0045754346],[-0.10664416,-3.9566016,-0.095965914,-0.019330999,-0.4638217,-1.5822362,-1.4879117,-1.5428027,-2.3343623,-0.8989189,0.15379162,-0.52634346,0.4945621,0.47638455,0.3022711,-0.2961842,-0.044219077,-0.15859331],[-0.8310568,-0.15923229,0.006822003,-0.018409794,-0.23237298,1.0993366,-0.29199913,-0.24162076,-0.079320475,-0.057994813,0.19191225,0.16130863,0.2252312,-0.2553471,-0.032364585,-0.12529343,-0.24044278,0.2582998],[-0.109629534,0.32457277,3.9654276,0.21012852,0.3246289,0.68227553,-0.13658419,0.3768019,-0.07727444,-0.74666935,-0.5759585,0.04406303,0.19795617,0.018164791,-0.26933455,0.050561618,-0.20878446,-0.047754884],[-1.363271,0.06545215,0.3758413,0.06491672,0.084676765,0.35959658,-0.32623026,-0.20922486,0.069487125,0.08547648,-0.04262586,0.3544595,-0.12652668,-0.37254444,0.21089934,0.008135089,-0.105872564,-0.008318545]],"activation":"σ"},{"dense_2_W":[[-0.72054654,-0.6050417,-0.7220704,-0.44005063,-1.0284771,0.8106998,0.014414875],[-0.058226008,-1.1631503,-1.027209,-0.75974965,-1.2817178,1.113419,-0.65957123],[0.50055337,0.83895123,-0.6208208,-0.57039124,0.28612334,-1.0834124,-0.38909918],[-0.99643636,-0.39019206,0.3543918,-1.5282012,1.0121741,0.5773511,1.208323],[0.12123124,-0.62592685,-1.1137303,-0.14054954,-1.0746346,0.25387576,0.21012427],[-0.028134568,-0.41023138,1.1109024,-0.29490876,-0.104959935,-0.028684778,-0.014831031],[0.3203809,0.69519943,-0.8536804,0.34720927,-0.41844305,-0.70005876,0.2783357],[0.65279526,0.26307833,-0.09818812,-0.14922686,0.0068492573,-0.6803769,-0.6562028],[-0.9916566,-0.746977,1.2095876,-0.28206152,0.77202094,0.09917717,0.53519136],[0.5871799,0.5488787,-0.85902935,0.29927683,-0.41470188,-0.034725975,-0.4221715],[0.8082283,0.6814313,-0.9875302,0.07708959,-0.33729747,-0.6126396,-0.3882399],[0.10397777,-0.37797046,0.6114876,0.4482404,0.23890285,-0.09893929,0.30193642],[0.65473473,0.6695784,-1.1461365,-0.09873656,-0.4201835,-0.4659413,-0.021572102]],"activation":"σ","dense_2_b":[[-0.22703657],[0.015636627],[-0.28062612],[-0.46867597],[-0.42662266],[0.10531475],[-0.27268052],[-0.117583275],[-0.03751292],[-0.21399282],[-0.15614581],[0.0078853285],[-0.041914072]]},{"dense_3_W":[[0.39234796,0.62153774,0.51387525,-0.25627816,-0.22709092,-0.7633196,0.4101854,0.35565174,-0.8346539,0.39193448,0.17382623,-0.03400133,0.12321009],[-0.29410705,-0.38960123,-0.062432252,0.44320828,-0.18776551,0.4824824,-0.18968157,-0.42845276,-0.26182756,-0.26892537,-0.3521713,0.6616498,-0.546959],[0.16058823,-0.86594164,-0.13168101,1.0188407,-0.5159865,0.19459534,-0.15246914,0.059648626,0.26894704,-0.32199717,-1.2184755,0.24150649,-1.0980307]],"activation":"identity","dense_3_b":[[-0.115189165],[0.12497786],[0.049071394]]},{"dense_4_W":[[-0.6646698,0.30865747,0.50033504]],"dense_4_b":[[0.12551612]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6080105'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6080105'.json deleted file mode 100755 index 48341be495..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6080105'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.46098],[0.5805504],[0.4286228],[0.027327532],[0.5625607],[0.5664083],[0.572346],[0.55758566],[0.55044997],[0.53875524],[0.5324083],[0.027238432],[0.027249781],[0.027267734],[0.027059836],[0.026759954],[0.02641711],[0.026055066]],"model_test_loss":0.00871726218611002,"input_size":18,"current_date_and_time":"2023-08-13_10-46-07","input_mean":[[22.35009],[0.03588671],[0.030875545],[-0.009168813],[0.023282468],[0.025879717],[0.030697377],[0.036618296],[0.039199185],[0.036285438],[0.027312003],[-0.009021863],[-0.009056173],[-0.009087383],[-0.00929402],[-0.009451607],[-0.009612639],[-0.009819853]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.034004],[-0.89401245],[0.9897701],[-0.3193278],[1.1259059],[-0.15454224],[3.3354394]],"dense_1_W":[[0.44570363,-0.7825432,-0.061906625,-0.026865548,0.2508251,-0.017034708,0.3547928,-0.310705,-0.09453543,0.070832364,0.09877715,0.2973578,-0.35449862,-0.18486549,0.30955637,0.21419896,-0.4893967,0.23366004],[0.69126964,-0.25657803,-0.030580372,-0.6565601,0.2661697,0.9771365,-0.048998043,-0.5814566,-0.13185975,0.25074315,0.15406479,-0.01448358,0.6794868,0.028108925,-0.545066,0.20658419,0.050444037,-0.016133675],[-0.6743554,-0.028887114,-0.032645535,0.25018308,0.006226353,1.0695997,-0.18894264,-0.24792102,-0.1595514,-0.059550885,0.26033223,-0.07776964,-0.13275231,-0.08301031,-0.06557147,0.015360838,-0.14179525,-0.02958493],[-0.00023020334,-2.5403516,0.103054345,-0.036754318,-0.37462926,-1.2828135,-0.78215855,-0.5872427,-0.23358877,0.8133214,-1.7763032,-0.11175946,-0.5391298,0.14259054,0.08525794,0.6968644,1.1772321,-1.3956367],[0.4643646,1.0727947,0.06773056,-0.1627986,-0.44790077,0.43600535,-0.83087605,0.3373429,0.035555895,-0.039930362,-0.11480868,0.34158143,0.086424485,-0.3963858,0.077727064,0.026601842,0.16779198,-0.14299323],[-0.01659432,0.18239553,-2.4434328,0.4596415,-1.3727697,-0.45394266,1.580408,-0.23654598,-0.03745976,0.0920622,0.5134545,-0.4865392,0.24464038,0.4678696,-0.32076362,-0.84693116,0.43715867,0.037381206],[-0.011063157,-0.9861401,-0.049675927,-0.730512,-0.29446808,0.047909494,-1.549821,1.0472431,0.20591155,-1.2257841,0.35139507,-0.9356053,-0.8952574,-1.3479776,-0.92216295,-0.5816112,-2.177031,-2.7402952]],"activation":"σ"},{"dense_2_W":[[-0.9175717,0.7838937,0.18961704,-0.21025512,0.049619257,0.1847999,-0.13175379],[-1.3712368,-0.22107592,0.8426797,-0.54940265,0.37827617,-0.7331404,0.3816527],[0.879834,-0.07275896,-0.15078747,-0.084817156,-0.5905503,-0.0077536167,-0.026412051],[-0.16437627,0.7776934,0.16704066,-0.81203943,0.714978,-0.38184956,0.5668494],[0.36693972,-0.71004605,-0.4970682,0.41367897,-0.26275557,0.04859335,0.0019217964],[-1.1874106,0.44417366,0.4221658,-0.459451,0.9441592,0.028537316,0.44670618],[0.06823978,0.053194616,-0.32906988,-0.040382143,-0.74561256,-0.3759315,0.52331495],[-0.16486976,-0.63236946,0.17065576,0.6424932,-1.2657642,0.19909996,-0.30308995],[0.44445,-0.5825901,-0.4318686,-0.37460575,-1.2127082,0.11012628,0.7677005],[-0.46705374,0.7579557,0.43045595,-0.14844555,0.81806993,-0.3961867,0.082349285],[0.9047916,-0.027479485,-0.21539336,-0.26026043,-0.56305844,0.23231633,0.24555749],[-0.13455963,-0.793142,0.16952343,0.31437233,-1.4577682,0.7650801,-0.17605627],[0.78401864,-0.40363696,-0.7288144,-0.4528122,0.13153328,-0.089454,-0.4570649]],"activation":"σ","dense_2_b":[[-0.03731149],[-0.25853628],[-0.22449726],[0.050002333],[-0.07679642],[-0.27620718],[-0.040895026],[-0.17041162],[-0.12874831],[-0.1850663],[-0.06403408],[-0.31963417],[0.010012412]]},{"dense_3_W":[[0.43035418,0.62377286,-0.04799687,0.37535116,-0.2510285,0.435108,-0.4777117,-0.42720693,-0.16901441,0.34647202,-0.5691831,-0.47436827,-0.56257755],[0.50507265,0.812848,-0.0652019,-0.037624083,-0.2630056,-0.063649006,-0.17664024,0.6002492,0.23068571,0.061552785,-0.5704422,-0.3373628,-0.5592467],[0.020316904,0.6937366,-0.266464,0.46094483,-0.045586474,0.38334998,0.41075394,-0.3045877,-0.63142675,-0.3368865,0.11822097,-0.1788716,-0.461762]],"activation":"identity","dense_3_b":[[0.058974706],[0.07503411],[-0.08209236]]},{"dense_4_W":[[1.1198002,0.17802396,0.12900992]],"dense_4_b":[[0.055657092]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6090105'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6090105'.json deleted file mode 100755 index ed370ac904..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN b'xf1x875Q0909143P xf1x892051xf1x820528B6090105'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.303951],[1.1061448],[0.45519033],[0.03890334],[1.081259],[1.0887367],[1.0969497],[1.092481],[1.0865434],[1.0689224],[1.0470375],[0.038625997],[0.038678918],[0.038709994],[0.038684364],[0.03853108],[0.03823509],[0.037891388]],"model_test_loss":0.0091054392978549,"input_size":18,"current_date_and_time":"2023-08-13_11-14-36","input_mean":[[24.991106],[-0.052309062],[0.0040966566],[-0.011176246],[-0.052617952],[-0.052739866],[-0.053076603],[-0.053221803],[-0.052702937],[-0.052821293],[-0.04823078],[-0.01125922],[-0.0112718595],[-0.011276353],[-0.011362061],[-0.011423353],[-0.011574674],[-0.011701717]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.2000623],[-1.0601752],[0.02134417],[0.34618574],[-0.41577217],[-0.1728919],[-0.61339724]],"dense_1_W":[[0.6945757,-0.32359305,1.5179125,0.061160147,0.2037475,0.6379559,-0.12414423,0.0059865746,0.13593642,0.34044787,-0.6639205,0.08353744,-0.077323966,-0.28454944,0.04639403,0.20414786,0.3709197,-0.3463716],[0.05652898,4.1764426,-0.006069666,-0.7129519,1.8937668,1.5178504,0.3519152,1.7854784,0.39515916,0.91557574,0.47060627,0.37094897,0.3413073,0.2681898,-0.31728673,0.20122348,-0.028086334,0.15455683],[0.14809841,-0.17917761,-0.00034424284,-0.124425046,-0.1850857,-0.74427736,0.15511078,-0.120926015,-0.012820842,-0.117898285,-0.016289195,0.27818105,-0.09533491,-0.03304152,-0.04132924,0.0033757824,0.35598698,-0.11256063],[1.1169398,0.49344513,-1.6779064,0.31510845,-0.165833,-0.52853584,-1.2107238,0.38685435,0.2492109,0.36423388,-0.026242055,-0.092144534,0.22960894,-0.3682959,-0.17427671,-0.15931715,0.31591633,-0.12631632],[-0.09261426,-0.44354674,0.0025963027,0.11725519,0.5170039,-1.6007098,0.409791,-0.18131912,0.0033203233,0.25904283,-0.21513839,-0.4170825,-0.15698108,0.47902456,0.53502494,-0.31782442,-0.03569762,0.051992897],[0.0042456975,-0.47560015,-0.0026210295,0.031245418,-0.012764861,-0.92874646,0.6509197,0.33344513,-0.012610092,0.18168646,-0.2557554,-0.44327387,-0.13764408,0.42211333,0.23698005,0.37390047,-0.073409125,-0.17985323],[-0.8177616,0.6893316,1.3907503,-0.0023526286,-0.5415417,0.801563,-0.40723026,0.18662976,0.07481949,0.11865076,-0.6322875,0.23950732,-0.17827813,-0.16382805,-0.084146835,0.39538124,-0.09231756,-0.06298284]],"activation":"σ"},{"dense_2_W":[[0.30893767,-0.21597238,0.34375098,-0.25055024,0.3330617,0.38276237,-0.71425796],[-0.31416908,0.19624454,0.84980524,-0.6247502,1.137116,0.7904554,-0.74953896],[0.10519312,0.14832982,-0.26275882,0.2762413,-0.35890564,-1.246903,0.25022545],[-0.3228544,-0.06965771,0.24511589,-0.09088025,0.87480575,0.8223658,-1.0762371],[-0.6225081,-0.79335475,-0.77840954,-0.5098249,0.62632555,0.2364035,-0.94132584],[-0.26544946,0.19669403,0.33992356,-0.021165801,0.5467231,0.35932502,-0.86759907],[-1.9278108,-3.4194539,-1.5747315,-1.8566562,1.757728,0.4785611,0.38245028],[0.00854604,0.22411391,-0.98446316,0.5888375,-1.1318563,-0.63558984,0.21114045],[-0.042795878,-0.25286025,0.9120754,-0.47074848,0.21183152,0.8286851,-0.5500911],[-0.048500616,-0.39560843,0.108169064,0.030019483,-0.2797118,-0.8024904,1.1825333],[0.24435245,0.30188617,-0.8876096,0.32955825,-1.0187839,-0.70859,0.41195366],[0.2961078,0.036369283,-0.173866,0.25641084,-0.7356608,-0.51908946,0.9349239],[-0.8808378,-0.3808547,-0.36999512,-0.77035606,0.5030658,0.36325094,0.39363125]],"activation":"σ","dense_2_b":[[-0.07842559],[-0.09987076],[0.010018767],[-0.2822568],[-0.35917684],[-0.44091773],[0.33568865],[0.07248511],[0.07309797],[0.10989416],[-0.003620754],[0.0024933761],[-0.2047217]]},{"dense_3_W":[[0.26641047,0.5025841,-0.5746309,0.72528905,0.4545447,0.14570309,0.58782375,-0.8174622,0.7011326,-0.37532592,-0.8499182,-0.5160384,-0.10076714],[0.42193347,-0.2640134,-0.09260018,-0.47143674,-0.31873474,-0.070022374,0.0072793798,0.21706063,0.47843012,-0.12351305,0.057239983,-0.37678227,0.3790527],[0.31047106,0.072491184,-0.26496214,0.28195223,0.43037447,-0.17418887,0.37405774,0.15594256,-0.030484399,-0.10081656,-0.36806333,0.17099544,-0.57947606]],"activation":"identity","dense_3_b":[[-0.035134505],[0.035389643],[-0.0024598911]]},{"dense_4_W":[[-0.88231134,0.03782195,-0.036473993]],"dense_4_b":[[0.026110955]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144F xf1x895043xf1x82x0561A01612A0'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144F xf1x895043xf1x82x0561A01612A0'.json deleted file mode 100755 index 4d03bacbb7..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144F xf1x895043xf1x82x0561A01612A0'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.393678],[0.9507211],[0.515524],[0.03579411],[0.92671007],[0.9349327],[0.94223416],[0.93390805],[0.91419286],[0.9005691],[0.8817757],[0.035967667],[0.035894528],[0.03581829],[0.035463523],[0.035266362],[0.034894552],[0.034437038]],"model_test_loss":0.007279031444340944,"input_size":18,"current_date_and_time":"2023-08-13_12-09-05","input_mean":[[18.321695],[0.026961222],[-0.0035306585],[0.0042126137],[0.026481297],[0.025289914],[0.02407461],[0.022458786],[0.02010773],[0.01840629],[0.010958715],[0.004338949],[0.004328805],[0.004322178],[0.004482345],[0.0045845066],[0.0045210808],[0.0044681383]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.23433709],[-0.18828739],[-0.18552896],[-0.5719115],[-0.22013229],[-1.4444673],[-1.5718764]],"dense_1_W":[[-1.2401875,0.3811429,0.22920376,0.17823632,0.38709855,-0.66355306,0.8482343,0.49103037,0.5053358,-0.24420182,-0.092417374,-0.23246154,-0.050690368,-0.08148075,0.24395947,0.33181128,-0.24565633,-0.08007848],[-0.033186838,-0.018208645,5.2053638,0.40082926,0.12013276,1.3642305,-0.066606104,-0.2109344,0.056820087,-0.49343818,-0.73463804,0.0054429434,0.30579343,0.2644848,-1.104032,-0.3646586,0.40208718,0.09694821],[0.013673816,1.5230023,0.03033682,-0.35785833,-0.47244158,1.1692531,-1.2142229,0.21123275,0.20759322,-0.12557651,-0.024190914,0.18843181,0.42164597,-0.41802365,-0.1273723,0.11422493,-0.3571295,0.24296899],[-1.2805165,-0.03634216,-0.2315571,-0.33567777,-0.15831298,0.46170834,-1.3284832,-0.35208622,-0.3114747,-0.14607859,0.23413593,0.42039818,0.100040615,-0.11651754,-0.25472957,-0.18363725,0.25635332,0.046210147],[-0.1223163,0.39836767,2.1085758,-0.83522975,0.93836105,1.1645079,0.5623019,0.803997,1.619908,0.69255054,0.006743934,-0.027720656,0.22808708,-0.50816184,1.2988809,0.82322896,-0.54477817,-0.36819857],[-0.7315945,0.4780022,0.1772432,0.4104992,0.08421316,0.9401301,-0.49227592,-0.009742048,0.11372556,0.104266785,-0.019224092,0.4900326,-0.47639382,-0.6323555,0.24357527,-0.0516575,0.23969004,-0.19771135],[-0.76657575,-0.4302957,-0.18278445,-0.14294477,0.019147635,-0.83321804,0.18196133,0.0027990995,-0.101887345,-0.09481852,0.02363611,-0.10652451,0.29024073,0.12037951,-0.19053681,-0.002771024,-0.18999992,0.19319752]],"activation":"σ"},{"dense_2_W":[[1.1674703,-1.0795661,-0.83592135,-1.2450091,0.39534637,-0.23755772,0.6893884],[-0.8306515,0.5932858,-2.246159,-0.60801744,0.89207256,-1.3776426,-0.87655],[0.06655564,-0.3241597,0.68319845,0.5761408,0.07908217,0.17945948,0.24506673],[0.68613476,0.19972438,-1.3021669,-0.6668362,-0.6518976,-0.24746297,1.2003715],[-0.8004638,0.5167141,1.1191069,0.013375394,-0.2572823,0.93613464,-1.1853722],[-0.21710496,-0.35993806,-0.07203962,-0.6938927,0.18984064,-0.09594037,-0.2881428],[-0.6179966,0.46525648,0.5319194,-0.16893135,0.60552096,1.0496196,-0.51345116],[0.37096095,-0.56000143,-1.0920874,-0.23331793,0.05436759,-1.0298152,1.2464622],[-0.75719625,0.636631,0.13826808,0.05155059,0.22594887,0.8592017,-0.037603486],[0.20930098,-0.55796367,-1.2967436,0.6157302,-0.9854021,-1.511364,1.3654305],[-0.7381424,0.45607466,0.6661581,0.7688956,-0.33832595,1.0015503,-0.6602416],[0.2261951,-0.15274303,-1.3926961,-0.2749363,-0.19298306,-0.8495188,0.6840784],[-0.06774882,0.43374217,-0.59146774,-0.98507404,-0.005510673,-0.63316214,0.44423348]],"activation":"σ","dense_2_b":[[0.25605625],[-0.27236927],[-0.026778517],[0.31539285],[-0.36685586],[-0.16439182],[-0.1343443],[0.3629454],[-0.13780022],[0.39224806],[-0.23516674],[0.24514045],[0.062903486]]},{"dense_3_W":[[0.5346557,0.3789998,-0.2614574,0.4879767,-0.46347272,0.18811665,-0.5559382,0.5217684,-0.6780195,0.568179,-0.20284745,0.40725482,0.25554204],[-0.30582777,-0.6364137,-0.2515572,-0.53830695,0.23051241,0.7431814,0.15372244,-0.14764914,-0.21156888,0.0260592,0.5506795,-0.36910096,-0.12995946],[0.1502716,-0.7994257,0.5153921,-0.6199781,0.056621913,0.29504618,0.005925515,0.060055684,-0.36957523,-0.3707947,0.71017915,-0.45440555,-0.37977552]],"activation":"identity","dense_3_b":[[-0.04320616],[0.24266042],[0.06822999]]},{"dense_4_W":[[-0.8555905,0.09768048,0.3667474]],"dense_4_b":[[0.03568016]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566A01613A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566A01613A1'.json deleted file mode 100755 index d71ba156c3..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566A01613A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.674182],[0.8655689],[0.57967585],[0.040321745],[0.84932566],[0.85650927],[0.86215264],[0.87139815],[0.87453574],[0.874555],[0.8716648],[0.03994974],[0.040019948],[0.040080216],[0.04002835],[0.03998725],[0.03991318],[0.039837524]],"model_test_loss":0.007650585845112801,"input_size":18,"current_date_and_time":"2023-08-13_12-35-04","input_mean":[[23.87158],[-0.1436498],[-0.028368313],[0.009035347],[-0.13046499],[-0.13379243],[-0.13699822],[-0.1480593],[-0.15190914],[-0.15157087],[-0.14864737],[0.009231746],[0.009238965],[0.00924779],[0.00920954],[0.009201414],[0.009255218],[0.00909153]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.09592608],[0.9918901],[-1.2113507],[0.8661807],[0.05155025],[0.3214984],[-1.153684]],"dense_1_W":[[-0.017169934,1.1931341,-1.1062534,-0.19596136,-0.81572723,-1.2010746,1.5714276,-0.57053953,-0.8263804,0.052935984,0.73478985,-0.2280826,-0.21767642,0.2753641,0.1326998,0.45369527,0.07199933,-0.30603126],[2.1590579,-1.4124492,0.009337138,-0.21821123,0.84495044,-0.61482656,1.1536438,0.7080137,-0.04427048,0.10480956,-0.022087824,0.2886762,-0.07587974,0.070064016,0.14185634,-0.0007030371,-0.38303795,0.27994344],[-0.40794194,1.153379,-0.0024999902,-0.6986611,-0.20693888,0.6483961,-0.701288,0.039575372,-0.047968443,-0.08190851,0.07021685,0.14132965,0.2368701,0.14922713,-0.22505046,0.28357986,-0.06247636,0.056652017],[0.52197176,1.2478426,0.0009211915,-0.4745136,-0.1614392,0.40458196,-0.48290923,0.053574517,-0.095450394,-0.017885987,0.032721847,-0.090606876,0.14145781,0.2679699,-0.1473115,0.18667473,-0.008584987,-0.005414795],[-0.022690998,0.6585079,-0.005586868,-0.6780271,0.19687867,-1.1014344,-0.2943398,0.36450255,0.03506954,-0.08123903,-0.15920855,0.0505067,0.058525577,0.36120212,-0.21424536,0.46626067,-0.017863052,-0.085303724],[0.00013837297,-0.25373533,-6.435928,1.58516,0.6184224,-0.2115976,0.2892219,-0.71608067,-0.6071019,-0.20726296,0.9175523,-0.47211647,-0.2097295,0.15351994,-0.7116983,-0.63811296,0.23258395,0.08622454],[-2.0628932,-0.7452186,0.008288695,-0.31313533,0.67136544,-0.5808361,0.9877969,0.1444861,0.15634331,0.030246384,0.014997267,0.043635026,0.062175572,0.28663024,-0.13891469,0.3720139,-0.38673353,0.17359486]],"activation":"σ"},{"dense_2_W":[[-0.16763338,-0.47461554,0.10763972,-0.2838411,-0.52468586,0.44780418,-0.66006994],[0.5267072,0.10084127,-0.0030579919,-0.43386367,-0.58511466,-0.099385306,-0.19599876],[-0.0906234,-0.83193815,-0.66303736,-0.8964175,-0.2003442,0.35760805,-0.058140375],[-0.190499,0.07829508,-0.08322553,0.012610012,-0.15027554,0.07325327,-0.22076952],[-0.65134853,-0.6751714,0.38901326,-0.20597398,-0.49264622,-0.6020643,0.38099632],[0.3904269,0.8117801,-4.0269456,-2.344315,0.987539,1.1614928,1.1175928],[0.26499394,0.7727802,-0.99474823,-0.9302356,0.3447509,-0.4111184,0.08102163],[0.35695434,0.33521402,-1.2582849,-1.6280061,0.4927368,-0.14476238,0.5757368],[-0.37491873,0.25197625,0.22271682,-0.491189,-0.52316636,0.4666745,-0.10067969],[-0.34871188,0.033361014,0.14734446,0.31006506,-0.27586716,0.06688171,-0.3405154],[0.5929227,0.8162524,-0.9812328,-0.5239229,0.5872333,0.020790983,0.31533986],[0.24348359,0.39312568,-0.0214521,0.6143711,0.016012145,-0.42566973,-0.118630745],[0.1463825,0.07799967,-0.6324735,0.25962767,-0.5155253,0.076581135,-0.6227099]],"activation":"σ","dense_2_b":[[-0.27831843],[-0.0112905],[-0.27060327],[0.007902096],[-0.05577947],[0.6268199],[-0.053876836],[-0.049551494],[-0.029292142],[0.031467807],[-0.027137926],[0.055927135],[-0.26256073]]},{"dense_3_W":[[0.060232863,-0.5037746,0.018263955,-0.5830695,-0.23065938,0.7206465,0.25052637,0.66073346,-0.34804803,-0.2457851,0.56354797,0.1584851,0.14229323],[-0.017081043,-0.36273557,-0.21656403,-0.05546782,-0.48246115,0.02398911,0.24811241,-0.15399784,-0.1066594,-0.53166276,0.27734274,-0.5389266,-0.5232047],[-0.21170785,0.5739519,0.58981717,0.07041403,0.24331552,0.2217054,0.16948755,0.14839208,0.30543324,0.059965707,0.58376944,-0.4667308,0.47962144]],"activation":"identity","dense_3_b":[[-0.034093823],[-0.02758039],[-0.049317274]]},{"dense_4_W":[[-1.1292782,-1.1194721,-0.71209276]],"dense_4_b":[[0.03250581]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571A0J714A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571A0J714A1'.json deleted file mode 100755 index ea8bf79c9c..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144K xf1x895072xf1x82x0571A0J714A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.261855],[1.0054495],[0.44603008],[0.04906136],[0.9972159],[0.9997243],[1.0025296],[0.99329203],[0.98267734],[0.9657255],[0.9471463],[0.04888154],[0.048943646],[0.04899115],[0.04890786],[0.04878479],[0.04839674],[0.047833208]],"model_test_loss":0.007453115191310644,"input_size":18,"current_date_and_time":"2023-08-13_13-00-57","input_mean":[[25.69152],[0.10401062],[-0.019496834],[0.008966865],[0.10911976],[0.10757787],[0.10587171],[0.097837746],[0.09283788],[0.085548356],[0.07863567],[0.008932414],[0.008952776],[0.0089605255],[0.008813915],[0.008735177],[0.00846132],[0.00794868]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.13713238],[0.20321627],[0.7490122],[-0.38984767],[-0.015705755],[-0.5183053],[-1.6598694]],"dense_1_W":[[-0.016463742,-0.80616003,0.0065253316,0.830898,0.64298636,-0.5656381,-0.06751878,-0.63732654,-0.96067095,-0.42503732,-0.027717927,0.40051052,0.05184687,0.17363398,-0.085222274,-0.19231836,-0.08309723,-0.16269061],[-0.009811768,-0.65155673,-5.564333,0.506703,0.65423405,-0.3767845,-0.07368195,-0.62674314,-0.17415152,0.25860035,1.2521535,-0.79924744,-0.017620802,0.29095054,0.30994758,-0.4196323,-0.16702113,0.057845533],[-0.96295756,-0.31182382,0.00043095846,-0.058392283,-0.584871,-0.98906785,0.44015396,1.2223701,0.6097256,-0.030337319,-0.65342844,0.082843415,-0.2627854,0.36388263,0.5306976,0.18281356,0.38318297,-0.35831112],[-0.045849763,1.0797496,-0.00030220754,-0.07059503,-0.75782734,1.1085478,-0.84971356,0.5044923,0.2171235,-0.035467442,-0.21155863,0.10211848,0.19065809,0.15918909,-0.3584042,0.042742535,-0.10781619,0.071901545],[0.0019713347,-0.10772645,-1.2357202,0.10401833,-0.59948766,-0.6267504,0.51822174,-0.38673958,-0.18886894,0.34199828,0.7218928,-0.07034036,0.009723587,0.39160627,-0.32980394,-0.08204679,-0.2102608,0.20249581],[0.9227928,-0.69833463,0.001716081,0.3443532,-0.20834416,-1.1405655,0.5173991,1.1539986,0.6729235,0.12514886,-0.70969516,0.14161992,-0.40097812,-0.17782708,1.0813764,0.10388947,-0.08262546,-0.17301287],[-0.16219285,-1.3139731,-0.005380759,-0.11242274,0.21998426,0.14689903,0.20139551,-0.46337608,-0.41527465,0.06917474,0.2767211,0.0030106166,-0.27788752,0.102582745,0.1434504,0.07394607,-0.071815714,0.09023541]],"activation":"σ"},{"dense_2_W":[[-0.09534758,-0.20494337,-0.3384321,0.50142735,-0.2070578,-0.17975266,-0.47026268],[-0.080807835,-0.7693725,-0.33129126,-0.6481296,0.2961305,0.59115857,0.29982796],[-0.67640305,0.10868651,-0.40651622,1.251038,-0.35252488,0.069079645,-0.4344765],[-0.405377,0.46910697,-0.648163,0.5376939,-0.4130663,-0.20368347,0.10605837],[0.07806083,0.13273892,0.59590846,-1.2799983,-0.14798646,0.5163046,0.71807456],[0.2771363,0.0771471,-0.88079923,0.19846076,0.33752158,-0.63239664,-0.73708975],[0.384604,0.10437411,0.23125851,-1.506182,-0.06421899,0.8640644,0.4960929],[0.008516661,-0.14540984,-0.039332498,0.3648482,-0.4843125,-0.26544338,-0.19283234],[0.5896814,0.479453,0.07903197,-1.3779969,0.44292685,0.57847136,-0.047437504],[-0.109293275,-0.42078793,-0.39426482,1.4202753,-0.35743013,0.16971365,-0.7200603],[-0.5129918,-0.20219454,0.102802396,0.71803844,-0.24758278,-0.5028839,-0.4083767],[-0.5097355,-0.21850984,-0.28750372,0.014024571,0.07086597,-0.24340022,0.23649839],[-0.72368366,0.15557946,-0.2388718,-0.084316276,0.37256187,-0.16913413,-0.93164635]],"activation":"σ","dense_2_b":[[-0.16169836],[-0.42624626],[0.103336595],[0.09075817],[-0.34198973],[-0.17581685],[-0.73661387],[-0.029041702],[-0.36334386],[0.27201274],[0.079298005],[-0.038892936],[-0.31755415]]},{"dense_3_W":[[-0.32185918,0.23010239,-0.29461142,-0.20029086,0.09440893,0.6768535,-0.5149668,0.37832007,-0.40137282,-0.01920188,0.09111374,0.13883176,0.5203541],[0.4970465,-0.45029837,0.5610221,0.36681646,-0.7023499,0.60753286,-0.027918534,-0.16638023,-0.62392753,0.674149,-0.17300312,-0.16632567,0.13502161],[0.22802192,-0.10680726,0.023894504,-0.37220314,0.5496468,0.25617206,0.49781597,-0.38562778,0.7652926,-0.52234906,-0.40956378,-0.2859582,-0.0064916024]],"activation":"identity","dense_3_b":[[-0.017725911],[-0.009221329],[-0.0017763044]]},{"dense_4_W":[[0.06679463,0.77652645,-0.89682037]],"dense_4_b":[[0.003297589]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144L xf1x895081xf1x82x0571A0JA15A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144L xf1x895081xf1x82x0571A0JA15A1'.json deleted file mode 100755 index d28c64acc3..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144L xf1x895081xf1x82x0571A0JA15A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.9609013],[0.68010557],[0.3328183],[0.030046908],[0.67651325],[0.6776699],[0.67907083],[0.6744121],[0.6666261],[0.6520554],[0.6380237],[0.030044695],[0.03003401],[0.030022014],[0.030028066],[0.03002876],[0.03002293],[0.030003896]],"model_test_loss":0.008286223746836185,"input_size":18,"current_date_and_time":"2023-08-13_13-27-29","input_mean":[[27.427336],[-0.053844143],[-0.0010561344],[-0.0085596135],[-0.05380778],[-0.05453289],[-0.054989513],[-0.055681985],[-0.059845272],[-0.063087784],[-0.068856664],[-0.008624959],[-0.008624049],[-0.008617082],[-0.0086126095],[-0.008567826],[-0.008474123],[-0.008392853]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.5761452],[0.04077484],[-0.10482081],[-0.6708523],[0.021307532],[-0.9310431],[-0.00019539302]],"dense_1_W":[[0.72231996,0.18390898,2.4203904,-0.0030663384,0.18403961,-0.82045245,0.51870364,0.1788108,-0.06536024,-0.075233705,-0.018536722,-0.026407123,-0.017022373,-0.1641255,0.08881735,0.3791095,0.15368912,-0.30361718],[0.00531365,-0.94260526,0.019553717,0.16079119,0.6135709,-1.1629479,0.25475162,0.16275546,0.23717655,-0.7684713,0.269077,0.4080043,-0.31144062,0.070601925,0.010450419,-0.22756179,-0.16736664,0.18631667],[-0.03383979,0.58095545,1.7085242,0.07134275,-0.48016626,0.043425214,-0.5469088,0.44866776,0.65664923,-0.30118445,-0.3005833,0.13361159,-0.11855819,-0.35175917,0.46242264,0.1385892,-0.29124546,0.018451372],[2.3314073,-0.7370475,-0.1599346,-0.112356625,-0.1908801,0.16796266,-0.05533258,-0.10605465,0.0662108,0.10284821,-0.3036309,0.17438193,0.003727518,-0.38027525,-0.23749365,-0.8124727,-1.1274155,-1.5589621],[-0.0006869782,-0.042528924,0.05025561,-0.031743184,-0.22178772,1.016933,-0.50708455,-0.30513486,0.16629063,-0.23337619,0.21578076,0.41531077,0.26406106,-0.24498649,-0.53471065,-0.36644122,0.11139245,0.2798891],[0.5800486,0.17213458,-2.2770967,0.13273536,-0.15001313,0.24997446,-0.7256148,0.33752334,0.053435106,0.18205637,-0.21749948,0.3237458,-0.31033078,0.13797231,-0.37041757,-0.13781188,-0.038840763,0.20394051],[0.0049984013,-0.35607442,-0.30905604,0.40517208,-0.19288664,-1.2281868,0.16647166,0.44088066,0.40701556,0.12298187,-0.08295799,-0.07647913,-0.38256118,-0.048575446,0.47953144,-0.019423949,-0.0798172,-0.15896548]],"activation":"σ"},{"dense_2_W":[[0.17072913,0.5787543,0.16908416,-0.15344563,0.21352929,0.1036233,-0.16814779],[-0.04280792,-0.8720339,0.5860262,0.17910767,0.05812723,0.43166825,-0.40927374],[-0.25224444,-0.32741183,0.5557173,0.2577443,0.27441007,0.024975402,-0.18134333],[-0.17902452,0.7218189,-0.24128178,0.08938652,-0.5499739,-0.2853039,0.6032645],[-0.012645399,-0.10678161,-0.2497543,0.12273038,-0.2995278,-0.5155403,-0.12064403],[-0.05483617,-0.61829835,-0.024198718,0.29385313,-0.05762493,-0.13852271,-1.0283959],[-0.17513163,0.5525871,-0.34557396,0.40270397,-0.4239708,-0.36327696,0.22318624],[-0.3050681,-0.5609769,0.6848509,-0.14485584,0.41891348,0.23840618,-0.42206725],[0.3968867,-0.00579093,-0.7550544,0.1985394,-0.41320163,-0.6388418,0.68250275],[0.13954934,0.31490627,-0.79896843,0.12518695,-0.46648943,-0.10224329,0.8570033],[0.40961888,0.4413134,-0.67998093,0.32758147,-0.30693418,-0.39162624,0.6029714],[-0.39057493,0.04696759,0.76041484,0.46441597,0.06613202,0.19455153,-0.84763706],[-0.1115568,-0.48450366,0.6582964,0.43812597,0.7578292,-0.45037985,-0.6380507]],"activation":"σ","dense_2_b":[[0.022194395],[-0.03836468],[-0.058703274],[-0.013638688],[-0.012889619],[-0.117961474],[0.015166406],[-0.040138457],[-0.011272022],[-0.012204604],[-0.062101785],[-0.09131032],[-0.06450806]]},{"dense_3_W":[[0.29413998,-0.24403282,-0.21639973,0.017811967,0.28033993,0.18735097,0.23800737,-0.61772835,0.47691423,0.2947574,0.39353845,-0.30080277,-0.573409],[-0.59557885,0.16263157,-0.33032954,0.27123576,0.30058095,0.14316729,-0.57262224,-0.010264795,0.5258702,0.31621447,-0.29535997,0.38230023,0.18332578],[0.54958236,-0.64796954,-0.5860492,0.4647252,0.25805357,-0.39067873,0.6433446,-0.62534493,0.2620962,0.22722915,0.31812868,-0.29690334,-0.6393193]],"activation":"identity","dense_3_b":[[0.02814165],[-0.050614122],[0.03127771]]},{"dense_4_W":[[-0.7580981,-0.00726576,-0.8432115]],"dense_4_b":[[-0.029448459]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144M xf1x895082xf1x82x0571A0JA16A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144M xf1x895082xf1x82x0571A0JA16A1'.json deleted file mode 100755 index 9f716a09ec..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873Q0909144M xf1x895082xf1x82x0571A0JA16A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.415863],[0.8583176],[0.3856797],[0.031867158],[0.84238064],[0.8479653],[0.85318357],[0.8488065],[0.84401506],[0.83682716],[0.8221359],[0.03176191],[0.031782564],[0.03180224],[0.031836487],[0.03187497],[0.03179108],[0.031642724]],"model_test_loss":0.006253075320273638,"input_size":18,"current_date_and_time":"2023-08-13_13-54-43","input_mean":[[27.552174],[-0.011369959],[0.0032041054],[-0.005240609],[-0.0099758925],[-0.009811709],[-0.010034873],[-0.008717237],[-0.008171778],[-0.009641522],[-0.009617026],[-0.005033958],[-0.005085749],[-0.00514212],[-0.0053138044],[-0.005393524],[-0.005487565],[-0.0055648554]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-2.9255316],[-1.3106222],[-0.28385758],[-0.005533128],[0.8718399],[0.13129508],[0.65529805]],"dense_1_W":[[-1.3177696,0.19991967,-2.7236588,0.47501546,-0.20533472,-1.0557586,0.17047773,0.009924321,0.06776284,0.115778096,-0.17705421,0.32459033,-0.0209746,0.12562141,-1.2017485,-0.427539,0.047930263,0.45157415],[0.14440672,-0.63587517,0.04897055,-0.22241928,0.012585529,-0.9856927,0.060655825,0.10771243,-0.11834612,-0.2647466,0.041776862,-0.005160143,0.4143384,-0.08409255,0.38516775,-0.06466858,0.4800853,0.116947636],[-0.048163578,-0.15507038,0.10709546,0.05433569,-0.78400093,-0.10471941,-0.687971,0.24902299,-0.28871644,-0.15858674,-0.15051886,-0.07557398,-0.21722956,0.19256075,0.9204932,-0.025876911,0.377379,0.11786139],[-0.0023113806,-1.1656983,-0.016276661,0.3712625,0.26083446,-0.8202079,0.7635671,0.12174111,-0.3810017,-0.4706684,0.476022,-0.1495595,-0.17617117,-0.0334313,0.34056324,-0.12129183,-0.18112142,0.0017632246],[0.36963087,-0.08762645,-1.6472614,0.58248544,0.099876635,-0.68770367,0.1060096,0.01555146,0.21880303,-0.07295039,-0.04888322,0.11901441,-0.3384761,0.6579154,-1.1264246,-0.25798565,-0.2051824,0.49036825],[-0.001395127,0.31909215,0.038826507,-0.16812363,-0.41808403,0.78146785,-0.12594081,-0.050199978,-0.0973126,-0.31068856,0.23852174,0.42455164,-0.08920052,0.24407244,-0.54622006,-0.2538641,0.038934287,0.26070222],[-0.1450647,-0.5672448,0.046273015,-0.3383503,-0.18226248,-0.75000846,0.22487456,-0.1403406,-0.19991998,0.040012,-0.07465593,-0.30669475,0.20688607,0.35658067,0.7150998,-0.056518137,0.2800083,0.09291142]],"activation":"σ"},{"dense_2_W":[[-0.26085964,0.3516763,-0.17330408,0.661693,0.17870913,-0.16493158,0.19355819],[-0.13368994,0.024639409,-0.57033145,0.5646507,0.3874018,-0.6424429,0.5143024],[0.36197537,-0.4894154,0.86991316,-1.0450212,-0.8808762,1.005693,-0.50344414],[0.037066706,-0.30221042,0.07532641,0.059567153,0.41288042,-0.6703966,0.5937009],[-0.3279511,-0.5896927,0.04172026,-0.25627023,0.311046,0.46807423,-0.7380045],[-0.17663476,-0.15280105,0.25481316,0.22980238,0.32853058,0.026288528,0.4474023],[-0.6216895,-0.43472454,0.16474614,0.24401735,-0.009333907,-0.55698293,-0.4658436],[0.64419144,-0.21330142,0.9627268,-1.1507334,-1.3168378,0.21035595,-0.22476402],[-0.22558647,-0.076528445,0.7357744,-0.89835054,-0.7661023,0.90134853,-0.07517657],[0.35094383,0.18648076,0.03390864,0.4248296,0.04366893,-0.26929817,-0.26258168],[-0.62187046,-0.59535176,0.72753495,-0.94289756,0.049893454,1.2905704,-0.16296726],[-0.39337137,-0.90796244,0.8290803,-0.22699821,0.17312697,0.98712176,-0.73924625],[-0.27244756,-0.37847507,0.122294754,-0.34000623,-0.034100182,0.08922609,-0.2426594]],"activation":"σ","dense_2_b":[[0.101125225],[0.10885535],[0.20420383],[0.009535166],[0.31587136],[0.07603302],[-0.357305],[-0.0620017],[0.11676147],[-0.21882989],[0.2917003],[0.07597336],[0.053113062]]},{"dense_3_W":[[0.6511969,0.195776,-0.49096948,0.4126447,-0.74414754,0.26202098,0.05113331,0.17945053,-0.2824012,0.28811157,-0.43237004,-0.7557984,-0.2802274],[-0.087479815,-0.5842241,-0.22641535,0.16699481,0.14202616,-0.02455116,0.32574484,0.81653625,0.4594011,0.2965805,0.22684464,-0.10494171,-0.37137553],[0.40364054,-0.2642197,-0.114815384,-0.49680176,0.411435,-0.15565751,-0.42915186,0.5777007,-0.27192292,0.27795404,-0.49125576,-0.23119576,0.09542205]],"activation":"identity","dense_3_b":[[0.16922124],[-0.16786872],[-0.1235053]]},{"dense_4_W":[[-1.0848238,0.43780962,0.121263236]],"dense_4_b":[[-0.16589022]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873QM909144 xf1x895072xf1x82x0571A01714A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873QM909144 xf1x895072xf1x82x0571A01714A1'.json deleted file mode 100755 index c60cfc778d..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x873QM909144 xf1x895072xf1x82x0571A01714A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.499129],[0.6601068],[0.37126893],[0.035993777],[0.64755857],[0.650401],[0.6537066],[0.64798653],[0.6443389],[0.6342998],[0.62037724],[0.035718568],[0.035768334],[0.0358108],[0.03556472],[0.035507064],[0.035144154],[0.034718994]],"model_test_loss":0.008825271390378475,"input_size":18,"current_date_and_time":"2023-08-13_14-51-36","input_mean":[[28.12371],[0.0065643145],[-0.012259348],[-0.0308991],[0.0035661163],[0.0040573454],[0.0040573636],[-0.0018063665],[-0.0031446684],[-0.006249773],[-0.007770399],[-0.03104693],[-0.031047331],[-0.03104868],[-0.03136646],[-0.03136208],[-0.03151733],[-0.031626265]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.6165265],[0.067915596],[-0.45316094],[-0.16899234],[-0.14808252],[-0.8624182],[0.7455331]],"dense_1_W":[[1.7688528,0.032614052,-0.04258705,-0.40471157,0.0026211264,0.14383507,-0.76273596,0.055630405,0.21549416,-0.10156934,-0.018276177,0.42286775,0.06321405,-0.048351847,-0.3251357,-0.13999832,0.014422678,0.20865417],[0.018235689,0.8150084,-0.011439717,-0.017960383,-1.0395502,0.4898895,-0.04454969,0.46327382,0.7437933,0.06830239,-0.4826564,0.1393547,0.14606072,-0.28793386,0.07896613,-0.26915878,0.061934475,0.10996908],[-1.7670835,-0.14292058,-0.04067935,-0.13737008,-0.11408217,0.34066078,-0.65927386,0.3707693,-0.08453015,-0.277993,0.15899399,0.19312033,0.12644269,0.0016063079,-0.3582613,-0.41488636,0.22687747,0.14989714],[0.009283532,0.21346128,3.842557,-0.18832086,-0.32320932,0.6712642,-0.56471795,1.146071,0.9314705,-0.6850848,-1.6761949,0.767423,0.09417577,-0.23689681,-0.81722146,0.2585955,-0.04035137,0.21729858],[-0.0062285685,-0.5146245,-0.082685284,0.0031572075,-0.20794849,-0.6622915,0.6452885,0.32985207,0.40914443,-0.13983616,-0.12780568,-0.17184584,-0.1486529,-0.25821346,0.536185,0.2092422,0.23474011,-0.40814623],[-0.2992245,-0.43034312,0.014492514,0.6396918,0.20689917,-1.0586469,0.6380456,0.111478046,-0.013004605,0.027720524,-0.11885847,-0.17448127,-0.22942995,0.3940829,-0.28098577,-0.49394473,0.062754326,0.16152045],[0.3649246,-0.45967793,0.026177378,0.034597564,0.104035355,-0.4483116,0.45026922,-0.26696894,-0.030676577,-0.16899553,0.11374246,-0.42508754,0.41004568,0.118722625,0.1094624,-0.045650996,-0.21261446,0.10205266]],"activation":"σ"},{"dense_2_W":[[0.29746833,-0.9805263,-0.20373926,-0.5810894,0.822015,0.78565085,0.774397],[-0.28532717,0.23769815,0.060819168,-0.18559076,-0.5988815,-0.6324048,-0.13228494],[-0.05379423,-0.6090431,-0.6882858,-0.38678372,1.2622792,0.5061005,0.806397],[0.016906988,0.8676961,0.13297725,0.07773776,-0.9471627,-0.23707166,-0.12722206],[-0.9656899,-0.52974796,-0.8884889,-0.18769741,0.20580004,0.088316336,-0.3275884],[-0.83929497,-1.3246149,0.20151234,-0.20800409,0.644204,0.73422116,0.37904078],[0.17644885,-0.17937113,0.7630181,0.23492537,-0.9941054,-0.087052345,-0.80296385],[0.5275903,0.15053748,0.26323977,-0.45628256,-0.904721,-0.13627163,-0.72142714],[-0.36794254,-0.36518982,-0.72322273,0.15947448,-0.5001212,0.09817367,0.2520628],[0.65508115,0.14115669,0.63049525,0.093293644,-0.15200832,0.26687813,-0.0647521],[-1.2376599,-1.0406941,0.35769528,-0.58431584,0.07535975,1.1416343,0.19291566],[-0.22289965,0.40572295,0.72577405,0.16881567,-1.15984,-0.6175091,-0.18357803],[-0.5811096,-0.95013314,-0.33011654,-0.15803374,0.7887948,0.29292244,-0.002783515]],"activation":"σ","dense_2_b":[[-0.049079053],[-0.08643912],[0.10503918],[0.04620607],[-0.24959993],[-0.29486987],[-0.07451853],[-0.15858883],[-0.246627],[0.022139506],[-0.26383835],[-0.27304852],[-0.11335464]]},{"dense_3_W":[[0.27437788,-0.13480587,0.4028967,0.26457673,-0.049248666,0.3107791,0.40147588,0.68062055,-0.32741368,-0.33465502,-0.38290545,0.34771603,-0.4449348],[-0.5136515,0.16504014,-0.69426614,0.69784516,-0.10840683,-0.53815,0.55030924,0.049842075,-0.043087877,0.37305754,-0.47518057,0.18190123,-0.0713615],[-0.09406427,-0.12237694,-0.71659255,0.42452714,-0.2178768,-0.44793212,0.5866718,0.52974296,0.42568213,-0.0633519,-0.74072903,0.77244145,-0.24008119]],"activation":"identity","dense_3_b":[[0.0077823168],[0.07439971],[0.038980033]]},{"dense_4_W":[[0.13538235,0.9460461,0.2892883]],"dense_4_b":[[0.06883352]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144AAxf1x891081xf1x82x0521A00608A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144AAxf1x891081xf1x82x0521A00608A1'.json deleted file mode 100755 index e04086d5e3..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144AAxf1x891081xf1x82x0521A00608A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.057558],[0.9240797],[0.39042372],[0.04054577],[0.91198736],[0.91717815],[0.92098093],[0.91237575],[0.899855],[0.8780954],[0.86047786],[0.04041413],[0.04044436],[0.040472586],[0.040513117],[0.04048389],[0.04041956],[0.040282376]],"model_test_loss":0.009325800463557243,"input_size":18,"current_date_and_time":"2023-08-13_15-19-49","input_mean":[[22.28529],[-0.031808108],[0.0006169089],[0.0020743944],[-0.028572567],[-0.028636014],[-0.028830813],[-0.028213872],[-0.02719701],[-0.023936827],[-0.021230578],[0.0021741558],[0.0021642826],[0.0021512513],[0.002037396],[0.001988419],[0.0019436596],[0.0019510677]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.030092482],[-0.08966159],[0.7434682],[0.052508995],[-0.037241258],[-0.6811802],[0.08887462]],"dense_1_W":[[-0.016281815,-0.21513529,-0.5826629,-0.040725954,0.1220137,-0.74154484,0.22448872,-0.69602275,-0.044675313,-0.050951652,0.55438906,-0.14687209,0.10323754,0.10435016,0.28258827,-0.46545756,0.20151669,-0.041637793],[-0.038013637,0.4798638,0.035863526,-0.047271762,-0.3552868,0.736299,-0.44315857,0.093434595,0.026829336,0.022546915,-0.014716782,-0.2137455,0.72353894,0.13167273,-0.5572506,-0.17848228,-0.19980797,0.34290475],[-1.3190829,-0.16427143,0.03076943,0.18381341,-0.35874882,-0.6953364,0.63559276,0.56573445,0.12491954,0.34269994,-0.46494725,-0.57930934,-0.0077773347,0.29941487,0.49355614,0.52276766,0.039447572,-0.36896285],[0.0075827236,-1.8779591,0.07066059,0.09625603,0.42762265,-0.8998018,0.28209868,-0.30655807,-0.17634554,0.38442346,-0.3097632,0.15156893,-0.13291042,0.1254108,-0.11183744,0.33543125,-0.41085628,0.09713285],[0.02231647,0.4558223,0.04829613,-0.5974221,0.12706976,0.5712898,-1.1618217,0.004924739,0.25602806,0.34039888,-0.26809433,-0.13969776,0.005608404,-0.04935092,0.6085609,0.56621975,0.054403227,-0.41240177],[1.3177918,0.34837294,0.03489512,-0.1798878,0.07544648,-0.7564881,-0.25446817,0.41348827,0.38496748,0.18170023,-0.4120484,-0.012971901,-0.14837568,-0.11443646,0.6549086,0.7655774,0.095144756,-0.46527424],[0.003085306,-1.8520818,-5.775147,0.9801003,1.6440481,-0.41763654,0.0023244382,-0.368523,-0.5199194,0.19324827,1.0014604,-0.7281056,-0.59879243,0.4747877,0.2891212,0.09482188,0.009162863,-0.40084323]],"activation":"σ"},{"dense_2_W":[[0.7327416,-1.021178,0.6615702,-0.20163396,-0.3478265,0.22332166,-0.27881405],[-0.35193413,0.366607,-0.31837893,0.05043401,-0.12893029,-0.15935789,0.3549393],[0.21511331,-0.18085788,-0.40121323,0.32115334,-0.13333887,-0.5539215,-0.2487469],[0.0033335267,1.0552391,-0.62137043,-0.40063322,0.99995136,0.5781669,-0.58789635],[0.61077094,-0.3306075,-0.31027898,0.7346135,-0.8391994,0.847853,0.48013672],[-0.14262784,-0.741944,0.6622348,0.48902386,-1.3086324,0.098962665,0.45717558],[0.2415809,-0.84083027,0.5231141,0.65175545,-0.554833,-0.008785207,-0.17766568],[0.055044893,0.52781713,-0.5939338,-0.7540269,0.15011188,-0.420139,0.2981709],[-0.14237478,-0.29901835,-0.7485882,-0.21372531,-0.34447756,0.40902004,-1.1021607],[-0.54304063,0.012865376,0.31854355,0.17462453,0.26030272,-0.7394602,-0.7608907],[-0.44612113,0.36114553,-0.25402042,-0.0076143444,0.8201758,0.47841248,-0.45955038],[-0.004852833,0.57263273,-0.019337526,-0.75631505,0.4485348,-0.3326961,-0.3167996],[-0.15952389,0.4143726,-0.01947486,0.2718969,0.47909242,0.089936785,-0.45480072]],"activation":"σ","dense_2_b":[[-0.15473405],[-0.03545587],[0.011608688],[0.24255751],[0.028790355],[-0.44917503],[-0.07094555],[-0.062117405],[-0.16924906],[-0.10952014],[0.1554779],[-0.20075743],[-0.113302805]]},{"dense_3_W":[[0.3808469,-0.551099,-0.22391781,0.15603887,0.23546505,0.029905649,0.44500378,-0.19618921,0.22027779,-0.40315858,-0.14389955,-0.33602792,-0.12122436],[-0.59489226,0.2445008,0.11975124,0.48564222,-0.39224073,-0.272205,-0.54375273,0.009905357,-0.23434179,0.52072835,0.34248853,0.16348307,0.20279588],[-0.014571961,0.5323131,-0.5192708,-0.37823296,0.66229814,0.112855725,0.64537394,-0.30970648,0.31949428,0.11771956,-0.23411283,0.30479413,0.3693334]],"activation":"identity","dense_3_b":[[-0.037845407],[0.04069344],[-0.059178203]]},{"dense_4_W":[[-0.99151933,1.1575272,-0.65392774]],"dense_4_b":[[0.04349]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A07B05A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A07B05A1'.json deleted file mode 100755 index ce3c207e0e..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A07B05A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.563397],[0.8385782],[0.38159406],[0.0343706],[0.82969534],[0.8327079],[0.8353158],[0.8362094],[0.8282918],[0.8180939],[0.80514234],[0.0341284],[0.03419915],[0.034257572],[0.034370307],[0.034313396],[0.034115147],[0.03375072]],"model_test_loss":0.011564328335225582,"input_size":18,"current_date_and_time":"2023-08-13_15-45-22","input_mean":[[21.38968],[-0.041864436],[0.016576989],[-0.021341346],[-0.045225102],[-0.044813316],[-0.04361269],[-0.034834445],[-0.031572755],[-0.024205465],[-0.018740682],[-0.021514442],[-0.021450149],[-0.021384653],[-0.021149829],[-0.021141373],[-0.020979993],[-0.020896269]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.5755177],[0.03428629],[-0.71415836],[0.22175552],[-0.09201754],[-2.8689044],[-0.1045704]],"dense_1_W":[[0.9483997,0.9610236,0.20808627,-0.30212918,0.053525597,0.5834779,-0.93940276,0.65561306,0.36549884,0.3216295,-0.21082531,0.44739217,-0.29857454,-0.11884895,-0.15256537,0.60311323,0.081600666,-0.23139988],[-0.005265079,1.3001031,3.8029873,-0.32444727,-2.6160483,0.2214184,0.058062643,1.1854216,1.1538562,0.15885483,-1.0735705,0.3265351,0.5016962,-0.4941123,0.016058635,-0.25360242,0.15720944,0.08846265],[0.0012037685,-0.65408915,-1.5829769,0.33530995,0.7700829,0.047827095,0.5908282,-0.17494035,-0.26473024,0.51929754,1.1789833,0.0807209,-0.24442843,0.60358465,0.003373896,0.6164561,0.045661986,-0.14974658],[-0.0006085811,-0.6465432,0.0034944871,-0.15468381,0.67403156,-0.93398803,-0.13589555,-0.35583574,-0.57860667,-0.21501748,0.385936,-0.3407401,0.20494653,0.20552959,0.12731454,0.0399628,-0.2351022,0.091997944],[-0.0065293787,0.7746981,0.51969033,-0.5453975,-0.051220566,0.95546484,-0.24264541,-0.19263709,0.3042942,-0.4307904,-0.4401109,0.31372312,0.5982625,-0.32563445,-0.3293053,-0.076774836,0.30764472,0.03080843],[-0.9222714,0.65885305,0.20200571,0.0613283,-0.12522168,0.3155805,-0.17339218,0.62215847,0.3577474,0.3287558,-0.23576994,0.2977285,0.15171073,-0.54179823,-0.20839736,0.14107114,0.29692984,-0.17770605],[0.0037967945,0.9581507,-0.0014370086,-0.49775982,-0.13051113,1.0137179,-1.1507403,0.24028304,-0.79054755,0.17817192,0.17676984,0.99630857,-0.077027574,-0.20737489,-0.5133581,0.0631313,-0.34999797,0.48768488]],"activation":"σ"},{"dense_2_W":[[-0.48959735,-0.59383065,0.068969965,0.4048074,-0.09356656,-0.22178447,-0.008503189],[-0.47465578,0.046973683,-0.30203333,0.7319351,0.37943313,-0.7515599,-0.7609684],[-0.7812694,-0.1668936,0.34998512,0.6032413,0.2552332,-0.07198844,-0.9453271],[-0.1400433,0.56433755,-0.28285316,-0.5249183,-0.061916184,0.5938611,0.43950254],[-0.19838578,-0.120480634,-0.2613999,0.040656477,-0.57329947,0.035204634,-0.23756325],[-0.31026715,-0.91703445,0.5292604,-0.6104651,-0.35656053,0.19026318,-0.33533737],[0.362478,-0.6857054,-0.061543047,0.14211811,0.38036314,-0.5977386,-0.6514936],[0.28820255,0.014584735,-0.5350505,-0.664403,0.6750804,0.35808724,0.39167216],[-0.82168514,-1.1079371,-0.18080051,-0.79870147,0.12686022,0.18076727,0.08958418],[0.2513723,0.17902936,-0.30011544,-0.714674,0.51919776,-0.23153323,0.7435418],[0.30748522,0.12669975,0.081522584,-0.5034588,0.030012246,-0.017879713,0.6410725],[0.26371044,0.34655178,-0.59103256,-0.43619967,-0.687298,-0.7533559,-0.3246515],[-0.38202673,-0.58601105,-0.24320982,0.69089496,-0.5146493,0.17502482,0.060758125]],"activation":"σ","dense_2_b":[[-0.03921857],[0.20950015],[0.05701196],[-0.24196394],[-0.043847077],[-0.09972506],[0.084566765],[-0.11199834],[-0.23634689],[-0.19677764],[-0.08626865],[-0.08511737],[0.08237302]]},{"dense_3_W":[[0.2521058,0.05273895,0.14777374,0.2316707,-0.03372719,0.37708887,-0.22231328,-0.14752237,0.024881583,0.14600374,-0.36284056,-0.053377006,0.15762502],[0.17785782,0.65084356,0.653211,-0.65019035,0.20140639,0.38871175,0.24968603,-0.6089574,0.30058384,-0.08686883,-0.49139014,0.17155631,0.48726168],[-0.11656486,0.2625412,-0.3139385,0.10613407,0.4817832,0.19348018,0.08415106,-0.6385824,-0.2113412,-0.5868329,0.1681216,0.33424532,0.14378552]],"activation":"identity","dense_3_b":[[0.046604935],[-0.0675065],[-0.049730938]]},{"dense_4_W":[[0.40339613,-1.2102003,-0.3411253]],"dense_4_b":[[0.061254077]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A00442A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A00442A1'.json deleted file mode 100755 index b3b8b8db24..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A00442A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.8480306],[0.96037143],[0.56644064],[0.031923212],[0.9592892],[0.9607283],[0.9606423],[0.9418574],[0.9194964],[0.8982176],[0.87986463],[0.03180112],[0.0318301],[0.031843536],[0.031923328],[0.0321031],[0.032251816],[0.032379184]],"model_test_loss":0.007998951710760593,"input_size":18,"current_date_and_time":"2023-08-13_18-46-40","input_mean":[[17.83718],[-0.021548323],[0.008896963],[-0.020022377],[-0.027599646],[-0.026774092],[-0.025805676],[-0.021180406],[-0.0172894],[-0.014156764],[-0.015430601],[-0.020131098],[-0.020135172],[-0.020142682],[-0.02023454],[-0.020377133],[-0.020592311],[-0.020893447]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-3.234378],[-1.0114365],[3.3278525],[-0.043438543],[0.09898487],[-1.1228223],[-0.09896681]],"dense_1_W":[[-1.4481235,1.14371,-0.18619996,-0.014011254,0.5418801,-0.8123825,0.04581224,-0.31140676,-0.219098,0.009256715,-0.20572591,-0.24179928,0.121151835,0.17432994,0.046270356,-0.42792895,0.08374407,0.2014057],[-0.35328487,0.87328243,0.23025416,0.041772332,-0.19766848,0.65253824,0.007881493,0.10688904,0.25050953,-0.28640047,0.124380134,0.41151407,-0.20547412,-0.38162622,0.022347001,0.017873542,0.005152273,0.04886075],[1.4722439,0.974171,-0.19161922,0.20244934,0.61558235,-0.8968513,0.16112171,-0.25674978,-0.22722203,0.058710273,-0.23509592,0.16444913,-0.2827588,-0.03489349,-0.18735917,0.00018917536,-0.18949887,0.27490872],[0.012972494,1.2556565,5.9566135,-0.15130961,-0.4523947,-0.37081477,-0.91552794,1.1574521,0.47152543,-0.47953206,-0.55489933,0.099222064,0.38702163,-0.29589957,0.041597135,-0.03547445,0.022571348,0.027354982],[-0.003863914,0.22050343,0.0120630115,-0.25257105,-0.10205844,0.9146121,-0.7968388,-0.29547405,-0.17439528,0.46752262,-0.08055068,0.17053045,0.18076906,-0.1516316,0.055936866,-0.17291713,-0.10852507,0.16824071],[-0.4190413,-0.857921,-0.25096828,-0.28255612,0.19289751,-0.8734456,0.28353396,-0.37122184,-0.11925379,0.19329911,-0.06972643,0.25552443,-0.35699388,0.26851597,0.43666807,-0.24304788,-0.09045897,0.055230238],[0.0012014257,-0.54465014,-0.4546114,0.0631211,-0.18529981,-0.94013214,0.40706542,-0.23528938,0.075760044,0.8153893,0.17362785,-0.39601672,0.18890578,0.48059973,0.10882803,-0.22344732,0.16269675,-0.24009374]],"activation":"σ"},{"dense_2_W":[[-0.8621162,0.6375523,-0.121657215,-0.34696895,0.51134723,-0.642076,-0.43340936],[-0.39562237,-0.241824,-0.12310841,-1.2114509,-0.89629316,-0.012759714,-0.58896196],[-0.69110984,-0.09870509,-0.3375854,-0.09505871,0.97829163,-0.6490481,0.1399663],[-0.010694462,0.022776525,0.82732725,-0.15266539,-0.25287274,0.39495268,-0.39242798],[-0.120031275,-0.71853244,0.37485296,0.45275152,-0.9226145,0.1723915,0.045272652],[-0.5235272,-0.4945377,-0.18775977,-0.8348921,-0.25558534,-0.26095316,0.2460929],[-0.2680453,0.7991849,-1.2544307,0.6096642,0.8758116,-0.66279304,-0.44246507],[0.24853848,-0.009198416,-0.3490367,-0.27431184,-1.1257328,0.35145393,-0.30193186],[1.1962029,-1.1290612,0.23949686,-0.20245065,-1.1434972,0.53818357,0.60230476],[0.6036199,-0.45529002,0.9213078,0.03841346,-0.73413646,0.1718995,-0.2821352],[0.864308,-0.6686404,0.9973249,-0.19549038,-0.8948997,-0.10574349,0.5035874],[1.9524418,-0.022500906,-0.4884547,-1.4554193,-1.1326776,1.0094995,0.33511108],[0.35033834,-0.5318131,-0.72255147,0.07995676,-0.35800278,-0.5116459,0.3332227]],"activation":"σ","dense_2_b":[[0.108086385],[-0.31281564],[0.13146636],[-0.17104536],[-0.24870978],[-0.31226832],[0.08884647],[-0.3376938],[-0.33002087],[-0.14730828],[-0.17783853],[-0.38552558],[-0.093307]]},{"dense_3_W":[[0.18446985,0.21522333,-0.28989294,0.35959074,-0.16474617,-0.16107476,-0.9634279,0.63884085,0.33368322,-0.14383645,0.6392969,0.88589066,-0.57898635],[0.26163533,0.40219304,-0.5289297,0.11495239,0.29818106,0.17250255,-0.12519145,0.31459266,-0.38456517,-0.12500696,0.17287982,0.0887632,0.10183194],[-0.71430176,-0.40297222,-0.52635926,-0.07720518,0.369048,-0.03566161,-0.9068424,-0.46042228,0.2392488,0.73106444,0.27735183,-0.16808154,0.38387048]],"activation":"identity","dense_3_b":[[0.009075719],[-0.0069753183],[0.029595045]]},{"dense_4_W":[[-0.8512863,-0.071502104,-1.0336823]],"dense_4_b":[[-0.021940688]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QN909144B xf1x895082xf1x82x0571A01A18A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QN909144B xf1x895082xf1x82x0571A01A18A1'.json deleted file mode 100755 index e5182951ae..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN b'xf1x875QN909144B xf1x895082xf1x82x0571A01A18A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.188053],[1.1657922],[0.53592527],[0.040702485],[1.1630709],[1.1658245],[1.165898],[1.1360451],[1.1134317],[1.0845132],[1.0600443],[0.04062425],[0.0406608],[0.040687334],[0.04069575],[0.040612057],[0.040392578],[0.040035486]],"model_test_loss":0.014063029550015926,"input_size":18,"current_date_and_time":"2023-08-13_20-26-43","input_mean":[[21.149807],[-0.10974744],[-0.0031464333],[9.495444e-5],[-0.108882815],[-0.11035729],[-0.11167806],[-0.11192071],[-0.10970605],[-0.1038049],[-0.09687886],[-8.529318e-5],[-5.421513e-5],[-1.24803355e-5],[0.00014361751],[0.00017423068],[0.0003317356],[0.0004546588]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.27552018],[0.90119773],[-1.3030006],[-2.1216948],[0.18355446],[-2.4107463],[0.16562456]],"dense_1_W":[[0.12652385,2.4475446,-0.022650752,-0.69291824,-1.0016218,0.91486317,0.6336902,0.14477217,0.2598121,-0.20517316,0.36350495,0.39227563,0.0074457154,0.07074344,-0.19992946,0.0991527,0.04138881,0.06528243],[1.3323559,-0.7597325,-0.043890204,0.09516193,0.5088217,-0.21222521,0.38730863,-0.10672117,0.12993167,-0.12611133,0.17683442,-0.29292497,0.28472096,0.31997505,-0.07029694,-0.24922556,-0.0124233235,0.112814486],[-0.36201748,1.4186722,0.0062952894,-0.037926484,-0.5666642,0.72316504,-0.46085364,0.035363074,0.118354574,-0.11634284,0.10892351,0.28690028,-0.25633323,0.11827332,-0.110319726,-0.052415002,-0.08695773,0.13403927],[-0.57906187,-2.1076198,0.00707048,0.124392234,0.9577161,-0.652618,0.11178688,0.08233431,-0.10934392,0.15851316,-0.16079995,-0.200316,0.02980312,0.16383933,-0.19201891,0.07208879,0.0134847,-0.026035026],[1.6250517,-0.2035624,0.050559063,-0.27959144,0.02131727,1.4500656,-1.1230069,-0.13204305,-0.20134674,0.109666,0.105381586,0.33672488,-0.054919533,0.1381979,-0.37668028,-0.44266343,0.40978658,0.055366118],[-0.48616406,-0.09577948,0.030225683,-0.054680806,-0.4930565,-0.22118689,1.1458802,0.32909223,-0.3652297,-0.28851825,0.21014541,0.24283552,-0.11504994,0.41478232,-0.77871186,-0.2583162,0.44575816,0.024779651],[-0.06703918,0.022096574,-3.0616148,0.19644247,-0.7936287,-1.3313962,1.0172884,-0.14775673,-0.6005079,0.41182107,0.7640057,-0.037669305,-0.43755364,0.21248876,0.25767666,0.08838868,-0.38727447,0.116036914]],"activation":"σ"},{"dense_2_W":[[-0.5774166,0.3788837,-1.1512787,0.6045041,-0.30563933,0.1520524,0.4747448],[0.026152905,-0.40509266,0.71000934,-0.4843991,-0.20758377,0.18950084,0.37816125],[-0.13815251,-0.8893696,0.23316386,-0.113908656,-0.4585042,-0.46166483,-0.22798917],[-0.542509,1.2547107,-1.8032401,0.2135292,0.4327131,0.6078487,1.2712867],[-0.041001927,0.16597806,0.39927384,-0.54332757,0.23889625,-0.45043373,0.19426684],[0.16223486,-0.64652383,0.4093884,-0.6869164,0.015826961,0.18224072,0.40522045],[0.5264121,-0.81645095,1.0303737,-0.7750668,0.53066015,-0.18214639,-0.09689465],[0.47082463,-0.62583274,0.64610606,-0.17833126,0.48148805,0.086845286,0.11682811],[-0.7040258,1.2640396,-2.4362037,1.873551,-1.8753885,1.3339359,1.0496316],[0.14156407,0.5989012,-0.23044766,-0.097144015,0.12927,-0.010738458,0.6056361],[0.26921788,-0.1284144,0.007066244,-0.04917847,0.5776498,-0.47206506,-0.36211184],[-0.2055914,-0.48159376,-0.024098463,0.103931576,0.50089693,-0.06848274,-0.09180179],[-1.3385345,-1.9117901,-0.0011972345,-0.7033701,-4.2961745,2.4796546,2.848627]],"activation":"σ","dense_2_b":[[0.19726445],[-0.06158395],[-0.14339806],[0.12678884],[-0.14894912],[-0.04651775],[-0.14024791],[-0.15321352],[0.08253985],[0.18063237],[-0.049321633],[-0.08920167],[-1.457004]]},{"dense_3_W":[[0.7081014,-0.30889422,-0.49976626,0.32896045,-0.40754297,-0.45574123,-0.6064694,-0.4691866,0.5265183,0.6408709,-0.32701582,-0.34626913,0.5192711],[-0.32945433,-0.2021828,-0.43582925,0.21351081,0.51058686,-0.33781144,0.7423047,0.3941001,-0.71700716,-0.26396632,-0.5284645,0.20918335,-0.71266997],[-0.623438,0.35574603,-0.042172,-0.2322551,-0.21975967,0.4599549,-0.24270838,0.4056575,0.46420303,-0.31508285,0.5513475,-0.24558863,-0.28036433]],"activation":"identity","dense_3_b":[[0.10075232],[0.1357436],[-0.02601655]]},{"dense_4_W":[[-1.0338233,0.175015,-0.0050515365]],"dense_4_b":[[-0.102083005]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A10A01A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A10A01A1'.json deleted file mode 100755 index 23d7c217e4..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521A10A01A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.369346],[1.0345815],[0.48595738],[0.038879942],[1.0224149],[1.0270526],[1.0309867],[1.0154411],[0.9946685],[0.9673825],[0.9462645],[0.038886003],[0.03886903],[0.038842827],[0.038692325],[0.038516246],[0.03829045],[0.038023546]],"model_test_loss":0.011551334522664547,"input_size":18,"current_date_and_time":"2023-08-13_21-17-35","input_mean":[[24.614252],[-0.027011419],[0.0014726992],[0.008945528],[-0.02214811],[-0.023875551],[-0.025268542],[-0.021144817],[-0.020492183],[-0.01736523],[-0.01178769],[0.009003565],[0.009013808],[0.009026339],[0.009184481],[0.009248184],[0.009236562],[0.00922171]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.3147287],[-1.6872499],[-0.42541492],[-2.6292078],[0.028035024],[0.03459358],[0.07949542]],"dense_1_W":[[0.047803342,-1.4541457,-7.672288,1.0376374,0.90106887,-0.5459878,0.30515322,-0.08935539,-1.0962652,0.29930526,0.7711765,-0.47839776,-0.067261726,-0.31026986,0.096002005,-0.19196555,0.049338873,0.037196536],[-0.9811775,-0.78911555,-2.1510236,0.50958246,-0.4388312,-0.96856743,0.28030896,0.1779042,0.0768994,-0.13534106,0.16211012,-0.5117382,-0.4880125,0.4930607,0.42255047,-0.427145,-0.016792877,0.04354907],[0.24651746,1.9175419,-0.001038614,0.4657561,-0.7955447,0.28141394,-0.21989036,0.7032182,0.021002548,0.054642107,-0.25775212,-0.18840952,-0.19194557,-0.11614515,-0.2208172,-0.18785909,-0.100455984,0.11671375],[-1.110365,1.4617373,2.5632505,-0.6936042,0.18904822,1.2634845,-0.7143399,0.43131736,-0.6782005,-0.11955076,0.014935311,-0.053061865,0.60653067,0.2520773,-0.5539984,0.37587786,0.38024148,-0.29947954],[-0.049056992,3.2711048,-0.0012738818,-0.9280159,0.06959995,1.3438661,2.1296465,1.5839107,1.2994887,0.2974056,-0.4331058,0.5643816,0.17077604,0.46159738,0.13453983,0.32876533,0.29972157,-0.19157079],[-0.002617311,-0.26627848,0.00035574558,0.15850249,-0.51069593,-0.9413688,1.3242084,0.36154234,-0.037687466,-0.12007863,-0.103309914,-0.08942667,-0.49348807,0.24432492,0.19013445,0.090723045,0.09632228,-0.19452243],[-0.3788624,1.6411204,0.0010042163,-0.7426254,-0.9095712,0.5644892,0.10306167,0.37586528,0.35857487,-0.26580176,-0.07742835,0.38095754,0.35132152,-0.26794037,-0.5125942,0.26599923,-0.07368752,0.14955874]],"activation":"σ"},{"dense_2_W":[[-1.1191249,-0.44653374,0.3957576,0.20264097,0.8131554,-0.8871739,0.76233166],[0.24396768,-0.11242304,0.11703958,0.23683518,0.26508585,-0.8381617,-0.010156824],[0.95748633,-0.8170791,0.91270953,-2.2128932,-1.7108568,-0.3102869,-0.51243025],[-1.0560807,-0.18680175,1.0978043,-0.1330585,0.50391763,-0.61881065,0.40257195],[0.13224883,0.33161446,-1.2939858,-0.86368215,0.25465244,0.41896132,-0.4954958],[-0.9718114,-1.1362193,0.12704434,-0.7889261,0.67179495,-0.025664078,-1.2435114],[-1.0912126,-1.4135875,0.87950945,-0.07909115,0.74423045,0.08346314,-1.4557395],[-0.47076926,-0.09556143,-0.26575336,0.30210772,-0.032517277,-0.6874358,-0.28881064],[0.91966176,0.10665701,-0.91860026,-0.33751714,-0.06834981,0.93626994,-0.6571628],[0.5642148,0.49901268,-1.3865877,-0.5038256,-0.77347946,0.10353698,0.12781042],[-0.13634703,-0.63548046,-0.12139281,-0.35569352,-0.15445279,-0.60711306,0.38474676],[0.45710889,0.071052924,-0.6941922,-0.40552536,-0.2624531,0.30862984,-0.21026665],[-0.17136033,0.13013878,-0.56358737,0.017554766,-0.8674639,0.5193747,0.404817]],"activation":"σ","dense_2_b":[[-0.24010156],[-0.03701659],[-0.11688351],[0.0057563568],[-0.2258239],[-0.12888032],[-0.04495887],[-0.19279772],[-0.024947112],[-0.24512185],[-0.06996539],[0.002301173],[-0.18535274]]},{"dense_3_W":[[-0.3262236,0.2867189,-0.46465525,-0.12294561,-0.09975732,0.6389669,-0.06613567,-0.6155315,0.5748487,0.5216139,-0.4668207,0.35530105,0.2609643],[-0.63311577,-0.7085013,-0.31479278,-0.63713,0.32777005,0.2345535,0.7747577,0.2789224,0.3357283,0.53898865,-0.15058397,0.20608704,0.49955884],[-0.72667474,-0.25321692,-0.17046283,-0.11438071,0.5548703,-0.008387027,0.6999693,0.052387122,-0.2282906,-0.32617927,0.025806168,0.50178117,0.5016455]],"activation":"identity","dense_3_b":[[-0.09833234],[-0.08791367],[0.020298293]]},{"dense_4_W":[[-0.5844458,-0.98398805,-0.08582402]],"dense_4_b":[[0.08352287]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521B00404A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521B00404A1'.json deleted file mode 100755 index d52b43b372..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144B xf1x891081xf1x82x0521B00404A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[6.938926],[0.62772423],[0.29867607],[0.03094836],[0.6110426],[0.6159467],[0.62132204],[0.6395374],[0.64702064],[0.65667325],[0.65815526],[0.030817023],[0.030845646],[0.030863807],[0.030900748],[0.030872138],[0.030954026],[0.031025298]],"model_test_loss":0.02285374514758587,"input_size":18,"current_date_and_time":"2023-08-13_21-42-28","input_mean":[[23.255941],[-0.0039265477],[-0.0056222063],[-0.016524963],[-0.00218176],[-0.0024286949],[-0.0033278896],[-0.0040004114],[-0.0063022724],[-0.00994652],[-0.014132979],[-0.016437652],[-0.016452443],[-0.016481234],[-0.016730793],[-0.016982961],[-0.017188018],[-0.017422361]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.29317],[1.5267397],[0.08217149],[1.2452852],[-0.9688157],[-0.096829034],[0.39433828]],"dense_1_W":[[0.005915041,0.5450623,-0.0069149085,-0.46442664,-0.22601163,1.3387343,-0.7786973,-0.4650629,-0.40435264,-0.14188097,0.67670316,0.45593762,-0.2410964,-0.04123494,0.1702602,-0.18933693,-0.3188177,0.04489354],[0.47714752,0.6054337,0.13158876,-0.30294856,0.061013125,0.5564793,-1.1751397,0.35795754,0.6406297,0.2721367,-0.5613271,0.36031482,-0.25085223,-0.10549718,0.14662914,0.18818983,-0.24555802,0.12492779],[0.0003755121,-1.5311179,-4.3272233,-0.46309865,1.436148,-0.45119837,-0.93964314,0.4118978,-0.7870894,-0.7511141,2.7374241,-0.07799791,0.010225301,0.17858656,0.025200186,0.37682062,0.24588887,-0.32082075],[0.021538865,0.2234551,-0.05087945,-0.16210763,0.052253578,-0.5015178,0.86417854,0.56207055,0.14652875,-0.037124693,0.7986706,-0.625708,0.142645,0.052587703,-0.237036,-0.23684868,-0.4017891,-0.7608035],[-0.3722909,0.54145604,0.11193832,-0.41615248,-0.20452525,0.41731396,-0.56850874,0.445437,0.20962103,0.2034371,-0.38485476,0.40009347,0.0909534,-0.073908776,-0.31467494,0.08797947,0.012187805,0.13753214],[-0.07315742,-0.843601,-0.13284892,-0.21064427,0.813711,-0.6778223,0.09393603,-0.31476387,-0.33809435,0.31934786,0.11784876,-0.11346231,-0.50661373,0.81929815,0.41997102,-0.19574907,-0.10820584,-0.0013016728],[-0.0045597386,-1.876721,-0.6161992,0.29715562,-0.83337486,-2.280439,-2.1169722,-1.5114844,-1.9489485,-2.430094,-0.9096425,-0.92954713,-0.4385408,0.19880356,0.64660573,-0.46100757,0.17253575,-0.076600425]],"activation":"σ"},{"dense_2_W":[[1.009494,0.042049244,-0.7750519,-0.57728094,1.3917161,-0.9949108,-0.27987498],[-0.4912434,-0.22204591,-0.5417998,0.4574385,0.21495223,0.2710998,0.62334305],[-0.15153155,0.01599128,-0.45292535,0.012102149,0.23569047,0.4165612,-0.3426787],[-0.56857765,-0.48303458,0.17770454,-0.026586715,0.04770979,0.6940287,-0.04585979],[-0.6126955,0.12536684,0.023409514,-0.6668342,-0.094184265,0.01863304,-0.036869247],[0.37028855,-0.29489964,-0.3782998,0.44059175,0.4545478,-0.9325122,-0.28946736],[-0.5399863,-0.52101445,0.24559934,0.5746218,-1.1413286,0.71955156,0.4434971],[0.8772197,0.5362956,0.19421022,-1.0224069,0.7089293,-1.0749434,0.04264178],[-0.5255222,-0.03324677,-0.7210142,-0.38647947,0.19431087,-1.3739054,0.3249313],[1.1000354,1.0278201,-0.69191587,-0.50786847,0.5078231,-1.0587357,-0.24861221],[-0.2748495,-0.54516625,0.24361324,-0.37419957,-0.12278863,-0.0628238,0.17636348],[-1.0216668,0.054562744,-0.36077505,0.403067,-0.5215005,0.47245187,-0.31446433],[0.20261914,-0.18020427,-1.0289909,-0.08297991,-0.673349,-0.2813431,-0.43772835]],"activation":"σ","dense_2_b":[[-0.0071199946],[0.11808283],[0.012594512],[0.010172507],[-0.26932594],[-0.059178684],[-0.109771855],[-0.21241476],[-0.26554722],[0.051559977],[0.019238671],[0.06243583],[-0.2946492]]},{"dense_3_W":[[-0.09602511,-0.048682462,-0.18955606,0.4171001,0.066497065,-0.59586984,0.21584617,-0.37557873,0.27344728,-0.33525473,0.6279888,-0.39435863,0.46858945],[0.6317756,0.0002881869,0.19008896,-0.59359,0.3863359,-0.2528118,-0.1984929,0.5970809,0.3629511,0.3559985,-0.637736,-0.84007025,0.04686958],[0.750255,-0.24061574,-0.58244413,-0.24981315,-0.25377622,0.5355694,-0.30574042,0.5434507,-0.060648266,0.6019894,-0.6170493,-0.50975835,0.08353199]],"activation":"identity","dense_3_b":[[0.033729278],[-0.054734595],[-0.028816417]]},{"dense_4_W":[[-0.44288176,0.2882923,0.91610426]],"dense_4_b":[[-0.03074748]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A00642A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A00642A1'.json deleted file mode 100755 index 1d20a774f4..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A00642A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.884762],[0.81607556],[0.46235383],[0.04137435],[0.8147813],[0.8158872],[0.8164004],[0.80351764],[0.78805685],[0.7781327],[0.7716266],[0.041138463],[0.041208826],[0.041283675],[0.041592937],[0.04169671],[0.041762512],[0.04168417]],"model_test_loss":0.007246986962854862,"input_size":18,"current_date_and_time":"2023-08-13_22-07-07","input_mean":[[20.607279],[0.1291296],[-0.0037803883],[-0.0014043924],[0.13077764],[0.13015877],[0.12909429],[0.12892099],[0.12536412],[0.123454005],[0.11908713],[-0.0013121094],[-0.0013442688],[-0.0013850179],[-0.0015709468],[-0.0017340528],[-0.0019103661],[-0.0019895914]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-1.3721764],[0.084215105],[-0.055472832],[0.077813394],[-0.96163833],[1.1660722],[-1.6546477]],"dense_1_W":[[-0.58524305,0.029181788,-1.0521368,0.35033363,-0.39801714,-0.87713426,0.85987127,0.047615178,0.40549085,0.14911534,-0.2479689,-0.28950268,-0.14985971,0.07570249,-0.10249687,0.043796625,-0.07579884,0.10728671],[-0.001887957,1.4247402,0.0036300311,0.12278278,-0.2253377,0.36661762,-0.31705707,-0.45933437,-0.46282038,-0.053074382,0.29370224,-0.19806243,0.082440175,-0.45482296,-0.32952204,-0.011400758,0.10100219,0.10240154],[-0.059823256,-0.5745303,-4.452575,0.22918445,0.5550891,-0.79828143,0.61945033,-0.6684762,-0.09642584,0.21603544,0.6628456,-0.7397862,-0.2869019,0.0020030462,0.28633127,0.55959415,-0.33312178,0.28244367],[0.04614508,-0.11604671,-0.79724836,-0.491676,-0.14662114,0.52269655,-1.2130527,0.5618968,0.51555824,0.3292312,-0.45453092,0.42635924,-0.15188393,0.34045127,-0.57950723,0.22944026,-0.16212673,0.319651],[-0.2394283,1.0045947,-0.0012783561,-0.10012283,-0.3071191,0.7955691,-0.36835575,-0.008639509,0.3636069,-0.01755343,-0.10722917,0.19506188,-0.35370708,0.17400146,0.086988635,0.22335935,-0.32956237,0.11304717],[0.5236153,-0.15631859,-0.98424,-0.111111596,-0.60968053,-0.20851852,0.7218569,0.048679378,0.3039536,0.021387655,-0.09857831,-0.37517497,0.06802272,0.3579023,-0.045115247,0.09317572,-0.24613723,0.21383843],[-0.30168456,-1.2367435,-0.00061271444,-0.1381754,0.32092336,-0.6533606,0.5152246,-0.2438313,-0.31787005,-0.052657858,0.21278745,0.29981515,-0.35046533,0.14706951,0.1782125,-0.3582475,0.2180452,-0.01023163]],"activation":"σ"},{"dense_2_W":[[-0.4264956,-0.30409577,0.036205757,0.28041327,-0.17547563,0.22233264,-0.5563757],[-0.39062256,-0.8167799,0.66903347,-0.24326237,-0.939436,0.7294541,1.202365],[0.032040264,-0.06555011,-0.37881997,0.54659986,0.3044162,-0.0027152027,-0.30760282],[0.2730313,-0.7371839,-0.6369608,-0.0032412624,-0.6352998,-0.25697374,-0.6930982],[0.5224691,-0.3149151,-0.053694103,0.0010917719,-0.69223607,0.6271929,0.095157035],[0.3687945,-0.22422504,0.093919925,-0.06523741,-0.22843531,-0.14060488,0.26878905],[-0.04975786,0.3340523,-0.2715762,0.4248088,0.35888636,-0.35311514,-0.36247927],[-0.04869314,-0.50731874,-0.6262194,-0.68582696,-0.38477626,-0.62149537,-0.09445867],[0.50780857,-0.35911572,-0.28358296,-0.45811683,0.19999982,-0.47677487,0.1871591],[0.46753326,-0.48402148,-0.019163152,-0.4120921,-0.12853143,0.6621117,0.54874456],[1.0123298,-0.9825988,0.12905803,-0.8407654,-0.7416709,0.4597624,0.45862544],[-0.45890373,0.55880725,0.19543312,0.56986344,0.34912577,-0.1812731,-0.69188166],[-0.13247645,2.9199218e-5,-0.6082515,0.18595329,0.043651372,-0.49888754,0.29356086]],"activation":"σ","dense_2_b":[[0.0050273063],[0.13748644],[0.01580143],[-0.26208422],[-0.035189588],[-0.13114949],[-0.012246006],[-0.28205365],[-0.053524993],[-0.20919354],[-0.032046903],[-0.061223272],[-0.013682854]]},{"dense_3_W":[[-0.02703186,0.6016364,-0.45162404,0.15611896,0.50627923,0.51877177,-0.7800174,-0.054255366,0.33341834,-0.2897292,0.6872302,-0.0026089211,0.3239283],[-0.24794696,0.4848827,0.09518162,0.5067153,0.423029,-0.5145099,-0.12581715,-0.32483757,-0.06947478,0.23648755,0.5299817,-0.3650013,-0.47067726],[-0.06398943,0.0541899,-0.60453045,-0.51784617,0.38545498,0.32902572,-0.11962995,0.36440012,-0.1133295,0.17170249,0.073485106,-0.4394425,-0.34638456]],"activation":"identity","dense_3_b":[[-0.09188924],[-0.02956994],[-0.026732257]]},{"dense_4_W":[[-0.5402822,-0.8496468,-0.8664632]],"dense_4_b":[[0.03144883]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566B00611A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566B00611A1'.json deleted file mode 100755 index 1a1f451ac9..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x873Q0909144J xf1x895063xf1x82x0566B00611A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.962804],[0.7562036],[0.38428113],[0.033356115],[0.74190426],[0.7469579],[0.75150245],[0.7410608],[0.72982436],[0.7126891],[0.6949334],[0.033194255],[0.033214666],[0.03323774],[0.03321157],[0.033148184],[0.033052694],[0.0329442]],"model_test_loss":0.008441523648798466,"input_size":18,"current_date_and_time":"2023-08-13_23-24-03","input_mean":[[22.17462],[0.03106641],[-0.005453808],[-0.0050417427],[0.033787917],[0.03330055],[0.03320549],[0.03181684],[0.03000325],[0.026441913],[0.024252506],[-0.004972066],[-0.004947025],[-0.00493625],[-0.005049273],[-0.005097442],[-0.0051535596],[-0.0052144374]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.060010195],[-4.127207],[-0.025756951],[1.1371067],[-0.18480848],[-1.5460433],[-4.385164]],"dense_1_W":[[-0.012603463,1.2675081,0.26481828,-0.6390102,-1.312759,1.511266,-0.69735384,-0.42666143,1.017449,-0.5036708,-0.4066075,0.06250349,0.32637885,-0.21702744,0.29735997,0.16498649,0.032733943,-0.09865579],[-1.7240236,1.2846862,0.4235646,0.16218854,-0.0021448887,0.98084474,-0.9292698,0.3639735,-0.1823644,0.07235068,0.17636193,0.29514208,-0.5203855,-0.26677978,0.38333958,0.119583756,0.12173379,-0.24175833],[-0.009374525,1.6042166,4.722405,0.055045582,-0.5204036,0.028873047,-0.90108126,-0.09144464,0.5713409,-0.25763115,-0.5311292,0.15709037,0.37013984,-0.00975939,-0.2143132,-0.6385762,-0.13333312,0.44007307],[-0.9055522,-0.8628247,-0.040643092,0.3484062,-0.18693899,-1.1056893,1.3160697,0.010075687,0.14756401,-0.11564695,-0.025115244,-0.27166274,-0.19431637,0.1267001,0.09704567,0.5197097,0.03209645,-0.27001658],[-0.018839281,-1.290398,0.058688518,0.33156508,0.68419033,-2.4491622,1.7043401,-0.3630223,0.18457794,-0.2868806,0.049333274,-0.61860454,-0.14083372,0.66726494,0.33173916,-0.13214351,0.034108125,-0.08901106],[0.8751846,-0.28634623,-0.030397577,0.12990081,-0.330972,-0.9653466,0.7668182,0.37737978,-0.11113706,-0.35438588,0.10701755,-0.48095903,-0.12939374,0.6977727,0.16942686,0.02181331,0.10608403,-0.13171671],[-1.7585233,-1.5873438,-0.43496054,-0.2323169,-0.069673285,-0.9673478,1.2224542,-0.4760693,0.23799634,0.09720081,-0.27788097,0.12954445,-0.24112089,0.615078,-0.25901628,-0.25295392,0.00043022525,0.19755143]],"activation":"σ"},{"dense_2_W":[[-0.48768643,-0.13457146,-0.94332385,-0.015858617,0.3480726,0.09448187,0.10320337],[-0.20015644,0.5809371,0.22025663,-0.29464918,-0.39863232,-0.7891601,-0.33703023],[-0.14985067,-0.83543855,-0.5071646,-0.90759295,-0.3330416,-0.2905544,-0.27152473],[0.0032478045,-0.75732607,-0.82309675,-0.77273506,-0.13305809,0.10644364,-0.68221307],[-1.4204942,-2.3662848,-1.1431475,0.7174042,2.1057255,0.785913,2.2557228],[0.3001741,0.57693744,0.57035863,0.95958936,0.32337785,-0.09218264,0.13867925],[-0.5285859,0.3610803,-0.020290779,-0.2668336,-0.64541036,-0.09989579,-0.05994527],[-0.27520058,-0.7017016,-0.6802332,0.2792723,1.0755413,0.65584993,0.88514155],[0.05950802,0.12636684,-0.035091616,-0.32777858,0.28212768,-0.76370627,-0.5573967],[0.58700997,0.78871405,-0.10341003,-0.6230865,0.077733986,-0.7194054,-0.18458478],[-0.18768333,-0.49252254,0.027535807,-0.53566045,0.15138532,0.16044581,0.14787057],[0.6626681,0.8601064,0.60114187,-0.3327629,-0.58684623,-0.95519954,-0.5899526],[-1.0263729,-0.41759077,-1.0262698,0.040096123,0.08806692,-0.0133949425,0.72428477]],"activation":"σ","dense_2_b":[[-0.25272742],[0.14023453],[-0.014608332],[-0.33230057],[-0.40752354],[-0.041421413],[0.01844217],[-0.28299713],[0.06559437],[0.109856494],[-0.04810613],[-0.021127785],[-0.44977495]]},{"dense_3_W":[[-0.029548874,0.5103658,0.17107706,-0.29514194,-0.947415,-0.511465,0.32390937,-0.6248399,0.045778725,0.6936353,0.30394363,-0.10813219,0.36093238],[-0.02098016,0.3392484,-0.66028225,0.15492892,-0.023099247,0.008027363,-0.43149045,0.133276,-0.12618168,-0.120471604,-0.07336129,-0.116436034,0.08667111],[0.07088678,-0.26997882,-0.24363138,-0.67593896,0.42628843,0.19159117,0.115236744,0.18871395,-0.56831765,-0.28568426,0.27478302,-0.7448726,0.49073538]],"activation":"identity","dense_3_b":[[0.07825424],[-0.012723917],[-0.053086866]]},{"dense_4_W":[[0.73551875,-0.06301601,-0.56700844]],"dense_4_b":[[0.06256496]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143K xf1x892033xf1x820514B0060703'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143K xf1x892033xf1x820514B0060703'.json deleted file mode 100755 index 14415e081e..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143K xf1x892033xf1x820514B0060703'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.666501],[0.8200595],[0.4267363],[0.029060148],[0.8098353],[0.81299865],[0.8158713],[0.80811334],[0.80471945],[0.79804546],[0.78982925],[0.02891173],[0.028966159],[0.029011153],[0.02911869],[0.029185541],[0.02921757],[0.029190162]],"model_test_loss":0.006315805949270725,"input_size":18,"current_date_and_time":"2023-08-13_23-50-23","input_mean":[[25.293772],[0.004106909],[-0.013306409],[-0.005250305],[0.005468495],[0.004553356],[0.0038011023],[-0.0017266939],[-0.003917628],[-0.010417055],[-0.014121405],[-0.0053853025],[-0.0053633936],[-0.0053434907],[-0.0053283866],[-0.0053414376],[-0.005541431],[-0.005723747]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.28580254],[-0.23432341],[1.1156756],[-0.86002725],[0.11221744],[-0.26342744],[-1.8761094]],"dense_1_W":[[-0.25975057,1.0925561,1.0103881,0.036238585,-0.3607785,0.08896782,-0.5181012,0.20072389,-0.038183834,0.09980021,-0.4068494,-0.17393062,0.330586,-0.23314619,0.034675427,0.07329598,-0.15636317,0.05865833],[0.017393583,0.3741976,0.0030892517,0.18871218,-0.42910495,-1.2822627,-0.05155862,0.53394276,0.22852045,0.12027069,-0.5230852,-0.115542546,0.23333092,-0.042271625,0.047717366,0.050503843,-0.0035985464,0.032520477],[0.35676572,-1.1685232,-0.011553547,-0.24975727,0.24694973,-0.6117383,0.4092684,-0.27288175,-0.33223516,0.16621913,0.025712943,0.42010584,-0.31489658,-0.052690785,0.054999806,0.18088785,0.006976741,0.021856777],[-0.44594803,-0.8409663,-1.1404896,0.41818568,0.058727153,-0.21626356,0.7575016,-0.19471127,-0.09616215,0.1518164,0.25844562,-0.8136779,0.20843573,0.6002283,-0.23000686,-0.19357574,-0.022530245,0.04392898],[0.8572372,0.025385775,1.2609717,0.042114303,0.399061,-0.19249442,0.51250815,-0.12575161,-0.28613088,-0.19633885,0.07607506,-0.4094928,0.11277618,0.2009149,0.4207984,-0.18763435,-0.3462443,0.16364828],[0.7268745,-0.18285611,-1.3299872,-0.09213111,-0.217109,0.36897022,-0.8693468,0.41960382,0.019098964,0.28840658,-0.03882476,0.4372806,0.08356159,-0.23352197,-0.20746002,-0.2340454,0.11242141,0.14783],[-0.5003176,-1.7298814,-0.025057396,-0.051110655,0.17657964,-0.8302932,1.1969275,-0.42902136,-0.28651416,0.049032684,0.12503019,-0.073111385,-0.11944735,0.09518251,0.1635864,0.0545354,0.05875944,-0.038880356]],"activation":"σ"},{"dense_2_W":[[-0.12937793,0.76093704,0.20176205,-0.08243198,0.4225252,-0.68954825,0.8347276],[0.6415931,-0.049831085,-0.36734578,-0.71415675,-0.57440925,-0.53335655,0.15256901],[-1.1228914,-0.120415226,-0.59729034,0.8767655,-0.12896578,0.18779756,0.8045126],[-0.30790147,0.6392956,0.040560763,-0.12412736,0.22901759,-0.6460633,0.89982486],[0.42736927,-0.94990593,-0.5395771,0.13554287,-0.49102458,0.94958186,-0.6974517],[0.5491617,-0.18928741,-0.50987816,-0.6287503,0.08691802,0.33302802,-0.36628336],[0.27155477,-0.27820358,-0.9777661,-1.1842451,-0.30412066,-0.6699264,0.41161236],[-0.59314966,0.4599474,-0.19772863,0.52712804,0.32302898,0.19360131,-0.09676147],[0.58557266,-0.6139606,-0.558897,-0.14769661,0.050115813,0.5432267,-0.5170338],[-0.17028296,-1.033602,-0.076122455,-0.40448987,0.052614305,0.1912033,-0.07015176],[-0.68916506,0.3962156,-0.1657399,0.687493,0.060366802,-0.10516932,0.01300196],[0.276943,-0.9250079,-0.7488696,0.13571858,-0.036271952,0.5265197,-0.15073454],[0.14400741,-0.11341286,-0.3804518,-0.8804317,-0.071586706,-0.43452612,-0.3208466]],"activation":"σ","dense_2_b":[[-0.040302996],[-0.11010342],[-0.20677158],[-0.048647635],[0.120229416],[-0.0054608714],[0.058483347],[-0.03004292],[0.05187668],[-0.076424606],[0.0038315326],[-0.022529595],[-0.2090887]]},{"dense_3_W":[[0.008394337,-0.30972952,0.39671507,0.6184598,0.12630114,0.32693958,-0.76353675,0.2980328,-0.48589507,-0.59280705,-0.35038635,0.3186341,0.26545805],[-0.7789929,0.55391824,-0.2314275,-0.1026219,0.7185184,0.6306864,0.6643669,-0.32594445,0.37869594,0.12729132,-0.6604259,0.43580285,0.17978954],[0.5019366,0.08632822,-0.5505618,0.14464153,-0.49149013,0.3130208,-0.37043464,0.14965,-0.7112207,-0.35579038,0.56159174,-0.23439313,0.24922566]],"activation":"identity","dense_3_b":[[0.027808271],[-0.068755515],[-0.07428425]]},{"dense_4_W":[[-0.25726643,1.2216649,-0.05311492]],"dense_4_b":[[-0.06435458]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143M xf1x892041xf1x820522B0080803'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143M xf1x892041xf1x820522B0080803'.json deleted file mode 100755 index c24501ec58..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143M xf1x892041xf1x820522B0080803'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.117151],[0.8780721],[0.47055784],[0.03373205],[0.87878203],[0.87837523],[0.87788916],[0.8586185],[0.8462304],[0.8342321],[0.82547796],[0.033661477],[0.03367423],[0.03368023],[0.03354494],[0.033401415],[0.033237793],[0.033019036]],"model_test_loss":0.007191894110292196,"input_size":18,"current_date_and_time":"2023-08-14_00-15-11","input_mean":[[20.899157],[-0.01104718],[0.036451686],[-0.0037773221],[-0.015367436],[-0.014161936],[-0.012414819],[0.0024655054],[0.011132189],[0.024372566],[0.03227307],[-0.0040591834],[-0.003941466],[-0.003825588],[-0.0034224978],[-0.0032681874],[-0.0031958742],[-0.0031637321]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.030808564],[-0.7881302],[-0.31871074],[-0.7077137],[-0.6866325],[-1.4053191],[1.028521]],"dense_1_W":[[-0.004262297,0.26770896,-0.0056766947,0.30141094,-0.48577562,1.0045375,-0.2323648,0.115538254,0.115895815,-0.4666756,0.25802436,-0.31511456,-0.0127651235,-0.14158984,-0.2904196,-0.052200418,0.22780252,-0.14276873],[-0.78517354,0.22283344,1.9814899,-0.060622748,0.44862846,0.5629776,-0.95423114,-0.2534107,0.113122925,-0.19669883,-0.22316283,0.3763087,-0.52413887,0.08829021,0.5618185,-0.4974062,-0.003229953,0.104768366],[-0.0031356695,-0.3358509,-0.013187175,0.09005276,-0.33111897,-1.0076365,1.2956011,0.25053537,0.032162637,-0.24333534,-0.0034071796,-0.5057202,0.24314785,0.1808326,0.05994126,0.053177986,0.29184142,-0.2806042],[-0.7272065,0.2573282,1.7617868,0.29571036,0.37528726,-1.083522,1.3229558,-0.4182797,-0.345258,-0.5115551,0.17309518,-0.24578947,0.10943833,0.08469504,0.049101092,-0.08576649,-0.5060829,0.3355709],[-0.349624,-1.6453601,-3.26807,0.43909118,0.51051325,-0.17063986,0.21545473,0.34421232,0.03763902,-0.2049723,0.92357033,-0.18443908,-0.18679084,0.3117935,-0.44758165,-0.18143773,0.29891232,-0.08629131],[-0.39733958,-1.0273623,0.003442246,0.45654815,0.120703034,-0.7350454,0.44965222,-0.049190737,-0.05031882,-0.1817813,0.107058324,-0.41069368,0.04839138,-0.09612549,-0.040410392,0.035452463,-0.102408044,-0.01588105],[0.30539432,-1.042117,0.00010271933,0.334786,0.39255652,-0.9954019,0.59428906,-0.041689884,-0.055279892,-0.32039487,0.22644287,-0.5457353,0.09216463,0.07863109,0.07457668,-0.16325666,0.12002374,-0.11692654]],"activation":"σ"},{"dense_2_W":[[-0.4462192,0.006479972,0.16022606,0.08788203,0.4124234,0.20229541,-0.15212922],[-0.8229072,-0.6896271,0.41974926,-0.5126825,-0.5892288,0.36048502,0.08571766],[0.8743697,0.11519312,-0.8927151,-0.20659262,-0.03500918,-0.2431935,-0.21345907],[-0.7572373,-0.41277024,0.5602531,0.23260891,0.57976633,0.21060136,0.49044013],[0.10042878,0.032445718,-0.3576043,0.20940162,-0.27814117,-0.42059135,-0.65223837],[0.5351519,0.41956633,-0.3044747,-0.45954588,0.16867766,-0.4634547,-0.5968737],[-0.23816408,-0.48021644,0.838582,-0.21538194,0.18876094,0.5458715,0.61050403],[-0.924066,-0.3433875,0.57219464,-0.16153193,0.042738453,0.52251714,0.3991525],[0.48040503,0.1870807,-0.52080226,0.21046016,-0.45690414,-0.73420763,0.22072145],[-0.12941065,-0.44941613,0.5425607,0.59573215,-0.22534776,0.5405078,0.39194173],[0.36701992,0.34995168,-0.62530506,-0.6363552,-0.103005536,0.22475937,-0.7253444],[0.9647937,-0.056563377,-0.46448824,-0.22327216,-0.14012502,-0.011079587,-0.6820786],[-0.45136547,-0.14740916,-0.6345192,-0.46869496,0.26515964,-0.8063111,-0.36604276]],"activation":"σ","dense_2_b":[[-0.0016022231],[-0.27396354],[0.09004652],[-0.22539683],[-0.038415063],[0.06759769],[-0.14015342],[-0.26507622],[0.056926068],[-0.13300559],[0.012339802],[0.1285967],[-0.09678008]]},{"dense_3_W":[[-0.52442557,-0.68827885,0.539679,-0.5438538,0.61366826,0.63880235,0.08888519,-0.3074122,0.09701449,-0.6003877,0.45083877,0.22909275,-0.18219474],[-0.5755899,0.09211835,0.20371199,-0.5715788,0.15341173,0.6038049,-0.41338116,-0.23703997,0.5769859,-0.0016438926,0.50527227,0.20451528,0.42446515],[-0.5199198,0.16957249,0.45533246,0.34319803,0.32190958,0.35860723,-0.09089439,0.09584038,-0.17535931,-0.4608781,0.32986072,0.28507563,-0.44377762]],"activation":"identity","dense_3_b":[[-0.00831913],[-0.03343917],[-0.05860182]]},{"dense_4_W":[[0.48563462,1.1415706,0.1720984]],"dense_4_b":[[-0.028836345]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143P xf1x892051xf1x820526B0060905'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143P xf1x892051xf1x820526B0060905'.json deleted file mode 100755 index 7182b5b664..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0909143P xf1x892051xf1x820526B0060905'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.181382],[0.86813647],[0.5492334],[0.036760613],[0.8545429],[0.85885984],[0.86159694],[0.86050034],[0.85472816],[0.8523642],[0.8434543],[0.036624078],[0.036657],[0.03669113],[0.036766365],[0.03678054],[0.036892213],[0.036896084]],"model_test_loss":0.005091955419629812,"input_size":18,"current_date_and_time":"2023-08-14_00-41-09","input_mean":[[19.510765],[0.022819782],[-0.0037222924],[0.0013656311],[0.034109943],[0.033269133],[0.03193874],[0.030672757],[0.03303289],[0.039188243],[0.047165018],[0.0015104475],[0.0014863856],[0.001448786],[0.0013402464],[0.0011793213],[0.00095052656],[0.00085381255]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.24343],[0.036478233],[1.1406748],[-4.0893216],[0.010201278],[3.8922794],[-0.02359314]],"dense_1_W":[[0.5112725,1.2539926,0.08067997,0.40639907,-0.17453805,1.0416505,-0.12549862,0.027588852,-0.33463654,-0.05859373,0.17721942,0.25630853,0.1335248,-0.2872575,-0.39503282,-0.34860995,-0.06432243,0.31120285],[-0.0021122668,0.70218897,0.010622942,0.5508349,-0.090317965,1.2903326,-0.7231601,-0.18765782,0.09797428,0.046807405,0.059654005,-0.41199416,0.18483795,-0.29445493,-0.6740794,-0.12480136,-0.0430672,0.19277844],[0.5476078,-1.2119801,-0.08559349,0.19138788,0.28913566,-1.1168361,0.035099618,-0.35251448,0.7215318,-0.03543186,-0.19039832,-0.5274913,-0.07222603,-0.26130104,0.6166925,0.4533689,0.050027058,-0.4696203],[-2.058259,-1.0750265,-1.169345,-0.30267146,-0.20469314,-0.8867201,1.2159588,-0.41085604,-0.5082783,0.2776987,-0.050553918,-0.22321407,-0.0077316845,0.29300007,0.65865314,-0.85335296,0.25066155,0.18064624],[-0.035402827,-0.5353682,1.8089458,0.028881337,0.20666885,-1.1033194,1.6017944,0.9444415,-0.2323832,-0.15898483,-0.30815956,-0.26466683,-0.00038011433,0.79185253,0.45667037,-0.5028157,-0.73411787,0.21777979],[2.0663276,-0.9846567,-1.1721373,1.0919439,0.08992667,-1.567887,1.5389193,-0.3230045,-0.679468,0.26205733,0.0035511316,-0.049015433,-0.52897847,-0.1632392,0.10244833,-0.9965355,0.26675847,0.27428353],[0.022025522,-0.41033313,-2.2404602,1.1125531,0.046705477,-1.1841795,1.162694,-0.42915577,-0.19991426,0.050461024,0.4656523,-0.6310463,-0.12011685,-0.0015236506,-0.6044337,-0.5173836,0.33471113,0.43550345]],"activation":"σ"},{"dense_2_W":[[-0.04584096,-0.99214095,0.31622618,0.5777341,-0.045811962,-0.043618474,0.5721162],[0.38406098,0.47349882,-0.40502512,-0.3970886,-0.38640773,-0.19816592,-0.053756084],[0.6450702,0.7932687,-0.710186,-0.3985887,-0.034641393,-0.0185165,-0.69896996],[-0.7009559,-0.022874104,-0.08941493,0.64746475,0.15585321,-0.29219258,0.58332366],[-0.0010929473,0.33329758,-0.3808528,-0.153307,0.02534006,-0.62115765,-0.605843],[0.16988595,0.9742904,-0.6698165,-0.09701397,-0.5044086,-0.29125994,-0.4428076],[0.055143006,-0.80990934,-0.37862834,0.17991501,-0.71648,-0.9390392,-0.42016158],[-0.25731847,-0.42503363,0.3942715,-0.7323096,-0.22550054,-0.2743843,-0.7322862],[0.004696864,-0.25343058,-0.3075049,0.35224637,0.5207669,0.41676813,0.7068549],[-0.5403459,-0.7852185,0.27016988,0.13775401,0.28410533,0.067339934,0.6903914],[-0.3101071,-0.8646119,-0.2535561,0.53973216,0.16905892,0.40238792,0.2142207],[-0.29162455,0.53124887,0.004796835,-0.19279581,0.3287921,-0.025846375,0.0793902],[-0.6812329,-0.22995314,0.5113913,-0.24881253,0.21576783,0.48485595,0.28645903]],"activation":"σ","dense_2_b":[[-0.21589507],[0.10397086],[0.15712452],[-0.16989635],[0.26295224],[0.24404621],[-0.10845146],[-0.18922116],[-0.15020797],[-0.16395593],[-0.36227095],[0.0059039695],[-0.05891273]]},{"dense_3_W":[[-0.164952,0.5829566,0.5295758,-0.23809046,0.72228867,0.44742477,0.123699404,0.044092085,-0.6295931,-0.5918753,-0.40078494,-0.055157468,-0.23842782],[0.07521707,0.15951206,-0.03775708,0.3879158,-0.34177628,-0.2327042,-0.41371173,-0.009885026,-0.44009754,0.10016008,-0.43510032,0.24980222,0.13962166],[0.32187572,-0.6400992,-0.17281993,0.07402123,0.4694254,-0.2456943,-0.31591687,-0.15127994,0.4486657,-0.2195093,-0.47274616,-0.24562888,0.5684488]],"activation":"identity","dense_3_b":[[0.05258817],[0.07220977],[-0.044359814]]},{"dense_4_W":[[1.0103351,0.06551428,-0.5411557]],"dense_4_b":[[0.046632294]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143B xf1x892201xf1x82x0563B0000600'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143B xf1x892201xf1x82x0563B0000600'.json deleted file mode 100755 index 58f060b313..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143B xf1x892201xf1x82x0563B0000600'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.662233],[0.8113375],[0.4172554],[0.033643167],[0.79888594],[0.8028403],[0.80670947],[0.7995481],[0.7934126],[0.7891131],[0.782117],[0.033658788],[0.03365928],[0.03366303],[0.033584062],[0.033565614],[0.033572596],[0.03341478]],"model_test_loss":0.011067546904087067,"input_size":18,"current_date_and_time":"2023-08-14_01-06-44","input_mean":[[20.030537],[0.060196385],[-0.007738257],[-0.012284204],[0.062764056],[0.06089445],[0.05955253],[0.059412487],[0.059961364],[0.05963631],[0.05755611],[-0.012353351],[-0.012392538],[-0.012430977],[-0.012426002],[-0.012402114],[-0.012500397],[-0.012698062]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.011189804],[-1.8674326],[2.1096756],[0.26339114],[0.5535559],[-1.3430045],[0.54640424]],"dense_1_W":[[0.0008347146,-1.6734533,0.004123626,0.53035754,0.7637235,-0.9993929,-0.0076265903,-1.1400509,-0.25552282,0.5817568,0.0021680437,0.026432207,-0.22946344,-0.39117494,0.1184229,-0.031067535,-0.23829687,0.12487833],[-1.1671325,-1.5989091,2.0931304,-0.6706487,1.7253804,1.9009653,-1.0202484,0.31748152,-0.9233542,-0.087770805,0.3862745,0.24705102,0.082410954,0.15667558,0.30451232,-0.2267331,0.08866649,0.035475973],[1.4456624,-1.5619239,2.466439,-0.93418974,2.2984,1.5268502,-0.90133584,0.3620802,-1.2135332,-0.049564496,0.45319128,0.3234485,0.24712734,0.10689693,0.32506576,-0.07574348,-0.032787975,0.083121665],[0.03307216,-0.6489449,-0.0005701389,-0.13173494,0.8676245,1.2602453,-1.2616234,-0.95231324,0.2632026,0.24062945,0.18689358,0.09292445,-0.24533354,0.3599325,-0.7487064,0.46976736,0.56557786,-0.39855072],[0.05449837,1.5482326,0.0052019306,-0.15240818,-1.3306834,0.37130266,-0.34324887,0.44472352,0.7343325,0.0939915,-0.46491262,0.17091997,0.18282665,-0.13365027,-0.27148074,-0.36316878,-0.074748464,0.39142248],[-1.0103469,1.7473103,0.0042393715,-0.3335703,-1.3267844,1.0646676,-0.57885313,0.06908706,0.5133798,-0.09079333,-0.049777858,-0.17497323,-0.036685776,0.32865825,-0.20434003,-0.10280022,0.05871905,0.14388838],[1.725505,0.67823017,-0.015625048,0.80355895,-0.37574232,1.3815744,-1.3868164,-1.0791757,-1.0506003,-0.19924724,0.47507092,-0.6711824,-0.69669557,0.6993373,0.5932092,0.33117467,-0.40151066,-0.29909366]],"activation":"σ"},{"dense_2_W":[[0.4855691,0.9684355,-0.98692816,-0.31508428,-1.228063,-1.6463718,0.15983118],[-1.1735238,-0.09113564,1.2186227,1.0091687,1.0687741,0.07123165,1.6712769],[0.28951633,0.022773247,-0.3386379,-0.5069151,-0.77005637,-0.30232868,-0.56512755],[0.32825664,0.27628714,-0.42091107,-0.31968302,-0.5112418,-0.47919804,-0.43602708],[-1.2471062,0.785496,0.10179997,-0.31093064,0.5988123,0.70579207,-0.58402646],[-0.6930572,0.83520454,-0.7187977,0.08945707,-0.17269047,0.16038384,-0.48173437],[-1.0064458,-1.0428234,0.6521663,-0.39936963,-0.4934068,-0.6583212,-0.6813975],[-0.7038946,-0.691905,0.10873986,0.033401936,-0.05016936,-0.5048962,-0.7372117],[0.26728374,-0.6021571,-0.82455206,-1.0239568,-0.63041604,0.25164172,-1.5996319],[-0.306726,-0.64836156,-0.18564051,-0.24620682,-1.0371934,0.08292383,-0.1839289],[0.5721492,-0.16167684,-0.14333242,-0.23550391,-0.71259844,-0.46686116,0.045510437],[0.012533767,0.22610848,-0.13282865,0.48579726,0.46268955,0.31126258,0.3202859],[-0.31318545,-0.009125532,0.3056208,-0.08678949,-0.37333733,-0.55968124,-0.2400406]],"activation":"σ","dense_2_b":[[-0.048040356],[0.010551669],[-0.034002457],[-0.09350583],[-0.43931866],[-0.25840852],[0.30683145],[-0.17581052],[-0.207552],[-0.136824],[0.15877321],[-0.2822651],[-0.14438301]]},{"dense_3_W":[[0.1878037,0.7795191,-0.40910757,-0.39871213,0.119621195,-0.41886806,-0.7300552,0.4663937,-0.23213437,-0.34520158,-0.62860143,0.7035117,-0.17154448],[0.2195641,-0.6607046,0.3519602,0.567264,0.17038877,-0.36625072,-0.12122062,0.51718,-0.09198265,0.22301078,0.39600024,-0.23041521,0.023985038],[-0.6850335,0.000747365,-0.18778192,-0.05563331,0.5623896,0.27665734,-0.4172306,-0.26284721,-0.30182174,0.06609348,-0.59820837,-0.047604926,-0.10808185]],"activation":"identity","dense_3_b":[[0.010739073],[-0.028906258],[0.040689796]]},{"dense_4_W":[[0.66164374,-0.6622832,1.1909763]],"dense_4_b":[[0.033283826]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020600'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020600'.json deleted file mode 100755 index d61947e4ee..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN b'xf1x875Q0910143C xf1x892211xf1x82x0567B0020600'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[9.53693],[0.8837301],[0.504074],[0.03892978],[0.8755903],[0.8769705],[0.8770567],[0.85198003],[0.83604085],[0.80722994],[0.7793083],[0.038844477],[0.038851265],[0.03885575],[0.038714577],[0.03858303],[0.03835089],[0.038112696]],"model_test_loss":0.008165956474840641,"input_size":18,"current_date_and_time":"2023-08-14_01-33-05","input_mean":[[18.900034],[-0.040913012],[-0.014206974],[-0.0010526397],[-0.042061422],[-0.043862846],[-0.045665625],[-0.049387835],[-0.04846715],[-0.049707115],[-0.049154304],[-0.0011701209],[-0.0012063662],[-0.0012323125],[-0.0014004245],[-0.0015620717],[-0.0018737207],[-0.0021513186]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.05034311],[-0.16049339],[-0.8387054],[0.026724432],[5.6924577],[-6.2590356],[0.09195408]],"dense_1_W":[[0.0013737448,-1.3723408,0.001342769,0.41604844,0.079518534,-1.0992196,0.69320405,-0.20007867,-0.242486,0.10413749,-0.012725727,-0.24533777,0.18676357,0.103152275,0.08449463,0.29623845,0.18195744,-0.28134367],[-0.016047297,-2.1172945,3.6351044,-0.9225221,2.4778526,1.9237944,-1.6851976,1.552848,0.48124325,-0.4579708,-0.9661728,0.5705856,0.2986973,-0.12730876,0.25481766,-0.104712516,-0.47604793,0.4647864],[-0.031255946,4.4344115,0.0115045,-2.06056,2.2306361,3.17809,2.2399688,1.7444073,2.2162871,0.0605305,-1.2824659,0.5707839,0.55752015,-0.3394804,1.3753946,0.6923126,-0.69295144,0.06596876],[0.014996965,-1.4983084,0.0074849236,-0.43667704,1.5386254,-0.71714413,0.8680148,0.0403995,0.1127605,-0.18272513,-0.65287465,0.038639955,0.18207908,-0.26570496,0.6805489,-0.008021424,-0.20940506,0.026279788],[3.619847,0.79453075,1.2752336,0.5329089,0.06674295,0.23762697,-1.6461107,1.7750511,0.34661958,-0.23756266,0.0066114087,-0.15820406,-0.015352938,-0.72475356,0.6494297,-0.19538523,0.06557879,-0.16827972],[-3.801798,1.7125183,1.3432858,0.7638726,-0.91818637,-0.41282243,-0.35768026,1.5054896,0.29776478,-0.27578938,-0.055791046,-0.032674264,-0.68724346,-0.17769502,0.05515912,0.1238052,0.30904874,-0.3660749],[0.040583555,-0.16267918,-0.0029201144,-0.076724455,0.8662686,1.1377587,-0.7607313,-0.54665464,-0.0014566372,-0.29003936,-0.69195867,-0.37417176,0.40961555,0.08589823,-0.49127874,0.55313677,0.120903105,-0.21122085]],"activation":"σ"},{"dense_2_W":[[-0.10612687,0.00028133072,0.10279292,-0.32244202,0.56135786,-0.3038803,0.6117771],[-0.8537405,1.0868497,1.517143,-1.7185221,-1.2330467,1.7012283,-0.35707718],[-0.34067577,-0.13233681,-0.6401421,-0.45288932,0.30520055,0.10491509,0.42614308],[0.21184444,-0.3464179,0.029474478,-0.17789295,0.34473762,0.20484819,-0.21357347],[0.5183205,-0.6048094,0.11201475,0.88285375,-0.5477966,-0.28368485,-0.37010878],[0.7407778,0.0031467904,0.564206,0.3737212,-0.42286292,-0.52992564,-0.5154023],[1.1209921,-0.3645087,0.04481938,0.35292685,0.29335323,-0.14295474,-0.7726177],[0.5309003,0.2573966,0.30485377,0.08541345,-0.1786945,-0.4923706,-0.433013],[0.492245,-0.085702844,-0.55991167,0.99195623,-0.7306447,0.15703674,-0.58475363],[0.1410831,0.33561346,-0.4702111,-0.042534262,-0.34679964,0.0015535586,-0.15639044],[1.221257,-0.62122816,-0.54385215,0.5745175,0.43091094,-0.73388636,-0.3718265],[-0.5161705,-0.109079786,-0.071408875,-0.38007596,-0.44005582,0.045142595,0.05468212],[-0.9730059,1.4277359,2.029946,-3.2277482,2.1687982,-1.6582972,0.904579]],"activation":"σ","dense_2_b":[[-0.0014250523],[-0.5932475],[0.021336202],[-0.016517289],[-0.062387757],[-0.072613515],[0.06306965],[0.019332306],[-0.09633628],[-0.05684373],[0.2125887],[-0.01661518],[0.17361407]]},{"dense_3_W":[[0.5674474,0.546337,0.3743424,-0.273058,-0.5405256,-0.2000324,-0.46903795,-0.5156394,-0.44108075,-0.060869083,-0.40524966,0.19688256,0.70918274],[0.3262551,0.58425474,0.5729054,-0.031375743,-0.041701257,-0.5766777,-0.16657038,-0.31636402,0.15437165,-0.24735309,0.12849659,0.55700594,0.046101455],[-0.097841896,-0.511152,-0.39260116,-0.28767872,0.15554437,-0.16604982,0.43458262,0.05001186,-0.11995932,-0.2560319,0.58787644,-0.45917046,-0.3966601]],"activation":"identity","dense_3_b":[[0.023453068],[0.012939301],[0.18564974]]},{"dense_4_W":[[0.8108035,0.47054186,-0.09254697]],"dense_4_b":[[0.02033851]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A60604A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A60604A1'.json deleted file mode 100755 index 7fb76b4823..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875Q0909144ABxf1x891082xf1x82x0521A60604A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[7.3289046],[0.53865254],[0.34363064],[0.03131177],[0.5423575],[0.5418235],[0.5407688],[0.52266824],[0.5094745],[0.48748496],[0.4674636],[0.03126794],[0.03127153],[0.03128563],[0.031270076],[0.03110797],[0.03086513],[0.030758223]],"model_test_loss":0.0065342518500983715,"input_size":18,"current_date_and_time":"2023-08-14_02-51-07","input_mean":[[19.854994],[0.02852481],[-0.008394549],[0.003052669],[0.02878524],[0.02829884],[0.027643727],[0.02405635],[0.020893725],[0.016066605],[0.01561026],[0.0030796202],[0.003104916],[0.0031055945],[0.0029775568],[0.002796068],[0.0024804338],[0.002308984]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[2.6401606],[-0.041325524],[2.5215666],[-0.041392956],[-0.07687011],[-0.052842032],[0.6748459]],"dense_1_W":[[1.5242575,0.35627735,0.5635576,0.35448948,-0.3953701,0.3265091,-0.577471,0.6584769,0.71018475,0.10515297,-0.2427247,0.35898077,-0.40721607,0.08450537,-0.267958,0.29337814,0.22232342,-0.60763425],[-0.007026347,0.4657935,0.03749239,-0.34094924,-0.075710565,1.4064182,-0.8528577,-0.318615,-0.31381673,-0.27045733,0.42012632,0.26428086,0.100735106,0.08037723,-0.32698122,-0.06074372,0.10325446,0.084082514],[1.5156735,-0.47489092,-0.55053735,-0.40526438,0.23048405,-0.529619,1.1181229,-0.79596174,-0.5320006,-0.09871097,0.1812741,0.49836755,-0.17353886,-0.3646145,-0.006225405,0.0969328,-0.3082221,0.6313902],[0.0070438217,0.7177413,0.070641816,-0.64644647,-0.12578073,0.66291285,-0.6603725,0.18909127,0.08034264,-0.34289366,0.10820179,0.43800563,0.67992795,-0.8538587,0.0030815017,-0.07758179,-0.0855604,0.29938003],[-0.0004627711,-1.4414465,0.07495133,-0.05092367,1.1927464,-0.67879677,0.27852902,-0.583847,-0.81228834,-1.3539568,1.3550432,0.112276375,-0.4907178,0.40841964,0.12346382,-0.22612214,0.6329694,-0.4437507],[0.032261487,0.8911769,6.108131,-0.61734253,0.65491176,1.4899205,-0.34530422,-0.21132824,-1.4898846,-0.43324688,0.5005588,0.4327097,-0.017908085,-0.6668785,0.5833861,0.35305926,0.3997379,-0.51656204],[-0.0018498964,-2.6991417,0.16747902,2.187501,0.53372544,-0.109926574,0.43455476,0.45718986,1.8602107,0.25133002,-0.8681649,1.2997736,1.6204847,2.1496859,0.14778936,-0.49531916,-0.78723556,0.98850256]],"activation":"σ"},{"dense_2_W":[[0.24454884,0.35007536,0.2867137,0.09012383,-0.38733336,-0.49449205,-0.13559741],[0.23089275,-0.5370107,0.09162375,-0.51357645,-0.23495477,-0.06315045,0.11455118],[-0.0063527166,-0.053212985,-0.27540293,0.70994335,0.10962871,-0.14789675,-0.27231297],[-0.50261515,-0.46583286,0.3427541,-0.3748585,0.4016677,0.23851554,0.2952814],[0.06376815,0.26943728,-1.2382541,0.044812873,-0.28141838,0.35423744,0.5646739],[0.56663376,0.6105675,-0.81973964,0.83144623,-0.34869766,0.23554252,-0.2855648],[-0.06491405,0.21282296,-0.25241178,-0.5098676,0.40169764,-0.33915997,-0.37829182],[-0.058915704,-0.52073437,-0.3808913,-0.58914316,0.48207447,-0.14773318,-0.15192641],[-0.0054449504,-0.52427745,-0.17092238,-0.5706592,-0.35192126,0.19167943,0.4108363],[0.26346433,0.5781188,-0.20278165,0.68046784,-0.7055976,0.06091033,-0.2715019],[0.46802843,0.29305348,-0.48767036,0.76116073,-0.5743784,0.018987808,-0.2706612],[-0.35490564,-0.39351743,-0.22781888,-0.273698,-0.4345575,-0.21557479,-0.41541457],[0.8614721,0.42754713,-1.2491077,1.2331724,-1.1045619,0.7123346,-0.33662388]],"activation":"σ","dense_2_b":[[-0.01874273],[0.009371876],[-0.036509376],[0.0034165683],[-0.30991253],[-0.35229847],[0.10235407],[0.14266653],[0.034850482],[-0.112194695],[-0.09342103],[0.0710196],[-0.2241445]]},{"dense_3_W":[[-0.17080562,0.32143503,-0.17581414,0.56947404,-0.055805363,-0.20806669,0.13803789,0.5370566,0.37103105,-0.48028666,-0.10460543,0.6821912,-0.0842912],[0.30726758,0.058517847,-0.33661544,0.21711047,-0.37768382,-0.26146904,0.51983565,-0.07036411,-0.032129124,-0.37549922,-0.3525898,-0.053472064,-0.68903774],[0.16374777,0.41130075,0.054798886,-0.5551823,-0.10899548,-0.13250633,-0.39466566,-0.3571533,-0.1534892,0.39225924,0.6325772,-0.3902483,-0.3982242]],"activation":"identity","dense_3_b":[[0.05099233],[0.06483823],[-0.004630559]]},{"dense_4_W":[[-1.2006958,-0.80405784,0.03314714]],"dense_4_b":[[-0.055501234]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A60634A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A60634A1'.json deleted file mode 100755 index dea8295e8d..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A60634A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[5.0083737],[0.42046377],[0.20520201],[0.02763439],[0.42246833],[0.4221625],[0.4216298],[0.41341385],[0.40692678],[0.4022001],[0.40219635],[0.02748101],[0.027535422],[0.027579376],[0.027645623],[0.027637415],[0.027440004],[0.027380727]],"model_test_loss":0.004143005236983299,"input_size":18,"current_date_and_time":"2023-08-14_03-41-29","input_mean":[[25.47412],[0.19958466],[-0.017220736],[0.0033158686],[0.2047261],[0.20301075],[0.20060319],[0.19406201],[0.19408248],[0.19245343],[0.19168448],[0.0033969714],[0.0033646896],[0.003344533],[0.0033792283],[0.0033883466],[0.003463568],[0.003644856]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.1657069],[-1.9022597],[0.3573439],[-0.44420108],[-0.100230284],[-1.7269558],[1.1205612]],"dense_1_W":[[-0.00092326954,-0.422309,-0.17512406,0.5054023,0.14710678,-0.25678113,-0.20028122,0.06749457,-0.2863628,0.3886345,0.05361403,-0.08413107,-0.43366045,0.06432067,0.48437363,0.014648756,-0.0020482785,-0.14993115],[-1.1023697,0.34174618,-0.28158325,0.4212608,0.5830523,-1.0980513,-0.25991014,0.3546678,0.20719239,-0.46449193,-0.019278029,0.010792962,-0.7601846,0.5799624,-0.13653645,-0.17269216,0.084417485,-0.021036232],[0.00030671473,-0.39266655,0.29377759,-0.48246792,-0.38019815,1.1431502,0.58916605,-0.018903274,0.3098398,-0.035918158,-0.3678466,0.37013093,0.29870456,-0.03076149,-0.14486301,-0.084633216,-0.0988374,0.20422511],[-0.36138636,0.81817955,1.8987099,-1.1200192,-0.11336604,0.17895934,0.043662008,-0.21876605,0.45478925,-0.03689186,1.0078938,-0.30329502,-0.35860255,-0.62149346,0.022846708,0.12703322,0.18421635,0.35560572],[-0.5364841,0.1453418,-3.6584685,0.6151252,0.5582709,-0.2691487,0.023903158,0.5754364,-0.116071,0.37825516,-0.19200331,-0.2248982,-0.3850075,0.30770153,-0.17167693,-0.45830363,-0.046138637,0.21326888],[-1.162092,0.10568817,0.29473102,-0.27880898,-0.36157534,0.5742935,-0.0031682379,-0.08621305,-0.23101984,0.35677135,0.0148600945,-0.27795824,0.62892383,-0.46830806,0.3602908,0.03294911,0.27180216,-0.26759154],[-0.0180816,0.7662361,-0.22583437,-0.8438566,0.50242615,0.43400842,0.30508512,0.012276164,0.968684,0.8544783,0.46200368,-1.9207745,-1.1937202,-1.0721608,-0.21986486,-0.48469168,0.2959894,-0.856707]],"activation":"σ"},{"dense_2_W":[[-0.5470442,1.7217759,-0.1470755,-2.4646258,0.0037959144,1.3074782,-0.05712827],[-0.3711513,0.41745117,0.4496939,-0.20902565,-0.2925513,-0.26379028,0.41135114],[0.6467387,0.12482949,-0.6287757,0.12178349,0.19214922,-0.32433525,-0.4479245],[-0.23320459,-0.29114887,0.06960925,0.40295774,-0.38662457,0.1818995,0.5802863],[-0.66332686,-0.09888686,0.31044513,0.16627274,0.09730392,0.56536597,-0.31096095],[0.6163865,0.44544005,-0.5907308,0.33815238,-0.42669207,-0.7298953,0.19980703],[-0.5976602,-0.6812888,0.024319809,0.10030743,-0.078346655,0.2787135,0.20778744],[0.32584617,0.49106023,-1.2814318,-0.50078326,0.2115034,0.40731817,0.0049111852],[0.739966,-0.18427776,-0.57610196,0.009918123,0.18318374,-0.27952188,-0.073271],[-0.26890662,0.32813534,0.45242321,0.28769568,-0.1091229,0.36858273,-0.5646969],[0.065649405,-0.595555,0.6637816,-0.50877273,-0.025255747,0.29801172,-0.089912675],[-0.6580612,-0.53460723,0.64502347,-0.037672743,-0.38733548,0.35739285,0.37566775],[-0.26895392,-0.2532778,0.6466152,-0.32872054,0.4610569,0.42680815,-0.289281]],"activation":"σ","dense_2_b":[[-0.57801545],[-0.02487967],[0.046223283],[-0.011919688],[-0.023250999],[-0.0042634523],[-0.27497166],[-0.09866434],[0.012610335],[-0.08247934],[-0.036527302],[-0.05259078],[-0.031590052]]},{"dense_3_W":[[-0.16326903,0.5243444,-0.63081026,0.28322223,0.2934153,-0.31467402,-0.329545,-0.36580902,-0.37401882,0.12621103,0.3331115,0.6052953,0.48938477],[-0.09900888,-0.06063517,-0.17130663,0.1667584,0.16381904,-0.6082081,0.013274949,0.15247221,-0.03997433,0.18612197,0.2806802,-0.11156396,-0.3359548],[-0.2837178,-0.44840294,-0.004694435,0.29237515,0.55196846,-0.6161363,0.57095647,-0.11839446,-0.61730903,0.038825605,-0.19622047,-0.21944387,0.1243949]],"activation":"identity","dense_3_b":[[-0.00747683],[0.002752381],[0.0026605453]]},{"dense_4_W":[[0.95164365,0.30194584,0.58023304]],"dense_4_b":[[-0.005728339]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A62A32A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A62A32A1'.json deleted file mode 100755 index 616751a758..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QF909144B xf1x895582xf1x82x0571A62A32A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.626944],[1.0619773],[0.5539984],[0.03671154],[1.0561126],[1.0578535],[1.0594684],[1.0446345],[1.0212003],[0.9992795],[0.97770816],[0.036627006],[0.036641616],[0.036646295],[0.036549233],[0.036383647],[0.036169644],[0.035927355]],"model_test_loss":0.0056040422059595585,"input_size":18,"current_date_and_time":"2023-08-14_04-08-06","input_mean":[[18.489305],[0.07716587],[0.008159927],[0.014758759],[0.07426559],[0.07554208],[0.07664342],[0.07870349],[0.07942318],[0.08122073],[0.081623584],[0.01484478],[0.014833818],[0.014823983],[0.014814751],[0.014938193],[0.015166377],[0.015501372]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.036457997],[0.19156031],[-0.01508866],[-0.052175455],[-1.0038084],[-0.2074287],[0.15170857]],"dense_1_W":[[-0.004964838,-1.1980921,-0.029613819,0.28823835,0.7013706,-1.2906415,1.0065259,0.23381212,-0.046492662,0.120659865,-0.098360516,0.0062270476,-0.46386242,0.12284296,0.059551295,0.09112548,-0.055498406,0.0027111673],[-0.005198727,-0.6752965,-0.6080775,0.20275135,-0.29710057,-0.85021347,1.3533522,-0.21732911,-0.22854595,0.19577463,0.321285,0.06076337,-0.03275157,0.36474285,0.042674348,0.2598862,-0.103289686,-0.21956365],[0.0043494096,1.2409916,-0.01650288,-0.41806248,-0.08088325,0.98173875,-1.6316887,0.25142598,-0.23021263,0.13534379,-0.04843492,0.2575174,-0.08009086,0.22280405,-0.25962964,0.00019480381,0.12492345,-0.028998379],[-0.022095788,-1.111526,-1.9763997,0.3185457,0.14024144,-0.6664468,-0.16739945,0.08738434,-0.60685486,-0.28227818,-0.7769675,0.566913,-0.007644112,0.31493762,-0.40619445,-0.13403314,-0.16620153,0.035001427],[2.3655212,-0.5150374,0.31141245,0.065676264,0.18930423,-0.98876,0.43160492,-0.045166675,0.059209798,0.23501736,-0.13611424,-0.24918106,0.25709474,0.4468884,-0.01140312,-0.14684597,0.13040915,0.03804596],[-0.0047277273,-1.1999024,0.022677707,0.06893214,0.0034417252,-0.7617319,0.74206394,-0.28641677,0.043607976,-0.16808808,-0.11143388,-0.27479768,0.041559022,-0.29644537,0.16951554,0.16085929,-0.14372928,0.19972724],[0.0015725193,1.8013598,6.0048485,-0.31310147,-1.4716569,-0.32186383,-0.67218703,0.2699829,0.8223929,-0.39775306,-0.27570257,0.1735122,0.34330562,-0.11839002,0.112108946,0.0284751,-0.42073828,0.32494405]],"activation":"σ"},{"dense_2_W":[[-0.8274989,-0.26683718,1.1221086,-0.4967123,-0.15982957,-0.5157279,0.5409362],[-0.4282439,-0.28969744,-0.15959398,-0.31986535,0.06426711,0.045167804,-0.12751547],[0.75156754,0.5139446,-1.6046362,0.22225763,-0.17358594,0.4643068,-0.56141883],[-0.64656496,-0.31969824,-0.3383586,-0.24736834,-0.115212455,-0.28582263,-0.29819226],[0.02432829,0.59469664,-0.15138043,-0.5656801,-0.5094818,0.7270511,0.70142233],[0.8166905,0.17791738,-0.7938446,-0.41242573,0.15946935,0.010435327,-0.07871756],[-0.50170904,-0.70214444,-0.09667413,0.06173317,-0.34481144,-0.05702854,0.28547388],[-0.4316806,-0.69494605,0.35303894,-0.32337648,-0.11162086,0.16142549,0.046552487],[-0.47061762,-0.033296604,0.48481578,-0.1644464,-0.35995185,-0.9828825,0.48374155],[-1.1422112,-0.30554995,1.0520233,0.11161053,-0.34157068,-0.3464864,0.44715127],[0.32906184,0.24655321,-1.2441839,0.40368524,-0.26899955,0.26253235,-0.47163612],[0.89605176,0.21842143,-0.18375918,0.25550878,-0.17637666,0.18975225,-0.01678542],[0.015940731,-0.25979605,0.025350504,0.27074146,0.4475809,-0.68709433,-0.6171181]],"activation":"σ","dense_2_b":[[0.1036446],[-0.24618293],[-0.3107517],[-0.14251111],[-0.00010030766],[-0.22231226],[0.03811995],[-0.24698843],[-0.056234393],[-0.024014654],[-0.121909596],[-0.21749336],[-0.3809104]]},{"dense_3_W":[[-0.38996089,0.41667554,0.31174377,0.48924834,0.5464652,0.17986193,-0.29639804,-0.6972503,-0.61368924,-0.2425055,-0.19786963,0.30278218,-0.1469855],[0.6355902,0.08049979,0.111204624,0.19977798,-0.1947918,-0.59491324,0.29035076,-0.23108244,-0.28247926,0.31540954,-0.2722785,-0.37643728,0.39918077],[0.39822328,0.36373773,-0.40062055,0.33348098,0.038394526,0.16810612,0.16263756,-0.26843348,0.23122968,0.11646639,-0.6678012,-0.30025852,-0.23330888]],"activation":"identity","dense_3_b":[[-0.03313786],[0.042609334],[0.039157733]]},{"dense_4_W":[[-0.6706609,0.49312,0.83626646]],"dense_4_b":[[0.032975886]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM907144D xf1x891063xf1x82x002SA6092SOM'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM907144D xf1x891063xf1x82x002SA6092SOM'.json deleted file mode 100755 index 9c07f0aa4c..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM907144D xf1x891063xf1x82x002SA6092SOM'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[4.846948],[0.81105536],[0.41403648],[0.035652053],[0.8037867],[0.8062848],[0.8087894],[0.80610657],[0.8037343],[0.80183107],[0.7975248],[0.035562087],[0.035535168],[0.035516404],[0.03546272],[0.03543645],[0.035458043],[0.03562561]],"model_test_loss":0.007874921895563602,"input_size":18,"current_date_and_time":"2023-08-14_04-32-42","input_mean":[[25.956413],[0.047174964],[0.009190482],[0.0044681234],[0.04175229],[0.04260476],[0.04351004],[0.047875065],[0.04891037],[0.052666083],[0.061359685],[0.0043021124],[0.0042939777],[0.004301477],[0.0043947003],[0.0044108145],[0.004389884],[0.0046027442]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[0.059979655],[0.069013156],[-0.8281847],[-0.11142841],[0.03955072],[0.12549742],[0.783418]],"dense_1_W":[[0.0030481117,-1.0549505,-0.006972525,-0.15595584,0.7840362,-0.69210386,0.17925914,0.04507908,-0.14131218,0.34102848,-0.09225534,0.20323838,0.0819431,0.9120782,0.1297282,-0.11015781,-0.3067628,0.021845477],[-0.00080558297,0.73653907,-0.001798047,0.1313806,0.068776235,0.49522364,-0.2105799,-0.21456197,0.21042615,0.21957193,-0.11765698,0.51994056,-0.4339728,-0.023908615,-0.16695696,-0.176756,0.12341636,0.058519702],[0.7222947,-0.17934859,-0.003890196,0.09484328,-0.38000545,-0.3075813,0.13792701,0.11271669,-0.0005278281,0.12689501,-0.20993122,-0.44905135,0.33738986,0.07277459,0.38528377,0.106667824,-0.18891095,-0.019514121],[0.06560848,0.40144962,-0.12956662,-0.055643696,-0.049663123,0.86327803,0.34819037,-1.1415983,-0.24294508,0.45161903,0.5174569,-0.9724499,-1.1054265,-0.59140885,-0.121702924,0.53453803,0.77787405,-0.24458599],[-0.0030644669,0.26243958,2.1391315,0.06857931,0.5363525,0.25445628,-1.2047125,0.7697752,0.24485303,-0.06228338,-0.7510021,0.23437755,-0.09784092,-0.7235852,0.8837979,-0.17948864,-0.2157018,0.034686614],[-0.012706729,0.3920872,-0.010908032,0.7358326,-0.03599182,1.3597629,-0.43022266,0.15597473,-0.40719056,0.706777,-0.19327079,1.2462306,0.75319684,0.3395795,-0.40832612,-0.33334768,-0.996102,-0.89866537],[-0.7431401,-0.29369017,-0.000105630024,0.29781067,0.013087427,-0.94798666,0.5259348,0.116058856,-0.11235733,0.16232441,-0.17218283,-0.32375956,-0.22164673,0.4142412,0.20824604,0.059222106,0.097304516,-0.18275806]],"activation":"σ"},{"dense_2_W":[[0.97417414,-1.1549966,0.8853947,-0.26468486,-0.8227154,-0.09399993,0.6159557],[0.10204023,0.86626434,-0.28335205,-0.5750978,-0.302103,-0.27426735,0.01522395],[-0.6768031,0.79712826,-0.79459053,0.26956165,-0.17597227,0.324712,0.077839725],[-0.38779014,0.96340615,-0.12227216,0.28462237,0.7044941,0.4787453,-1.0882279],[-0.39657563,0.5794276,-0.7634172,0.18103188,0.61563504,0.50122654,-0.9383998],[-0.5073624,0.12485382,-1.1825857,-0.4041146,0.5108791,0.44801873,-0.51704717],[-0.6595412,0.6669609,-0.5334947,0.17545679,0.407928,0.019941911,-0.7399486],[0.09550178,0.2438875,-0.04877144,-0.0019337976,-0.019350123,0.43442073,-0.3072027],[0.80995226,-0.28730962,1.149432,-0.2670333,-0.55623615,-0.36270526,0.27021706],[0.09230979,-1.2384902,0.96683645,0.50837046,-0.8388565,-0.06853885,0.9245854],[1.0689826,-0.6658299,0.6486111,-0.6554747,-0.64078957,-0.24539684,0.73077625],[0.08056471,-0.6417475,0.4964616,-0.12449939,0.18329845,-0.2311192,0.6783663],[0.45767495,-0.28652194,0.19447622,-0.08870219,-0.18199718,0.025115477,0.29550073]],"activation":"σ","dense_2_b":[[-0.028785199],[0.06734204],[0.0311671],[0.090430334],[0.0499396],[-0.06613649],[0.1572726],[-0.0020371592],[0.04266869],[-0.13803189],[-0.3047031],[-0.07539335],[-0.12442536]]},{"dense_3_W":[[0.66223514,-0.1747075,-0.50954103,0.29728493,-0.46075493,0.13727571,-0.18393758,0.39366758,-0.47327036,-0.01879659,0.23903094,-0.32678747,0.30671299],[-0.28180516,0.2469839,0.22324938,-0.2998403,0.6316917,0.14390591,0.63533956,-0.254778,0.22968335,-0.3778501,-0.41270712,0.3120054,-0.44822124],[0.27459204,-0.42109582,-0.24014448,-0.592849,-0.33828726,-0.17524625,-0.42107752,-0.20445393,0.48335218,0.67310184,0.1951032,0.5667199,0.19647887]],"activation":"identity","dense_3_b":[[0.020020232],[-0.07193015],[-0.029508086]]},{"dense_4_W":[[-0.022750493,0.059219737,-1.015219]],"dense_4_b":[[0.02894119]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60604A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60604A1'.json deleted file mode 100755 index 6ef36a3b0e..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60604A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.254052],[0.9806163],[0.4231999],[0.04356696],[0.97200865],[0.97504586],[0.97775066],[0.9591673],[0.93643886],[0.9057191],[0.87526655],[0.043427564],[0.043460514],[0.04348194],[0.043345723],[0.04318236],[0.042914458],[0.042423796]],"model_test_loss":0.01540292613208294,"input_size":18,"current_date_and_time":"2023-08-14_04-58-24","input_mean":[[22.365421],[0.0019552947],[-0.026129048],[-0.010464547],[0.010480075],[0.008010973],[0.0055930708],[-0.003615944],[-0.008296312],[-0.0115947],[-0.015986588],[-0.010414467],[-0.010435414],[-0.010465159],[-0.0105609745],[-0.010642022],[-0.010804179],[-0.01103055]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[-0.3185732],[-2.5867317],[-2.4119403],[0.28416687],[-0.02702185],[-0.16531649],[-1.1527723]],"dense_1_W":[[-0.022257918,0.8040401,1.287335,-0.23689313,0.4893548,0.8433865,-1.0691862,0.36647147,-0.24386124,-0.13633506,0.07477291,0.35244244,-0.43019938,-0.6580194,1.0880467,0.6347402,-0.6914378,-0.037980463],[-0.56894374,-1.8446071,-0.21028358,-0.47825742,0.16942668,-0.94593054,0.7141977,-0.758547,-0.13884988,0.05721294,0.30957872,-0.33949006,0.0921146,0.3615484,0.45655683,0.082172595,-0.034271725,-0.09097419],[-0.57559276,1.5042158,0.20520714,0.51569813,-0.5431699,1.0341207,-0.09032631,0.61960757,0.2701506,-0.12109735,-0.30678055,0.3720596,-0.1883834,-0.13189395,-0.6962025,-0.23011449,0.23485538,0.07106131],[1.9175196,-0.06870724,-0.009685604,-0.58994263,-0.77743906,3.5469222,-1.9311298,-1.4536422,0.6789666,0.19781737,0.060366552,0.70214975,0.28552058,-0.94600236,-0.61913157,-0.25661743,0.2521842,0.38764063],[0.015907988,-1.8861995,-0.12928374,-0.5463564,0.70329434,-0.4612843,-0.5395861,-0.92044824,-0.56931007,0.18662772,0.5002842,-0.6624107,0.047241144,0.21043116,0.9085904,0.34524617,0.17921534,-0.5345244],[-1.9607425,-0.17032151,-0.002710183,-0.49269548,0.46140772,1.5506655,-1.4574836,-0.75262254,0.28762928,0.4009911,-0.041949093,0.4422491,0.080314584,-0.4521053,-0.95743835,0.08831782,0.12635101,0.36157072],[-0.17528914,0.014480862,9.194567,-0.027118178,0.21340506,0.25479296,-0.08499456,-0.3819038,-0.08245096,0.14458492,0.012424778,0.1363471,-0.2180041,0.12804921,-0.06768428,-0.14581227,0.28676355,-0.40200242]],"activation":"σ"},{"dense_2_W":[[-0.13735515,-0.36693308,0.31717214,-0.16753168,-0.5315297,0.06383681,0.16398782],[0.5107664,-0.41147742,0.23399776,0.12284709,0.52509624,0.26873505,-0.84280556],[-0.5975781,-0.13184041,-0.43245456,-0.19741607,0.24153347,0.23864448,0.06348907],[0.44337207,-0.14361665,0.30699468,0.24923041,-0.5986253,0.55096453,-0.21386127],[-1.0883859,0.18649225,-0.14793696,-1.1706864,-0.18842566,0.8806919,-1.1581444],[-0.5192367,0.63482714,-0.30454943,-0.74983114,0.76898384,-0.29513043,-0.23884358],[-0.16692421,0.085194685,-0.57313204,-0.52969104,-0.35271636,-1.3866607,1.0940571],[-0.36982897,0.1070417,-0.7242904,-0.21129967,0.85419685,-0.09256855,-0.12815432],[0.37570813,-0.4983966,0.25351462,-0.5352563,-0.885784,0.38207167,0.55912787],[-0.17706849,-1.1736196,0.78014624,0.64170426,-1.0116245,0.13409959,0.2723705],[0.03780842,0.36266404,-0.056093358,0.700982,0.25742763,-0.730712,-0.10212599],[-0.043599892,-0.896462,0.67346543,0.49555147,-1.0908926,0.36215103,0.34307495],[-0.17067212,-0.19787733,0.29983255,-0.04538142,-0.62211144,0.052005216,-0.114241906]],"activation":"σ","dense_2_b":[[-0.17325053],[0.06832358],[-0.13694412],[-0.0011346783],[-0.34375873],[0.09270055],[-0.21357837],[0.020085877],[-0.38013837],[-0.26146224],[0.28615406],[-0.21359953],[-0.09619647]]},{"dense_3_W":[[-0.038358208,-0.31359997,0.20052825,-0.560843,0.7097384,0.6719386,0.36616954,0.36791024,-0.2366012,-0.4499782,0.6078685,-0.6232705,-0.3668057],[0.16431291,0.039036777,-0.11336356,-0.427402,0.681554,0.11661078,0.24273938,0.17969954,-0.42864278,-0.5946742,-0.076663315,-0.23562627,0.17208236],[-0.4079696,0.60386187,-0.0019695666,-0.55016863,-0.15872847,-0.4558569,-0.19035904,-0.2832483,-0.5238773,0.42874604,0.13831717,0.07666673,0.6144315]],"activation":"identity","dense_3_b":[[0.05688099],[0.09056785],[0.068805546]]},{"dense_4_W":[[-0.9861829,-0.23317513,-0.07935023]],"dense_4_b":[[-0.055984028]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60804A1'.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60804A1'.json deleted file mode 100755 index 0b94ed5748..0000000000 --- a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN b'xf1x875QM909144C xf1x891082xf1x82x0521A60804A1'.json +++ /dev/null @@ -1 +0,0 @@ -{"input_std":[[8.714143],[0.9927753],[0.42477676],[0.03973602],[0.9727292],[0.9798503],[0.98615247],[0.97174776],[0.9597771],[0.9394966],[0.9168747],[0.03964375],[0.039681226],[0.039701194],[0.039581764],[0.03947426],[0.039269768],[0.039058764]],"model_test_loss":0.013159733265638351,"input_size":18,"current_date_and_time":"2023-08-14_05-25-10","input_mean":[[23.218801],[-0.033690505],[0.0024943613],[-0.0032879899],[-0.03312757],[-0.033911895],[-0.034462307],[-0.03274429],[-0.03286793],[-0.032002535],[-0.030374872],[-0.0032268409],[-0.0032460035],[-0.0032604784],[-0.0032413462],[-0.0033537117],[-0.003547709],[-0.0038500645]],"input_vars":["v_ego","lateral_accel","lateral_jerk","roll","lateral_accel_m03","lateral_accel_m02","lateral_accel_m01","lateral_accel_p03","lateral_accel_p06","lateral_accel_p10","lateral_accel_p15","roll_m03","roll_m02","roll_m01","roll_p03","roll_p06","roll_p10","roll_p15"],"output_size":1,"layers":[{"dense_1_b":[[1.7959027],[0.55505973],[-2.3768406],[-0.16383298],[-1.7668463],[-0.4719505],[0.8295408]],"dense_1_W":[[1.0514657,0.4917108,6.960775,0.040523,-0.8114545,-0.42457384,-1.5367419,0.18918777,0.37774196,-0.3243656,-0.40481222,0.39827186,0.41831338,-0.6198045,0.4753863,0.48323017,-0.06107707,-0.16029453],[0.15152642,-2.5568774,-0.001119578,0.028153164,0.5115196,-0.57825077,0.49559352,-0.05674371,-0.0267328,-0.046980154,0.10357833,-0.18090251,-0.26617435,0.29677737,0.7249489,-0.03468213,-0.005596551,-0.18188117],[-1.5674329,-0.4283582,1.070279,-1.1344318,1.4361267,1.2410127,-1.8508538,0.25674936,0.4047672,-0.51887536,0.45543274,0.3743945,0.40804172,-0.96260333,1.0525509,0.5583048,0.18581861,-0.49588192],[-0.4904594,0.052873794,-0.54584765,-0.6538562,0.33124956,0.3054544,-1.2273709,-0.04424467,0.07750318,-0.052387144,0.023881147,0.7269529,0.48401436,-0.44175398,-0.3785952,-0.19174287,-0.05213665,0.36695448],[-1.3100109,0.08232854,-0.8303036,0.92385757,-0.83452135,-0.93788815,1.2850705,0.0645516,-0.5059019,0.36357152,-0.27048874,-0.8359992,0.10816168,0.91588885,-0.93813425,-0.54902464,0.11485201,0.2426489],[-0.27612093,0.5894454,6.7886415,-0.42007807,0.8136479,0.48477572,-0.015306809,0.33938614,0.8966847,0.118165955,-2.203581,0.19513792,0.51539826,-0.080586016,0.2052024,-0.5273732,-0.1945807,0.35707137],[0.25792342,1.6364664,-0.001792033,0.22856699,-0.13199906,0.77897304,-0.0359948,-0.20382008,0.035235707,0.025847819,0.08331019,0.11043304,-0.07570084,-0.11650494,-0.47634286,-0.33599797,0.118242994,0.15796357]],"activation":"σ"},{"dense_2_W":[[0.5116447,-0.092584796,-0.10705274,-0.17041756,-0.14934607,-0.12380058,-0.057289656],[-0.22088462,1.2812711,-0.46391612,-0.3160566,0.76806194,-0.5649681,-0.7918618],[0.045260437,-1.6188258,0.68774945,0.020580687,0.1319073,0.50655997,0.10069625],[-0.028886491,-0.22777122,-0.09551939,-0.4077626,-0.44366226,0.27823326,-0.3208229],[-0.7618065,-0.5159872,-0.7606131,0.15979978,-0.03456325,0.005977178,-0.45774835],[0.6098429,-0.79085386,-0.18997884,-0.008630259,-0.81565344,0.6787126,1.1412653],[-0.06353774,-0.79416084,0.293484,-0.120535955,-0.25111738,-0.113088645,-0.19914077],[0.2501803,-1.7164524,0.696637,-0.5307749,0.5375581,0.4207089,0.35805798],[-0.071142145,-0.6921994,0.23711675,0.17744231,0.16084164,-0.30682364,0.16035682],[0.9792056,-0.37842458,0.935338,-0.038432624,0.91073805,0.69246453,0.37750706],[0.396947,0.3347981,-0.5091141,-0.5149633,0.1858322,0.29677188,-0.43474185],[0.3491485,0.29401642,-0.36790296,0.42044657,-0.53512317,0.058706686,-0.50015694],[-0.4911135,0.646846,0.18155076,-0.2229118,0.31506446,0.36774144,-0.82843393]],"activation":"σ","dense_2_b":[[-0.03162165],[0.04077409],[-0.30135295],[-0.023840334],[-0.25210667],[0.012809456],[-0.23830907],[-0.36270756],[-0.10388676],[0.07296503],[-0.051522776],[-0.041601982],[-0.09325582]]},{"dense_3_W":[[-0.5250345,-0.22525242,0.2523494,0.3467854,0.015721213,-0.52880615,-0.24200426,0.5264877,-0.34023857,0.417793,0.018722747,-0.5499491,-0.30318102],[-0.19100182,0.2990618,-0.1496899,0.34770057,-0.08324218,0.5929635,0.57089233,0.1725288,0.56539565,-0.1898713,-0.5954888,-0.25292823,-0.49786177],[-0.0627163,0.61702037,-0.6596768,0.461395,-0.20111923,-0.6267803,0.3331113,-0.25044763,0.055209983,0.20798822,0.056768,-0.055646416,0.08195084]],"activation":"identity","dense_3_b":[[-0.007629902],[-0.0233827],[0.022168329]]},{"dense_4_W":[[0.20391291,1.0325449,-1.0948162]],"dense_4_b":[[-0.023781778]],"activation":"identity"}]} \ No newline at end of file diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_ARTEON_MK1.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN ARTEON 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_ARTEON_MK1.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_ATLAS_MK1.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN ATLAS 1ST GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_ATLAS_MK1.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_GOLF_MK7.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN GOLF 7TH GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_GOLF_MK7.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_JETTA_MK7.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN JETTA 7TH GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_JETTA_MK7.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_PASSAT_MK8.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT 8TH GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_PASSAT_MK8.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT NMS.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_PASSAT_NMS.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN PASSAT NMS.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_PASSAT_NMS.json diff --git a/selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN.json b/selfdrive/car/torque_data/lat_models/VOLKSWAGEN_TIGUAN_MK2.json old mode 100755 new mode 100644 similarity index 100% rename from selfdrive/car/torque_data/lat_models/VOLKSWAGEN TIGUAN 2ND GEN.json rename to selfdrive/car/torque_data/lat_models/VOLKSWAGEN_TIGUAN_MK2.json From 1c0bf1808416cef566089a1a06f28325d3cf0f33 Mon Sep 17 00:00:00 2001 From: DevTekVE Date: Mon, 13 May 2024 12:32:17 +0000 Subject: [PATCH 920/923] Refactor manage_athenad to make it more generic --- selfdrive/athena/manage_athenad.py | 17 ++++++----- selfdrive/athena/manage_sunnylinkd.py | 41 ++------------------------- 2 files changed, 12 insertions(+), 46 deletions(-) diff --git a/selfdrive/athena/manage_athenad.py b/selfdrive/athena/manage_athenad.py index 2ec92cc3e0..cda1c95cf7 100755 --- a/selfdrive/athena/manage_athenad.py +++ b/selfdrive/athena/manage_athenad.py @@ -13,8 +13,12 @@ ATHENA_MGR_PID_PARAM = "AthenadPid" def main(): + manage_athenad("DongleId", ATHENA_MGR_PID_PARAM, 'athenad', 'selfdrive.athena.athenad') + + +def manage_athenad(dongle_id_param, pid_param, process_name, target): params = Params() - dongle_id = params.get("DongleId").decode('utf-8') + dongle_id = params.get(dongle_id_param).decode('utf-8') build_metadata = get_build_metadata() cloudlog.bind_global(dongle_id=dongle_id, @@ -27,17 +31,16 @@ def main(): try: while 1: - cloudlog.info("starting athena daemon") - proc = Process(name='athenad', target=launcher, args=('selfdrive.athena.athenad', 'athenad')) + cloudlog.info(f"starting {process_name} daemon") + proc = Process(name=process_name, target=launcher, args=(target, process_name)) proc.start() proc.join() - cloudlog.event("athenad exited", exitcode=proc.exitcode) + cloudlog.event(f"{process_name} exited", exitcode=proc.exitcode) time.sleep(5) except Exception: - cloudlog.exception("manage_athenad.exception") + cloudlog.exception(f"manage_{process_name}.exception") finally: - params.remove(ATHENA_MGR_PID_PARAM) - + params.remove(pid_param) if __name__ == '__main__': main() diff --git a/selfdrive/athena/manage_sunnylinkd.py b/selfdrive/athena/manage_sunnylinkd.py index 788d9fdf5e..b778bb1497 100755 --- a/selfdrive/athena/manage_sunnylinkd.py +++ b/selfdrive/athena/manage_sunnylinkd.py @@ -1,42 +1,5 @@ #!/usr/bin/env python3 -#TODO: Add this to files_common to allow release to public - -import time -from multiprocessing import Process - -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 - -SUNNYLINK_MGR_PID_PARAM = "SunnylinkdPid" - - -def main(): - params = Params() - dongle_id = params.get("SunnylinkDongleId").decode('utf-8') - cloudlog.bind_global(dongle_id=dongle_id, - version=get_version(), - origin=get_normalized_origin(), - branch=get_short_branch(), - commit=get_commit(), - dirty=is_dirty(), - device=HARDWARE.get_device_type()) - - try: - while 1: - cloudlog.info("starting athena daemon") - proc = Process(name='sunnylinkd', target=launcher, args=('selfdrive.athena.sunnylinkd', 'sunnylinkd')) - proc.start() - proc.join() - cloudlog.event("sunnylinkd exited", exitcode=proc.exitcode) - time.sleep(5) - except Exception: - cloudlog.exception("manage_sunnylinkd.exception") - finally: - params.remove(SUNNYLINK_MGR_PID_PARAM) - +from selfdrive.athena.manage_athenad import manage_athenad if __name__ == '__main__': - main() + manage_athenad("SunnylinkDongleId", "SunnylinkdPid", 'sunnylinkd', 'selfdrive.athena.sunnylinkd') From 755c39b2fdea9cccae3e7da45bff0b45d8a8b443 Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Wed, 15 May 2024 22:25:53 -0400 Subject: [PATCH 921/923] Revert "[$100 bounty] mapsd: switch to static render mode (#32118)" This reverts commit 3c69fcddc80327919b097c26a25017f8e11f28b0. --- selfdrive/navd/map_renderer.cc | 42 ++++++++++------------- selfdrive/navd/map_renderer.h | 2 -- selfdrive/navd/tests/test_map_renderer.py | 2 +- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/selfdrive/navd/map_renderer.cc b/selfdrive/navd/map_renderer.cc index 1e57ad3e7c..d52ee162bd 100644 --- a/selfdrive/navd/map_renderer.cc +++ b/selfdrive/navd/map_renderer.cc @@ -41,8 +41,6 @@ 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(); @@ -89,18 +87,6 @@ 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); @@ -128,16 +114,22 @@ void MapRenderer::msgUpdate() { float bearing = RAD2DEG(orientation.getValue()[2]); updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing); - if (!rendering) { + // 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); 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")) { @@ -165,9 +157,7 @@ void MapRenderer::updatePosition(QMapLibre::Coordinate position, float bearing) m_map->setCoordinate(position); m_map->setBearing(bearing); m_map->setZoom(zoom); - if (!rendering) { - update(); - } + update(); } bool MapRenderer::loaded() { @@ -175,10 +165,16 @@ bool MapRenderer::loaded() { } void MapRenderer::update() { - rendering = true; + double start_t = millis_since_boot(); gl_functions->glClear(GL_COLOR_BUFFER_BIT); - start_render_t = millis_since_boot(); - m_map->startStaticRender(); + 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(); + } } 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 7a3d2c316b..fd5922b668 100644 --- a/selfdrive/navd/map_renderer.h +++ b/selfdrive/navd/map_renderer.h @@ -43,10 +43,8 @@ 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 832e0d1eab..7d5a4c297f 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 < 20: + if (invalid_and_not_previously_valid or valid_and_not_previously_invalid) and frames_since_test_start < 5: continue # check output From d959c43284eb31a68616afbf4c4e8d5844963bfc Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 16 May 2024 00:12:17 -0400 Subject: [PATCH 922/923] Longitudinal: Use upstream button timer to toggle between Chill & Experimental Mode --- selfdrive/car/chrysler/interface.py | 2 +- selfdrive/car/ford/interface.py | 2 +- selfdrive/car/gm/interface.py | 2 +- selfdrive/car/hyundai/interface.py | 2 +- selfdrive/car/interfaces.py | 18 +----------------- selfdrive/car/mazda/interface.py | 2 +- selfdrive/car/nissan/interface.py | 2 +- selfdrive/car/toyota/interface.py | 2 +- selfdrive/controls/controlsd.py | 5 ++++- selfdrive/controls/lib/drive_helpers.py | 19 ++++++++++++++++++- 10 files changed, 30 insertions(+), 26 deletions(-) diff --git a/selfdrive/car/chrysler/interface.py b/selfdrive/car/chrysler/interface.py index 7b221595c9..8ca6668b30 100755 --- a/selfdrive/car/chrysler/interface.py +++ b/selfdrive/car/chrysler/interface.py @@ -141,7 +141,7 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index ed35d1ba43..5d6fa7dde4 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -104,7 +104,7 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) if self.CS.out.madsEnabled != self.CS.madsEnabled: if self.mads_event_lock: diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 465109eb4c..7787fabb02 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -251,7 +251,7 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index c5a83fcbed..d06cdbd209 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -239,7 +239,7 @@ class CarInterface(CarInterfaceBase): self.CS.madsEnabled, self.CS.accEnabled = self.get_sp_cancel_cruise_state(self.CS.madsEnabled) ret.cruiseState.enabled = False if self.CP.pcmCruise else self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=(self.CS.cruise_buttons[-1] == 3)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index fc9715cb82..036e7ba2d5 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -593,7 +593,7 @@ class CarInterfaceBase(ABC): else: return CS.madsEnabled - def get_sp_common_state(self, cs_out, CS, min_enable_speed_pcm=False, gear_allowed=True, gap_button=False): + def get_sp_common_state(self, cs_out, CS, min_enable_speed_pcm=False, gear_allowed=True): cs_out.cruiseState.enabled = CS.accEnabled if not self.CP.pcmCruise or not self.CP.pcmCruiseSpeed or min_enable_speed_pcm else \ cs_out.cruiseState.enabled @@ -603,9 +603,6 @@ class CarInterfaceBase(ABC): elif not cs_out.cruiseState.enabled and CS.out.cruiseState.enabled: CS.madsEnabled = False - if self.CP.openpilotLongitudinalControl: - self.toggle_exp_mode(gap_button) - cs_out.belowLaneChangeSpeed = cs_out.vEgo < LANE_CHANGE_SPEED_MIN and self.below_speed_pause if cs_out.gearShifter in [GearShifter.park, GearShifter.reverse] or cs_out.doorOpen or \ @@ -631,19 +628,6 @@ class CarInterfaceBase(ABC): return cs_out, CS - # TODO: SP: use upstream's buttonEvents counter checks from controlsd - def toggle_exp_mode(self, gap_pressed): - if gap_pressed: - if not self.experimental_mode_hold: - self.gap_button_counter += 1 - if self.gap_button_counter > 50: - self.gap_button_counter = 0 - self.experimental_mode_hold = True - self.param_s.put_bool_nonblocking("ExperimentalMode", not self.experimental_mode) - else: - self.gap_button_counter = 0 - self.experimental_mode_hold = False - def create_sp_events(self, CS, cs_out, events, main_enabled=False, allow_enable=True, enable_pressed=False, enable_from_brake=False, enable_pressed_long=False, enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): diff --git a/selfdrive/car/mazda/interface.py b/selfdrive/car/mazda/interface.py index 8d49218b02..2d6b68f9e1 100755 --- a/selfdrive/car/mazda/interface.py +++ b/selfdrive/car/mazda/interface.py @@ -77,7 +77,7 @@ class CarInterface(CarInterfaceBase): self.CS.accEnabled = False self.CS.accEnabled = ret.cruiseState.enabled or self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # MADS BUTTON if self.CS.out.madsEnabled != self.CS.madsEnabled: diff --git a/selfdrive/car/nissan/interface.py b/selfdrive/car/nissan/interface.py index 878d8f14c0..4416299230 100644 --- a/selfdrive/car/nissan/interface.py +++ b/selfdrive/car/nissan/interface.py @@ -51,7 +51,7 @@ class CarInterface(CarInterfaceBase): self.CS.madsEnabled, self.CS.accEnabled = self.get_sp_cancel_cruise_state(self.CS.madsEnabled) ret.cruiseState.enabled = False if self.CP.pcmCruise else self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(self.CS.distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # CANCEL if self.CS.out.cruiseState.enabled and not ret.cruiseState.enabled: diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 38f4753c47..51d76dece0 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -224,7 +224,7 @@ class CarInterface(CarInterfaceBase): if not self.CP.pcmCruise: ret.cruiseState.enabled = self.CS.accEnabled - ret, self.CS = self.get_sp_common_state(ret, self.CS, gap_button=bool(distance_button)) + ret, self.CS = self.get_sp_common_state(ret, self.CS) # CANCEL if self.CS.out.cruiseState.enabled and not ret.cruiseState.enabled: diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index 32407f97a0..ff927f563c 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -760,9 +760,12 @@ class Controls: # 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): + if self.v_cruise_helper.update_personality: self.personality = (self.personality - 1) % 3 self.params.put_nonblocking('LongitudinalPersonality', str(self.personality)) + if self.v_cruise_helper.update_experimental_mode: + self.experimental_mode = not self.experimental_mode + self.params.put_bool_nonblocking('ExperimentalMode', self.experimental_mode) return CC, lac_log diff --git a/selfdrive/controls/lib/drive_helpers.py b/selfdrive/controls/lib/drive_helpers.py index 61edf7aade..0c80d186e5 100644 --- a/selfdrive/controls/lib/drive_helpers.py +++ b/selfdrive/controls/lib/drive_helpers.py @@ -75,7 +75,7 @@ class VCruiseHelper: self.v_cruise_kph = V_CRUISE_UNSET self.v_cruise_cluster_kph = V_CRUISE_UNSET self.v_cruise_kph_last = 0 - self.button_timers = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0} + self.button_timers = {ButtonType.decelCruise: 0, ButtonType.accelCruise: 0, ButtonType.gapAdjustCruise: 0} self.button_change_states = {btn: {"standstill": False, "enabled": False} for btn in self.button_timers} self.is_metric_prev = None @@ -84,6 +84,9 @@ class VCruiseHelper: self.slc_state_prev = SpeedLimitControlState.inactive self.slc_speed_limit_offsetted = 0 + self.update_personality = False + self.update_experimental_mode = False + @property def v_cruise_initialized(self): return self.v_cruise_kph != V_CRUISE_UNSET @@ -120,6 +123,8 @@ class VCruiseHelper: long_press = False button_type = None + update_personality = False + update_experimental_mode = False v_cruise_delta = 1. if is_metric else IMPERIAL_INCREMENT v_cruise_delta_mltplr = 10 if is_metric else 5 @@ -140,6 +145,15 @@ class VCruiseHelper: if button_type is None: return + if button_type == ButtonType.gapAdjustCruise and self.button_timers[ButtonType.gapAdjustCruise]: + if self.button_timers[ButtonType.gapAdjustCruise] < 50: + update_personality = True + elif self.button_timers[ButtonType.gapAdjustCruise] == 50: + update_experimental_mode = True + + self.update_personality = update_personality + self.update_experimental_mode = update_experimental_mode + resume_button = ButtonType.accelCruise if not self.CP.pcmCruiseSpeed: if self.CP.carName == "chrysler": @@ -154,6 +168,9 @@ class VCruiseHelper: if not self.button_change_states[button_type]["enabled"]: return + if button_type == ButtonType.gapAdjustCruise: + return + pressed_value = (1 if long_press else v_cruise_delta_mltplr) if reverse_acc else (v_cruise_delta_mltplr if long_press else 1) long_press_state = not long_press if reverse_acc else long_press v_cruise_delta = v_cruise_delta * pressed_value From 2efdba4daf2aac31547073ba616b390bd69c409e Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Thu, 16 May 2024 00:37:40 -0400 Subject: [PATCH 923/923] Update CHANGELOGS.md --- CHANGELOGS.md | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOGS.md b/CHANGELOGS.md index 7c1746f90e..6b0b3bf2bf 100644 --- a/CHANGELOGS.md +++ b/CHANGELOGS.md @@ -1,10 +1,13 @@ -sunnypilot - 0.9.7.0 (2024-xx-xx) +sunnypilot - 0.9.7.0 (2024-05-xx) ======================== * New driving model -* Support for many hybrid Ford models +* 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 ************************ * UPDATED: Synced with commaai's openpilot - * master commit 56e343b (February 27, 2024) + * master commit 2e6b2ef (May 9, 2024) * NEW❗: sunnylink (Alpha early access) * NEW❗: Config Backup * Remotely back up and restore sunnypilot settings easily @@ -24,8 +27,20 @@ sunnypilot - 0.9.7.0 (2024-xx-xx) * RE-ENABLED: Map-based Turn Speed Control (M-TSC) for supported platforms * openpilot Longitudianl Control available cars * Custom Stock Longitudinal Control available cars +* UPDATED: Driving Model Selector v4 + * NEW❗: Driving Model additions + * North Dakota (April 29, 2024) - NDv2 + * WD40 (April 09, 2024) - WD40 + * Duck Amigo (March 18, 2024) - DA + * Recertified Herbalist (March 01, 2024) - CHLR + * Legacy Driving Models with Navigate on openpilot (NoO) support + * Includes Duck Amigo and all preceding models * UPDATED: Reset Mapbox Access Token -> Reset Access Tokens for Map Services * Reset self-service access tokens for Mapbox, Amap, and Google Maps +* UPDATED: Upstream native support for Gap Adjust Cruise +* UPDATED: Neural Network Lateral Control (NNLC) + * Due to upstream changes with platform simplifications, most platforms will match and fallback to combined platform model + * This will be updated when the new mapping of platforms are restructured (thanks @twilsconso 😉) * UI Updates * Display Metrics Below Chevron * NEW❗: Metrics is now being displayed below the chevron instead of above