From 3365ed5effa48d34ffe0e2e9bbe9f6941336bed5 Mon Sep 17 00:00:00 2001 From: schlimeszn <138847413+schlimeszn@users.noreply.github.com> Date: Mon, 10 Jun 2024 21:59:01 -0400 Subject: [PATCH 001/168] Custom setproctitle (#32667) * add custom setproctitle * add test * Update poetry.lock * fix lint * support only Linux * test only Linux * final lint * Update test_setproctitle.py * Update setproctitle.py * convert to threadnames * delete proctitles * Check str len and use PR_GET_NAME * fix poetry.lock * lint fix * Update common/threadname.py --------- Co-authored-by: reddyn12 Co-authored-by: Adeeb Shihadeh --- common/realtime.py | 6 +- common/tests/test_threadname.py | 8 +++ common/threadname.py | 19 ++++++ poetry.lock | 102 +------------------------------- pyproject.toml | 1 - scripts/waste.py | 4 +- selfdrive/modeld/modeld.py | 12 ++-- system/manager/process.py | 4 +- 8 files changed, 41 insertions(+), 115 deletions(-) create mode 100644 common/tests/test_threadname.py create mode 100644 common/threadname.py diff --git a/common/realtime.py b/common/realtime.py index dd97ea3d78..e7265406ac 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -4,7 +4,7 @@ import os import time from collections import deque -from setproctitle import getproctitle +from openpilot.common.threadname import getthreadname from openpilot.system.hardware import PC @@ -52,7 +52,7 @@ class Ratekeeper: self._print_delay_threshold = print_delay_threshold self._frame = 0 self._remaining = 0.0 - self._process_name = getproctitle() + self._thread_name = getthreadname() self._dts = deque([self._interval], maxlen=100) self._last_monitor_time = time.monotonic() @@ -87,7 +87,7 @@ class Ratekeeper: remaining = self._next_frame_time - time.monotonic() self._next_frame_time += self._interval if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: - print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + print(f"{self._thread_name} lagging by {-remaining * 1000:.2f} ms") lagged = True self._frame += 1 self._remaining = remaining diff --git a/common/tests/test_threadname.py b/common/tests/test_threadname.py new file mode 100644 index 0000000000..38e5e1d498 --- /dev/null +++ b/common/tests/test_threadname.py @@ -0,0 +1,8 @@ +from openpilot.common.threadname import setthreadname, getthreadname, LINUX + +class TestThreadName: + def test_set_get_threadname(self): + if LINUX: + name = 'TESTING' + setthreadname(name) + assert name == getthreadname() diff --git a/common/threadname.py b/common/threadname.py new file mode 100644 index 0000000000..3db7a7d013 --- /dev/null +++ b/common/threadname.py @@ -0,0 +1,19 @@ +import ctypes +import os + +LINUX = os.name == 'posix' and os.uname().sysname == 'Linux' + +if LINUX: + libc = ctypes.CDLL('libc.so.6') + +def setthreadname(name: str) -> None: + if LINUX: + name = name[:15] + '\0' + libc.prctl(15, str.encode(name), 0, 0, 0) + +def getthreadname() -> str: + if LINUX: + name = ctypes.create_string_buffer(16) + libc.prctl(16, name) + return name.value.decode('utf-8') + return "" diff --git a/poetry.lock b/poetry.lock index 6f0b998639..9662109361 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7319,106 +7319,6 @@ starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] -[[package]] -name = "setproctitle" -version = "1.3.3" -description = "A Python module to customize the process title" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, - {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, - {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, - {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, - {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, - {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, - {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, - {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, - {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, - {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, - {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, - {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, - {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, - {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, - {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, - {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, - {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, - {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, - {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, -] - -[package.extras] -test = ["pytest"] - [[package]] name = "setuptools" version = "70.0.0" @@ -8066,4 +7966,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "a09744c1ac37507bef4de0c210f7321722a2852798ca366d04dfec9329190202" +content-hash = "1aebbaeb87fb971b11182abcd487743e3bc4f6ee3560923a0d8714cc3d3a4efc" diff --git a/pyproject.toml b/pyproject.toml index 007245540f..e1635728fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,7 +137,6 @@ future-fstrings = "*" # these should be removed psutil = "*" timezonefinder = "*" # just used for nav ETA -setproctitle = "*" pycryptodome = "*" # used in updated/casync, panda, body, and a test [tool.poetry.group.dev.dependencies] diff --git a/scripts/waste.py b/scripts/waste.py index 0764ff77c3..bf92710fee 100755 --- a/scripts/waste.py +++ b/scripts/waste.py @@ -3,7 +3,7 @@ import os import time import numpy as np from multiprocessing import Process -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname def waste(core): os.sched_setaffinity(0, [core,]) @@ -16,7 +16,7 @@ def waste(core): j = 0 while 1: if (i % 100) == 0: - setproctitle("%3d: %8d" % (core, i)) + setthreadname("%3d: %8d" % (core, i)) lt = time.monotonic() print("%3d: %8d %f %.2f" % (core, i, lt-st, j)) st = lt diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 3ac80aad91..b037d1861f 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -6,7 +6,7 @@ import numpy as np import cereal.messaging as messaging from cereal import car, log from pathlib import Path -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname from cereal.messaging import PubMaster, SubMaster from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf from openpilot.common.swaglog import cloudlog @@ -24,7 +24,7 @@ from openpilot.selfdrive.modeld.fill_model_msg import fill_model_msg, fill_pose_ from openpilot.selfdrive.modeld.constants import ModelConstants from openpilot.selfdrive.modeld.models.commonmodel_pyx import ModelFrame, CLContext -PROCESS_NAME = "selfdrive.modeld.modeld" +THREAD_NAME = "selfdrive.modeld.modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PATHS = { @@ -114,9 +114,9 @@ class ModelState: def main(demo=False): cloudlog.warning("modeld init") - sentry.set_tag("daemon", PROCESS_NAME) - cloudlog.bind(daemon=PROCESS_NAME) - setproctitle(PROCESS_NAME) + sentry.set_tag("daemon", THREAD_NAME) + cloudlog.bind(daemon=THREAD_NAME) + setthreadname(THREAD_NAME) config_realtime_process(7, 54) cloudlog.warning("setting up CL context") @@ -286,7 +286,7 @@ if __name__ == "__main__": args = parser.parse_args() main(demo=args.demo) except KeyboardInterrupt: - cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") + cloudlog.warning(f"child {THREAD_NAME} got SIGINT") except Exception: sentry.capture_exception() raise diff --git a/system/manager/process.py b/system/manager/process.py index 36f299ae62..9214e417c1 100644 --- a/system/manager/process.py +++ b/system/manager/process.py @@ -8,7 +8,7 @@ from collections.abc import Callable, ValuesView from abc import ABC, abstractmethod from multiprocessing import Process -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname from cereal import car, log import cereal.messaging as messaging @@ -27,7 +27,7 @@ def launcher(proc: str, name: str) -> None: mod = importlib.import_module(proc) # rename the process - setproctitle(proc) + setthreadname(proc) # create new context since we forked messaging.context = messaging.Context() From efd744e03e53c0069796c9ba65bfe1eb2c532b35 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 10 Jun 2024 19:16:50 -0700 Subject: [PATCH 002/168] always on DM isn't in 0.9.7 --- RELEASES.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index aa0ab182ec..18c011e111 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,15 +1,14 @@ Version 0.9.8 (2024-XX-XX) ======================== -* Always on driver monitoring toggle +* Added toggle to enable driver monitoring even when openpilot is not engaged -Version 0.9.7 (2024-06-11) +Version 0.9.7 (2024-06-13) ======================== * New driving model * Inputs the past curvature for smoother and more accurate lateral control * Simplified neural network architecture in the model's last layers * Minor fixes to desire augmentation and weight decay * Adjust driving personality with the follow distance button -* Added toggle to enable driver monitoring even when openpilot is not engaged * Support for hybrid variants of supported Ford models * Fingerprinting without the OBD-II port on all cars From 84dd8ad4a3c0542505f19f73cf95ebae7938b412 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Mon, 10 Jun 2024 19:26:48 -0700 Subject: [PATCH 003/168] Bump pyopencl and disable on arm64 (#32695) bump pyopencl --- poetry.lock | 84 ++++++++++++++++++++------------------------------ pyproject.toml | 3 +- 2 files changed, 35 insertions(+), 52 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9662109361..f4933887cf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -6409,63 +6409,47 @@ pyobjc-framework-Cocoa = ">=10.3" [[package]] name = "pyopencl" -version = "2023.1.4" +version = "2024.2.6" description = "Python wrapper for OpenCL" optional = false python-versions = "~=3.8" files = [ - {file = "pyopencl-2023.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ce71196cee0171a923d9ef6a8c21ce26fd7342ddaee88a29aa372ae3295f5257"}, - {file = "pyopencl-2023.1.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bdf472b8e36f81145ac526d51f550ba539b765199da9da16732a222c7b85bee"}, - {file = "pyopencl-2023.1.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e99bb71267ce5223814177ff8c73e98057a70d20fc6555050d77d98b01bba5"}, - {file = "pyopencl-2023.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11d8cbe0d2121babf7daf0bcd6ded687c191c6d2effbac85c5421659fbc26947"}, - {file = "pyopencl-2023.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:08ebc3d5776ec2a8853c11234d605754bdf0d5af8322a08d558d661eb85c6fa3"}, - {file = "pyopencl-2023.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f199eff64be353f5badac62576d14cb40cc137c9f92f5260452de097dd9fe7a0"}, - {file = "pyopencl-2023.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:38a0a3c8389f44b51c0a916dc8e532d77ea37ab5a11f10e1ba97cc8f9a634695"}, - {file = "pyopencl-2023.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a1158956a59e73a57e98acc681ff01a64574d0b3715634703437aa8b7c785c"}, - {file = "pyopencl-2023.1.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55f09e9d12a036830d71f60af9233ff493c83ff2f99b472baa1f779688c816b7"}, - {file = "pyopencl-2023.1.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:742fdb18bcc933f20b795c787fe513c69b83f074626bc62ff3c9cd1c8b243022"}, - {file = "pyopencl-2023.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4102eb3f5b9fe4b08c7900820a908cec3004e9a6990cc7202162ae46e07869d"}, - {file = "pyopencl-2023.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:36d79cd6445a86b4db7399488c301b49bda5fde6c1455c36b1ce58e03c690916"}, - {file = "pyopencl-2023.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4a561e42ee3030b2966e7dc5cc764e705d9ff1bb5aa1124fa7d6ba4009ebfb96"}, - {file = "pyopencl-2023.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:0f7889dce94dba10738225fabec929fa977bfe8777a64f5699f6f2fe2b00742c"}, - {file = "pyopencl-2023.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ab31b35875cecd2b1c10ac47ea06e224c5881cca942fba94387317357d73c0b9"}, - {file = "pyopencl-2023.1.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:230c63354fe6a18043e67042769ddc5e329002fb55fb99f692e4f5c8fcf3007c"}, - {file = "pyopencl-2023.1.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef091d4a4802b267b0aa5ec46c4ebc00fd664d9178ad9866b485006eeff180b4"}, - {file = "pyopencl-2023.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c11fc7445e21dcd97bd8f5534531ed7bbd09ded853b520157623f48fad5b739"}, - {file = "pyopencl-2023.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0b6a0ebbf67b2ef7098bdf3632177b71c7430883b2a48b2b09b84a02d8cbb4b0"}, - {file = "pyopencl-2023.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1767616f795c598531cd19d89f451db7e25393add300204e7d1a7dd2a017709f"}, - {file = "pyopencl-2023.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:8bbb02f230b969109bdf00f36e463fed1de6e1c70e088f2f2f9b41fab128f20c"}, - {file = "pyopencl-2023.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0e444320491744fe52e49f87674c931219a5be254a8a129175db61378f5b6f18"}, - {file = "pyopencl-2023.1.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0649a9d6249612e79cffef46618cccaaa9eac7b0c3f1833a3576ea0bd985d887"}, - {file = "pyopencl-2023.1.4-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f790dda26812cad5288fe1831158f55c48e6ede46ae4a37db66394645b07ef8e"}, - {file = "pyopencl-2023.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:571c6430c6fb046643040d4a6d99ee677e4c6c99b09577dbb51177001e93c21c"}, - {file = "pyopencl-2023.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0ca2d4f14e1fc716b1928679c3182595a4862f577fa0f4a5d8edf37ef8db059b"}, - {file = "pyopencl-2023.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6ac9e8e84dc11b82df51916cf41f34a9ca327adbaf9f4a03a8d1f4f1e1f35382"}, - {file = "pyopencl-2023.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:802e5eb27fd311af42133bb2da83b5777a84f5c7c11e0a4b8d1d50d265b22e37"}, - {file = "pyopencl-2023.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ae4b7f34aa56a4dc5ce5b4d795dc872f9a1aac66f15ded575aeabdfd15da0bc"}, - {file = "pyopencl-2023.1.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e3f5861de88a7d5054cfc8a0f78c42c7b7cd7c65c43a1426a72411111b024658"}, - {file = "pyopencl-2023.1.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c658eb9198235e8866afedb9b32bad4c6a4988c7dff2103e61794cd9ea261b2a"}, - {file = "pyopencl-2023.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d148b21de9f7aa542b576c09ba3c68106658c8a3429f41c0120c7cd4cb55970f"}, - {file = "pyopencl-2023.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:63be569b566ad627e7a1331db6cfda3eb82a2076872549f1c89f4e24ee12601a"}, - {file = "pyopencl-2023.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d61a6ca8c2d8f2d7bcf106abff6ac58cb79f335303b02b90b66591b25d1af4aa"}, - {file = "pyopencl-2023.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:daeff57a66c7a2be03345dd919507f2a2b2ed4ce64c3d8416fc01fa947807e59"}, - {file = "pyopencl-2023.1.4-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c059f15d71c680e35704650bc02d7026b5566687fd45ca9f4c789567d0731cfc"}, - {file = "pyopencl-2023.1.4-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38c1ab4ed770eb2b2f9c34bced444fc81e96dddd188848f028d36cd16fe9fcb9"}, - {file = "pyopencl-2023.1.4-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d195dad3d3a0473373bbf173671900d4519662824b5a81ced5b491cfae5c5e23"}, - {file = "pyopencl-2023.1.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4917db2d0ec5ea7dd3c0cc66dc6a5acadc39a577a6b532293dde57ba3b23fb"}, - {file = "pyopencl-2023.1.4-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c926fb5886a561fe01be907575e396096a75fd35a2a6df5fc080c19959ae8c5c"}, - {file = "pyopencl-2023.1.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35fc3161b2f609018b6e1b22f4aa79fb571a388b61e90177c1d474975af15ce8"}, - {file = "pyopencl-2023.1.4.tar.gz", hash = "sha256:220174efca900e9d5de5aef2aa1b77a6f2550501de92b035a91013aeae4d4c5e"}, + {file = "pyopencl-2024.2.6-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:bb114056d04613c6ba7f92de4c8daa545dbdcca15379a06367d5a3780cf5930d"}, + {file = "pyopencl-2024.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c38d95bac4176e07865f8d750dee66958dced82ca22e3483898f2d43fcf13ae"}, + {file = "pyopencl-2024.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3e8c14ba292be4b9aef8c8f6011ab7344737239478e55076cc71e2f0d0b6a6a"}, + {file = "pyopencl-2024.2.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:355b17304784b484e127978bd5fde58c7758734991aa637b579fea4686055b85"}, + {file = "pyopencl-2024.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:96912ca852ca590eb5334615a3d88017b164ef70ca5791605802f83144ffad3f"}, + {file = "pyopencl-2024.2.6-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:688bff1033fd21d420437986db04b8ab11543b23090c90da2963b4ed4fe94e82"}, + {file = "pyopencl-2024.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4750fc441cc599b17c2c7a654420bb17a9818a02fd1541031a2cb9f867ecc6ef"}, + {file = "pyopencl-2024.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb30fea4527db88e1c037712d4bf0bab44cfc2e38265925aaf6fc8c7efe79b9f"}, + {file = "pyopencl-2024.2.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ad333bfca7f074dd0cf616358408ea69a605e3cab3fdc4d782bcf8c0a78c630a"}, + {file = "pyopencl-2024.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:a538e9551dfacf24f6270bddd581be21abdb1bfbcf64e1b5ba67ff29493ba23d"}, + {file = "pyopencl-2024.2.6-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:a3218b1eafcad4918532aa75f2c9dc0b3491bcf2b602edcdd6e3a4e45a72c68a"}, + {file = "pyopencl-2024.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:30cce55b34bc0a2a4955f3fd37baf34da3969296191f4cd602fd62e320611606"}, + {file = "pyopencl-2024.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:630f48ef777479f1c82b3ad9b3d208abeca2639828defe1c6da01f4d8c8b1ae5"}, + {file = "pyopencl-2024.2.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:725a941be6be4377145f6b9a364221aae397c38b9d475086fa65401a34f39a82"}, + {file = "pyopencl-2024.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:ff7ed484ea950022dcc5ee79fde3c9d9cf6312aa94e010ed462c011062428326"}, + {file = "pyopencl-2024.2.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:bc491df0c62cf6d67bdac94bfd892ff4fceb5ec527efac096eeb84ae6cbcaae0"}, + {file = "pyopencl-2024.2.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:743fdae7648f916826d3dda02df6c4627b6dc3a923b95e658abb53f451418f10"}, + {file = "pyopencl-2024.2.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:175fad6fd79ec23d6822395d274838b42e06a3f4b4bb4f35bef4e9559b5f2767"}, + {file = "pyopencl-2024.2.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:114a2058dfaa70724f1cc5f985d2154e885819180e2f2e1c454d83c5a02d5593"}, + {file = "pyopencl-2024.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:554f529b04534ec80a71d10c41deacc26094b5095c5b850829a2717c86c024f6"}, + {file = "pyopencl-2024.2.6-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:fd06bf87b53b360a5b03ef9b31b730abadffdca5fbd6b6b78425cf3bf0883f90"}, + {file = "pyopencl-2024.2.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ac3d682d27203a5204769d5590164c482afa03b8434cec1f75d0cb805251c857"}, + {file = "pyopencl-2024.2.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f86d5473c1a564f038f7298c2e176dd28b36610569cdac5d3e9ef02f604d2549"}, + {file = "pyopencl-2024.2.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f9be442abdfdfce5e1238aadfc23756ac2292dd081cd3d1a653d728397ede78"}, + {file = "pyopencl-2024.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:bb693a20b553453c7e3a2eb5f7a43e6d851644ba76a85ee8e185ece0ecf7933b"}, + {file = "pyopencl-2024.2.6.tar.gz", hash = "sha256:ceb9beeef0b6162e601c05922fede29b5094554a66eb473c610cabc14308ba82"}, ] [package.dependencies] numpy = "*" platformdirs = ">=2.2.0" -pytools = ">=2021.2.7" +pytools = ">=2024.1.5" [package.extras] -oclgrind = ["oclgrind-binary-distribution (>=18.3)"] -pocl = ["pocl-binary-distribution (>=1.2)"] +oclgrind = ["oclgrind_binary_distribution (>=18.3)"] +pocl = ["pocl_binary_distribution (>=1.2)"] test = ["Mako", "pytest (>=7.0.0)"] [[package]] @@ -6848,13 +6832,13 @@ files = [ [[package]] name = "pytools" -version = "2024.1.3" +version = "2024.1.5" description = "A collection of tools for Python" optional = false python-versions = "~=3.8" files = [ - {file = "pytools-2024.1.3-py2.py3-none-any.whl", hash = "sha256:2977a7e9580fac6260d1352ed7a69a12a0c59687f834e0ebaecaf1148eceb7f3"}, - {file = "pytools-2024.1.3.tar.gz", hash = "sha256:cc2db25666aa64094d3fb4532aa8a7deaa2da8edd7340fb270ed1807dcc75202"}, + {file = "pytools-2024.1.5-py2.py3-none-any.whl", hash = "sha256:dd2b4a1cbe078699742ab37ae3a94a81c5cc598c3247536d12e90588c39b0cc6"}, + {file = "pytools-2024.1.5.tar.gz", hash = "sha256:8c377bb1ffdcb5103301b8e7e94f01cbe36573a01e020434fea96291b1f1ac19"}, ] [package.dependencies] @@ -7966,4 +7950,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "1aebbaeb87fb971b11182abcd487743e3bc4f6ee3560923a0d8714cc3d3a4efc" +content-hash = "8ab43c0fd81c48afa1af652f8487d351444e286a7f43c11fb0148199d4cca1ee" diff --git a/pyproject.toml b/pyproject.toml index e1635728fe..37dfd8e6f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -165,8 +165,7 @@ pprofile = "*" polyline = "*" pre-commit = "*" pyautogui = "*" -pytools = "<=2024.1.3" # our pinned version of pyopencl use a broken version of pytools -pyopencl = "==2023.1.4" # 2024.1 is broken on arm64 +pyopencl = { version = "*", markers = "platform_machine != 'aarch64'" } # broken on arm64 pygame = "*" pywinctl = "*" pyprof2calltree = "*" From 4684651dc55dd0fb95fe33686ad519309f988bfd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 10 Jun 2024 19:45:03 -0700 Subject: [PATCH 004/168] test_onroad: update modeld proc name --- 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 75585e2f14..f80df5ac4f 100644 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -309,7 +309,7 @@ class TestOnroad: assert max(mems) - min(mems) <= 3.0 def test_gpu_usage(self): - assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld"} + assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.model"} def test_camera_processing_time(self): result = "\n" From 5b51f039675edbbdfbeac72cd9c518450a85bc04 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 10 Jun 2024 19:55:41 -0700 Subject: [PATCH 005/168] Revert "Custom setproctitle (#32667)" This reverts commit 3365ed5effa48d34ffe0e2e9bbe9f6941336bed5. --- common/realtime.py | 6 +++--- common/tests/test_threadname.py | 8 -------- common/threadname.py | 19 ------------------- pyproject.toml | 1 + scripts/waste.py | 4 ++-- selfdrive/modeld/modeld.py | 12 ++++++------ system/manager/process.py | 4 ++-- 7 files changed, 14 insertions(+), 40 deletions(-) delete mode 100644 common/tests/test_threadname.py delete mode 100644 common/threadname.py diff --git a/common/realtime.py b/common/realtime.py index e7265406ac..dd97ea3d78 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -4,7 +4,7 @@ import os import time from collections import deque -from openpilot.common.threadname import getthreadname +from setproctitle import getproctitle from openpilot.system.hardware import PC @@ -52,7 +52,7 @@ class Ratekeeper: self._print_delay_threshold = print_delay_threshold self._frame = 0 self._remaining = 0.0 - self._thread_name = getthreadname() + self._process_name = getproctitle() self._dts = deque([self._interval], maxlen=100) self._last_monitor_time = time.monotonic() @@ -87,7 +87,7 @@ class Ratekeeper: remaining = self._next_frame_time - time.monotonic() self._next_frame_time += self._interval if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: - print(f"{self._thread_name} lagging by {-remaining * 1000:.2f} ms") + print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") lagged = True self._frame += 1 self._remaining = remaining diff --git a/common/tests/test_threadname.py b/common/tests/test_threadname.py deleted file mode 100644 index 38e5e1d498..0000000000 --- a/common/tests/test_threadname.py +++ /dev/null @@ -1,8 +0,0 @@ -from openpilot.common.threadname import setthreadname, getthreadname, LINUX - -class TestThreadName: - def test_set_get_threadname(self): - if LINUX: - name = 'TESTING' - setthreadname(name) - assert name == getthreadname() diff --git a/common/threadname.py b/common/threadname.py deleted file mode 100644 index 3db7a7d013..0000000000 --- a/common/threadname.py +++ /dev/null @@ -1,19 +0,0 @@ -import ctypes -import os - -LINUX = os.name == 'posix' and os.uname().sysname == 'Linux' - -if LINUX: - libc = ctypes.CDLL('libc.so.6') - -def setthreadname(name: str) -> None: - if LINUX: - name = name[:15] + '\0' - libc.prctl(15, str.encode(name), 0, 0, 0) - -def getthreadname() -> str: - if LINUX: - name = ctypes.create_string_buffer(16) - libc.prctl(16, name) - return name.value.decode('utf-8') - return "" diff --git a/pyproject.toml b/pyproject.toml index 37dfd8e6f8..01885c7ac3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,6 +137,7 @@ future-fstrings = "*" # these should be removed psutil = "*" timezonefinder = "*" # just used for nav ETA +setproctitle = "*" pycryptodome = "*" # used in updated/casync, panda, body, and a test [tool.poetry.group.dev.dependencies] diff --git a/scripts/waste.py b/scripts/waste.py index bf92710fee..0764ff77c3 100755 --- a/scripts/waste.py +++ b/scripts/waste.py @@ -3,7 +3,7 @@ import os import time import numpy as np from multiprocessing import Process -from openpilot.common.threadname import setthreadname +from setproctitle import setproctitle def waste(core): os.sched_setaffinity(0, [core,]) @@ -16,7 +16,7 @@ def waste(core): j = 0 while 1: if (i % 100) == 0: - setthreadname("%3d: %8d" % (core, i)) + setproctitle("%3d: %8d" % (core, i)) lt = time.monotonic() print("%3d: %8d %f %.2f" % (core, i, lt-st, j)) st = lt diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index b037d1861f..3ac80aad91 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -6,7 +6,7 @@ import numpy as np import cereal.messaging as messaging from cereal import car, log from pathlib import Path -from openpilot.common.threadname import setthreadname +from setproctitle import setproctitle from cereal.messaging import PubMaster, SubMaster from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf from openpilot.common.swaglog import cloudlog @@ -24,7 +24,7 @@ from openpilot.selfdrive.modeld.fill_model_msg import fill_model_msg, fill_pose_ from openpilot.selfdrive.modeld.constants import ModelConstants from openpilot.selfdrive.modeld.models.commonmodel_pyx import ModelFrame, CLContext -THREAD_NAME = "selfdrive.modeld.modeld" +PROCESS_NAME = "selfdrive.modeld.modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PATHS = { @@ -114,9 +114,9 @@ class ModelState: def main(demo=False): cloudlog.warning("modeld init") - sentry.set_tag("daemon", THREAD_NAME) - cloudlog.bind(daemon=THREAD_NAME) - setthreadname(THREAD_NAME) + sentry.set_tag("daemon", PROCESS_NAME) + cloudlog.bind(daemon=PROCESS_NAME) + setproctitle(PROCESS_NAME) config_realtime_process(7, 54) cloudlog.warning("setting up CL context") @@ -286,7 +286,7 @@ if __name__ == "__main__": args = parser.parse_args() main(demo=args.demo) except KeyboardInterrupt: - cloudlog.warning(f"child {THREAD_NAME} got SIGINT") + cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") except Exception: sentry.capture_exception() raise diff --git a/system/manager/process.py b/system/manager/process.py index 9214e417c1..36f299ae62 100644 --- a/system/manager/process.py +++ b/system/manager/process.py @@ -8,7 +8,7 @@ from collections.abc import Callable, ValuesView from abc import ABC, abstractmethod from multiprocessing import Process -from openpilot.common.threadname import setthreadname +from setproctitle import setproctitle from cereal import car, log import cereal.messaging as messaging @@ -27,7 +27,7 @@ def launcher(proc: str, name: str) -> None: mod = importlib.import_module(proc) # rename the process - setthreadname(proc) + setproctitle(proc) # create new context since we forked messaging.context = messaging.Context() From 00388ca7958d7dd9b4d505927ee57df77bdb16d7 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 10 Jun 2024 19:55:48 -0700 Subject: [PATCH 006/168] Revert "test_onroad: update modeld proc name" This reverts commit 4684651dc55dd0fb95fe33686ad519309f988bfd. --- 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 f80df5ac4f..75585e2f14 100644 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -309,7 +309,7 @@ class TestOnroad: assert max(mems) - min(mems) <= 3.0 def test_gpu_usage(self): - assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.model"} + assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld"} def test_camera_processing_time(self): result = "\n" From 3e332071e7c6b2ba975de301567e9d25e40d65b5 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 10 Jun 2024 21:52:36 -0700 Subject: [PATCH 007/168] update poetry lock --- poetry.lock | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index f4933887cf..9ebc6d8709 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.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -2730,7 +2730,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, @@ -2749,7 +2748,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-headless-4.10.0.82.tar.gz", hash = "sha256:de9e742c1b9540816fbd115b0b03841d41ed0c65566b0d7a5371f98b131b7e6d"}, - {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a09ed50ba21cc5bf5d436cb0e784ad09c692d6b1d1454252772f6c8f2c7b4088"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:977a5fd21e1fe0d3d2134887db4441f8725abeae95150126302f31fcd9f548fa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4ec6755838b0be12510bfc9ffb014779c612418f11f4f7e6f505c36124a3aa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a37fa5276967ecf6eb297295b16b28b7a2eb3b568ca0ee469fb1a5954de298"}, @@ -7303,6 +7301,106 @@ starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] +[[package]] +name = "setproctitle" +version = "1.3.3" +description = "A Python module to customize the process title" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, +] + +[package.extras] +test = ["pytest"] + [[package]] name = "setuptools" version = "70.0.0" @@ -7950,4 +8048,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "~3.11" -content-hash = "8ab43c0fd81c48afa1af652f8487d351444e286a7f43c11fb0148199d4cca1ee" +content-hash = "8f581b34273378265dba62166f3cd5abbb931b9375d95fb260dcaf192cfacc86" From 965415135ac7db4c67ea248ac52535eac537f3bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Mon, 10 Jun 2024 22:29:17 -0700 Subject: [PATCH 008/168] Long control: Double delay is super complicated (#32694) * Double delay is super complicated * No more upper bound * DEAD * Update ref --- cereal/car.capnp | 4 ++-- selfdrive/car/gm/interface.py | 2 +- selfdrive/car/honda/interface.py | 2 +- selfdrive/car/hyundai/interface.py | 3 +-- selfdrive/car/interfaces.py | 3 +-- selfdrive/car/tesla/interface.py | 2 +- selfdrive/controls/lib/longcontrol.py | 12 +++--------- selfdrive/test/process_replay/ref_commit | 2 +- 8 files changed, 11 insertions(+), 19 deletions(-) diff --git a/cereal/car.capnp b/cereal/car.capnp index 8d76f0ead8..7f3f64c911 100644 --- a/cereal/car.capnp +++ b/cereal/car.capnp @@ -490,8 +490,7 @@ struct CarParams { startingState @70 :Bool; # Does this car make use of special starting state steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds - longitudinalActuatorDelayLowerBound @61 :Float32; # Gas/Brake actuator delay in seconds, lower bound - longitudinalActuatorDelayUpperBound @58 :Float32; # Gas/Brake actuator delay in seconds, upper bound + longitudinalActuatorDelay @58 :Float32; # Gas/Brake actuator delay in seconds openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control? carVin @38 :Text; # VIN number queried during fingerprinting dashcamOnly @41: Bool; @@ -703,4 +702,5 @@ struct CarParams { brakeMaxVDEPRECATED @16 :List(Float32); directAccelControlDEPRECATED @30 :Bool; maxSteeringAngleDegDEPRECATED @54 :Float32; + longitudinalActuatorDelayLowerBoundDEPRECATEDDEPRECATED @61 :Float32; } diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 358bc9e5ba..2e194b12f2 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -148,7 +148,7 @@ class CarInterface(CarInterfaceBase): 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 + ret.longitudinalActuatorDelay = 0.5 # large delay to initially start braking if candidate == CAR.CHEVROLET_VOLT: ret.lateralTuning.pid.kpBP = [0., 40.] diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 2026c385c2..43a4454b90 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -74,7 +74,7 @@ class CarInterface(CarInterfaceBase): if candidate in HONDA_BOSCH: ret.longitudinalTuning.kpV = [0.25] ret.longitudinalTuning.kiV = [0.05] - ret.longitudinalActuatorDelayUpperBound = 0.5 # s + ret.longitudinalActuatorDelay = 0.5 # s if candidate in HONDA_BOSCH_RADARLESS: ret.stopAccel = CarControllerParams.BOSCH_ACCEL_MIN # stock uses -4.0 m/s^2 once stopped but limited by safety model else: diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 22c54bce6b..0ba4dcb5e3 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -94,8 +94,7 @@ class CarInterface(CarInterfaceBase): ret.startingState = True ret.vEgoStarting = 0.1 ret.startAccel = 1.0 - ret.longitudinalActuatorDelayLowerBound = 0.5 - ret.longitudinalActuatorDelayUpperBound = 0.5 + ret.longitudinalActuatorDelay = 0.5 # *** feature detection *** if candidate in CANFD_CAR: diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index a3572238ba..5eac6062aa 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -210,8 +210,7 @@ class CarInterfaceBase(ABC): ret.longitudinalTuning.kiBP = [0.] ret.longitudinalTuning.kiV = [1.] # TODO estimate car specific lag, use .15s for now - ret.longitudinalActuatorDelayLowerBound = 0.15 - ret.longitudinalActuatorDelayUpperBound = 0.15 + ret.longitudinalActuatorDelay = 0.15 ret.steerLimitTimer = 1.0 return ret diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index e039859263..09de10b54d 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -23,7 +23,7 @@ class CarInterface(CarInterfaceBase): ret.longitudinalTuning.kpV = [0] ret.longitudinalTuning.kiBP = [0] ret.longitudinalTuning.kiV = [0] - ret.longitudinalActuatorDelayUpperBound = 0.5 # s + ret.longitudinalActuatorDelay = 0.5 # s ret.radarTimeStep = (1.0 / 8) # 8Hz # Check if we have messages on an auxiliary panda, and that 0x2bf (DAS_control) is present on the AP powertrain bus diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index d08ee05035..a619c47634 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -73,16 +73,10 @@ class LongControl: v_target_now = interp(t_since_plan, CONTROL_N_T_IDX, speeds) a_target_now = interp(t_since_plan, CONTROL_N_T_IDX, long_plan.accels) - v_target_lower = interp(self.CP.longitudinalActuatorDelayLowerBound + t_since_plan, CONTROL_N_T_IDX, speeds) - a_target_lower = 2 * (v_target_lower - v_target_now) / self.CP.longitudinalActuatorDelayLowerBound - a_target_now + v_target = interp(self.CP.longitudinalActuatorDelay + t_since_plan, CONTROL_N_T_IDX, speeds) + a_target = 2 * (v_target - v_target_now) / self.CP.longitudinalActuatorDelay - a_target_now - v_target_upper = interp(self.CP.longitudinalActuatorDelayUpperBound + t_since_plan, CONTROL_N_T_IDX, speeds) - a_target_upper = 2 * (v_target_upper - v_target_now) / self.CP.longitudinalActuatorDelayUpperBound - a_target_now - - v_target = min(v_target_lower, v_target_upper) - a_target = min(a_target_lower, a_target_upper) - - v_target_1sec = interp(self.CP.longitudinalActuatorDelayUpperBound + t_since_plan + 1.0, CONTROL_N_T_IDX, speeds) + v_target_1sec = interp(self.CP.longitudinalActuatorDelay + t_since_plan + 1.0, CONTROL_N_T_IDX, speeds) else: v_target = 0.0 v_target_now = 0.0 diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 70178b8ea3..eaf61ccb81 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -e536df5586a71b22baa789dc584d7eab67f1fbbb +0ba779ec9f624872b1d038acb15095b726ff8983 From 4581f6c36812c535b3e63b258296ed920fb486e6 Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Tue, 11 Jun 2024 17:57:56 +0300 Subject: [PATCH 009/168] compressed_vipc.py fixes (#32699) * Restored VISION_STREAM_* to original index order * Register exit handler --- tools/camerastream/compressed_vipc.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/camerastream/compressed_vipc.py b/tools/camerastream/compressed_vipc.py index ea427816ef..6c27e861ff 100755 --- a/tools/camerastream/compressed_vipc.py +++ b/tools/camerastream/compressed_vipc.py @@ -6,6 +6,7 @@ import argparse import numpy as np import multiprocessing import time +import signal import cereal.messaging as messaging from msgq.visionipc import VisionIpcServer, VisionStreamType @@ -18,8 +19,8 @@ V4L2_BUF_FLAG_KEYFRAME = 8 ENCODE_SOCKETS = { VisionStreamType.VISION_STREAM_ROAD: "roadEncodeData", - VisionStreamType.VISION_STREAM_WIDE_ROAD: "wideRoadEncodeData", VisionStreamType.VISION_STREAM_DRIVER: "driverEncodeData", + VisionStreamType.VISION_STREAM_WIDE_ROAD: "wideRoadEncodeData", } def decoder(addr, vipc_server, vst, nvidia, W, H, debug=False): @@ -147,10 +148,14 @@ if __name__ == "__main__": vision_streams = [ VisionStreamType.VISION_STREAM_ROAD, - VisionStreamType.VISION_STREAM_WIDE_ROAD, VisionStreamType.VISION_STREAM_DRIVER, + VisionStreamType.VISION_STREAM_WIDE_ROAD, ] vsts = [vision_streams[int(x)] for x in args.cams.split(",")] cvipc = CompressedVipc(args.addr, vsts, args.nvidia, debug=(not args.silent)) + + # register exit handler + signal.signal(signal.SIGINT, lambda sig, frame: cvipc.kill()) + cvipc.join() From 6fa5d7c3b575faf90e4edadd35e8f2f8cfbe42a5 Mon Sep 17 00:00:00 2001 From: Mauricio Alvarez Leon <65101411+BBBmau@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:03:47 -0700 Subject: [PATCH 010/168] Update `.gitignore` with recommended VSCode config (#32696) * add .vscode into .gitignore * use recommended gitignore config for .vscode --- .gitignore | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.gitignore b/.gitignore index 370335e6a0..f067893c77 100644 --- a/.gitignore +++ b/.gitignore @@ -83,3 +83,22 @@ build/ poetry.toml Pipfile + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide \ No newline at end of file From c2be8a55533c7d9efb0a7b1510a839289bda3584 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 11 Jun 2024 11:29:39 -0700 Subject: [PATCH 011/168] little more release blacklist --- release/release_files.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/release/release_files.py b/release/release_files.py index 2d279e97a4..031b51737d 100755 --- a/release/release_files.py +++ b/release/release_files.py @@ -33,16 +33,22 @@ blacklist = [ "matlab.*.md", - ".git$", # for submodules ".git/", ".github/", ".devcontainer/", "Darwin/", ".vscode", - # no LFS + # common things + "LICENSE", + "Dockerfile", + ".pre-commit", + + # no LFS or submodules in release ".lfsconfig", ".gitattributes", + ".git$", + ".gitmodules", ] # gets you through the blacklist From 148eaf8fa6c9b23cdd346e926f58fad61f79ff1d Mon Sep 17 00:00:00 2001 From: Mauricio Alvarez Leon <65101411+BBBmau@users.noreply.github.com> Date: Tue, 11 Jun 2024 13:45:15 -0700 Subject: [PATCH 012/168] Update to Python 3.12 (#32548) * 3.12 * pprofile is broken * use modified metadrivepy3-12 * 0.3.0 metadrive * add metadrive/commaai git dependency * metadrive git set * pin sounddevice 0.4.6 * datetime.utcnow() deprecation * poetry lock * make datetime not aware * poetry lock * pin pytools * google_crc32c wheel * unpin sounddevice * clean metadrive * use python crc * mypy * 3.12.4 * allow python3.11 * test * no pip * poetry * better * better * merge * remove * try * test * try this * snok * python * simpler * setuptools * lower * try * try * work? * ubuntu deps * ubuntu * try * remove * move * remove this * names * Update .github/workflows/tools_tests.yaml Co-authored-by: Adeeb Shihadeh * python<4 * <3.13 --------- Co-authored-by: Adeeb Shihadeh Co-authored-by: Maxime Desroches --- .github/workflows/tools_tests.yaml | 19 + .python-version | 2 +- Dockerfile.openpilot_base | 4 +- common/api/__init__.py | 4 +- poetry.lock | 2726 ++++++++++---------- pyproject.toml | 7 +- selfdrive/test/test_updated.py | 2 +- system/athena/registration.py | 4 +- system/manager/manager.py | 2 +- system/qcomgpsd/qcomgpsd.py | 2 +- system/qcomgpsd/tests/test_qcomgpsd.py | 2 +- system/statsd.py | 2 +- system/ubloxd/pigeond.py | 4 +- system/updated/updated.py | 10 +- system/webrtc/tests/test_stream_session.py | 1 + system/webrtc/tests/test_webrtcd.py | 1 + system/webrtc/webrtcd.py | 1 + tools/lib/azure_container.py | 4 +- 18 files changed, 1442 insertions(+), 1355 deletions(-) diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index ba597f7000..c2f7d86e69 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -39,6 +39,25 @@ jobs: source selfdrive/test/setup_vsound.sh && \ CI=1 pytest tools/sim/tests/test_metadrive_bridge.py" + test_python311: + name: test python3.11 support + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - name: Installing ubuntu dependencies + run: INSTALL_EXTRA_PACKAGES=no tools/install_ubuntu_dependencies.sh + - name: Installing python + uses: actions/setup-python@v5 + with: + python-version: '3.11.4' + - name: Installing pip + run: pip install pip==24.0 + - name: Installing poetry + run: pip install poetry==1.7.0 + - name: Installing python dependencies + run: poetry install --no-cache --no-root + devcontainer: name: devcontainer runs-on: ubuntu-latest diff --git a/.python-version b/.python-version index 0c7d5f5f5d..455808f8e1 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.11.4 +3.12.4 diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index 0789a39c3e..6818195d72 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -64,7 +64,7 @@ RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers USER $USER ENV POETRY_VIRTUALENVS_CREATE=false -ENV PYENV_VERSION=3.11.4 +ENV PYENV_VERSION=3.12.4 ENV PYENV_ROOT="/home/$USER/pyenv" ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH" @@ -76,7 +76,7 @@ RUN cd /tmp && \ rm -rf /tmp/* && \ rm -rf /home/$USER/.cache && \ find /home/$USER/pyenv -type d -name ".git" | xargs rm -rf && \ - rm -rf /home/$USER/pyenv/versions/3.11.4/lib/python3.11/test + rm -rf /home/$USER/pyenv/versions/3.12.4/lib/python3.12/test USER root RUN sudo git config --global --add safe.directory /tmp/openpilot diff --git a/common/api/__init__.py b/common/api/__init__.py index f3a7d83842..ac231400a4 100644 --- a/common/api/__init__.py +++ b/common/api/__init__.py @@ -1,7 +1,7 @@ import jwt import os import requests -from datetime import datetime, timedelta +from datetime import datetime, timedelta, UTC from openpilot.system.hardware.hw import Paths from openpilot.system.version import get_version @@ -23,7 +23,7 @@ class Api: return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params) def get_token(self, expiry_hours=1): - now = datetime.utcnow() + now = datetime.now(UTC).replace(tzinfo=None) payload = { 'identity': self.dongle_id, 'nbf': now, diff --git a/poetry.lock b/poetry.lock index 9ebc6d8709..f4925a17fe 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 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" @@ -2234,7 +2234,7 @@ name = "metadrive-simulator" version = "0.4.2.3" description = "An open-ended driving simulator with infinite scenes" optional = false -python-versions = ">=3.6, <3.12" +python-versions = ">=3.6, <4" files = [] develop = false @@ -2246,7 +2246,7 @@ lxml = "*" matplotlib = "*" numpy = ">=1.21.6" opencv-python = "*" -panda3d = "1.10.13" +panda3d = "1.10.14" panda3d-gltf = "0.13" pandas = "*" pillow = "*" @@ -2269,9 +2269,9 @@ ros = ["zmq"] [package.source] type = "git" -url = "https://github.com/metadriverse/metadrive.git" -reference = "233a3a1698be7038ec3dd050ca10b547b4b3324c" -resolved_reference = "233a3a1698be7038ec3dd050ca10b547b4b3324c" +url = "https://github.com/commaai/metadrive.git" +reference = "python3.12" +resolved_reference = "0823c7491a1ab870bcd53d10a41e985a3ad1b968" [[package]] name = "mouseinfo" @@ -2322,22 +2322,22 @@ tests = ["pytest (>=4.6)"] [[package]] name = "msal" -version = "1.28.0" +version = "1.28.1" 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 = ">=3.7" files = [ - {file = "msal-1.28.0-py3-none-any.whl", hash = "sha256:3064f80221a21cd535ad8c3fafbb3a3582cd9c7e9af0bb789ae14f726a0ca99b"}, - {file = "msal-1.28.0.tar.gz", hash = "sha256:80bbabe34567cb734efd2ec1869b2d98195c927455369d8077b3c542088c5c9d"}, + {file = "msal-1.28.1-py3-none-any.whl", hash = "sha256:563c2d70de77a2ca9786aab84cb4e133a38a6897e6676774edc23d610bfc9e7b"}, + {file = "msal-1.28.1.tar.gz", hash = "sha256:d72bbfe2d5c2f2555f4bc6205be4450ddfd12976610dd9a16a9ab0f05c68b64d"}, ] [package.dependencies] -cryptography = ">=0.6,<45" +cryptography = ">=2.5,<45" PyJWT = {version = ">=1.0.0,<3", extras = ["crypto"]} requests = ">=2.0.0,<3" [package.extras] -broker = ["pymsalruntime (>=0.13.2,<0.15)"] +broker = ["pymsalruntime (>=0.13.2,<0.17)"] [[package]] name = "msal-extensions" @@ -2730,6 +2730,7 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, + {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, @@ -2738,7 +2739,10 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} +numpy = [ + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] [[package]] name = "opencv-python-headless" @@ -2748,6 +2752,7 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-headless-4.10.0.82.tar.gz", hash = "sha256:de9e742c1b9540816fbd115b0b03841d41ed0c65566b0d7a5371f98b131b7e6d"}, + {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a09ed50ba21cc5bf5d436cb0e784ad09c692d6b1d1454252772f6c8f2c7b4088"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:977a5fd21e1fe0d3d2134887db4441f8725abeae95150126302f31fcd9f548fa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4ec6755838b0be12510bfc9ffb014779c612418f11f4f7e6f505c36124a3aa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a37fa5276967ecf6eb297295b16b28b7a2eb3b568ca0ee469fb1a5954de298"}, @@ -2756,7 +2761,10 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.5", markers = "python_version >= \"3.11\""} +numpy = [ + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] [[package]] name = "packaging" @@ -2771,87 +2779,79 @@ files = [ [[package]] name = "panda3d" -version = "1.10.13" +version = "1.10.14" description = "Panda3D is a framework for 3D rendering and game development for Python and C++ programs." optional = false python-versions = "*" files = [ - {file = "panda3d-1.10.13-cp27-cp27m-macosx_10_6_i386.whl", hash = "sha256:697555595a01c3f5468d49a1ee1f05f57df31e63a251a9ba47a8f534faf0ba15"}, - {file = "panda3d-1.10.13-cp27-cp27m-macosx_10_6_x86_64.whl", hash = "sha256:ccfa288a3575c2996ad7f409f14e8ceb8541a9b1b39bb0162e30f73b1fa0884b"}, - {file = "panda3d-1.10.13-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b2d9870c044e8ac0f6a65e96b6814d122a560adfe045b6ad500bc107aa361726"}, - {file = "panda3d-1.10.13-cp27-cp27m-win32.whl", hash = "sha256:1c35d8676caa1a2c11f91592a6abd8cf18c3ac9496437082e79b4b0671603857"}, - {file = "panda3d-1.10.13-cp27-cp27m-win_amd64.whl", hash = "sha256:f7423bf86d3369f5f7578ec70199f6674ba9f81f80f3eea83d0b27ec7d2522fc"}, - {file = "panda3d-1.10.13-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:017c2a9d40c024de3d68359926dfbb0fef51e219bd2bc6d021464051bba9c80e"}, - {file = "panda3d-1.10.13-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8028fd67c0fc524eae3b7dbfba0b433e3d811e386ba51adbccf1f95a79ef32cb"}, - {file = "panda3d-1.10.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:50427b08d6dcbe91e95c719b3eb32abe5e806fe265a2cfa66f5b704d22776409"}, - {file = "panda3d-1.10.13-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:597332377b09cb97a1699fed2514c99bcc4241924ce7c21e7577685164576afc"}, - {file = "panda3d-1.10.13-cp310-cp310-manylinux2010_i686.whl", hash = "sha256:fd64c7995fc9d3f07100d4fe225498106cf3851f77bd54be3131193965768041"}, - {file = "panda3d-1.10.13-cp310-cp310-manylinux2010_x86_64.whl", hash = "sha256:acbcdf204ff75abe75b66af5c025b2f42e7777c2acb6cb17375cf7c66751a062"}, - {file = "panda3d-1.10.13-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:73905d348b486675706ac53e454b34138a3ab12faa1058720b6bf40110973be1"}, - {file = "panda3d-1.10.13-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:870da8fb7654f60d04ff5a85c75e80f89f14406c7f8812f4916f5781d1caeb25"}, - {file = "panda3d-1.10.13-cp310-cp310-win32.whl", hash = "sha256:5f75c18323ba3d36236e4756a98cba68268b0dd4ac6e4b889d87904a65b4fbbc"}, - {file = "panda3d-1.10.13-cp310-cp310-win_amd64.whl", hash = "sha256:7d8a28b10167990d55ac696275b08b21b06fb35e7f5f64d482c9b76410373e96"}, - {file = "panda3d-1.10.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52f4b9014235ef5abbd6b5714389dc887ad45828316c42c83af53937179360d8"}, - {file = "panda3d-1.10.13-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:d4cbd179bf442fab572bd9a486f866147ce38579e78dd5c01e1f59887bea64b8"}, - {file = "panda3d-1.10.13-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b4419faa2ca1747fccca8e76ca37700c1e011a38a8bad5be104fc703d1216bc3"}, - {file = "panda3d-1.10.13-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:68e9e215c4192ca14ab1304be79f86657f43d6d663b3dbe3af209caf8eb9793c"}, - {file = "panda3d-1.10.13-cp311-cp311-win32.whl", hash = "sha256:3a4df33d18fad4bfbc70907e6f7d6ef27f20ef4d0f3dfb3c17d7e4d46abd78f5"}, - {file = "panda3d-1.10.13-cp311-cp311-win_amd64.whl", hash = "sha256:55efa8ae9a04260358257e94f29c506e338af0197c5b75dae29b0112dfdd67ac"}, - {file = "panda3d-1.10.13-cp34-cp34m-macosx_10_6_i386.whl", hash = "sha256:f6f016870c22ba0a250958fb09c49843eb17d5620dd1bfa86f38dfd200af9401"}, - {file = "panda3d-1.10.13-cp34-cp34m-macosx_10_6_x86_64.whl", hash = "sha256:fd901d3a822824a9b288392ba6ade77143c8024e208d3ce73a554e364f03cadb"}, - {file = "panda3d-1.10.13-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:4e46ad41febad38f57e4948912f9642838f5bff196c7c336194904e13165172d"}, - {file = "panda3d-1.10.13-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:dc7cd2ee0bd8ca9f7e957b2672f2d8ee1132cd6ddc2f8287d9579efa682b8b01"}, - {file = "panda3d-1.10.13-cp34-cp34m-win32.whl", hash = "sha256:190bd5c58184cae94cf158900106215f20d579f84a1b7ce1474bfbcb797b4a0b"}, - {file = "panda3d-1.10.13-cp34-cp34m-win_amd64.whl", hash = "sha256:372ac3770ada07f1c92848f36f13359c2c00f3eefa525b0b3cad4804ec64c6ca"}, - {file = "panda3d-1.10.13-cp35-cp35m-macosx_10_6_i386.whl", hash = "sha256:496147561f15a738a9a212a69ce3dda340ff1d8ae8bfd0501507945a94153bd8"}, - {file = "panda3d-1.10.13-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:b78acc42a2ee7006dd9618d52ea2657e03d6e39fe4d8c9b4c48342a1d866bbfd"}, - {file = "panda3d-1.10.13-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:35bb1a847a9012e218b1fa768632e4e52644e87ac8daf08fbd4c49feff0672b4"}, - {file = "panda3d-1.10.13-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fdd564b7f154a78310d6d08920a9a6f405d9e7e9f74fd4b53c9eb73a007d2dea"}, - {file = "panda3d-1.10.13-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:730e5c6b8fb20448478ac1af117cc4aadd8e9dfa2558b5f9e89a69f83ce5f284"}, - {file = "panda3d-1.10.13-cp35-cp35m-win32.whl", hash = "sha256:4da16ba0a2c9615c9d68afdee47681454ece21bf252039078b4662dca856b8f0"}, - {file = "panda3d-1.10.13-cp35-cp35m-win_amd64.whl", hash = "sha256:526a1db71fcf1a2b4eaafb36642c710eb5d2425c9ec96d1afb7fadde4b1af619"}, - {file = "panda3d-1.10.13-cp36-cp36m-macosx_10_6_i386.whl", hash = "sha256:3298dcbfc8a9e87565d35129e3942ba0d076c6c7a504b32f656ccea39b876eb4"}, - {file = "panda3d-1.10.13-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:36c55f8aeb1b4eb305c3f76e0704678bdad80e37d46db71d3f723cbe4aa1eecf"}, - {file = "panda3d-1.10.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e4a7549e3583cd009a1a3ce33f84ed68f9ffd5b3f34f67606af6e8d6dafa32d5"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1711c7edc7620a8ca2f4fee2e6e448522726678cc5318d59de00d0d1e3f35ea6"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4c9da46324813e23b1108c0c3906460aa73a052c2934643a0e4a406a1a93dc03"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:c1c77315e2a998f9173fe86d3af63b0affc1e7399a03226881d39ff758cc6b2d"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:017fdcb16c1a786f12b45a39bd33666423689a94060d1fc6135539d826146eb3"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b112c8d0ecdc85b14a93f6bae57dbb31043a3bbf1cd3ce3905b143e76ffbfc84"}, - {file = "panda3d-1.10.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:1e18194c78b9b519da885620ddcc7f6709e139645f665f08309b7eff58a5a0ee"}, - {file = "panda3d-1.10.13-cp36-cp36m-win32.whl", hash = "sha256:8eda3bd2402d75fb52962051c157f9495742f1f85c49c38b9bc47091fc0639b0"}, - {file = "panda3d-1.10.13-cp36-cp36m-win_amd64.whl", hash = "sha256:39652709ae0b8167aaf253edacc78898109cce96e872d9e7be33257dd5f98485"}, - {file = "panda3d-1.10.13-cp37-cp37m-macosx_10_6_i386.whl", hash = "sha256:d8c9668f257da744f301bf83ff44b2cdc8bd635e732fadf2f9b09200655cd3e4"}, - {file = "panda3d-1.10.13-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:ece8eb268a0be1fa45b6ef1e6cfa1ae89f25ee926e866893baf8bf391708c02d"}, - {file = "panda3d-1.10.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:508df5128cb63163eeee8f3cb6cb2984aefe473ee7e8e328f25a8bf205d54de2"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:d8a7beb7b88f1fc4ec0061be28018f6da1511783eb6a9911442d2a3435e50f7d"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a1cae74294394aa4afe93414c799798be77777e5bba77a45368bb1973ca65d2e"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:94d59874924de7b6765d427ea833ffea38fbb1b72a35679f81ef76c34ddf584d"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:23806bb1b289ad31f1ec1c206ddbdddd484ecdf8fdb09a4f89bc1c61af6b19ba"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6013bf0049bb6b30b0ff17ca5dc6bde621b553f0d1815481ced186ba710aa3b6"}, - {file = "panda3d-1.10.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:e208d1ac385acb48e24f557badfdb6244b0122bc25511c512b893c55ccb1bed3"}, - {file = "panda3d-1.10.13-cp37-cp37m-win32.whl", hash = "sha256:1dea56806643077e863abd8735e7056019ffd2b935990670607b44f996ef8456"}, - {file = "panda3d-1.10.13-cp37-cp37m-win_amd64.whl", hash = "sha256:08f7729e3b13d7417a07b14a3532ee93e4c50293de45392d9783038dcc24cfd4"}, - {file = "panda3d-1.10.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8099b2bc211a98ff1d26a91c26d126d538896a59ad29d4de50dea19ccaf31b1b"}, - {file = "panda3d-1.10.13-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:bc41bd97e3a2dd04d0f664ae0ea1a7677ce7c6a718ab4d3b3ff79ef06f0a22c9"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2027d6d8ac86db0989fbcbafa9f4f1e1a4de79a94f087325e43ccf9e65da12a9"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:dbfccaf3ff52b4e5de66d33bf06aa489af43cb139367b77fa6bc79ac774d23dc"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c0785bfa3ad3e87f837433737679dce5e0d1a33accbfcb0dcb0393ce3a7a68f2"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e384ed11490d479095cbad2f27ad61f536ca75aeb702557ce83b67381d4448bd"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8cd5e47e18f56dd6dab7ed1acb21c07f356b7220db72b820f02363050ee3bdfd"}, - {file = "panda3d-1.10.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:094ccf20cdfb2a2f44cde56a1ab9a1287a09cfd33dd4fe094cb255aaacfb678f"}, - {file = "panda3d-1.10.13-cp38-cp38-win32.whl", hash = "sha256:83c39308ee95951616dd5ab1e2ee730853fca9b4331a7c9ea9d92c9af3321aa9"}, - {file = "panda3d-1.10.13-cp38-cp38-win_amd64.whl", hash = "sha256:2ae1bd477a8882c80bdb6d63d6738ae2c4c335f0d88af592a051a9705434c75d"}, - {file = "panda3d-1.10.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df904a0ca374fd7667727a3d3743c386e913e6e80b8efe67fe0fcd01f904e4c3"}, - {file = "panda3d-1.10.13-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:db8cc33163112722cdf313d06939ff30b260c7a5e2a404b38bddc7558e6e8a26"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:029d7c698114da30d0d5ecd57e0c92423d319848e4197e6a86ac54b9ae43c424"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4927f23e8c1469e6a17c3f05a81ac0c6fa7c23b2d39bffee5277ecabfb2da10f"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2683fc8ad1e98a98ae692dbd82896c3f055743351e7a61a8ecd22557ddef643e"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:809881853087d36211f380245499778a4838f2f1748a4f8d90546debed294f8b"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:05be45eeddc81fb4879b0e6b206422b810e2de0f6639ab04522f660270eb202a"}, - {file = "panda3d-1.10.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a00823d1ae2490dba0643109f10e7347b15e6c2554de0b1bed0a085950fa6ed0"}, - {file = "panda3d-1.10.13-cp39-cp39-win32.whl", hash = "sha256:2d5d3e2160d8fa667ef548171695be84e7de25f51817ae31c61cf2e869a2f6c6"}, - {file = "panda3d-1.10.13-cp39-cp39-win_amd64.whl", hash = "sha256:839d8b2724a149d56a31f621c6397a1fed597a7dacee478922c711426160990e"}, + {file = "panda3d-1.10.14-cp27-cp27m-macosx_10_6_i386.whl", hash = "sha256:cf47bcbe5d6270107e80f5f18b88186cc40de83e4e90c86e7e516d2289a68dd1"}, + {file = "panda3d-1.10.14-cp27-cp27m-macosx_10_6_x86_64.whl", hash = "sha256:c371a3df183b2e382cb6dbf07efb744b05bdb0d89101457f350ea9a7a9a481f1"}, + {file = "panda3d-1.10.14-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ba49c6f213a5f0287e4cbdb66714cdf3b4aa5bdbe4e1a55034e74d0dda9f0250"}, + {file = "panda3d-1.10.14-cp27-cp27m-win32.whl", hash = "sha256:adb54216a9234f3736693d49032783d7fb8952a15510f1397f992a5c94cdf897"}, + {file = "panda3d-1.10.14-cp27-cp27m-win_amd64.whl", hash = "sha256:f94dd5f557166b6571969883bd2ffd3a555e8ac720f0f3e347d2081222bc0997"}, + {file = "panda3d-1.10.14-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c98d2143755e52d4be3b474b932207c830e473aa0e10052831bc82784f1dd17c"}, + {file = "panda3d-1.10.14-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b7f8c6524e1381bd28a15e5e2ed7aaba8ed3b6fa29d4ea5a4b215c4639b49438"}, + {file = "panda3d-1.10.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b0e2aacb148b7033c08929bbf89bb497c2bed1811aa9f7e5efc167dbf57c90ae"}, + {file = "panda3d-1.10.14-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:2c60139139654a51dab213ce1c9f67abd73153fc9e0a0514c0758741b2d2bd96"}, + {file = "panda3d-1.10.14-cp310-cp310-manylinux2010_i686.whl", hash = "sha256:f5da02fb5735294193eb1794ecbe619f20f87712f1b2c5d6e4d1a269f652ebeb"}, + {file = "panda3d-1.10.14-cp310-cp310-manylinux2010_x86_64.whl", hash = "sha256:d6a65b1930e144d5901cdd20d2779dc157897a730f0c9674692d61ad50e31213"}, + {file = "panda3d-1.10.14-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:182a309537cd76c514b9f4d0dfd54bc9cb35d06a32234084bab6f3f0b0db3985"}, + {file = "panda3d-1.10.14-cp310-cp310-win32.whl", hash = "sha256:2a2b872a180ed84ff337147d6d46c14aceccbcfd1149135ba57e15136350d87f"}, + {file = "panda3d-1.10.14-cp310-cp310-win_amd64.whl", hash = "sha256:385d12a1f0924e91a39ebd6053104712a1acd91e089638d292b533e36f402c48"}, + {file = "panda3d-1.10.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:54b8ef9fe3684960a2c7d47b0d63c0354c17bc516795e59db6c1e5bda8c16c1c"}, + {file = "panda3d-1.10.14-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:93414675894b18eea8d27edc1bbd1dc719eae207d45ec263d47195504bc4705f"}, + {file = "panda3d-1.10.14-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:d1bc0d926f90c8fa14a1587fa9dbe5f89a4eda8c9684fa183a8eaa35fc8e891a"}, + {file = "panda3d-1.10.14-cp311-cp311-win32.whl", hash = "sha256:1039340a4a7965fe4c3e904edb4fff691584df435a154fecccf534587cd07a34"}, + {file = "panda3d-1.10.14-cp311-cp311-win_amd64.whl", hash = "sha256:1ddf01040b9c5497fb8659e3c5ef793a26c869cfdfb1b75e6d04d6fba0c03b73"}, + {file = "panda3d-1.10.14-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1bfbcee77779f12ecce6a3d5a856e573b25d6343f8c4b107e814d9702e70a65d"}, + {file = "panda3d-1.10.14-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:bc6540c5559d7e14a8992eff7de0157b7c42406b7ba221941ed224289496841c"}, + {file = "panda3d-1.10.14-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:143daab1ce6bedcba711ea3f6cab0ebe5082f22c5f43e7178fadd2dd01209da7"}, + {file = "panda3d-1.10.14-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:3c4399a286a142de7ff86f9356d7e526bbbd38892d7f7d39fecb5c33064972bc"}, + {file = "panda3d-1.10.14-cp312-cp312-win32.whl", hash = "sha256:e92e0dd907e2af33085a2c31ca2263dc8023b1b7bc70ce1b9fbc84631e130e51"}, + {file = "panda3d-1.10.14-cp312-cp312-win_amd64.whl", hash = "sha256:a5f2defd822d38848f8ae1956115adcb6cc7f464f03a67e73681cc72df125ef4"}, + {file = "panda3d-1.10.14-cp34-cp34m-macosx_10_6_i386.whl", hash = "sha256:84ca5855e03173f521a2b4edc84e62ad5ffb31e9454bd809efb8e71a5c32df4f"}, + {file = "panda3d-1.10.14-cp34-cp34m-macosx_10_6_x86_64.whl", hash = "sha256:9082e3d66a653589ffab7c5bd7a50eb46ab168104e08a86c77b58bbd77030d50"}, + {file = "panda3d-1.10.14-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:f1a46ca8427ffb9267b3951af81f6774b7259b7e8f89210af6366b208e5762e6"}, + {file = "panda3d-1.10.14-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:c23694788696d7bfe291ced98dd87e57532a23f821e71f7b2d0c2004a4648c8f"}, + {file = "panda3d-1.10.14-cp34-cp34m-win32.whl", hash = "sha256:f14455c459730f396e524d8b9e62875438481e1dc7dfd2083e9522a3bad45f28"}, + {file = "panda3d-1.10.14-cp34-cp34m-win_amd64.whl", hash = "sha256:110a33b20f15aa6333c8e72e30bcf0dc9afaef809a325d247bb7470de3942dae"}, + {file = "panda3d-1.10.14-cp35-cp35m-macosx_10_6_i386.whl", hash = "sha256:d91e37d43242d5132886c3850aa4a2f3ee7401de2360cb8313616b45ab78ecba"}, + {file = "panda3d-1.10.14-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:f4bcf78223df3c13e9a627a25856c91bdbf28f75b021630e5ca37a961eeabb27"}, + {file = "panda3d-1.10.14-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:e0a7a1d7cbe10474cad720898b384d642dcd3d7a07b3dbe09154107a5651be49"}, + {file = "panda3d-1.10.14-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:78404da82a5d93641b0f2a89790cad235b087e7e2e37bbe83c995e99495635cd"}, + {file = "panda3d-1.10.14-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aa1381f4c06b789b8a725185773397b0c7a2508eeb8156874537c07171e5cb99"}, + {file = "panda3d-1.10.14-cp35-cp35m-win32.whl", hash = "sha256:8a497dd7401b50fa372664c724f1cb949b8d8bc3ed6d9b6433af19086bcf9325"}, + {file = "panda3d-1.10.14-cp35-cp35m-win_amd64.whl", hash = "sha256:293c5441e4f2720da480abdb3c99e55e96a7616d8867ac9c7b94526694a5812e"}, + {file = "panda3d-1.10.14-cp36-cp36m-macosx_10_6_i386.whl", hash = "sha256:15083e9c82d884c279bca897576ed91848323f951617f7bbb43d2dba32e6d662"}, + {file = "panda3d-1.10.14-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:b8a20828a45a9215f7ecb59baec18a79adda56ad1b25eb99b9958d26d8ab2a40"}, + {file = "panda3d-1.10.14-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4c555a5c47ffcaaed518c52b3bb9d5729a5dc4492f51e8a46b076ca54adcae0"}, + {file = "panda3d-1.10.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0c43a4dfd6b12323359439ea7c60e8fbf84ff0aa75abaccd5179cc6b27baa2b7"}, + {file = "panda3d-1.10.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:06a4595f1737170d316829b451cbfb01a130918a04481b1f217212c485c64586"}, + {file = "panda3d-1.10.14-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:24d2a38f9068f868ac23101a8601d88f3c137ededed2be222d5e711a4b114467"}, + {file = "panda3d-1.10.14-cp36-cp36m-win32.whl", hash = "sha256:d7d722fb5a62531e62f6b98db2b3e399deddde945f84c954aefac73989c75e4c"}, + {file = "panda3d-1.10.14-cp36-cp36m-win_amd64.whl", hash = "sha256:7d17fe989aaed3f35a7992742a4c4536936fb0a70a87d4625b92f185f0318c45"}, + {file = "panda3d-1.10.14-cp37-cp37m-macosx_10_6_i386.whl", hash = "sha256:0ab75f828daef54678e9f2a15bccfe4e7b090991ee025689be324194266fd82e"}, + {file = "panda3d-1.10.14-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:f04af7a7becaf30c0c256a0177a7493ab91247ea5a2798345b2df2ec71aeff23"}, + {file = "panda3d-1.10.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d41579867cb2998f4273bdece282c641dac6f40ca2e713dafa3fb9ce3ef12162"}, + {file = "panda3d-1.10.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4db1b920d501d3524e92467a21ecb08cc0063566a681991cc683f2070068f128"}, + {file = "panda3d-1.10.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:db28161d1f40adf0b0998f7064ac784e49a2f2ec3bb04810c2757ba938c7d2cf"}, + {file = "panda3d-1.10.14-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:0cbdbc41229fa7d075925a716477e7a8d1a17a2523fc88e97fa010c4e0706442"}, + {file = "panda3d-1.10.14-cp37-cp37m-win32.whl", hash = "sha256:145cd28de41261e0ac2bc24323417f8b21623f48de0bb7a9e0d70ff386c34c84"}, + {file = "panda3d-1.10.14-cp37-cp37m-win_amd64.whl", hash = "sha256:fadb6eb4106dc3fecea81a1e81186b3cc3ee0019d0b5435273113a18aec2352c"}, + {file = "panda3d-1.10.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a61c973d8d58305a502d05a82dc3ec6cf2b5e01ada7151a83415c51a959ff774"}, + {file = "panda3d-1.10.14-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3e82b2f904efb9f7f78dbf6d88bc5ebc83c5c0fbc9e477a8ef2b154bd7935591"}, + {file = "panda3d-1.10.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:96d1ce3483a51ec5aebc43f3e30e552deacb660606d2b36e86ed3a9756e3eccf"}, + {file = "panda3d-1.10.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b658d75a5342ff175703ce780e8b383da438ff68ea941d0e5dff68c5189d38ec"}, + {file = "panda3d-1.10.14-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3e564c44d879b01d01a7fcdc03977affcf3b1dabcf2d6e5c678e06b9de8855ac"}, + {file = "panda3d-1.10.14-cp38-cp38-win32.whl", hash = "sha256:06007592951730b52852771e98b306b3c1de9dc51abf0bab183c3ec3ac404131"}, + {file = "panda3d-1.10.14-cp38-cp38-win_amd64.whl", hash = "sha256:b05713b5acfcfcbf1dc87c19b1d5babf926d21f83b3772180e7a5de83f45b454"}, + {file = "panda3d-1.10.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d55c7d52bd07e54a16219bb88a7cf34a5b9e7c720dce585e9de8427cc54d9dd2"}, + {file = "panda3d-1.10.14-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:39abf9330ebcfcff07c29ebcf397cf43c2e5be6c148cf45a0a025d3297c43289"}, + {file = "panda3d-1.10.14-cp39-cp39-manylinux1_i686.whl", hash = "sha256:0f69c7232713f50a552b00ada4cbb03780bb97ec1ddb640e5162df61d1b26a2b"}, + {file = "panda3d-1.10.14-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9dda6736e8c180fa9caab70aa9461d7042b74764f73e4d2c59fe560751989341"}, + {file = "panda3d-1.10.14-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a91ab520fa8bd206460f0b7acfa6329440d72669048bac3eab4bb4d8dcd09991"}, + {file = "panda3d-1.10.14-cp39-cp39-win32.whl", hash = "sha256:2de074b0a3e0f243e4c1fba0376a26489d585cc71fd79986de274e282e3913d8"}, + {file = "panda3d-1.10.14-cp39-cp39-win_amd64.whl", hash = "sha256:356c55c25c2227bb2cf20a9613410c470f4e9de887543ec8b3765c848af4bff0"}, ] [[package]] @@ -2926,7 +2926,10 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -3121,16 +3124,6 @@ docs = ["sphinx (>=1.7.1)"] redis = ["redis"] tests = ["pytest (>=5.4.1)", "pytest-cov (>=2.8.1)", "pytest-mypy (>=0.8.0)", "pytest-timeout (>=2.1.0)", "redis", "sphinx (>=6.0.0)", "types-redis"] -[[package]] -name = "pprofile" -version = "2.1.0" -description = "Line-granularity, thread-aware deterministic and statistic pure-python profiler" -optional = false -python-versions = "*" -files = [ - {file = "pprofile-2.1.0.tar.gz", hash = "sha256:b2bb56603dadf40c0bc0f61621f22c20e41638425f729945d9b7f8e4ae8cdd4a"}, -] - [[package]] name = "pre-commit" version = "3.7.1" @@ -3630,2780 +3623,2853 @@ files = [ [[package]] name = "pyobjc" -version = "10.3" +version = "10.3.1" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc-10.3-py3-none-any.whl", hash = "sha256:80068513b43c4a7950d41931f2fb53599ddfefd7e3961976cb8a65a01d2bb2d7"}, - {file = "pyobjc-10.3.tar.gz", hash = "sha256:4af8a73bf5d73fc62f6cceb8826d6fc86db63017bf75450140a4fa7ec263db6b"}, + {file = "pyobjc-10.3.1-py3-none-any.whl", hash = "sha256:dfa9ff44a353b9d0bf1245c25c94d1eee6d0cb26d9c5433bbcd67a265f7654ae"}, + {file = "pyobjc-10.3.1.tar.gz", hash = "sha256:476dd5c72394e4cfcdac6dfd756839011a0159353247f45e3e07cc0b3536c9d4"}, ] [package.dependencies] -pyobjc-core = "10.3" -pyobjc-framework-Accessibility = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Accounts = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AddressBook = "10.3" -pyobjc-framework-AdServices = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AdSupport = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-AppleScriptKit = "10.3" -pyobjc-framework-AppleScriptObjC = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-ApplicationServices = "10.3" -pyobjc-framework-AppTrackingTransparency = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AudioVideoBridging = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AuthenticationServices = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-AutomaticAssessmentConfiguration = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Automator = "10.3" -pyobjc-framework-AVFoundation = {version = "10.3", markers = "platform_release >= \"11.0\""} -pyobjc-framework-AVKit = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-AVRouting = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BackgroundAssets = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BrowserEngineKit = {version = "10.3", markers = "platform_release >= \"23.4\""} -pyobjc-framework-BusinessChat = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-CalendarStore = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-CallKit = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-CFNetwork = "10.3" -pyobjc-framework-Cinematic = {version = "10.3", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ClassKit = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-CloudKit = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-Cocoa = "10.3" -pyobjc-framework-Collaboration = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-ColorSync = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-Contacts = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-ContactsUI = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-CoreAudio = "10.3" -pyobjc-framework-CoreAudioKit = "10.3" -pyobjc-framework-CoreBluetooth = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-CoreData = "10.3" -pyobjc-framework-CoreHaptics = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreLocation = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CoreMedia = {version = "10.3", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMediaIO = {version = "10.3", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMIDI = "10.3" -pyobjc-framework-CoreML = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreMotion = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreServices = "10.3" -pyobjc-framework-CoreSpotlight = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreText = "10.3" -pyobjc-framework-CoreWLAN = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CryptoTokenKit = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-DataDetection = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-DeviceCheck = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-DictionaryServices = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-DiscRecording = "10.3" -pyobjc-framework-DiscRecordingUI = "10.3" -pyobjc-framework-DiskArbitration = "10.3" -pyobjc-framework-DVDPlayback = "10.3" -pyobjc-framework-EventKit = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-ExceptionHandling = "10.3" -pyobjc-framework-ExecutionPolicy = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ExtensionKit = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ExternalAccessory = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-FileProvider = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FileProviderUI = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FinderSync = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-FSEvents = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-GameCenter = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameController = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-GameKit = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameplayKit = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-HealthKit = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ImageCaptureCore = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-InputMethodKit = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-InstallerPlugins = "10.3" -pyobjc-framework-InstantMessage = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-Intents = {version = "10.3", markers = "platform_release >= \"16.0\""} -pyobjc-framework-IntentsUI = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-IOBluetooth = "10.3" -pyobjc-framework-IOBluetoothUI = "10.3" -pyobjc-framework-IOSurface = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-iTunesLibrary = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-KernelManagement = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-LatentSemanticMapping = "10.3" -pyobjc-framework-LaunchServices = "10.3" -pyobjc-framework-libdispatch = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-libxpc = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-LinkPresentation = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-LocalAuthentication = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-LocalAuthenticationEmbeddedUI = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MailKit = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MapKit = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaAccessibility = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaLibrary = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaPlayer = {version = "10.3", markers = "platform_release >= \"16.0\""} -pyobjc-framework-MediaToolbox = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-Metal = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalFX = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-MetalKit = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalPerformanceShaders = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-MetalPerformanceShadersGraph = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-MetricKit = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MLCompute = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ModelIO = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MultipeerConnectivity = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-NaturalLanguage = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetFS = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-Network = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetworkExtension = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-NotificationCenter = {version = "10.3", markers = "platform_release >= \"14.0\""} -pyobjc-framework-OpenDirectory = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-OSAKit = "10.3" -pyobjc-framework-OSLog = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PassKit = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-PencilKit = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PHASE = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Photos = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PhotosUI = {version = "10.3", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PreferencePanes = "10.3" -pyobjc-framework-PubSub = {version = "10.3", markers = "platform_release >= \"9.0\" and platform_release < \"18.0\""} -pyobjc-framework-PushKit = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Quartz = "10.3" -pyobjc-framework-QuickLookThumbnailing = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ReplayKit = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-SafariServices = {version = "10.3", markers = "platform_release >= \"16.0\""} -pyobjc-framework-SafetyKit = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SceneKit = {version = "10.3", markers = "platform_release >= \"11.0\""} -pyobjc-framework-ScreenCaptureKit = {version = "10.3", markers = "platform_release >= \"21.4\""} -pyobjc-framework-ScreenSaver = "10.3" -pyobjc-framework-ScreenTime = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ScriptingBridge = {version = "10.3", markers = "platform_release >= \"9.0\""} -pyobjc-framework-SearchKit = "10.3" -pyobjc-framework-Security = "10.3" -pyobjc-framework-SecurityFoundation = "10.3" -pyobjc-framework-SecurityInterface = "10.3" -pyobjc-framework-SensitiveContentAnalysis = {version = "10.3", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ServiceManagement = {version = "10.3", markers = "platform_release >= \"10.0\""} -pyobjc-framework-SharedWithYou = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SharedWithYouCore = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ShazamKit = {version = "10.3", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Social = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-SoundAnalysis = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Speech = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-SpriteKit = {version = "10.3", markers = "platform_release >= \"13.0\""} -pyobjc-framework-StoreKit = {version = "10.3", markers = "platform_release >= \"11.0\""} -pyobjc-framework-Symbols = {version = "10.3", markers = "platform_release >= \"23.0\""} -pyobjc-framework-SyncServices = "10.3" -pyobjc-framework-SystemConfiguration = "10.3" -pyobjc-framework-SystemExtensions = {version = "10.3", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ThreadNetwork = {version = "10.3", markers = "platform_release >= \"22.0\""} -pyobjc-framework-UniformTypeIdentifiers = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-UserNotifications = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-UserNotificationsUI = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-VideoSubscriberAccount = {version = "10.3", markers = "platform_release >= \"18.0\""} -pyobjc-framework-VideoToolbox = {version = "10.3", markers = "platform_release >= \"12.0\""} -pyobjc-framework-Virtualization = {version = "10.3", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Vision = {version = "10.3", markers = "platform_release >= \"17.0\""} -pyobjc-framework-WebKit = "10.3" +pyobjc-core = "10.3.1" +pyobjc-framework-Accessibility = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-Accounts = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-AddressBook = "10.3.1" +pyobjc-framework-AdServices = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-AdSupport = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-AppleScriptKit = "10.3.1" +pyobjc-framework-AppleScriptObjC = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-ApplicationServices = "10.3.1" +pyobjc-framework-AppTrackingTransparency = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-AudioVideoBridging = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-AuthenticationServices = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-AutomaticAssessmentConfiguration = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Automator = "10.3.1" +pyobjc-framework-AVFoundation = {version = "10.3.1", markers = "platform_release >= \"11.0\""} +pyobjc-framework-AVKit = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-AVRouting = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-BackgroundAssets = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-BrowserEngineKit = {version = "10.3.1", markers = "platform_release >= \"23.4\""} +pyobjc-framework-BusinessChat = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-CalendarStore = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-CallKit = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-CFNetwork = "10.3.1" +pyobjc-framework-Cinematic = {version = "10.3.1", markers = "platform_release >= \"23.0\""} +pyobjc-framework-ClassKit = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-CloudKit = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-Cocoa = "10.3.1" +pyobjc-framework-Collaboration = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-ColorSync = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-Contacts = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-ContactsUI = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-CoreAudio = "10.3.1" +pyobjc-framework-CoreAudioKit = "10.3.1" +pyobjc-framework-CoreBluetooth = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-CoreData = "10.3.1" +pyobjc-framework-CoreHaptics = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-CoreLocation = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-CoreMedia = {version = "10.3.1", markers = "platform_release >= \"11.0\""} +pyobjc-framework-CoreMediaIO = {version = "10.3.1", markers = "platform_release >= \"11.0\""} +pyobjc-framework-CoreMIDI = "10.3.1" +pyobjc-framework-CoreML = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-CoreMotion = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-CoreServices = "10.3.1" +pyobjc-framework-CoreSpotlight = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-CoreText = "10.3.1" +pyobjc-framework-CoreWLAN = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-CryptoTokenKit = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-DataDetection = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-DeviceCheck = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-DictionaryServices = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-DiscRecording = "10.3.1" +pyobjc-framework-DiscRecordingUI = "10.3.1" +pyobjc-framework-DiskArbitration = "10.3.1" +pyobjc-framework-DVDPlayback = "10.3.1" +pyobjc-framework-EventKit = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-ExceptionHandling = "10.3.1" +pyobjc-framework-ExecutionPolicy = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ExtensionKit = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ExternalAccessory = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-FileProvider = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-FileProviderUI = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-FinderSync = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-FSEvents = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-GameCenter = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-GameController = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-GameKit = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-GameplayKit = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-HealthKit = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ImageCaptureCore = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-InputMethodKit = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-InstallerPlugins = "10.3.1" +pyobjc-framework-InstantMessage = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-Intents = {version = "10.3.1", markers = "platform_release >= \"16.0\""} +pyobjc-framework-IntentsUI = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-IOBluetooth = "10.3.1" +pyobjc-framework-IOBluetoothUI = "10.3.1" +pyobjc-framework-IOSurface = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-iTunesLibrary = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-KernelManagement = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-LatentSemanticMapping = "10.3.1" +pyobjc-framework-LaunchServices = "10.3.1" +pyobjc-framework-libdispatch = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-libxpc = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-LinkPresentation = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-LocalAuthentication = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-LocalAuthenticationEmbeddedUI = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MailKit = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MapKit = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaAccessibility = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaLibrary = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-MediaPlayer = {version = "10.3.1", markers = "platform_release >= \"16.0\""} +pyobjc-framework-MediaToolbox = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-Metal = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MetalFX = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-MetalKit = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MetalPerformanceShaders = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-MetalPerformanceShadersGraph = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-MetricKit = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-MLCompute = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-ModelIO = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-MultipeerConnectivity = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-NaturalLanguage = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-NetFS = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-Network = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-NetworkExtension = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-NotificationCenter = {version = "10.3.1", markers = "platform_release >= \"14.0\""} +pyobjc-framework-OpenDirectory = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-OSAKit = "10.3.1" +pyobjc-framework-OSLog = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-PassKit = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-PencilKit = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-PHASE = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-Photos = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-PhotosUI = {version = "10.3.1", markers = "platform_release >= \"15.0\""} +pyobjc-framework-PreferencePanes = "10.3.1" +pyobjc-framework-PubSub = {version = "10.3.1", markers = "platform_release >= \"9.0\" and platform_release < \"18.0\""} +pyobjc-framework-PushKit = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Quartz = "10.3.1" +pyobjc-framework-QuickLookThumbnailing = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ReplayKit = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-SafariServices = {version = "10.3.1", markers = "platform_release >= \"16.0\""} +pyobjc-framework-SafetyKit = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-SceneKit = {version = "10.3.1", markers = "platform_release >= \"11.0\""} +pyobjc-framework-ScreenCaptureKit = {version = "10.3.1", markers = "platform_release >= \"21.4\""} +pyobjc-framework-ScreenSaver = "10.3.1" +pyobjc-framework-ScreenTime = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-ScriptingBridge = {version = "10.3.1", markers = "platform_release >= \"9.0\""} +pyobjc-framework-SearchKit = "10.3.1" +pyobjc-framework-Security = "10.3.1" +pyobjc-framework-SecurityFoundation = "10.3.1" +pyobjc-framework-SecurityInterface = "10.3.1" +pyobjc-framework-SensitiveContentAnalysis = {version = "10.3.1", markers = "platform_release >= \"23.0\""} +pyobjc-framework-ServiceManagement = {version = "10.3.1", markers = "platform_release >= \"10.0\""} +pyobjc-framework-SharedWithYou = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-SharedWithYouCore = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-ShazamKit = {version = "10.3.1", markers = "platform_release >= \"21.0\""} +pyobjc-framework-Social = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-SoundAnalysis = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-Speech = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-SpriteKit = {version = "10.3.1", markers = "platform_release >= \"13.0\""} +pyobjc-framework-StoreKit = {version = "10.3.1", markers = "platform_release >= \"11.0\""} +pyobjc-framework-Symbols = {version = "10.3.1", markers = "platform_release >= \"23.0\""} +pyobjc-framework-SyncServices = "10.3.1" +pyobjc-framework-SystemConfiguration = "10.3.1" +pyobjc-framework-SystemExtensions = {version = "10.3.1", markers = "platform_release >= \"19.0\""} +pyobjc-framework-ThreadNetwork = {version = "10.3.1", markers = "platform_release >= \"22.0\""} +pyobjc-framework-UniformTypeIdentifiers = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-UserNotifications = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-UserNotificationsUI = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-VideoSubscriberAccount = {version = "10.3.1", markers = "platform_release >= \"18.0\""} +pyobjc-framework-VideoToolbox = {version = "10.3.1", markers = "platform_release >= \"12.0\""} +pyobjc-framework-Virtualization = {version = "10.3.1", markers = "platform_release >= \"20.0\""} +pyobjc-framework-Vision = {version = "10.3.1", markers = "platform_release >= \"17.0\""} +pyobjc-framework-WebKit = "10.3.1" [package.extras] -allbindings = ["pyobjc-core (==10.3)", "pyobjc-framework-AVFoundation (==10.3)", "pyobjc-framework-AVKit (==10.3)", "pyobjc-framework-AVRouting (==10.3)", "pyobjc-framework-Accessibility (==10.3)", "pyobjc-framework-Accounts (==10.3)", "pyobjc-framework-AdServices (==10.3)", "pyobjc-framework-AdSupport (==10.3)", "pyobjc-framework-AddressBook (==10.3)", "pyobjc-framework-AppTrackingTransparency (==10.3)", "pyobjc-framework-AppleScriptKit (==10.3)", "pyobjc-framework-AppleScriptObjC (==10.3)", "pyobjc-framework-ApplicationServices (==10.3)", "pyobjc-framework-AudioVideoBridging (==10.3)", "pyobjc-framework-AuthenticationServices (==10.3)", "pyobjc-framework-AutomaticAssessmentConfiguration (==10.3)", "pyobjc-framework-Automator (==10.3)", "pyobjc-framework-BackgroundAssets (==10.3)", "pyobjc-framework-BrowserEngineKit (==10.3)", "pyobjc-framework-BusinessChat (==10.3)", "pyobjc-framework-CFNetwork (==10.3)", "pyobjc-framework-CalendarStore (==10.3)", "pyobjc-framework-CallKit (==10.3)", "pyobjc-framework-Cinematic (==10.3)", "pyobjc-framework-ClassKit (==10.3)", "pyobjc-framework-CloudKit (==10.3)", "pyobjc-framework-Cocoa (==10.3)", "pyobjc-framework-Collaboration (==10.3)", "pyobjc-framework-ColorSync (==10.3)", "pyobjc-framework-Contacts (==10.3)", "pyobjc-framework-ContactsUI (==10.3)", "pyobjc-framework-CoreAudio (==10.3)", "pyobjc-framework-CoreAudioKit (==10.3)", "pyobjc-framework-CoreBluetooth (==10.3)", "pyobjc-framework-CoreData (==10.3)", "pyobjc-framework-CoreHaptics (==10.3)", "pyobjc-framework-CoreLocation (==10.3)", "pyobjc-framework-CoreMIDI (==10.3)", "pyobjc-framework-CoreML (==10.3)", "pyobjc-framework-CoreMedia (==10.3)", "pyobjc-framework-CoreMediaIO (==10.3)", "pyobjc-framework-CoreMotion (==10.3)", "pyobjc-framework-CoreServices (==10.3)", "pyobjc-framework-CoreSpotlight (==10.3)", "pyobjc-framework-CoreText (==10.3)", "pyobjc-framework-CoreWLAN (==10.3)", "pyobjc-framework-CryptoTokenKit (==10.3)", "pyobjc-framework-DVDPlayback (==10.3)", "pyobjc-framework-DataDetection (==10.3)", "pyobjc-framework-DeviceCheck (==10.3)", "pyobjc-framework-DictionaryServices (==10.3)", "pyobjc-framework-DiscRecording (==10.3)", "pyobjc-framework-DiscRecordingUI (==10.3)", "pyobjc-framework-DiskArbitration (==10.3)", "pyobjc-framework-EventKit (==10.3)", "pyobjc-framework-ExceptionHandling (==10.3)", "pyobjc-framework-ExecutionPolicy (==10.3)", "pyobjc-framework-ExtensionKit (==10.3)", "pyobjc-framework-ExternalAccessory (==10.3)", "pyobjc-framework-FSEvents (==10.3)", "pyobjc-framework-FileProvider (==10.3)", "pyobjc-framework-FileProviderUI (==10.3)", "pyobjc-framework-FinderSync (==10.3)", "pyobjc-framework-GameCenter (==10.3)", "pyobjc-framework-GameController (==10.3)", "pyobjc-framework-GameKit (==10.3)", "pyobjc-framework-GameplayKit (==10.3)", "pyobjc-framework-HealthKit (==10.3)", "pyobjc-framework-IOBluetooth (==10.3)", "pyobjc-framework-IOBluetoothUI (==10.3)", "pyobjc-framework-IOSurface (==10.3)", "pyobjc-framework-ImageCaptureCore (==10.3)", "pyobjc-framework-InputMethodKit (==10.3)", "pyobjc-framework-InstallerPlugins (==10.3)", "pyobjc-framework-InstantMessage (==10.3)", "pyobjc-framework-Intents (==10.3)", "pyobjc-framework-IntentsUI (==10.3)", "pyobjc-framework-KernelManagement (==10.3)", "pyobjc-framework-LatentSemanticMapping (==10.3)", "pyobjc-framework-LaunchServices (==10.3)", "pyobjc-framework-LinkPresentation (==10.3)", "pyobjc-framework-LocalAuthentication (==10.3)", "pyobjc-framework-LocalAuthenticationEmbeddedUI (==10.3)", "pyobjc-framework-MLCompute (==10.3)", "pyobjc-framework-MailKit (==10.3)", "pyobjc-framework-MapKit (==10.3)", "pyobjc-framework-MediaAccessibility (==10.3)", "pyobjc-framework-MediaLibrary (==10.3)", "pyobjc-framework-MediaPlayer (==10.3)", "pyobjc-framework-MediaToolbox (==10.3)", "pyobjc-framework-Metal (==10.3)", "pyobjc-framework-MetalFX (==10.3)", "pyobjc-framework-MetalKit (==10.3)", "pyobjc-framework-MetalPerformanceShaders (==10.3)", "pyobjc-framework-MetalPerformanceShadersGraph (==10.3)", "pyobjc-framework-MetricKit (==10.3)", "pyobjc-framework-ModelIO (==10.3)", "pyobjc-framework-MultipeerConnectivity (==10.3)", "pyobjc-framework-NaturalLanguage (==10.3)", "pyobjc-framework-NetFS (==10.3)", "pyobjc-framework-Network (==10.3)", "pyobjc-framework-NetworkExtension (==10.3)", "pyobjc-framework-NotificationCenter (==10.3)", "pyobjc-framework-OSAKit (==10.3)", "pyobjc-framework-OSLog (==10.3)", "pyobjc-framework-OpenDirectory (==10.3)", "pyobjc-framework-PHASE (==10.3)", "pyobjc-framework-PassKit (==10.3)", "pyobjc-framework-PencilKit (==10.3)", "pyobjc-framework-Photos (==10.3)", "pyobjc-framework-PhotosUI (==10.3)", "pyobjc-framework-PreferencePanes (==10.3)", "pyobjc-framework-PubSub (==10.3)", "pyobjc-framework-PushKit (==10.3)", "pyobjc-framework-Quartz (==10.3)", "pyobjc-framework-QuickLookThumbnailing (==10.3)", "pyobjc-framework-ReplayKit (==10.3)", "pyobjc-framework-SafariServices (==10.3)", "pyobjc-framework-SafetyKit (==10.3)", "pyobjc-framework-SceneKit (==10.3)", "pyobjc-framework-ScreenCaptureKit (==10.3)", "pyobjc-framework-ScreenSaver (==10.3)", "pyobjc-framework-ScreenTime (==10.3)", "pyobjc-framework-ScriptingBridge (==10.3)", "pyobjc-framework-SearchKit (==10.3)", "pyobjc-framework-Security (==10.3)", "pyobjc-framework-SecurityFoundation (==10.3)", "pyobjc-framework-SecurityInterface (==10.3)", "pyobjc-framework-SensitiveContentAnalysis (==10.3)", "pyobjc-framework-ServiceManagement (==10.3)", "pyobjc-framework-SharedWithYou (==10.3)", "pyobjc-framework-SharedWithYouCore (==10.3)", "pyobjc-framework-ShazamKit (==10.3)", "pyobjc-framework-Social (==10.3)", "pyobjc-framework-SoundAnalysis (==10.3)", "pyobjc-framework-Speech (==10.3)", "pyobjc-framework-SpriteKit (==10.3)", "pyobjc-framework-StoreKit (==10.3)", "pyobjc-framework-Symbols (==10.3)", "pyobjc-framework-SyncServices (==10.3)", "pyobjc-framework-SystemConfiguration (==10.3)", "pyobjc-framework-SystemExtensions (==10.3)", "pyobjc-framework-ThreadNetwork (==10.3)", "pyobjc-framework-UniformTypeIdentifiers (==10.3)", "pyobjc-framework-UserNotifications (==10.3)", "pyobjc-framework-UserNotificationsUI (==10.3)", "pyobjc-framework-VideoSubscriberAccount (==10.3)", "pyobjc-framework-VideoToolbox (==10.3)", "pyobjc-framework-Virtualization (==10.3)", "pyobjc-framework-Vision (==10.3)", "pyobjc-framework-WebKit (==10.3)", "pyobjc-framework-iTunesLibrary (==10.3)", "pyobjc-framework-libdispatch (==10.3)", "pyobjc-framework-libxpc (==10.3)"] +allbindings = ["pyobjc-core (==10.3.1)", "pyobjc-framework-AVFoundation (==10.3.1)", "pyobjc-framework-AVKit (==10.3.1)", "pyobjc-framework-AVRouting (==10.3.1)", "pyobjc-framework-Accessibility (==10.3.1)", "pyobjc-framework-Accounts (==10.3.1)", "pyobjc-framework-AdServices (==10.3.1)", "pyobjc-framework-AdSupport (==10.3.1)", "pyobjc-framework-AddressBook (==10.3.1)", "pyobjc-framework-AppTrackingTransparency (==10.3.1)", "pyobjc-framework-AppleScriptKit (==10.3.1)", "pyobjc-framework-AppleScriptObjC (==10.3.1)", "pyobjc-framework-ApplicationServices (==10.3.1)", "pyobjc-framework-AudioVideoBridging (==10.3.1)", "pyobjc-framework-AuthenticationServices (==10.3.1)", "pyobjc-framework-AutomaticAssessmentConfiguration (==10.3.1)", "pyobjc-framework-Automator (==10.3.1)", "pyobjc-framework-BackgroundAssets (==10.3.1)", "pyobjc-framework-BrowserEngineKit (==10.3.1)", "pyobjc-framework-BusinessChat (==10.3.1)", "pyobjc-framework-CFNetwork (==10.3.1)", "pyobjc-framework-CalendarStore (==10.3.1)", "pyobjc-framework-CallKit (==10.3.1)", "pyobjc-framework-Cinematic (==10.3.1)", "pyobjc-framework-ClassKit (==10.3.1)", "pyobjc-framework-CloudKit (==10.3.1)", "pyobjc-framework-Cocoa (==10.3.1)", "pyobjc-framework-Collaboration (==10.3.1)", "pyobjc-framework-ColorSync (==10.3.1)", "pyobjc-framework-Contacts (==10.3.1)", "pyobjc-framework-ContactsUI (==10.3.1)", "pyobjc-framework-CoreAudio (==10.3.1)", "pyobjc-framework-CoreAudioKit (==10.3.1)", "pyobjc-framework-CoreBluetooth (==10.3.1)", "pyobjc-framework-CoreData (==10.3.1)", "pyobjc-framework-CoreHaptics (==10.3.1)", "pyobjc-framework-CoreLocation (==10.3.1)", "pyobjc-framework-CoreMIDI (==10.3.1)", "pyobjc-framework-CoreML (==10.3.1)", "pyobjc-framework-CoreMedia (==10.3.1)", "pyobjc-framework-CoreMediaIO (==10.3.1)", "pyobjc-framework-CoreMotion (==10.3.1)", "pyobjc-framework-CoreServices (==10.3.1)", "pyobjc-framework-CoreSpotlight (==10.3.1)", "pyobjc-framework-CoreText (==10.3.1)", "pyobjc-framework-CoreWLAN (==10.3.1)", "pyobjc-framework-CryptoTokenKit (==10.3.1)", "pyobjc-framework-DVDPlayback (==10.3.1)", "pyobjc-framework-DataDetection (==10.3.1)", "pyobjc-framework-DeviceCheck (==10.3.1)", "pyobjc-framework-DictionaryServices (==10.3.1)", "pyobjc-framework-DiscRecording (==10.3.1)", "pyobjc-framework-DiscRecordingUI (==10.3.1)", "pyobjc-framework-DiskArbitration (==10.3.1)", "pyobjc-framework-EventKit (==10.3.1)", "pyobjc-framework-ExceptionHandling (==10.3.1)", "pyobjc-framework-ExecutionPolicy (==10.3.1)", "pyobjc-framework-ExtensionKit (==10.3.1)", "pyobjc-framework-ExternalAccessory (==10.3.1)", "pyobjc-framework-FSEvents (==10.3.1)", "pyobjc-framework-FileProvider (==10.3.1)", "pyobjc-framework-FileProviderUI (==10.3.1)", "pyobjc-framework-FinderSync (==10.3.1)", "pyobjc-framework-GameCenter (==10.3.1)", "pyobjc-framework-GameController (==10.3.1)", "pyobjc-framework-GameKit (==10.3.1)", "pyobjc-framework-GameplayKit (==10.3.1)", "pyobjc-framework-HealthKit (==10.3.1)", "pyobjc-framework-IOBluetooth (==10.3.1)", "pyobjc-framework-IOBluetoothUI (==10.3.1)", "pyobjc-framework-IOSurface (==10.3.1)", "pyobjc-framework-ImageCaptureCore (==10.3.1)", "pyobjc-framework-InputMethodKit (==10.3.1)", "pyobjc-framework-InstallerPlugins (==10.3.1)", "pyobjc-framework-InstantMessage (==10.3.1)", "pyobjc-framework-Intents (==10.3.1)", "pyobjc-framework-IntentsUI (==10.3.1)", "pyobjc-framework-KernelManagement (==10.3.1)", "pyobjc-framework-LatentSemanticMapping (==10.3.1)", "pyobjc-framework-LaunchServices (==10.3.1)", "pyobjc-framework-LinkPresentation (==10.3.1)", "pyobjc-framework-LocalAuthentication (==10.3.1)", "pyobjc-framework-LocalAuthenticationEmbeddedUI (==10.3.1)", "pyobjc-framework-MLCompute (==10.3.1)", "pyobjc-framework-MailKit (==10.3.1)", "pyobjc-framework-MapKit (==10.3.1)", "pyobjc-framework-MediaAccessibility (==10.3.1)", "pyobjc-framework-MediaLibrary (==10.3.1)", "pyobjc-framework-MediaPlayer (==10.3.1)", "pyobjc-framework-MediaToolbox (==10.3.1)", "pyobjc-framework-Metal (==10.3.1)", "pyobjc-framework-MetalFX (==10.3.1)", "pyobjc-framework-MetalKit (==10.3.1)", "pyobjc-framework-MetalPerformanceShaders (==10.3.1)", "pyobjc-framework-MetalPerformanceShadersGraph (==10.3.1)", "pyobjc-framework-MetricKit (==10.3.1)", "pyobjc-framework-ModelIO (==10.3.1)", "pyobjc-framework-MultipeerConnectivity (==10.3.1)", "pyobjc-framework-NaturalLanguage (==10.3.1)", "pyobjc-framework-NetFS (==10.3.1)", "pyobjc-framework-Network (==10.3.1)", "pyobjc-framework-NetworkExtension (==10.3.1)", "pyobjc-framework-NotificationCenter (==10.3.1)", "pyobjc-framework-OSAKit (==10.3.1)", "pyobjc-framework-OSLog (==10.3.1)", "pyobjc-framework-OpenDirectory (==10.3.1)", "pyobjc-framework-PHASE (==10.3.1)", "pyobjc-framework-PassKit (==10.3.1)", "pyobjc-framework-PencilKit (==10.3.1)", "pyobjc-framework-Photos (==10.3.1)", "pyobjc-framework-PhotosUI (==10.3.1)", "pyobjc-framework-PreferencePanes (==10.3.1)", "pyobjc-framework-PubSub (==10.3.1)", "pyobjc-framework-PushKit (==10.3.1)", "pyobjc-framework-Quartz (==10.3.1)", "pyobjc-framework-QuickLookThumbnailing (==10.3.1)", "pyobjc-framework-ReplayKit (==10.3.1)", "pyobjc-framework-SafariServices (==10.3.1)", "pyobjc-framework-SafetyKit (==10.3.1)", "pyobjc-framework-SceneKit (==10.3.1)", "pyobjc-framework-ScreenCaptureKit (==10.3.1)", "pyobjc-framework-ScreenSaver (==10.3.1)", "pyobjc-framework-ScreenTime (==10.3.1)", "pyobjc-framework-ScriptingBridge (==10.3.1)", "pyobjc-framework-SearchKit (==10.3.1)", "pyobjc-framework-Security (==10.3.1)", "pyobjc-framework-SecurityFoundation (==10.3.1)", "pyobjc-framework-SecurityInterface (==10.3.1)", "pyobjc-framework-SensitiveContentAnalysis (==10.3.1)", "pyobjc-framework-ServiceManagement (==10.3.1)", "pyobjc-framework-SharedWithYou (==10.3.1)", "pyobjc-framework-SharedWithYouCore (==10.3.1)", "pyobjc-framework-ShazamKit (==10.3.1)", "pyobjc-framework-Social (==10.3.1)", "pyobjc-framework-SoundAnalysis (==10.3.1)", "pyobjc-framework-Speech (==10.3.1)", "pyobjc-framework-SpriteKit (==10.3.1)", "pyobjc-framework-StoreKit (==10.3.1)", "pyobjc-framework-Symbols (==10.3.1)", "pyobjc-framework-SyncServices (==10.3.1)", "pyobjc-framework-SystemConfiguration (==10.3.1)", "pyobjc-framework-SystemExtensions (==10.3.1)", "pyobjc-framework-ThreadNetwork (==10.3.1)", "pyobjc-framework-UniformTypeIdentifiers (==10.3.1)", "pyobjc-framework-UserNotifications (==10.3.1)", "pyobjc-framework-UserNotificationsUI (==10.3.1)", "pyobjc-framework-VideoSubscriberAccount (==10.3.1)", "pyobjc-framework-VideoToolbox (==10.3.1)", "pyobjc-framework-Virtualization (==10.3.1)", "pyobjc-framework-Vision (==10.3.1)", "pyobjc-framework-WebKit (==10.3.1)", "pyobjc-framework-iTunesLibrary (==10.3.1)", "pyobjc-framework-libdispatch (==10.3.1)", "pyobjc-framework-libxpc (==10.3.1)"] [[package]] name = "pyobjc-core" -version = "10.3" +version = "10.3.1" description = "Python<->ObjC Interoperability Module" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_core-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:713dd174e3fd4bfb975949d7314c778d02909d5c017497408d8eedcedab73a42"}, - {file = "pyobjc_core-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eca0c6d3923e8f5c4a86831e446f2995958525ff0c6a01f6f4fa8de0cb25c8a"}, - {file = "pyobjc_core-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:50dfe3bd7295f04445cf3134113578678a188ca4fb0869e821369a2d288492dc"}, - {file = "pyobjc_core-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:13511c0ab3235486d4560e9923ed96db76357e7c7e70e0629fee9425b0a8d901"}, - {file = "pyobjc_core-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a7e3a0625f9370ef86a2529be0d22dd3dc48326a7a28113bc6f24d4bf866d076"}, - {file = "pyobjc_core-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7a17321d2e226ca43a8f70f8bc823cfaa58ff9d9cdedcd16708d4eec9ca808b2"}, - {file = "pyobjc_core-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5c2bfb2f9fcb9f291a64041a336aab1b34a20dbbf4f77fca3057a7d8ef9ce9c5"}, - {file = "pyobjc_core-10.3.tar.gz", hash = "sha256:875f2555b51a8a36cafbdb7d5d36f3452287a81bd5d7dc09aa6c309d638a9275"}, + {file = "pyobjc_core-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ea46d2cda17921e417085ac6286d43ae448113158afcf39e0abe484c58fb3d78"}, + {file = "pyobjc_core-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:899d3c84d2933d292c808f385dc881a140cf08632907845043a333a9d7c899f9"}, + {file = "pyobjc_core-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6ff5823d13d0a534cdc17fa4ad47cf5bee4846ce0fd27fc40012e12b46db571b"}, + {file = "pyobjc_core-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2581e8e68885bcb0e11ec619e81ef28e08ee3fac4de20d8cc83bc5af5bcf4a90"}, + {file = "pyobjc_core-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea98d4c2ec39ca29e62e0327db21418696161fb138ee6278daf2acbedf7ce504"}, + {file = "pyobjc_core-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4c179c26ee2123d0aabffb9dbc60324b62b6f8614fb2c2328b09386ef59ef6d8"}, + {file = "pyobjc_core-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cb901fce65c9be420c40d8a6ee6fff5ff27c6945f44fd7191989b982baa66dea"}, + {file = "pyobjc_core-10.3.1.tar.gz", hash = "sha256:b204a80ccc070f9ab3f8af423a3a25a6fd787e228508d00c4c30f8ac538ba720"}, ] [[package]] name = "pyobjc-framework-accessibility" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Accessibility on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Accessibility-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6affccae6d0cd6f1061954c9a5c3341f6db3a2358fefa64117ccefd444d2a985"}, - {file = "pyobjc_framework_Accessibility-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:523e031fcb4e06270212c24b93de19df66287fe77bec3d03a27dc1c888da7992"}, - {file = "pyobjc_framework_Accessibility-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b119e3bf3c5173358797d4ed2fddf554b498dd623def8dd2925f7ac27a548655"}, - {file = "pyobjc_framework_accessibility-10.3.tar.gz", hash = "sha256:5be6f066582b4eda8e0c6ffac7d19c9f01835c036f16bed81211c9c7dece9f67"}, + {file = "pyobjc_framework_Accessibility-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4a1b10d2098b5e3887d4e52b13c2d7619f248ceeaa4e78bb21c51c25c7d391c3"}, + {file = "pyobjc_framework_Accessibility-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4926eeef40d750215f0787d2124407a4c65bc03407e402ea47901b713e8765e5"}, + {file = "pyobjc_framework_Accessibility-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b5b9d7373d1a8a06f57baca2f67279c3b0c61ecfb17fa6da964e0e275e7d18ed"}, + {file = "pyobjc_framework_Accessibility-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:94dbc5f223e6485820c14e7dee99d8f4d5cbf0600353033822dcab7ec4bc998e"}, + {file = "pyobjc_framework_accessibility-10.3.1.tar.gz", hash = "sha256:c973306417441e6bed5f9be6154e6399aa7f38fa9b6bcf3368fa42d92ef3030b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-accounts" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Accounts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Accounts-10.3-py2.py3-none-any.whl", hash = "sha256:09f311f689676805b98e8c848df582ab8a6f2ec30cd2eabfa453340b2f813abe"}, - {file = "pyobjc_framework_accounts-10.3.tar.gz", hash = "sha256:a84a84e82536054403bcf1a990755897d2011848e13377faaedca1333c58d418"}, + {file = "pyobjc_framework_Accounts-10.3.1-py2.py3-none-any.whl", hash = "sha256:451488f91263afd23233287f223ba00c0ee5c93d64cd10e133d72bc6a0fc48aa"}, + {file = "pyobjc_framework_accounts-10.3.1.tar.gz", hash = "sha256:3d55738e7b3290af8cd4993fd2b670242a952deb995a69911be2a1be4c509a86"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-addressbook" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AddressBook on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AddressBook-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3e383caa4af01522cad1336b67339e50786887ce9e5c0a1ccfbcd4949f1930"}, - {file = "pyobjc_framework_AddressBook-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7403df85c541fc2b8569c21fa148a5cf56faff2763466600a7a4953e858ceaed"}, - {file = "pyobjc_framework_AddressBook-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d26655504b723cbf2e9efcd76f937bbe4afe5ce107ec158f96aec9dfd925a2d5"}, - {file = "pyobjc_framework_addressbook-10.3.tar.gz", hash = "sha256:e9488b4fede12f6bbd6215ab3478699c94a257b31983f665ce3cfa76d8249f1d"}, + {file = "pyobjc_framework_AddressBook-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:02ab8cb2300d55beaddee4f113a5c4a78ef737eda6c704678487529e391062e2"}, + {file = "pyobjc_framework_AddressBook-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1cfa893c21920f5420f3e57da314315e92c855a83f0718482dc33bdb859b9f24"}, + {file = "pyobjc_framework_AddressBook-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7aa89a352f1729de1cb4d7841906487d9db752c2802af5695596b1cf5290acfb"}, + {file = "pyobjc_framework_AddressBook-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f25864847b4a81289dd08e7052455699ee011a4df98f4da0b07f46523c212592"}, + {file = "pyobjc_framework_addressbook-10.3.1.tar.gz", hash = "sha256:cde99b855c39b56ca52479b0a1e2daa3ef5de12cebfe780c3c802a5f59a484cc"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-adservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AdServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AdServices-10.3-py2.py3-none-any.whl", hash = "sha256:a3d8ed85beb1f75335fb5598eb0d63a76390099bb09735b8a5b37908ddd6ad40"}, - {file = "pyobjc_framework_adservices-10.3.tar.gz", hash = "sha256:c3b8a874a77a346b34439d8fcc6e37fa59836130160a58e848af2b222f476fe5"}, + {file = "pyobjc_framework_AdServices-10.3.1-py2.py3-none-any.whl", hash = "sha256:c839c4267ad8443393e4d138396026764ee43776164da8a8ed9ac248b7d9c0d9"}, + {file = "pyobjc_framework_adservices-10.3.1.tar.gz", hash = "sha256:28123eb111d023f708e1d86f5f3f76bd4f6bb0d932466863f84b3e322b11537a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-adsupport" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AdSupport on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AdSupport-10.3-py2.py3-none-any.whl", hash = "sha256:e68b2bfcf095fd291fe04b6626d26dc60c17c9e37418b30f977e79a42567d415"}, - {file = "pyobjc_framework_adsupport-10.3.tar.gz", hash = "sha256:fe04f5bdab7d1f56c9c97fadea619576d62774bffb418832b97c9e17ef7cab01"}, + {file = "pyobjc_framework_AdSupport-10.3.1-py2.py3-none-any.whl", hash = "sha256:0e403ec206ada472b2c0b129ed656342a97c20110ca8398ab907100516b0e48c"}, + {file = "pyobjc_framework_adsupport-10.3.1.tar.gz", hash = "sha256:ba85a00cf20c42501d8083092f7ca0fcd1e616b1725e6512e75bcb60a6d58528"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-applescriptkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AppleScriptKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AppleScriptKit-10.3-py2.py3-none-any.whl", hash = "sha256:93f25fe54cf5ea0b389956c3ab7061181373db7aec8beccbc376d0c9e116dc71"}, - {file = "pyobjc_framework_applescriptkit-10.3.tar.gz", hash = "sha256:d6a99ad673ed1feaccc41aa0e082526026b7b43e6b37a018c123577513965767"}, + {file = "pyobjc_framework_AppleScriptKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:97ce878ff334b6853405a62e164debb9e6695110e64db5ed596008c0fde84970"}, + {file = "pyobjc_framework_applescriptkit-10.3.1.tar.gz", hash = "sha256:add2e63598b699666bcf00ac59f6f1046266df1665bec71b142cd21b89037064"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-applescriptobjc" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AppleScriptObjC on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AppleScriptObjC-10.3-py2.py3-none-any.whl", hash = "sha256:97e171fda7473ec09788531b840fd19b26ab64fc8d44dbdf4ec70da2127304c6"}, - {file = "pyobjc_framework_applescriptobjc-10.3.tar.gz", hash = "sha256:9f7fad7bd4f6e4b90800ac87a4f4260e44fd78e052a0c24bef90b797b9cf4159"}, + {file = "pyobjc_framework_AppleScriptObjC-10.3.1-py2.py3-none-any.whl", hash = "sha256:2d64c74a4af48656bb407eb177fe5f1d3c0f7bd9c578e5583dffde8e3d55f5df"}, + {file = "pyobjc_framework_applescriptobjc-10.3.1.tar.gz", hash = "sha256:a87101d86b08e06e2c0e51630ac76d4c70f01cf1ed7af281f3138e63146e279b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-applicationservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ApplicationServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ApplicationServices-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6beb4565b5fa17f45828e2957161d4f6991f7bea5da6c44e268d96a7d103bfa7"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fe18f999755e15f2c7bc459860e4aac9a78b84208eb1751cbaef83e6ac9f6765"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9cd2b5bae9e0517b453aac7fc15143e9ac5ea607ad6a8fa56d31b58555403bba"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:ea7db447abef7deb8233da00204bc5e76e695e504dcf7ad765c7b5d04d164188"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9381d3c3ad04063d460b5aa9edd8bb1234350833b4decb8dd3df3feefc19c62f"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:cbc55594468cab4df4314b956a0ab9b92395460ede76f874991d6219038c8e2a"}, - {file = "pyobjc_framework_ApplicationServices-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cba0a07176a30b1e3961842195bad2f079f80ec57872d52d705910e18eb23e26"}, - {file = "pyobjc_framework_applicationservices-10.3.tar.gz", hash = "sha256:36ca55df6a9552b7404e1a0799797c15db47faf608050024a898d50d2b1f4351"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b694260d423c470cb90c3a7009cfde93e332ea6fb4b9b9526ad3acbd33460e3d"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d886ba1f65df47b77ff7546f3fc9bc7d08cfb6b3c04433b719f6b0689a2c0d1f"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:be157f2c3ffb254064ef38249670af8cada5e519a714d2aa5da3740934d89bc8"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:57737f41731661e4a3b78793ec9173f61242a32fa560c3e4e58484465d049c32"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c429eca69ee675e781e4e55f79e939196b47f02560ad865b1ba9ac753b90bd77"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4f1814a17041a20adca454044080b52e39a4ebc567ad2c6a48866dd4beaa192a"}, + {file = "pyobjc_framework_ApplicationServices-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1252f1137f83eb2c6b9968d8c591363e8859dd2484bc9441d8f365bcfb43a0e4"}, + {file = "pyobjc_framework_applicationservices-10.3.1.tar.gz", hash = "sha256:f27cb64aa4d129ce671fd42638c985eb2a56d544214a95fe3214a007eacc4790"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreText = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreText = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-apptrackingtransparency" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AppTrackingTransparency on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AppTrackingTransparency-10.3-py2.py3-none-any.whl", hash = "sha256:10774b1e288ee303813f5736569a5f7522c8cde0ad5d787a36f9d4f89da6e2d7"}, - {file = "pyobjc_framework_apptrackingtransparency-10.3.tar.gz", hash = "sha256:8917c06633b9b5b5317945edfbc7064679f096651ae847fd4d186734a256eaac"}, + {file = "pyobjc_framework_AppTrackingTransparency-10.3.1-py2.py3-none-any.whl", hash = "sha256:7c0e3a5cad402e8c3c5da1f070be0f49bb827e6d9e5165744f64e082633a4b45"}, + {file = "pyobjc_framework_apptrackingtransparency-10.3.1.tar.gz", hash = "sha256:2e381db5f7d3985207b5ff2975e41bf0f9147080345b2e1b4b242f8799290d04"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-audiovideobridging" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AudioVideoBridging on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b29110d34e79a7ff275628246237de1f497e88db954c0763d1da19874e136639"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:21761c9f69813d95243c9ecfa68161468a48cf2eae3bff982c568458f369de52"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4683c2f919161178210292f3aff8bf664d402325452be4a7fae419cc02e3f976"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:8688210459c3fe3883131c6d91d3ee5e821488215398dd1e3513ca472cc3f335"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4bd821fe8da7ee329f96900645515d23689eaea4799ebb4738ab1e0e9fe68d00"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:f58c46deb3c75c3c35904ab300986863f0ee0f494919b7bc0f92c6d40873d7e0"}, - {file = "pyobjc_framework_AudioVideoBridging-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5cbe0382f874fd277704b7a539cc401fe915ecdde75e67c719c3e45aef55f911"}, - {file = "pyobjc_framework_audiovideobridging-10.3.tar.gz", hash = "sha256:0125620773157566c34038318b064def855ae096ac601e4482882277e4d913e6"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8accf87f136a6aa71d89d3a2204127b48e64ec25d3e1159f0f23ede0c4d70e59"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4f6067b2f50fb48c9ecb521b8865d93dfbd46510a4322cc2041b1e917678f39b"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1aebc6c1aafb3cdfc5f9fad2dfe2dfccfbab159dc8dbfe54cfea777108e80e44"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b1fb0af1df78800205cd7a7cd90e58b640513bbb944fe6a8d89df43e626a27a8"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2cc18c005c72a74654a000a1d6d405b6cb12b1d6c09be9bd6b58502ae06035e7"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:b61dc632c31875cb090521b0139d61f528e5fe5fedf4055524522c0aa808a77d"}, + {file = "pyobjc_framework_AudioVideoBridging-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8de78207e617d4d89c66b4a66ff4ff49b60822249d2a68fc9356dd09475f0103"}, + {file = "pyobjc_framework_audiovideobridging-10.3.1.tar.gz", hash = "sha256:b2c1d5977a92915f6af2203e3b4c9b8a8392bc51e0fc13ccb393589419387119"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-authenticationservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AuthenticationServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AuthenticationServices-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6598252867b6578d8f5c6f987299aadcdaa36095c15439318011fb7b3c2e9334"}, - {file = "pyobjc_framework_AuthenticationServices-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cb9d0154a15a8509bb0c4be32138b852802bcf0ad362fe9907038cfe37c5f9b7"}, - {file = "pyobjc_framework_AuthenticationServices-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4f8a1e45db6e61d6e0a18e3182e07cac7e9c09b2b0c5909a74c465938d3cbab5"}, - {file = "pyobjc_framework_authenticationservices-10.3.tar.gz", hash = "sha256:2cbb41260156dc5d2423fd9e3573c04117eca91f765b3c8f9268360d97253a7e"}, + {file = "pyobjc_framework_AuthenticationServices-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:fa0a11fb64e30f14f01ec2d3a2a89a3e1a554db62111b0612f1782722b6dd534"}, + {file = "pyobjc_framework_AuthenticationServices-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e2753cdd5480f97753dc32d9f41d7e6cb75b09f7ce950b2eea4a9851e0a437db"}, + {file = "pyobjc_framework_AuthenticationServices-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:91c2cc0e963d6ac44c3a6014270b54e6499f1aae64d82482d96114c38fb99817"}, + {file = "pyobjc_framework_AuthenticationServices-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d715bbdf1c94ea838830930a41de0554905760943cff1510268d8e485c826ee8"}, + {file = "pyobjc_framework_authenticationservices-10.3.1.tar.gz", hash = "sha256:0ac834f4a5cbe3cf20acd4f6a96df77bc643a1ae248e394d06964db9fe0d6310"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-automaticassessmentconfiguration" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AutomaticAssessmentConfiguration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fca0e66a78daa4605b056c54a3aadc10772d7d942b3fbc77d1a12fcc5d454bc"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2af49bd323db3d94421364e2f89bcb38511dcf3bd36688c852ea49619caed9db"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:03e506e574b75aac0a82d783376b4e2ff1519c31e14dd2b0a978595e27149d0c"}, - {file = "pyobjc_framework_automaticassessmentconfiguration-10.3.tar.gz", hash = "sha256:e31b4f0e4127b5e82f77c7fac73d8168e12df02176ab38b220683c375b8a884f"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:f717f6df5886123a55584f8dd85626c42387f5b55edcd3d68ff306b3fe56a206"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ab84a771835f346e8a45d19e05f0c2ef8bb3dca81461fb2acc6c9f031794ec63"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:66fd582549ef602a8bcaadb57de8a06cb0dc0367c2a508b20c580fde2232daed"}, + {file = "pyobjc_framework_AutomaticAssessmentConfiguration-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:578512ae1443e031c3fbfec7eefa71e5ac5fc8cac892ad7183c5ac0b894d494d"}, + {file = "pyobjc_framework_automaticassessmentconfiguration-10.3.1.tar.gz", hash = "sha256:f7846d04493e90eddbacfb7cffebc11b3f76f0800d3dc2bec39441732a20ac56"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-automator" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Automator on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Automator-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0e63a47fd3a89334de05246e4594f33af13b495ad2b4523a5fa18db445d1015f"}, - {file = "pyobjc_framework_Automator-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:efff1edede64731581026ec4b3f89ec624f1a7fe8652ae435b7a8090ba2e8f47"}, - {file = "pyobjc_framework_Automator-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c303f65a16a09f70bf2b52e0b41270329422c2d8e07c7d4bf16146b4c5db60d7"}, - {file = "pyobjc_framework_automator-10.3.tar.gz", hash = "sha256:18dc4792774e0a7e13c5df62212b73af8fa78a40414f3422e52919145a7a9180"}, + {file = "pyobjc_framework_Automator-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:63632d2c1d069ca29a077b15ab20a0a0acc0a5f33ee322c9c8cc854702c66549"}, + {file = "pyobjc_framework_Automator-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4bc8afe0a52bee09f7f99bdfc62100654f08113de47e74488c0af2afcd646e23"}, + {file = "pyobjc_framework_Automator-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8609e1295030d2a46916965cd070072a90b6528abc25ae4d02e50818d2cb252f"}, + {file = "pyobjc_framework_Automator-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2f482464b3f91405a5a59e3b96ae89c5062af81023ea0fc803353fdfe8cc4a9d"}, + {file = "pyobjc_framework_automator-10.3.1.tar.gz", hash = "sha256:330042475479f054ac98abd568b523fc0165c39eeefffc23bd65d35780939316"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-avfoundation" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AVFoundation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AVFoundation-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2692fc423a1fcbcb3f8355d8217d9258cf27c0b2ef6c2362829fdc0b65f262c4"}, - {file = "pyobjc_framework_AVFoundation-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4a54fc6e34a6045b4b6050699d4724bdb7f1ae8e6355c9646e262db3f9b31dfa"}, - {file = "pyobjc_framework_AVFoundation-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:56989f914e463340eb7d51db63a10dd6b5b5204bb1da528a0602d80072d56788"}, - {file = "pyobjc_framework_avfoundation-10.3.tar.gz", hash = "sha256:0bcccca344f7708416c7d910daab2a7b7f05c51f0efb4eec1860a01ed4862af2"}, + {file = "pyobjc_framework_AVFoundation-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:0896f6650df35f0229d1fb3aa3fbf632647dd815d4921cb61d9eb7fa26be6237"}, + {file = "pyobjc_framework_AVFoundation-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0cb27cc95288d95df7504adf474596f8855de7fa7798bbc1bbfbdfbbcb940952"}, + {file = "pyobjc_framework_AVFoundation-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb606ef0806d952a04db45ae691167678121df1d8d7c2f8cc73745695097033"}, + {file = "pyobjc_framework_AVFoundation-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:00889eb915479aa9ea392cdd241e4b635ae0fa3114f043d08cf3e1d1b5a23bd4"}, + {file = "pyobjc_framework_avfoundation-10.3.1.tar.gz", hash = "sha256:2f94bee3a4217b46d9416cad066e4f357bf0f344079c328736114451ae19ae94"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreAudio = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreAudio = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-avkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AVKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AVKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:56555ea3b415c929d0111db2b52961b01bbb6e105d3bf75d9ff84ab1399cf4c9"}, - {file = "pyobjc_framework_AVKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:420e09834e862a13dc0a93debd0a493775bd99ba1a8f7262531d02d755a584d6"}, - {file = "pyobjc_framework_AVKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:de1b117de0490018058c0e159b771bd5e908ac876fe53622a6d1e019f0f99415"}, - {file = "pyobjc_framework_avkit-10.3.tar.gz", hash = "sha256:5b9ab88fde35d45e495efab95ba1fdb1c83f63c35ba71cf2a7312efb9467f0ba"}, + {file = "pyobjc_framework_AVKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:bb6025331e5ed493d5ca0a35fab14026820e0d8b0a091fc6010b4ef77aa4bf16"}, + {file = "pyobjc_framework_AVKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:675832ec9c088c2010bd9cd9f912ff5c45ff608d7d94233347d49f1b91f690ca"}, + {file = "pyobjc_framework_AVKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1d92e1d5d098af87667f3eac0609c39c58320c095cdcb7737958cc4895569f22"}, + {file = "pyobjc_framework_AVKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:91bf61fa8d8ef3764345b085038a4081165a8c54b4f0c2a11ee07f86a1556689"}, + {file = "pyobjc_framework_avkit-10.3.1.tar.gz", hash = "sha256:97ca35b5f0cec98f5c8521fedb8537bb23d82739b7102e4ac732d3c3944c8ccc"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-avrouting" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework AVRouting on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_AVRouting-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f9f1ebc5161758522a0da9336df8f893f0dce50ca130fcf95f222b30f016b51f"}, - {file = "pyobjc_framework_AVRouting-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b071da24ef134447dab23b80f2e6affd3bf2765ecb3633074a5e8724eee2b57c"}, - {file = "pyobjc_framework_AVRouting-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:73ba803f2a448a3af4e7a666998d13aa6200a0812fe7a19d51ef2e1e63b4fdc5"}, - {file = "pyobjc_framework_avrouting-10.3.tar.gz", hash = "sha256:1fa5c727ee8d6903625f5a946c43c53e96b78ec24e96f11b5bf12288e5726365"}, + {file = "pyobjc_framework_AVRouting-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:30b05ea44f21d481e39905684c79176c04060e0e92c1ad31756fed6aa39b07df"}, + {file = "pyobjc_framework_AVRouting-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:af940e322cb9ce9d79b47b829c5df41ac4980aca2cda1fbe1ead4ed0f9f589a4"}, + {file = "pyobjc_framework_AVRouting-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3e5101311ee84c884c0eba201b3b7f92e1a2325132a9e44b9b7ad84cdd28b4c2"}, + {file = "pyobjc_framework_AVRouting-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:186e891c2a271492612b3db2b5c2050c56ed1bfce1f6146de8dbf05e7cd7623b"}, + {file = "pyobjc_framework_avrouting-10.3.1.tar.gz", hash = "sha256:7026059b24daf8e1da05d7867f450e82abe412fe5c438faf9344f46e3b83da39"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-backgroundassets" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework BackgroundAssets on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_BackgroundAssets-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:83c66c350122cbb25d56ddc27a036eb7046eeb9d0411f3bf40b2b76bb0a55e8a"}, - {file = "pyobjc_framework_BackgroundAssets-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1307c0fc2616b5fbf214dd6c906e0da10d8bb25874ec6e8a41d14c7e146d0265"}, - {file = "pyobjc_framework_BackgroundAssets-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6a5ab8be15c98368e60eae602c01baea291c0b05075d89ae6faeb9e48f287c4f"}, - {file = "pyobjc_framework_backgroundassets-10.3.tar.gz", hash = "sha256:4ba4a0a2d5f657ea4f27962686e5eb725408912a1aa3846afafe626653c722d6"}, + {file = "pyobjc_framework_BackgroundAssets-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:f725d33a5d633c514e4973489e1bdca391976a5c04443451acaaacc5ccd4095e"}, + {file = "pyobjc_framework_BackgroundAssets-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:14cc84ad7bef64986fe240d23205870fc40dd7b1d2a1819d3dd7924c4898b5c2"}, + {file = "pyobjc_framework_BackgroundAssets-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e28624ecfba067b5e0fc91d5818cb3d20d0ba189a7e8a724678abbecc233c13e"}, + {file = "pyobjc_framework_BackgroundAssets-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aed2307c7fdd690e4dd214cbfacf4e7d5dd07e6cdd88ce1c02c4ddde3deea843"}, + {file = "pyobjc_framework_backgroundassets-10.3.1.tar.gz", hash = "sha256:5e1198f81db6f30ead2a55e8ea39264f9fce83dcf8e31a68e5f0ea08c5cfe9b5"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-browserenginekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework BrowserEngineKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_BrowserEngineKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:799551f5a432a1389bb73b5d580c55d0a75cdedee3fb093fd28164e30fe20f2b"}, - {file = "pyobjc_framework_BrowserEngineKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0a97c27c8a973131d69ef197d6168cd6e0464bc7005fa67a6d14e1fb09d29020"}, - {file = "pyobjc_framework_BrowserEngineKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3836d388413a047bdadfe7cc5350c1c8c6a89514e6e73334519ee967dbaa6e0e"}, - {file = "pyobjc_framework_browserenginekit-10.3.tar.gz", hash = "sha256:730e0c0b8c741f93a74aaba1dca53743922f0e43bbed0c94831bf18dc5683a5b"}, + {file = "pyobjc_framework_BrowserEngineKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:86c92ef4e79db4066f7887426e99cfec8902fc8949fb666359cf2a9e519106fc"}, + {file = "pyobjc_framework_BrowserEngineKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:69766ba235976e0a1961d3925228d2ef12808298acd0cd66fe9e883424f0f9a4"}, + {file = "pyobjc_framework_BrowserEngineKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5394a5a801563834764ae46204f8ce4d61a0e2d4567716361eaf5f5e3a27aba7"}, + {file = "pyobjc_framework_BrowserEngineKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d5aeff43abed7e87f637086a05f1b77083cfc7cab07c09c447ae2b23621b2945"}, + {file = "pyobjc_framework_browserenginekit-10.3.1.tar.gz", hash = "sha256:0f6ea100bcf06f2b3f915dab27cf2f038698b39510fb47d3769f72ff62c1e80b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreAudio = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreAudio = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-businesschat" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework BusinessChat on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_BusinessChat-10.3-py2.py3-none-any.whl", hash = "sha256:d5e16558060059784e65e1fd96c7ff52a6bb531179d5e5f55882060adb5f6e6f"}, - {file = "pyobjc_framework_businesschat-10.3.tar.gz", hash = "sha256:a320db015134b7cd200d1ec31ab3edb5c1361eef7dc0232d896da9a292015f80"}, + {file = "pyobjc_framework_BusinessChat-10.3.1-py2.py3-none-any.whl", hash = "sha256:952b60f558e3d3498e6191d717bf62c1803f4e1ad040ae29d130090671ec004f"}, + {file = "pyobjc_framework_businesschat-10.3.1.tar.gz", hash = "sha256:53e52981f9da336fcaf6783e82509e06faf8868931213ac70e6bd7395a5859a4"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-calendarstore" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CalendarStore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CalendarStore-10.3-py2.py3-none-any.whl", hash = "sha256:ad3aeea3183f172ac2fbcf8bebdbc4b805664b04922b0c162ab0bd2ccff6bcca"}, - {file = "pyobjc_framework_calendarstore-10.3.tar.gz", hash = "sha256:67f9d202adfc1cddb05552a9f7e1e13bf5e7db401df259105a35070d0c17ea61"}, + {file = "pyobjc_framework_CalendarStore-10.3.1-py2.py3-none-any.whl", hash = "sha256:7afb59e793ea6d28706423faa50bb1f25532d8ed7388c8540596ce41891445ca"}, + {file = "pyobjc_framework_calendarstore-10.3.1.tar.gz", hash = "sha256:21f627b0afb9a667794b451dd3a03f12ea3f74358dc5977c33b8ecc8b9736c27"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-callkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CallKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CallKit-10.3-py2.py3-none-any.whl", hash = "sha256:5a54438c22e66328b6cf3a12e138f5531fef5772bb0c8d542848ad21f0d87857"}, - {file = "pyobjc_framework_callkit-10.3.tar.gz", hash = "sha256:8ba5d5174c9090fa6befe2e0840575ff3fff83fb47629047ed1ccf54991e0972"}, + {file = "pyobjc_framework_CallKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:495354bea298efdc81c970154083b83aff985f2c294d4883a62de3cc4129e34e"}, + {file = "pyobjc_framework_callkit-10.3.1.tar.gz", hash = "sha256:350390023e9ac98ff6c91b1f51da2489eef2e23aa649d0f63c13cf1d8be1e0df"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-cfnetwork" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CFNetwork on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CFNetwork-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c52c47463d1e58c56f9d84bb29374ec71ec0b06f68cdb7359ae33c1572a39adc"}, - {file = "pyobjc_framework_CFNetwork-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f73e6da65867a498303ef315f1182b6e88ceca78c03424e17b7a43bbe0199d58"}, - {file = "pyobjc_framework_CFNetwork-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0e1c060b64e865e88af6fd60965f3fc16f31516e2235025e46e985a55c780b6c"}, - {file = "pyobjc_framework_cfnetwork-10.3.tar.gz", hash = "sha256:9dd4700f88575dce21b0827fde79ac29580f0f4f99a725aa910b9aaad47e0b63"}, + {file = "pyobjc_framework_CFNetwork-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:e6027a90c5442e36a4ef91c9e10896efb5bc1bb4743d732adf3422112922f6cf"}, + {file = "pyobjc_framework_CFNetwork-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:dff41296378029f1a5e9cedbc133b243f096a93fcc8d6985c555459328cfe11e"}, + {file = "pyobjc_framework_CFNetwork-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:01f1c4c43792e993c613b5b8923953eea774d4a7567fbc1861edb2c6c0cfa770"}, + {file = "pyobjc_framework_CFNetwork-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f6a5d6fe5e230cc0d53b9673902f1571ab68b542f3630d7c1319ea1e3e480f22"}, + {file = "pyobjc_framework_cfnetwork-10.3.1.tar.gz", hash = "sha256:0e4c51a75dbf4e2b1c0d4ee60a363f9d31d682d2dd2f6b74aded769d2d883aa8"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-cinematic" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Cinematic on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Cinematic-10.3-py2.py3-none-any.whl", hash = "sha256:2705fe6893bf8ac9c836dc5a10abe781e3e00af9b4b6c72eb455a0bee30b1deb"}, - {file = "pyobjc_framework_cinematic-10.3.tar.gz", hash = "sha256:17cfae0f02b382b9a9f69128279cb5c156b1dfbd205a7f87941a28bf9fd72c37"}, + {file = "pyobjc_framework_Cinematic-10.3.1-py2.py3-none-any.whl", hash = "sha256:48bf35d594f4f010266a028bbf93bd953cc78db7658d3c614e219b482c8d73b2"}, + {file = "pyobjc_framework_cinematic-10.3.1.tar.gz", hash = "sha256:7edaaa7e325aeb39cd0c33329c25783dd54af294229884556daad36d1d1b9d72"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-AVFoundation = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" -pyobjc-framework-Metal = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-AVFoundation = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" +pyobjc-framework-Metal = ">=10.3.1" [[package]] name = "pyobjc-framework-classkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ClassKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ClassKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:06b9a516cbdb6d1a18971a872f2a1306b19e3eb6c2ffb1b1fd54f7bcebc2aaf0"}, - {file = "pyobjc_framework_ClassKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:14f2ccd96c893b7f9ad852c19320eeaed09928a4d6a747aaadab136cf13f6fee"}, - {file = "pyobjc_framework_ClassKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5e2b21fa1f6ec371d6fbc25c044c084537823330314d527eac087fb1827ace3d"}, - {file = "pyobjc_framework_classkit-10.3.tar.gz", hash = "sha256:95279d5e21d2f6298b2956d46213c6ec2acf3762e6e1b62ba6b5c240274de5c4"}, + {file = "pyobjc_framework_ClassKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:980d2605296428d177b0111af914d0dd4a0c5116da5ae944cdd8b6bba733e758"}, + {file = "pyobjc_framework_ClassKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:17dec45d5ec7db663bc87ddf80b8185d2134177f265a12a9a6df778901183412"}, + {file = "pyobjc_framework_ClassKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b74155902851e8e2b31b34c606dd33f9e24d9b8992568cc71b60e1ddc553d99e"}, + {file = "pyobjc_framework_ClassKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:776a600182b7de58676ac661b235356f46683e758d99db1cf60f52aac335389f"}, + {file = "pyobjc_framework_classkit-10.3.1.tar.gz", hash = "sha256:e15700d32007bf77c5c740bc9931c864bb7739cdfcd2b0595377c3ed35ecfe25"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-cloudkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CloudKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CloudKit-10.3-py2.py3-none-any.whl", hash = "sha256:cad1645304336e5fafe9ffca3398bf8592c3b477b3ebb3c94c75b47a085d9dde"}, - {file = "pyobjc_framework_cloudkit-10.3.tar.gz", hash = "sha256:72e2dd2f5ea91c4a1dc45e50eac8566ba85f196a7aa14c159c6f079fcb2e67e7"}, + {file = "pyobjc_framework_CloudKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:53670f47320063b80aa60edd2d813308dce85dfd2112461dd13c060aa9e5b47a"}, + {file = "pyobjc_framework_cloudkit-10.3.1.tar.gz", hash = "sha256:4c7db72c2bb2fcf63365df91bf2eefa83cee4004606b901e1da89b75da652309"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Accounts = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreData = ">=10.3" -pyobjc-framework-CoreLocation = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Accounts = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreData = ">=10.3.1" +pyobjc-framework-CoreLocation = ">=10.3.1" [[package]] name = "pyobjc-framework-cocoa" -version = "10.3" +version = "10.3.1" description = "Wrappers for the Cocoa frameworks on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Cocoa-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:745fcd99cc9ca1827a5b6fa2127d12023428f8ce2047afefc57b1e69f185750f"}, - {file = "pyobjc_framework_Cocoa-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:116b79be8e9756047a9b6f90d2f08c0e640ff86fcea85ca553dbbb4b121b390f"}, - {file = "pyobjc_framework_Cocoa-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08ccc260d3481ddf03784f7dcf2cc7a4e9d8f1ecdf727cb4f80cde7b88416c39"}, - {file = "pyobjc_framework_Cocoa-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:277f5e4d4fab0d431cb5f07fc161a3076cb365099977e748c6a255e94eaad137"}, - {file = "pyobjc_framework_Cocoa-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:008e5ca144a378513ee5f8c5a9009e8b4401ec09edda3648b01f8d8b640b3152"}, - {file = "pyobjc_framework_Cocoa-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3c3f9806aa04dc1cd08e18a98a97629f0d0581fa0d6a71e739934f02e8b1a8df"}, - {file = "pyobjc_framework_Cocoa-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb89620f96d5d0d52a158faeab1b568bed6fa6d0c4f883198e60e60a14db1360"}, - {file = "pyobjc_framework_cocoa-10.3.tar.gz", hash = "sha256:d39f90ffe04143911060c392e62b9514f14caaba119657d6e2b8b197af49e117"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4cb4f8491ab4d9b59f5187e42383f819f7a46306a4fa25b84f126776305291d1"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5f31021f4f8fdf873b57a97ee1f3c1620dbe285e0b4eaed73dd0005eb72fd773"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11b4e0bad4bbb44a4edda128612f03cdeab38644bbf174de0c13129715497296"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:de5e62e5ccf2871a94acf3bf79646b20ea893cc9db78afa8d1fe1b0d0f7cbdb0"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c5af24610ab639bd1f521ce4500484b40787f898f691b7a23da3339e6bc8b90"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:a7151186bb7805deea434fae9a4423335e6371d105f29e73cc2036c6779a9dbc"}, + {file = "pyobjc_framework_Cocoa-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:743d2a1ac08027fd09eab65814c79002a1d0421d7c0074ffd1217b6560889744"}, + {file = "pyobjc_framework_cocoa-10.3.1.tar.gz", hash = "sha256:1cf20714daaa986b488fb62d69713049f635c9d41a60c8da97d835710445281a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" +pyobjc-core = ">=10.3.1" [[package]] name = "pyobjc-framework-collaboration" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Collaboration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Collaboration-10.3-py2.py3-none-any.whl", hash = "sha256:ebc711c769ed01382fe2f0335aeed57336e8ea6d352ba2ea514387e37e14325a"}, - {file = "pyobjc_framework_collaboration-10.3.tar.gz", hash = "sha256:b07f2b722bb6db94efe32007227d927d50c8ec43114fec31224da703de991bd4"}, + {file = "pyobjc_framework_Collaboration-10.3.1-py2.py3-none-any.whl", hash = "sha256:889b1e00bdea09c2423e9b8d493492ec45a70787ddc533bf67d060c7ec0e1f78"}, + {file = "pyobjc_framework_collaboration-10.3.1.tar.gz", hash = "sha256:bbca3de3679b058cbb89ad911e3bdfe491a02b4fa219d5f9219c022774ba237a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-colorsync" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ColorSync on Mac OS X" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ColorSync-10.3-py2.py3-none-any.whl", hash = "sha256:4cf483c9c370fda6ea621d7110b676321511c41b52e4ad33e94c98ebadee0094"}, - {file = "pyobjc_framework_colorsync-10.3.tar.gz", hash = "sha256:27990cde04b111087659507b270bbc788b36b693d1dc95be44e469e78f86e2b4"}, + {file = "pyobjc_framework_ColorSync-10.3.1-py2.py3-none-any.whl", hash = "sha256:0c37075e9b0f1dabc0aa1755687e1a5dada08ae0914ebb593c7810bf8090cf83"}, + {file = "pyobjc_framework_colorsync-10.3.1.tar.gz", hash = "sha256:180960ed6f76084b35073eff49fcca41a8fa883c3236949a40f75daa28ee8f94"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-contacts" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Contacts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Contacts-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe73800104eea8d358dc89f68742bcb65cacbb7e7f3b7caafcdd669b13861057"}, - {file = "pyobjc_framework_Contacts-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:77b2efeaf48b1c1ec5a1aec78323842ae23c774b71aa22a306d66b583b1368fd"}, - {file = "pyobjc_framework_Contacts-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0747f0ff0a49daca0c3ddff28bafe6579bdaaa75eeb4d5a97603e204afc8cf84"}, - {file = "pyobjc_framework_contacts-10.3.tar.gz", hash = "sha256:ca2c9a28bcdb3e0bb0dded2a1a34824c0ec64145e4cdd36b0c8e1edcf8ef0e1f"}, + {file = "pyobjc_framework_Contacts-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:401e40ff638712d011fe54c7b1e9929af994e87cb03d129cd95df2fb90439e4e"}, + {file = "pyobjc_framework_Contacts-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:83de186cd4037171c63899987caa66cc01527688b15176e899cf1a06e6baab09"}, + {file = "pyobjc_framework_Contacts-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e0bbffb430505ad3f91fd58f65b0a6e7535ab5bb28c2ca69ee8a6349f3edfe3c"}, + {file = "pyobjc_framework_Contacts-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d47f694977cf33f5d0b73e2f111edcd57f2ef0cd9a6a38e03b1dea965b8657cc"}, + {file = "pyobjc_framework_contacts-10.3.1.tar.gz", hash = "sha256:7120b5593a20e936cb5589b93ef7fd5558c86bd6ec8003f427afb87c04bbea20"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-contactsui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ContactsUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ContactsUI-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:78497fbb5b3b65b7318680f988919f7862e28ea1da8257a5a068623caeb42675"}, - {file = "pyobjc_framework_ContactsUI-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c5439b1db545c533c3a9578ed2dee39a98c553c7395c9b3ac20e089b1806a312"}, - {file = "pyobjc_framework_ContactsUI-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ba1315b9519930870adb506cb180e967266f30503e645b4974729fdf774a9d1e"}, - {file = "pyobjc_framework_contactsui-10.3.tar.gz", hash = "sha256:312af2525a5a4e45f23c2d9b3817d8ad5bb2395c44f18be3d692ce16e8fe2bb5"}, + {file = "pyobjc_framework_ContactsUI-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:0e939e46ccff1e07e7fa6768a35d646b7302886a99b9efe6b31dea4ea67674ad"}, + {file = "pyobjc_framework_ContactsUI-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4adc77f2fb7ae4e2999cfd72f5d3b8e0e039880f9d60cb8e15050607b249c730"}, + {file = "pyobjc_framework_ContactsUI-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1a605d93b4826cd4646cced6383cb253e65c8babcfd230d5894c1c4d67f6e147"}, + {file = "pyobjc_framework_ContactsUI-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:62ae604a000233c729712e420de734c97afdd9187fdd0bef8e61fbc8c4f6eda0"}, + {file = "pyobjc_framework_contactsui-10.3.1.tar.gz", hash = "sha256:51601501d5bc94c59ad458c7bb1d1994c497b373307dad8bd2ea2aa348f66c4a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Contacts = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Contacts = ">=10.3.1" [[package]] name = "pyobjc-framework-coreaudio" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreAudio on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreAudio-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ce7223a0b0295442a6ffc49c03bae555907ebf4d266ca89446be7db705d17845"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40b7236da5349e892fd57e9a777f068c25659ee832c5c3f938acb65be9e3fe80"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:17bc91198166232a77c935f449b77d9b72ef742638478ab8e2e92740995041e1"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:3444691c03c096902601a52bcf5b985e54d12fea7d9d8f53968a86998876468d"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01e21d0352b46ac49b3154f4557d23ec391687f621d210d59f7283855229d1bb"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:ed9883f42a001c5795d5e04bb57788acf57700769a31d922b7b1be936757c1b3"}, - {file = "pyobjc_framework_CoreAudio-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2d6d278bb83687dec413f43c568e3ccfea2f1192b53e1f7252bd6bb4fa0a992a"}, - {file = "pyobjc_framework_coreaudio-10.3.tar.gz", hash = "sha256:658af891719c3c60d1e36f77662eaa80f63ecaaabbf029f90f107bc1fc86b9b6"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:76a37e27cfdd67e4dcf27f57b680a881c4a2f3bf44ce3b31d7cdb32596e1e269"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bd58e69cabbc987d0c2854ab2d13516889cfe4a2094b80296591ad7df0f30e40"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e0aeca61a425d846afc92350ffba970e1e503469182f5f0ea436de98cfd00d96"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:21cecd1b023b6960d1071c106345656de45a399196701b07c7e5c076321f25ad"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:443b14cc6e64e09e6fb4eae61f6ac1ce19618d9074ae1627d75754fa434ef87f"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:4f8d4c4c4fa0529f178ef6d3676cfe08c9e8ae20c3cdbfe067b562d7395debfa"}, + {file = "pyobjc_framework_CoreAudio-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b93cc6f670feea29f8f4cd2a9511d2220aefde41a89912d5ab8eb06a198e344b"}, + {file = "pyobjc_framework_coreaudio-10.3.1.tar.gz", hash = "sha256:c81c709bf955aea474a4de380b187f3c2e56c864ca7de520b08362b73070c795"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coreaudiokit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreAudioKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreAudioKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:25006ba6109d79532926f9b8c590d386bd2375f411f6adc97f6bb4903a6d78b5"}, - {file = "pyobjc_framework_CoreAudioKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f3f08f32eec59f80784929a372c7bdc4e1c5d4b41cd2889f4fa7af50369854aa"}, - {file = "pyobjc_framework_CoreAudioKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:47b743bdd2ec3d8fec9d6bb7ad08918af016ab8fa55f90808d12427a4b973b4a"}, - {file = "pyobjc_framework_coreaudiokit-10.3.tar.gz", hash = "sha256:7a17534f08a8426e26ee3eec9f80f22aa5be3d6114687344f7545176abd4a705"}, + {file = "pyobjc_framework_CoreAudioKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:dfc967bc448cc0a1fce932e6af15ad42f5ea3eb2f793396e364cf39005c812eb"}, + {file = "pyobjc_framework_CoreAudioKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:6634f3f15d257e93cad4644eb08f5b32376e8a8a7ae2e95d99d36d935b5e9ba2"}, + {file = "pyobjc_framework_CoreAudioKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c2bf1b0c9f6c1d27c98b87bf4cf1ba3d0fa550dd771de948614ca21d15779a01"}, + {file = "pyobjc_framework_CoreAudioKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d5b3adabd7278e64a0deab6d0f6912bfcc667bc26054f5141a556897157dd8f9"}, + {file = "pyobjc_framework_coreaudiokit-10.3.1.tar.gz", hash = "sha256:81f35d5dc45cda043e01f0ca045311f4aebc36c51cb71e859b30ea0edf90b3db"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreAudio = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreAudio = ">=10.3.1" [[package]] name = "pyobjc-framework-corebluetooth" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreBluetooth on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreBluetooth-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1da6f13386165f28a55d71ba73fc93e3a731023cd83cbb0846f43aff7135856a"}, - {file = "pyobjc_framework_CoreBluetooth-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d96c721409979953353e006596f8d646ae35f3a463b2545a4d0083244a81f2a9"}, - {file = "pyobjc_framework_CoreBluetooth-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:439abd4edcbd6f091f4a885afe01f322ca4c879e6eb0edda869f359c5979fef9"}, - {file = "pyobjc_framework_corebluetooth-10.3.tar.gz", hash = "sha256:7ca00c8f96517b4421162846b5f66369360e4523ca917c6e0507d051381fb466"}, + {file = "pyobjc_framework_CoreBluetooth-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:c89ee6fba0ed359c46b4908a7d01f88f133be025bd534cbbf4fb9c183e62fc97"}, + {file = "pyobjc_framework_CoreBluetooth-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2f261a386aa6906f9d4601d35ff71a13315dbca1a0698bf1f1ecfe3971de4648"}, + {file = "pyobjc_framework_CoreBluetooth-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5211df0da2e8be511d9a54a48505dd7af0c4d04546fe2027dd723801d633c6ba"}, + {file = "pyobjc_framework_CoreBluetooth-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b8becd4e406be289a2d423611d3ad40730532a1f6728effb2200e68c9c04c3e8"}, + {file = "pyobjc_framework_corebluetooth-10.3.1.tar.gz", hash = "sha256:dc5d326ab5541b8b68e7e920aa8363851e779cb8c33842f6cfeef4674cc62f94"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coredata" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreData on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreData-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:218b64c79a6d2402852c763dd1accff2113ef206676b2b5a0027e875978cc56f"}, - {file = "pyobjc_framework_CoreData-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1fdb6d56d2902b9cafaeec8cc8fc0ea9b98c49abef59ac4afdb37e9672b9bd1a"}, - {file = "pyobjc_framework_CoreData-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:65de27fadc762d72efd559e1e92f5a98831e492500b6dc0ca405810afd5b72aa"}, - {file = "pyobjc_framework_coredata-10.3.tar.gz", hash = "sha256:1101f071d2e4485fcf3a41ec524cc27e4d0e86b19a03cca19a287ad5cbd1ca31"}, + {file = "pyobjc_framework_CoreData-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:2313aba4236f3a909d2747f4327da83be884adadb734a602ed4319addf88edd7"}, + {file = "pyobjc_framework_CoreData-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:065ff3058f4bc8544422ad1f10dff037bdeed25263cc8ec5c609e54231bf9347"}, + {file = "pyobjc_framework_CoreData-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:049acf980e5226b132a4285c3a94cc8266380e57050c8fd4caec3c5df4ef8c4d"}, + {file = "pyobjc_framework_CoreData-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2f1f4e1217fc02f66435dc2a5cb2e0b41c684c435f13d96bf05cd3d1e0ad4e2c"}, + {file = "pyobjc_framework_coredata-10.3.1.tar.gz", hash = "sha256:8a75094942c8f3ddc1bcbde920c87658d7bb4c7534a4652e60db42d17f4b4a4a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-corehaptics" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreHaptics on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreHaptics-10.3-py2.py3-none-any.whl", hash = "sha256:48077361a913ef7e9927c0110255c29ba58576a33f31276ac53eed18c50b13da"}, - {file = "pyobjc_framework_corehaptics-10.3.tar.gz", hash = "sha256:59cbdda7c4c77556377e97d47887385f9d641278015118c533165f8dd540910a"}, + {file = "pyobjc_framework_CoreHaptics-10.3.1-py2.py3-none-any.whl", hash = "sha256:163b83ea727cbac5c0963d16ffda89c9f1626ed633d5e52830c7918b8599a693"}, + {file = "pyobjc_framework_corehaptics-10.3.1.tar.gz", hash = "sha256:5a7cc117c0b64428e1f08dc9c8b76dbc5d8f61f80dc41e911d11ddee4e0e2059"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-corelocation" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreLocation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreLocation-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7bb5bc7835783f20a7262956a276526bc58bd74c1445a1272158c40704ebe3c1"}, - {file = "pyobjc_framework_CoreLocation-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f0de20706d176d118c65b551857d93c2f825a1ebe6aafedaebcae25bde61d917"}, - {file = "pyobjc_framework_CoreLocation-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:80f35e370a047bf67dffb6986adbd5f4dc80301760634722f9375fd2a69d0632"}, - {file = "pyobjc_framework_corelocation-10.3.tar.gz", hash = "sha256:0c48a19d253ac5746327a2bb12216d91972dc409809982f5bc8c03a301baebae"}, + {file = "pyobjc_framework_CoreLocation-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4cc83a730db7f78ca5ceef45ea4c992084d8c90bed189939fa3f51f8e9ea83ae"}, + {file = "pyobjc_framework_CoreLocation-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:97d5aa35214e417c9a03ac7209630dc445b98652932642dd0497f1ec52624bfe"}, + {file = "pyobjc_framework_CoreLocation-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:86d0e00b7eef5a3e2f01ea309cdcf58807b251138008edcfc65d3c31af8a5bd2"}, + {file = "pyobjc_framework_CoreLocation-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5c4ded6388f99a18ce2b9d7082b8a43a19b6d9f8f121e2147d10bb37a25e1714"}, + {file = "pyobjc_framework_corelocation-10.3.1.tar.gz", hash = "sha256:8ae54e5bd4c07f7224639d815f7a6537fadee17c11cb35dd99c2804bac1825ab"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coremedia" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreMedia on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreMedia-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:29d365c3eb9b3d40168c17f55df193c8b1db08668911c78a74d58d3f90ba4881"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:efc4f40a216e7a3503ff1f047124ffa3ebbc7d7574128c361ae0c7189aed58d4"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:88e934d2231febcfa049a274a6d4db86987c986958adffa5cd972c2b25b7cddf"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:52de7b47a04743e12617f9de17216590ff6c5120f610bf962d7851f449309632"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b1a93d2535b9f41fbd03a10dc15ea13a8675cae408f18122acce9e10e2e3a2c2"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2567dfafc595c92f5e7c1cd52fd49d7edb6f581a6eb9ae3929d195458097d62f"}, - {file = "pyobjc_framework_CoreMedia-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1ee5e0ea21cc43d584cdaf304e5b34b1bf34279e787fc1751bb78cfceada464e"}, - {file = "pyobjc_framework_coremedia-10.3.tar.gz", hash = "sha256:91e9752da6dd04a21349fc5a640c4665357fbcdba45f4800bb634b466fd05173"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ef02d87f12ba54e6182ea72fd5732cf6d348982c4263dc9c0b11e4163fbb877"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e63b002cf5e34540cba3f3a1704603ea0fb076ffc1ea42c2393a0679f40846de"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c6eaf48f202becab10679e3b5dd62607ddec2739495db45882524592cabf3997"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:98b8ab02e6ec979007b706e05166e16bd61121e47fbc6e449f4b2de2c58f3cb6"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:77ca460cc35e39b9f820d9f20e93bfa89439b23dfb350ba201448b1ee958902c"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:6ed3adf48fe3001d1b5acce688ecd5b75e0fa5f56d9f296ec120748cd36f2d24"}, + {file = "pyobjc_framework_CoreMedia-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b5bbed395bb8a8b0b4b8bb5475fd19f2a28d385c4d3a783cb590c9ea5e801baa"}, + {file = "pyobjc_framework_coremedia-10.3.1.tar.gz", hash = "sha256:bc3e0cddf5f546b5d8407d8f46b203f1bd4396ad5dbfdc0d064a560b3fe31221"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coremediaio" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreMediaIO on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreMediaIO-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:25b7359a195e4e9339744d835290a9232a783bc03eb4b21dfe5076e56fde5d05"}, - {file = "pyobjc_framework_CoreMediaIO-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0fdcd3332de8942a39181eca08ac42ab71296275305ca76c9fbdeed9ac020d1c"}, - {file = "pyobjc_framework_CoreMediaIO-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e78950d9d0fa6bcca95fd4f414824da3b722e501be1b2c519d557b69b03dadaf"}, - {file = "pyobjc_framework_coremediaio-10.3.tar.gz", hash = "sha256:d136225bf4fdae1b3962b0b163733e06ff104fd55c424424bdaa93d5acb7507b"}, + {file = "pyobjc_framework_CoreMediaIO-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:07e19e89489a372ebea9e8a5cfaf1ec03fd570e65ed3fa2dfa44719d1e337a36"}, + {file = "pyobjc_framework_CoreMediaIO-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c3bc3d8f3648b6a4126983119d9fc4e21d2c7ec06beb284c57039ca1033ceb03"}, + {file = "pyobjc_framework_CoreMediaIO-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b158612a62cabd7f61c1f2a4d08d4cb4682e1b2ba140a4d09ca88b1ae3014443"}, + {file = "pyobjc_framework_CoreMediaIO-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b3e9a9813bf5331bd0981e0a66ff380c5c927854f644e5cb62a2beaabd73b15f"}, + {file = "pyobjc_framework_coremediaio-10.3.1.tar.gz", hash = "sha256:5da3ed78475223dd3400fdb55fb97d543a248086f5cf8b77bf4aceac3df1513c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coremidi" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreMIDI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreMIDI-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1a1950ad4effaa46fde70b3c08331ba105b244b3ffb49fb44bf13590883d5af7"}, - {file = "pyobjc_framework_CoreMIDI-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0eda91893eeb21e25e3750a86f2d995d101cb0aa2d3a6620ada7ffbe866592ca"}, - {file = "pyobjc_framework_CoreMIDI-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b9cb89bc18165114a9675891586ca30d572270219b170619ac89f6313a68598d"}, - {file = "pyobjc_framework_coremidi-10.3.tar.gz", hash = "sha256:dd863a02a7cde849fdf1406bc604c86ce03812063fbc3fbb524f77e2b220a145"}, + {file = "pyobjc_framework_CoreMIDI-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:00a6869c2365b90cdf6e1ed0bbde6d87fe4daaa40ed243ee810e3cc3945f185a"}, + {file = "pyobjc_framework_CoreMIDI-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:92d04962f7ea63be03127880d4659f718f5b44b6a57a0e619a96d9def619bddb"}, + {file = "pyobjc_framework_CoreMIDI-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1be5f2d3c0c7c23817ad49a25d8cf8c84b9e420bd5fedc0065ec1322f5d5f2ab"}, + {file = "pyobjc_framework_CoreMIDI-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bbe2bfb537e8adcca703a2c76b21ca1741d32691205af00a5ec67c025ee5d8e1"}, + {file = "pyobjc_framework_coremidi-10.3.1.tar.gz", hash = "sha256:818454b56edae082a3a4b4366a7e93b8bb54856be01ee21bb8527a22a4732efc"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coreml" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreML on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreML-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:1c2427c9d0150cc270aef9385cfa6dcd47f0264847c07c96aca6f14d3b5015f8"}, - {file = "pyobjc_framework_CoreML-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:403754cd9f5bafdddab8d7227dedc79c4bcbe19887e333103e35a25d3ec2452e"}, - {file = "pyobjc_framework_CoreML-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3e468ca8f2e2430cc4b7e87bb42d5caa15a58f9f9d3df682dc1ac029cfc54113"}, - {file = "pyobjc_framework_coreml-10.3.tar.gz", hash = "sha256:37f86fbf7cf90809a43ad81a8fc31190175b9b78e792351817d124c3daf1302a"}, + {file = "pyobjc_framework_CoreML-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:c1fdcc0487807afa9cd0f88f25697e0e2e093d0219e8e1aa42aa3674dd78c2cb"}, + {file = "pyobjc_framework_CoreML-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:21c87e84c807b5dbe61e0f016d9aefa32d3212f175cc4b976b5c08770be7a58c"}, + {file = "pyobjc_framework_CoreML-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a0877aed5d4cdbb63d1246cd5384c09d78a0667e83c435a1257d10017c11c1a4"}, + {file = "pyobjc_framework_CoreML-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4bd3f1acfb3245727727b71cbcf7d21a33d7e00fa488e41ad01527764b969b92"}, + {file = "pyobjc_framework_coreml-10.3.1.tar.gz", hash = "sha256:6b7091142cfaafee76f1a804329e7a4e3aeca921eea8644e9ceba4cc2751f705"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coremotion" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreMotion on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreMotion-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7457a9167f70e5e41055663364431bb66c0995bbf4078183323b0f7492d6f62f"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d0e03179739670d0c1a4a7b50a2b652163c16e8ef3a0e88962179430058abbc9"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:eaa3fa5638717011f0eb64e2b1e8354574b363780efadd37bdd6490f0a0fa1ca"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:f924079954b0035ff95e943c88964879c0cfd35f59b285586fc1034f421c8060"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379f74023ce989df59df8d4fe6a6ff0e6ac5e081ae45ab457c173b301e9a2f87"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:39734bd0a2fe727208ecd795edc75ae85cca5745297c7783fd0d9fefd0b8e16d"}, - {file = "pyobjc_framework_CoreMotion-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:731e556f2ba5f24d941d5b36f9c4282e26f78794dc80c4de37dbfd12492dc83f"}, - {file = "pyobjc_framework_coremotion-10.3.tar.gz", hash = "sha256:981c395ba01b5e9cfe1474d8f180b9ccf42b35cf45ed8159b1ee4d1e4bd33721"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f8c320df1806ccd8c2b1ac32c9b9a7337816ff13cf338a710a2f15ee550f58cb"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a003478eeb520c7f28be4d9dc8f9e02df6ffa8921d46c8879e2b298c9fbc6926"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:63c8f831ad522212627f99ae8d6f34161628230afd544203646e7d66596d6437"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b78d2bcc71149821a49266eb548faea23abd7a25b7cd3f7a7f20b1d343a8786"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28b431e448b884830c846d156d9c6626b265d9ede70ad233d77ceceb67366a17"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7d4f95398ac5741a6dd1711e129f6173111385e26d858c59be8462543f62a8a1"}, + {file = "pyobjc_framework_CoreMotion-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:89c78be31e276aa88d848b69a2f8d11360deaa7297222bd5369ecd1910de166d"}, + {file = "pyobjc_framework_coremotion-10.3.1.tar.gz", hash = "sha256:6ba61ffd360473b018702b9ae025eb16b8aaa45c6e533121522f26eef93a9f71"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coreservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreServices-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:73b72eb37f7f1ee6f0dd4741adc56549806501c023b50d1425cf0765163caf3f"}, - {file = "pyobjc_framework_CoreServices-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:002139b8bcbb268eaf37c9055efdc9f70d6eab3bc7d36d169162968eff10aaf4"}, - {file = "pyobjc_framework_CoreServices-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:13e4c1a0cd54a557267a86deb47a8c8bc24ef2a4f1b427c2ddc4852f830c96ff"}, - {file = "pyobjc_framework_coreservices-10.3.tar.gz", hash = "sha256:a7c38090c26a2e1b600fb31c3b056ef60e86bacfbb26ecfbcdd997ed61b1cdc8"}, + {file = "pyobjc_framework_CoreServices-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:58d5708ee0a2ad7eea180864fe68123a2464b987ea089d0646ce69e2002500b0"}, + {file = "pyobjc_framework_CoreServices-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9d43b77fa11af139ba39d94921e695cf804226737f68167f8bdb8f1c449c932e"}, + {file = "pyobjc_framework_CoreServices-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e6c7b6bb821cc7fb4f04c08560d460783a7fa08093f5e153241bf10296a16cb4"}, + {file = "pyobjc_framework_CoreServices-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ccb64113ee612a05308ab8ed57ec224e22445d5a125bec11e24c35d58d1f77e4"}, + {file = "pyobjc_framework_coreservices-10.3.1.tar.gz", hash = "sha256:2e46d008ee4ff586420175888c45f8eb0f002ed5b840c8f7893c560af01b2d72"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-FSEvents = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-FSEvents = ">=10.3.1" [[package]] name = "pyobjc-framework-corespotlight" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreSpotlight on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreSpotlight-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:34497a442230e6f98e99374ba5b0694aa36ae730aece3869c022953e54554876"}, - {file = "pyobjc_framework_CoreSpotlight-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ce50141e3b0225d79ec39c99cd1fd5ba71fc02c83e4b87b39a98c6abe1b8764c"}, - {file = "pyobjc_framework_CoreSpotlight-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:07df5335405ccb55a12a44fe9bb7c3104068b5f9340ced6dd0e47a7098fa18c3"}, - {file = "pyobjc_framework_corespotlight-10.3.tar.gz", hash = "sha256:532340debec937393569d27f8f28af16fc46270e47299dad63634e05b58161da"}, + {file = "pyobjc_framework_CoreSpotlight-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4aa9b01b8d722ba9e803ec4a2329ee8da0bdecb9a004a668b793b957544a6d81"}, + {file = "pyobjc_framework_CoreSpotlight-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9684f735fd3d3e8fae447e90a2c246bf6a8d4ca37f619174208d65daa86d9ca0"}, + {file = "pyobjc_framework_CoreSpotlight-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:31b2a1309c747bb6e4d1ddc8368885af2948af55441fbf9817ebac193c1b815b"}, + {file = "pyobjc_framework_CoreSpotlight-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ba5a20e860af7246da67bb00db15d8bd5c5110b8a12a44568bd68030f51db478"}, + {file = "pyobjc_framework_corespotlight-10.3.1.tar.gz", hash = "sha256:6b8ad243a65943d631434a9ff4696458cdd3d0cb631cfeb501a967fe29445c30"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-coretext" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreText on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreText-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d68d8a4cd2e86a1a6fb748beea20ae5256221ec282c69becb16334ae293c17e"}, - {file = "pyobjc_framework_CoreText-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb7d4e89d7f6d579ec807542cebe815e62fe37a473342c8f026b6b048260d591"}, - {file = "pyobjc_framework_CoreText-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:bc4a53c6e82606e24d4e096f4c503c78ec0171f67cd3214c571ff443c6edaa8f"}, - {file = "pyobjc_framework_CoreText-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:4c2c407a24aa44acc3495098e394e33a332e3ae03d68cc6a045f94ad0a6c51e7"}, - {file = "pyobjc_framework_CoreText-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a43f90662021248c6c9e31a9d9d75a33b9eecb738075998798926ceb5c243455"}, - {file = "pyobjc_framework_CoreText-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:bddc0f7f72a92747d783cecd0a51eb1936d73dd77a5d1de48317d4a7e1293c98"}, - {file = "pyobjc_framework_CoreText-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8a697a4bbd51a45bb1c74baa3f83fd224c01e6352528b1c2485a01359785e695"}, - {file = "pyobjc_framework_coretext-10.3.tar.gz", hash = "sha256:d1c5f4345783451314f6f9725f0d020d02f112eaa8acd2cd15c27ca8e7639a64"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd6123cfccc38e32be884d1a13fb62bd636ecb192b9e8ae2b8011c977dec229e"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:834142a14235bd80edaef8d3a28d1e203ed3c988810a9b78005df7c561390288"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ae6c09d29eeaf30a67aa70e08a465b1f1e47d12e22b3a34ae8bc8fdb7e2e7342"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:51ca95df1db9401366f11a7467f64be57f9a0630d31c357237d4062df0216938"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b75bdc267945b3f33c937c108d79405baf9d7c4cd530f922e5df243082a5031"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:029b24c338f58fc32a004256d8559507e4f366dfe4eb09d3144273d536012d90"}, + {file = "pyobjc_framework_CoreText-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:418a55047dbff999fcd2b78cca167c4105587020b6c51567cfa28993bbfdc8ed"}, + {file = "pyobjc_framework_coretext-10.3.1.tar.gz", hash = "sha256:b8fa2d5078ed774431ae64ba886156e319aec0b8c6cc23dabfd86778265b416f"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-corewlan" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CoreWLAN on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CoreWLAN-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:485ea9c1cbddf8f3d76b162fd1498a5ac882294cb5699d978e3e7e083951cebb"}, - {file = "pyobjc_framework_CoreWLAN-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ca8fdf5d7d8a1fe96c673c377d8788780d61380565c16a2508736435e0c1a61"}, - {file = "pyobjc_framework_CoreWLAN-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1a41570f7d9c2d298430abb6ee9b631cbbacafca9989627ddb8e8bd97de414d1"}, - {file = "pyobjc_framework_corewlan-10.3.tar.gz", hash = "sha256:1ddc4d9bf0a02f3a8cd2add8721edcc5595dde0660ca02746db3cc0ce2b0af9e"}, + {file = "pyobjc_framework_CoreWLAN-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:0b9b9a6f54c11b6adcb04eb07686c8a8372140619876073d6355498da7ecd074"}, + {file = "pyobjc_framework_CoreWLAN-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8d68dabd2fdb74e5263f1e05fa039621c197907347e045cd672a54b3ac537140"}, + {file = "pyobjc_framework_CoreWLAN-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:995260e02f858ffa0781ec0d632e60e0567c45fd551102d36fe67a351f81697e"}, + {file = "pyobjc_framework_CoreWLAN-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e7120d4f7a73cfc283ca499165e8aaf2628bfb82773917e144c293447cabbdba"}, + {file = "pyobjc_framework_corewlan-10.3.1.tar.gz", hash = "sha256:d340d976b5d072b917c6d3de130cb4e7a944ee0fdf4e1335b2aa6b1d4d6b4e14"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-cryptotokenkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework CryptoTokenKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_CryptoTokenKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d9809ea10b0987d01f08d7948cd577a0dbc38f82d400270d8ff5903671bf99ab"}, - {file = "pyobjc_framework_CryptoTokenKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7272b025e56b5623994a629fd67c56ac84ec79976fe198640778f5b92b259c95"}, - {file = "pyobjc_framework_CryptoTokenKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:38d03fbd3348c471e201ea542b170bb633122e05dfb269b17e1d89ea01af2e0e"}, - {file = "pyobjc_framework_cryptotokenkit-10.3.tar.gz", hash = "sha256:d810a0f72cfe0a03ea57ce5efa9b44f1cbf73ea924431710338df8424a0ac4cf"}, + {file = "pyobjc_framework_CryptoTokenKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:6c88948bc8d30cd125ae29ffe551315e08c0fb49654d4f36ba4b3f0fe2f85259"}, + {file = "pyobjc_framework_CryptoTokenKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf0735d5d8e3ff61650deaa9670df62032dc218b865f21cd6b36b0d4c00b88ae"}, + {file = "pyobjc_framework_CryptoTokenKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bd58e48912a9b044c0203e39938b2108cab9b3a4903134ebb1ef610b45570802"}, + {file = "pyobjc_framework_CryptoTokenKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b53fdc79a095d327dff7e68e2545b0825437520f105b1341e5f638e8e1afb490"}, + {file = "pyobjc_framework_cryptotokenkit-10.3.1.tar.gz", hash = "sha256:ef1c4a3b9bc5429eceda59724279428e1f8740df2c5a511d061b244113b6fd97"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-datadetection" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DataDetection on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DataDetection-10.3-py2.py3-none-any.whl", hash = "sha256:50d5c2f6856251ca33d8d82545c2c9f57742f6623857855b1a9e5e52c2dbcef0"}, - {file = "pyobjc_framework_datadetection-10.3.tar.gz", hash = "sha256:eb3f1e8383affbc594b161dd5c73d398a553f03af837eaef13a81fcc6690637f"}, + {file = "pyobjc_framework_DataDetection-10.3.1-py2.py3-none-any.whl", hash = "sha256:618ea90267fd4b83d09b557b67342ad5f3ac579090020e081dca6c664f1ae598"}, + {file = "pyobjc_framework_datadetection-10.3.1.tar.gz", hash = "sha256:5394350cd7e7f40562dc0777f26dd9ddf4a595d20cb6e3cd601938e9490c963e"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-devicecheck" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DeviceCheck on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DeviceCheck-10.3-py2.py3-none-any.whl", hash = "sha256:a1982656616dfb4749d0dfb58e8ecc99f382599e678d66c6b3f5da87486dc499"}, - {file = "pyobjc_framework_devicecheck-10.3.tar.gz", hash = "sha256:e75e2261f61686a4590bdceef43357d8ba972b61e34ad9d0c2bf9dd07c405360"}, + {file = "pyobjc_framework_DeviceCheck-10.3.1-py2.py3-none-any.whl", hash = "sha256:9a3b291a2583bac2b65ff902c4b7872c1068736e249765906f530ae5a6eb8085"}, + {file = "pyobjc_framework_devicecheck-10.3.1.tar.gz", hash = "sha256:7f6f95c84dc3d1f62aa07061f79b47d19463390d977e5afb444ef9fdd9177a9d"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-dictionaryservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DictionaryServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DictionaryServices-10.3-py2.py3-none-any.whl", hash = "sha256:8ed612ff352f943cd9f7f5b77bd1d9da76e8ba2a852eb43c97cbfa692c506396"}, - {file = "pyobjc_framework_dictionaryservices-10.3.tar.gz", hash = "sha256:07ef0bc72a79f9634cd32f2fcd6299b60ae3b0c57e123fa36d298e9390f88351"}, + {file = "pyobjc_framework_DictionaryServices-10.3.1-py2.py3-none-any.whl", hash = "sha256:e40933bc96764450dff16cd8ca8080ec83157a93ed43574441848ea52f24918d"}, + {file = "pyobjc_framework_dictionaryservices-10.3.1.tar.gz", hash = "sha256:c9fb8ed1b92f63c6f568bcdbadf628baab1cb8bb4cd01dbd65424d59c236a552"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-CoreServices = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-CoreServices = ">=10.3.1" [[package]] name = "pyobjc-framework-discrecording" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DiscRecording on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DiscRecording-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4059e53356d0c52c8913fe63b440dcfa94312c6d10d0f4473f32a0f32859cab6"}, - {file = "pyobjc_framework_DiscRecording-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:739a8d2463af29f498f7c119084c379d2aa22bb07af837f0a0fe9e4508e7d1de"}, - {file = "pyobjc_framework_DiscRecording-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:0d74a12e75699d99bc4ed3cdc1c06ae8ae31fe15ec3899d238963404bcd0cd43"}, - {file = "pyobjc_framework_discrecording-10.3.tar.gz", hash = "sha256:f56e054af941feafa9b8599dd2e399460d31b96a9ead11ea794057531ed8623d"}, + {file = "pyobjc_framework_DiscRecording-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:99ee7b1762c7e2a4e0b74c36416f4095695ea33505c7de03875a4f46a5729af7"}, + {file = "pyobjc_framework_DiscRecording-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c4233f2649e34be2dd158752f0f0180c7db4ee705cc14aa62bc03c1f77318ca3"}, + {file = "pyobjc_framework_DiscRecording-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54016cd30b81f1f065d3a4d90b008c1bcfa77891cc79c68d72dff65e9d81e083"}, + {file = "pyobjc_framework_DiscRecording-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:da84170af530cda7b1f32023d5e8b98b62914c573c6ef571e562473d0b94fe6f"}, + {file = "pyobjc_framework_discrecording-10.3.1.tar.gz", hash = "sha256:47865c9a0d24366b6ede01d326d57404346c3d01e249f417bd2b0b3de00d6c54"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-discrecordingui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DiscRecordingUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DiscRecordingUI-10.3-py2.py3-none-any.whl", hash = "sha256:65d49b052c1c200b450607f72defa854863a5d8cae21d52acef7099c779d5b27"}, - {file = "pyobjc_framework_discrecordingui-10.3.tar.gz", hash = "sha256:374b4ab5b09f45667f610e2b10a88a7874cff713fba97e46f3dac5c4f324be4b"}, + {file = "pyobjc_framework_DiscRecordingUI-10.3.1-py2.py3-none-any.whl", hash = "sha256:cb25c70117a5c5eeb4ef74a96da48e2da171f01b7e92d1b7bbd7808068e8960c"}, + {file = "pyobjc_framework_discrecordingui-10.3.1.tar.gz", hash = "sha256:4b9c804a97c89001feddb58106cdc3e099e241314f7c4de062842d27b1318b68"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-DiscRecording = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-DiscRecording = ">=10.3.1" [[package]] name = "pyobjc-framework-diskarbitration" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DiskArbitration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DiskArbitration-10.3-py2.py3-none-any.whl", hash = "sha256:cd59193185f064df2a5bb4d79b337efffec81059ff6049b183b72fe287b5c867"}, - {file = "pyobjc_framework_diskarbitration-10.3.tar.gz", hash = "sha256:e02f6b52d6bdce90e151a77cf1e2c41e9d704608a7c8a049d079a78bc1bf1c80"}, + {file = "pyobjc_framework_DiskArbitration-10.3.1-py2.py3-none-any.whl", hash = "sha256:f0f727435da388efd035bdd510607a5f5769b22be2361afc5b8d4ee081c70cce"}, + {file = "pyobjc_framework_diskarbitration-10.3.1.tar.gz", hash = "sha256:0776318cb56f8e095066a880812c4fc5db2071687846e23a000a947a079f6c6c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-dvdplayback" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework DVDPlayback on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_DVDPlayback-10.3-py2.py3-none-any.whl", hash = "sha256:7d3e2aec568910deb7e9661185ff55e101726280f90a567d93d2cc40de0c24a9"}, - {file = "pyobjc_framework_dvdplayback-10.3.tar.gz", hash = "sha256:0db8a36223e1471cfabe3ee2767e81cac2686ac178fa9549fafa43a2def664a5"}, + {file = "pyobjc_framework_DVDPlayback-10.3.1-py2.py3-none-any.whl", hash = "sha256:c0fb2e96ce4eae8def642f1c4beaec2da3cdf61db1562d4b5199d1334d1a10fe"}, + {file = "pyobjc_framework_dvdplayback-10.3.1.tar.gz", hash = "sha256:1f7c22624dee9b1b54def15f12a3f7cacb28052cd864a845eb24b7f59de12257"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-eventkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Accounts on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_EventKit-10.3-py2.py3-none-any.whl", hash = "sha256:8644a1547b1d1a012306abbc6c5693d3302b98bb5b1098fb81e060885995bc70"}, - {file = "pyobjc_framework_eventkit-10.3.tar.gz", hash = "sha256:a9c7609e6b800d5378bd0fa05e19de878c000882a6b0c9ad716684fa0ca7bff8"}, + {file = "pyobjc_framework_EventKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:ad9f42431bd058ff72feba3bbce6fbd88b2a278c3b2c1cdb4625ea5f60f1ecda"}, + {file = "pyobjc_framework_eventkit-10.3.1.tar.gz", hash = "sha256:3eef14ba439be1c5bc47da561ccea3941daba663577efac7a58e3031d27e056b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-exceptionhandling" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ExceptionHandling on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ExceptionHandling-10.3-py2.py3-none-any.whl", hash = "sha256:5b5148bf5cbf70acc3713e5b8feef4fda3d8b1a9c515b1478143fa65cd6efc0f"}, - {file = "pyobjc_framework_exceptionhandling-10.3.tar.gz", hash = "sha256:7f3d4bca9dd23b1b10ed6174fe39e4c92368bb7e2a85fd237de37196a78dc8c4"}, + {file = "pyobjc_framework_ExceptionHandling-10.3.1-py2.py3-none-any.whl", hash = "sha256:79843a681a1d0f9ee2b7014dcf7e1182c99c83e49cf6cea81df934ebbdf4050b"}, + {file = "pyobjc_framework_exceptionhandling-10.3.1.tar.gz", hash = "sha256:ff6208777739f8a886d0cbfe20692b41cc4e5e0607419c47d2c5d405b6b4c6ee"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-executionpolicy" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ExecutionPolicy on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ExecutionPolicy-10.3-py2.py3-none-any.whl", hash = "sha256:6798cd17078d8a65544367243a432e54947c312885c7b0adf0f5fefe4f156b92"}, - {file = "pyobjc_framework_executionpolicy-10.3.tar.gz", hash = "sha256:16dcde7e8c81af347892b943f9e22633aebe772510bfcea19d688baac5cc1414"}, + {file = "pyobjc_framework_ExecutionPolicy-10.3.1-py2.py3-none-any.whl", hash = "sha256:f2eb203fa4c7dcf18a0ab3a4a94cb30a9f82cf888c237994dbbdb15adf01c8d2"}, + {file = "pyobjc_framework_executionpolicy-10.3.1.tar.gz", hash = "sha256:cc066dc8378fc2a1a4e6129c4d09e2076dc9a5b09925f8dd959aad591cbf9a44"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-extensionkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ExtensionKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ExtensionKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:84d4bd8c753a4c532dd5553e6d2d9900e6b534bff6b8b2f09b55fb85bc13896f"}, - {file = "pyobjc_framework_ExtensionKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:28b4979a1f373b70d0f00e5ed1187d1f28861199373bed607c868c06e634d0cb"}, - {file = "pyobjc_framework_ExtensionKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:65ed21df1e0aabf615be87d3cc985d761ffe88e77ba5e99db214bc48a100c483"}, - {file = "pyobjc_framework_extensionkit-10.3.tar.gz", hash = "sha256:928b7e5e1a1c5bb80b6e7c0b1fda0dda88ea212d15372f3ead7404283138b159"}, + {file = "pyobjc_framework_ExtensionKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:e2b54a5b32c959fc1500936b73c7ebd6d7ffcad23d74b9a6ff3db4ea5660f731"}, + {file = "pyobjc_framework_ExtensionKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f5b1e9c7e3a64224acae7b4c2d26d2a654edc54382e9e88aa3b056f4033508f8"}, + {file = "pyobjc_framework_ExtensionKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:62bc537cbeabb24667434c82515827e64c31d761bdcd02cc3ea6bb6a9a35873e"}, + {file = "pyobjc_framework_ExtensionKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c66797352b71a944810447c81133935656d8ea9bb847775a1532cf06d8deb1d3"}, + {file = "pyobjc_framework_extensionkit-10.3.1.tar.gz", hash = "sha256:91946030195fa17c5248655b10786ea60b9aee7d83a4627ba56768600b4e7674"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-externalaccessory" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ExternalAccessory on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ExternalAccessory-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:833dc91f933f40ef2e54fcaad4328154d1cedde46a289dcecf59ba87554fd344"}, - {file = "pyobjc_framework_ExternalAccessory-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c04f1470aa59c9930d732c04872aa44bd0a0ea6414c5d330e51fd323538f4675"}, - {file = "pyobjc_framework_ExternalAccessory-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b597b2c5c1dbf775cfaa60407bce7c0a7ecdfb40ccd9b0c03413c250b607ae20"}, - {file = "pyobjc_framework_externalaccessory-10.3.tar.gz", hash = "sha256:fa481f7171f7d42bb77e1d5d525798dfed6b6d89e4a789c0d252d9319b13e3b1"}, + {file = "pyobjc_framework_ExternalAccessory-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4395607570f1dd91abd786422fc516f83b4b2a5185321e6581d33dbe74a52c63"}, + {file = "pyobjc_framework_ExternalAccessory-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3fcdbb2338e7bd0fb66e9074dc95f2f989146ae92c66eb4282cfc1a6533cbe6c"}, + {file = "pyobjc_framework_ExternalAccessory-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b076ba07c84b1f4ef9a8a1aa095b66416119b1484b5111b2dd3041f2d301d1a1"}, + {file = "pyobjc_framework_ExternalAccessory-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4771cddfed6422502831a9bf88fa572918d1ca71a3e34e068f442d1197630267"}, + {file = "pyobjc_framework_externalaccessory-10.3.1.tar.gz", hash = "sha256:3ba1a7242448126b4af0fb93963790d0066766bcba2770d935111093e87b7b83"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-fileprovider" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework FileProvider on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_FileProvider-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed3171ca16e0cdeb5d76e557efc622ec30768a236ef3a4eb4245fd2444fd4e3b"}, - {file = "pyobjc_framework_FileProvider-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6fb9753039e37e4762fb42d1f29bf335f56323186913189109480cf849481ff6"}, - {file = "pyobjc_framework_FileProvider-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0c7253a92ed6b739a8cc92f1d874acf9323190a11c3271907cb8446619fa7b66"}, - {file = "pyobjc_framework_FileProvider-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:9991c333d3f7bd0c940c7363a6ab93eeb11cbe5b8795ccf6cfeb80b8197f9758"}, - {file = "pyobjc_framework_FileProvider-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b454f39902b88f840b4042752925e412e0e68ed3f95997ddd0d451481e42e22"}, - {file = "pyobjc_framework_FileProvider-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:16afd455c1a654562bc01ab2d62b4499ebb419991c45142aceb1663dccb375b5"}, - {file = "pyobjc_framework_FileProvider-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bf96275c3d8536af578984b8d2c638362680fb66452a58ba000977da6342a180"}, - {file = "pyobjc_framework_fileprovider-10.3.tar.gz", hash = "sha256:d0def20f2de25465b2d9090ef86063719736ef3e568bf7b2e7e9c3bd2c1fcbec"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:36f66bbd308fdf80d8fe21b89212af4b89bc80dff8cee5f785d5a6fcce942bec"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b44bcbf3d826fd8a0cbc53142c65655433d553205fb36811486757e2089e6c5f"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b28294768dc71190019c2b2638e27b7ebf6edb65a90721b86613083bd86f6b2d"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:bb07a0b7e259030c7bc034c590c77a22e44427320c99bf74e5348551fe0da011"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3e61b20aef5083df2303bf36f181fb83b02b9a7f4868af0e9229d94d7bc1828f"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2ad657fa433d1922f40d581e87af1c2f7002c4835fa49235fdb3909eda23e1e8"}, + {file = "pyobjc_framework_FileProvider-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e66548dfc9e81489bc66e245c97760c457371c25ced87a28bdeca655b548447e"}, + {file = "pyobjc_framework_fileprovider-10.3.1.tar.gz", hash = "sha256:63a4160e6cbede0f682145f4303ed889bd9f3c9fccfecdc32636a8d95aeceeab"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-fileproviderui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework FileProviderUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_FileProviderUI-10.3-py2.py3-none-any.whl", hash = "sha256:b11c922e017c3e11e957b459f3741331ddf3b4403aab7a9a477cfbab40c23e0e"}, - {file = "pyobjc_framework_fileproviderui-10.3.tar.gz", hash = "sha256:44dd84dcdcf187fd45ce34bacacb0eb6797f41767e663675eb37ec25bb2c8544"}, + {file = "pyobjc_framework_FileProviderUI-10.3.1-py2.py3-none-any.whl", hash = "sha256:14be680a7fc78def5174ec5a6d890d407678cff723d6b359bba66bc0a78bd31a"}, + {file = "pyobjc_framework_fileproviderui-10.3.1.tar.gz", hash = "sha256:2a3f3b9b81aff216df76bc72c8e8730d7ba7f3b2412720f68b722bae58f82797"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-FileProvider = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-FileProvider = ">=10.3.1" [[package]] name = "pyobjc-framework-findersync" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework FinderSync on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_FinderSync-10.3-py2.py3-none-any.whl", hash = "sha256:50c0f0da42ecb10174969d41d23051ab0c6a605086e05d9de17f7cd2dcb9e0d8"}, - {file = "pyobjc_framework_findersync-10.3.tar.gz", hash = "sha256:1b15d4aa42d636968a243832777c39c944844a1d7da435da28c9d0a4f78beec8"}, + {file = "pyobjc_framework_FinderSync-10.3.1-py2.py3-none-any.whl", hash = "sha256:d4778de8a9b386c16812d470d1ad44d7370970d1dbc75d8bea390d4f5cd12be4"}, + {file = "pyobjc_framework_findersync-10.3.1.tar.gz", hash = "sha256:b4a08e0a87c54f62623038de1929fab018fe44fca5372a455bb524b9f90e9196"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-fsevents" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework FSEvents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_FSEvents-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:160483598a4bef081f0acfcfdb51d62eedb07c81adb7614206ffa712b7552256"}, - {file = "pyobjc_framework_FSEvents-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ca91bc2c90df83438ee839ab8b97d148626c1dba5830f753ff07198923e83bd"}, - {file = "pyobjc_framework_FSEvents-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e987588a3f9d011ea27a5895b7bc3753b052d19ea6e7392b56644ab72f550b34"}, - {file = "pyobjc_framework_fsevents-10.3.tar.gz", hash = "sha256:46fe0220e54f4d2f375d2b98d292d10ad188a797973cf60b64b24336fd1160ad"}, + {file = "pyobjc_framework_FSEvents-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:7348e1aa268819b005e1ab648b5bac348052d3513aacf768c2c3999d6ffbf81e"}, + {file = "pyobjc_framework_FSEvents-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:420736c645e15006c1ed962767bfd164b1d5dba7d9dc3cd9730e4c9922b05c27"}, + {file = "pyobjc_framework_FSEvents-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:56b48def729acaa0b7c27335a40519ca7d17e6d45649ba68e0f9f1c70e902994"}, + {file = "pyobjc_framework_FSEvents-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:282ebeeba0190524fe1d5d21d729ebcb7034e379a8039a6ccdf5f5c6e4470e02"}, + {file = "pyobjc_framework_fsevents-10.3.1.tar.gz", hash = "sha256:6269fd8aa3f62d8a6312e316043aca6d7d792812bff09b617bbd6ca9f0f6e440"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-gamecenter" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework GameCenter on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_GameCenter-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:875fb445aa7916088ffbb556fad915b023978e6dbc56efed054e92bed21acff3"}, - {file = "pyobjc_framework_GameCenter-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9a498dd05ccaf8ddec5e118a1e2142025e5bb29c42fb6c1b3d2918ff77d39252"}, - {file = "pyobjc_framework_GameCenter-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c7701fa23009d04385584b88b9fa6ed248781a1d652d34761169fee807277d61"}, - {file = "pyobjc_framework_gamecenter-10.3.tar.gz", hash = "sha256:6719c88a40ff9958ae836d4da65c81ce61adb5c614f13f3e1849282f7d31c571"}, + {file = "pyobjc_framework_GameCenter-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:eba1058859fb30bef8227ce649dcf7531545aeff81c3cfd3e3b80ef8fe87bf70"}, + {file = "pyobjc_framework_GameCenter-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3329261e8a6a3b0df3abd4a7a3cc66cc8e47be919279a08249e08f94a0e4448f"}, + {file = "pyobjc_framework_GameCenter-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:d2420c7d28f9eab337955a1872179295ba92e3d8db0e5b1b8d40442e7079d711"}, + {file = "pyobjc_framework_GameCenter-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6bd556e798cf52b94434c48cabf299060dd79b668f0021826995ceee520db8af"}, + {file = "pyobjc_framework_gamecenter-10.3.1.tar.gz", hash = "sha256:221ae88ee69816b95861b1a0dc781c1c17775d38fcf0388327620535479b6a07"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-gamecontroller" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework GameController on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_GameController-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a75fcde32187cbcddbc7d0513fd9030e4f97ae9b1515af93a404b0d6be3c08f3"}, - {file = "pyobjc_framework_GameController-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eadfa2e9c2243eb6e8be4a8ca13fe63aad1e1d96fe9b43d62dc5cb3eff46e8fa"}, - {file = "pyobjc_framework_GameController-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:25010deb72f07978bf343f371237244e35f22f8c494542e14e2c4da0e08841bf"}, - {file = "pyobjc_framework_gamecontroller-10.3.tar.gz", hash = "sha256:dc85c473cafb46ba72cf91e1dadd428f26564c4e331d107b01f78ad450fa74c6"}, + {file = "pyobjc_framework_GameController-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:cfb754d29660e90f295ba443cc84fb189e5ca9d1f019c35a382cb24dd4e08bf8"}, + {file = "pyobjc_framework_GameController-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a7a1e34a4ebcf9f653bc4a066b7d08d9124d462bc7e1c434ead983a6ae093382"}, + {file = "pyobjc_framework_GameController-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a23bb9c97063fb334990cac20dcab1389942495cb028350a232faebb804d73c2"}, + {file = "pyobjc_framework_GameController-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e90afaa5a5d28771e60b4f60ff89b80037d4e9e558d680872810216299aea1a8"}, + {file = "pyobjc_framework_gamecontroller-10.3.1.tar.gz", hash = "sha256:f9f252b5fed5de2a8c7fdd2e302b6ed6e0b82015d7da75b28984c5ea5909345e"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-gamekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework GameKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_GameKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b997b024f8fbb5bd2d423399d3926fd2fb2e22c162d7f2f49e2616e452b36dfa"}, - {file = "pyobjc_framework_GameKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c289aba92513c3e1c2b3fad33ef32eacb6d987bc08252e5a3e4e6253b7e5ab63"}, - {file = "pyobjc_framework_GameKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:414e3a5c0c3d4cfa7e749fba0f2e83a3ffd29dd4ba87d2e30903780a120fb100"}, - {file = "pyobjc_framework_gamekit-10.3.tar.gz", hash = "sha256:c1aabd78057a95955ccccd8553a13ea554ce1ee2e6fdf5d270f1f5c404f38066"}, + {file = "pyobjc_framework_GameKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:57930e2b65296719b2998c9816ab844983460f3358c57a120f09ebe78013b64c"}, + {file = "pyobjc_framework_GameKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5634ac5f8b3569355f4fe8b2e6a06450d8aee555119607f7d738f5c85900c1b6"}, + {file = "pyobjc_framework_GameKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:83f689c959cdfaa311f6702d9e99402faf47e390334fb3880d255dc72e2d2a90"}, + {file = "pyobjc_framework_GameKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c861e575ed4543241adbc53162fb651395ba73c68a697f4b5aceaa61754e19c1"}, + {file = "pyobjc_framework_gamekit-10.3.1.tar.gz", hash = "sha256:7d21a8f45c32ac94ce0e70b6c6fe72928fe75cb1a6bd6d7715e2bf39b291b70b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-gameplaykit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework GameplayKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_GameplayKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:908e79ef67328c6dea5175896f9a94bf40f4bec185866ec5a0e0936466706487"}, - {file = "pyobjc_framework_GameplayKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a19405a1b3e7a6bd96bbda80208b37c9b261970cd2268b114d256db8113c6316"}, - {file = "pyobjc_framework_GameplayKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d247b11e30f4db7e1c0d1c6430f92afd6fa87ccd70e6ff61e5a4929b7fa33e7d"}, - {file = "pyobjc_framework_gameplaykit-10.3.tar.gz", hash = "sha256:3e0a52b2e7e271e28cb26391e3dd96760a21f8b36124a4c4224a8219d7b783c6"}, + {file = "pyobjc_framework_GameplayKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:cb54cfc4dbc69f1888c59ddce9da97ddc03f5003794fe47d56942a89c478e138"}, + {file = "pyobjc_framework_GameplayKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:eb49a732c82b17ff66f6e878b2cb9ba27e2222be303a337f2af4ed1a34a404bf"}, + {file = "pyobjc_framework_GameplayKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8a0c2148e9b421922accfe565a398effe9622653c71d0bb4eb1b69ac90ee257f"}, + {file = "pyobjc_framework_GameplayKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:628406ca0d0ce283cc0735a4e532dd04a3a4d57a4c22c3ee4338ba64d1b13790"}, + {file = "pyobjc_framework_gameplaykit-10.3.1.tar.gz", hash = "sha256:2035b81f7bc34b93636753cc3f9b06cd08171afc5c95bb2327a82fd3195f3c36"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-SpriteKit = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-SpriteKit = ">=10.3.1" [[package]] name = "pyobjc-framework-healthkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework HealthKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_HealthKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d7267d490329e62a733e50f37a4b5fdb98db8353425f2d193ba3117a80bf9f84"}, - {file = "pyobjc_framework_HealthKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:db1bc0574c32f639ca830fec3885c4774642015b086855a1147c8b2244246e54"}, - {file = "pyobjc_framework_HealthKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aa51fe233fc95da5b2c0c2726ba5d9c83e5c95312208c033d530ecde9fc75888"}, - {file = "pyobjc_framework_healthkit-10.3.tar.gz", hash = "sha256:ae964ed3d6a2250235bba6f1fcf465d54d9c10854322e82a64b0e06505c264fb"}, + {file = "pyobjc_framework_HealthKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:80aee8bf0e7af6e434e9023c2d2050c2a2fe8e53abbf0e1f2285a932836fdd17"}, + {file = "pyobjc_framework_HealthKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac9abec44c02edfe7f2151f529bac1c9544fb99ee1caffff55b331281b374463"}, + {file = "pyobjc_framework_HealthKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b64d4e61a8009a0a5586d464b591186570f654b20937f78941875ef3b7865505"}, + {file = "pyobjc_framework_HealthKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5bfcaac3a3947d070611d1fed1abe8858e049ef0ab1050f46974a7333b6369f6"}, + {file = "pyobjc_framework_healthkit-10.3.1.tar.gz", hash = "sha256:45622fedb42bbd95dcc096248bbc41dacd857d9db120ff7310f74f3bad4b23e1"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-imagecapturecore" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ImageCaptureCore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ImageCaptureCore-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:097fb42cc33e9deb84d2afba2f701757a831f31fd031dd4426b6357d20959496"}, - {file = "pyobjc_framework_ImageCaptureCore-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:02c2a1a8aacddd4b2b3842b4b389a8956ceaf26d0a965ece3e9bdca62a3cf8dd"}, - {file = "pyobjc_framework_ImageCaptureCore-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c80fbec0f6f0d7c39f11c0827bc1546badca66c2110e9923bde21b12e531d7da"}, - {file = "pyobjc_framework_imagecapturecore-10.3.tar.gz", hash = "sha256:649fb5676ceb76254c4a3782ac05bdc6c30f4fd69f58652727a4732921e07d64"}, + {file = "pyobjc_framework_ImageCaptureCore-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:649e0b7bf428ad3fe90faaf63dbd09d234563a32b3cee5a6f2d28ab31927bd54"}, + {file = "pyobjc_framework_ImageCaptureCore-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5bab844c665b3ac07b191e94130f543eb23c5cfd014035f025efacb7a48aa68c"}, + {file = "pyobjc_framework_ImageCaptureCore-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0fd14f9183c1fcee67cf09f36ccbe156186da84a83419917fd3ca81a5de23d97"}, + {file = "pyobjc_framework_ImageCaptureCore-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d625d84094f51dd4389d1dea7c53480c3311dd19447d96b3c9eb06be5a935fd6"}, + {file = "pyobjc_framework_imagecapturecore-10.3.1.tar.gz", hash = "sha256:9ce83c38b8ccee6b022faadb9cd7b8716119092cd41b6c2cabce3670101119bf"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-inputmethodkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework InputMethodKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_InputMethodKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:456b2601bf5e0e2b015f146cb4b9ee2083c0891df4b6e4508bbbf9b7d4f1ba2a"}, - {file = "pyobjc_framework_InputMethodKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3a19b34a229a338b1d6496813feb804079b3c84e29556977c43ef861d0540bac"}, - {file = "pyobjc_framework_InputMethodKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5d04033b886c2cb6c2696216ad7d25da67d58890bdec602d25c6b7f2db6317da"}, - {file = "pyobjc_framework_inputmethodkit-10.3.tar.gz", hash = "sha256:e38844bb93276758334f8fbe09e668da12d697e83b4c925850bf0ae7bc9decab"}, + {file = "pyobjc_framework_InputMethodKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:d1c3beb88f94eb6b0bdc458ef49f331d064c0260758134cef1cf941684f46c83"}, + {file = "pyobjc_framework_InputMethodKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d0f7538ac549b61afc93df895375114464f778e06a66a4c2684cbbf247a8f4c7"}, + {file = "pyobjc_framework_InputMethodKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7f5ff42a59209f3ede24181e5d1bb8d69f8ad428189f177c1bfd55d328f85575"}, + {file = "pyobjc_framework_InputMethodKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3fcd444b97cf2343a6c37b828dcc85080cc6a2c5ba508010dae4ebe836480d2b"}, + {file = "pyobjc_framework_inputmethodkit-10.3.1.tar.gz", hash = "sha256:637ba2da38da5f558443b4529b33bab276380336e977807347ee9dad81d42109"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-installerplugins" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework InstallerPlugins on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_InstallerPlugins-10.3-py2.py3-none-any.whl", hash = "sha256:1b577fb5ebe9d4651807798efb056d4cc2a43959bb680a53cdfe25cb185152d5"}, - {file = "pyobjc_framework_installerplugins-10.3.tar.gz", hash = "sha256:69f902733f6e8086c0fa18e6b23a604a759c7d65a7de66a331148afda5f120ec"}, + {file = "pyobjc_framework_InstallerPlugins-10.3.1-py2.py3-none-any.whl", hash = "sha256:2b32cde6fb8bbb3e1ffd04d7acbe3132291ad5937fc7af5820062e8aece7b5cc"}, + {file = "pyobjc_framework_installerplugins-10.3.1.tar.gz", hash = "sha256:280808bbce36090b59197756fdb56c19838845a5fc25966a435dbc5fc4ddbbf0"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-instantmessage" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework InstantMessage on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_InstantMessage-10.3-py2.py3-none-any.whl", hash = "sha256:27e17102aff08bd7016ac092597fd515e690e97ff179fbba8c92f5d1fdd3bf74"}, - {file = "pyobjc_framework_instantmessage-10.3.tar.gz", hash = "sha256:f88992c2ce71efa147d3809d5a0d8a422643e657281c5c72840ad9de5edce732"}, + {file = "pyobjc_framework_InstantMessage-10.3.1-py2.py3-none-any.whl", hash = "sha256:51a096e55a423423dbfbf19cc976a49915987ce68b9038f8ce3db9c3cde11718"}, + {file = "pyobjc_framework_instantmessage-10.3.1.tar.gz", hash = "sha256:bb1560a2f92a2def179b6381c17d406331b7818fa0fd1ba98f09ed94415f8a7b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-intents" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Intents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Intents-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f68e0fee12cd47c539655a6e5be219c43592e6579542c5059d7ef211f0d4ad04"}, - {file = "pyobjc_framework_Intents-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9d6e972ed2fc5f87dd28313e32fdea137588100a8c9baca645fd53f87cea7541"}, - {file = "pyobjc_framework_Intents-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:9542e410767899ac4723079875e9c3305efccb8266a145711b73e783d8f04c32"}, - {file = "pyobjc_framework_intents-10.3.tar.gz", hash = "sha256:03faf5c52eb8e069fb72065f7a772d51e669a1e3be1d74810a69e05bc2ff7326"}, + {file = "pyobjc_framework_Intents-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4d5a899e8cffd63096aec69edafac78e76d591afd07059a96377d6893ba56649"}, + {file = "pyobjc_framework_Intents-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b6da33ba8a1e6ae169eb67c1c83bf4e0aeb365fb368162ba002ef26cdc9f853f"}, + {file = "pyobjc_framework_Intents-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:332e5b74dceb8315e289d462058b9ec65544562936098b50b8003999954032b6"}, + {file = "pyobjc_framework_Intents-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6e77fea5fc4136888459c8ece7d48fe3eac3a37c665e9ba8aaeb18c1671eb083"}, + {file = "pyobjc_framework_intents-10.3.1.tar.gz", hash = "sha256:89f0ed49c515b75c8811d9f6771ac635e799dfaf11921172729f8e0857c8c0e9"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-intentsui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Intents on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_IntentsUI-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a25e9cbee40b404299194c3d94895760a9983db6ddafd11124d00905cb9bfe3e"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a27bf62bec02fe499918baefee4418207d138bca83327a3cdd775078c3d06e2"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:eb94c897a006bcb11f8c1d521650d11674b3e3a20e8a07ace70fe4994cba5975"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:d78ed0172745840561583127c4ae6786670de05aca385ffee167f15354e879a1"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81dd968167c3b4a76e55f89b642e7d18dfab0267b2aa8528d7f8d4ac4d64e6ff"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:82830c3bfae58f78b085c1c98258db7fb8774f69abf2e56b1b76a20cd23293cb"}, - {file = "pyobjc_framework_IntentsUI-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7d3f575c728688191a197d127940da1171fe91d902d366b9e9570d6dc927c0a"}, - {file = "pyobjc_framework_intentsui-10.3.tar.gz", hash = "sha256:1e791ecef111ba21ce03f779e8d39da5214b6921a2f6625247ee1247e09261be"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:23a606af7ea47bd899012b896e0b2d10c677f7facec80197ab45a3bcf899874b"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bd2fed37c96f1d97abcbd6d98b2da90ba2c744f968e2c4e0735dce77bbbc95f4"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e9fe0ba78c9dd500ef9c13227dd1a60e39df460c84180d8325f5022edd80178b"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6c124ceb8e7b7a1f3fb6c2c159e47f9dca42ece6e1645d763235660ea98e7915"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bfed2841fc9099cad850e058e3dfa23845a0988e53666f5ffc82cd1b91bbe824"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d6a802bc5ccb01a22c312f4dfaf88300a2edd4db2e2f7568b10d29176ae05edd"}, + {file = "pyobjc_framework_IntentsUI-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3ae02ba54c689cd672bfc49c039d18cc5e9515d7d95608bcbb34357ae90fd9ff"}, + {file = "pyobjc_framework_intentsui-10.3.1.tar.gz", hash = "sha256:68f42cabbd36889060d07b21f156f1dae78243d42b34c652448c687d07cbca62"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Intents = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Intents = ">=10.3.1" [[package]] name = "pyobjc-framework-iobluetooth" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework IOBluetooth on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_IOBluetooth-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a55ae467d77ef1482ce93ed0d0847ea86e466b2278b13929ec26cd8a8a609207"}, - {file = "pyobjc_framework_IOBluetooth-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8d671c767fea4e128a38136a24ef1f17a9df96b4578f8d6e56a4752c7b1a6e3c"}, - {file = "pyobjc_framework_IOBluetooth-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:001743ad0dc32a19ccd39d3352adf376f624e51d06d79b7ee9583a9c7090450f"}, - {file = "pyobjc_framework_iobluetooth-10.3.tar.gz", hash = "sha256:49ffbe7464684008b162c3dc025c39b8b943b505e300fc185966c567d7e8f284"}, + {file = "pyobjc_framework_IOBluetooth-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:cdd8bd3da07c6935657bbcf47e6fc6b3b7a2ed9bd7e8ef83bbbd5f4a0e8884f3"}, + {file = "pyobjc_framework_IOBluetooth-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d5c7ca666050b63c5dd87ede54beebdba7fc12a60bd754d77155da9f7e60618c"}, + {file = "pyobjc_framework_IOBluetooth-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9f90d8ea40f770b41ad97e17e19ad10e49daa1684f750e681db42707dbec9768"}, + {file = "pyobjc_framework_IOBluetooth-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:17303009a3c1ac48eaaa2c3a96a114ef47adcb1fffbf965e7538447bb02adde1"}, + {file = "pyobjc_framework_iobluetooth-10.3.1.tar.gz", hash = "sha256:bca424889d7fdd5bcb728d312e91ee681e73c0c2ac16ba37068603d699043d39"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-iobluetoothui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework IOBluetoothUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_IOBluetoothUI-10.3-py2.py3-none-any.whl", hash = "sha256:4ad16ce48e34b5af186d3b528147e34f772ff5818aa8284390070d3b45cdbf05"}, - {file = "pyobjc_framework_iobluetoothui-10.3.tar.gz", hash = "sha256:9ab371ff6ce1a4f7b3706acc3b430e697aa8816808899e3a709f5504b8c3d36c"}, + {file = "pyobjc_framework_IOBluetoothUI-10.3.1-py2.py3-none-any.whl", hash = "sha256:ae283c3fecbeb99adba9b3c3d5d06caaad741da726fc7a1dd50ecc0376e03ae8"}, + {file = "pyobjc_framework_iobluetoothui-10.3.1.tar.gz", hash = "sha256:6db82aeb360641b878f8ed73c2074db0425664d9411317b2e01962e0929fa29c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-IOBluetooth = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-IOBluetooth = ">=10.3.1" [[package]] name = "pyobjc-framework-iosurface" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework IOSurface on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_IOSurface-10.3-py2.py3-none-any.whl", hash = "sha256:ed016eeb0fb6b176a002a37da968bee9770ce764e11299dbbef9386a2dd746af"}, - {file = "pyobjc_framework_iosurface-10.3.tar.gz", hash = "sha256:bbb3acb6417e729f27bc4fed1286436aab9242ba750cc61e39cf6994ad26fecc"}, + {file = "pyobjc_framework_IOSurface-10.3.1-py2.py3-none-any.whl", hash = "sha256:4171a33a09ee006ad28ba29e6d12cee821e2c0ba09b4beddae8db16580fb9bc7"}, + {file = "pyobjc_framework_iosurface-10.3.1.tar.gz", hash = "sha256:94e4a109a94f0e365bd60ce68aab6ff166fef6f30a40f7682c76902f5fc3aa34"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-ituneslibrary" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework iTunesLibrary on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_iTunesLibrary-10.3-py2.py3-none-any.whl", hash = "sha256:3cf1062f5e95aa1c2641743fee6d48bcf73235955d40ca843c728690f46f590e"}, - {file = "pyobjc_framework_ituneslibrary-10.3.tar.gz", hash = "sha256:ac4978becfaa69cdb8e6ba2900965bb86dedb1610262acd993cf58dc7d8d33f3"}, + {file = "pyobjc_framework_iTunesLibrary-10.3.1-py2.py3-none-any.whl", hash = "sha256:9485e986f6075d04e10c196e5dc36e4c3b60116a45849683a61c876e5fb45fde"}, + {file = "pyobjc_framework_ituneslibrary-10.3.1.tar.gz", hash = "sha256:3899f8555ae02f6441a711892cdc6537404215b3d5f8a7ea4594f7460c58c9b2"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-kernelmanagement" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework KernelManagement on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_KernelManagement-10.3-py2.py3-none-any.whl", hash = "sha256:87998385a4ba9d7c69afc361aa081f8b980fe14dca0ef04f74a97eb13b133a1b"}, - {file = "pyobjc_framework_kernelmanagement-10.3.tar.gz", hash = "sha256:9619677c9976a9428f0913420c0e939a17f1fa809855bbc3d9bb6a989729d49e"}, + {file = "pyobjc_framework_KernelManagement-10.3.1-py2.py3-none-any.whl", hash = "sha256:e07134bf3815370d3d9c37f9813edec12758f86fdbbbc67036ab72e8b767ddee"}, + {file = "pyobjc_framework_kernelmanagement-10.3.1.tar.gz", hash = "sha256:04c41bc0d0ce014318acf9e333aba302092d2698ec408cbf0b022f3a507ecfa1"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-latentsemanticmapping" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework LatentSemanticMapping on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_LatentSemanticMapping-10.3-py2.py3-none-any.whl", hash = "sha256:fac29c9f90271299fdc6d0f79cd20cbccda2e65d25ebe8eb94b5de16283cf517"}, - {file = "pyobjc_framework_latentsemanticmapping-10.3.tar.gz", hash = "sha256:a3d633158ac9c416617fbe0a64a672c0a56167714774675b7c374d1e712efc5a"}, + {file = "pyobjc_framework_LatentSemanticMapping-10.3.1-py2.py3-none-any.whl", hash = "sha256:c80c709b983273c8f29e86a04c52e98e8e6b0e723a400f7d6036fcabfd850367"}, + {file = "pyobjc_framework_latentsemanticmapping-10.3.1.tar.gz", hash = "sha256:0bca94fd00f59f49874c8266bfacb09a7c56ad13b4d405c241421cef201f8943"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-launchservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework LaunchServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_LaunchServices-10.3-py2.py3-none-any.whl", hash = "sha256:2969eed89464e49a38bf1c80829cf0c721ea8bf2e75e67985748bdfb2ba03937"}, - {file = "pyobjc_framework_launchservices-10.3.tar.gz", hash = "sha256:b28b605ed6d5626ce0e48520444cf131d6596ee51b1af56596c0bbe2d1ef996a"}, + {file = "pyobjc_framework_LaunchServices-10.3.1-py2.py3-none-any.whl", hash = "sha256:3ce840027b43c4bd95dc31aaa9b4bfff1d431e782669b4c95e2b12d386c05000"}, + {file = "pyobjc_framework_launchservices-10.3.1.tar.gz", hash = "sha256:7f16af2acabca0c2953eb7333bfe652bf853bb9d9e59b771f9d228468bccdea3"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-CoreServices = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-CoreServices = ">=10.3.1" [[package]] name = "pyobjc-framework-libdispatch" -version = "10.3" +version = "10.3.1" description = "Wrappers for libdispatch on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_libdispatch-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6845f7dcb13cd24e921eed2c9cf5087ce138f69089a05ba0bf9ac9e2d5294930"}, - {file = "pyobjc_framework_libdispatch-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e49c4e6614f53a9c89f0e79abbee3cdcdd6426dd213780ebb9e3eeeb02088c3"}, - {file = "pyobjc_framework_libdispatch-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e71d7bad62be682718035d384aefc7603ec1f350ee7992cf89a3eff797f6e371"}, - {file = "pyobjc_framework_libdispatch-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:df656b26e04bc489f76f96d1748f3349a9fb0a5f6dcd8f0ca686b0bf1c89641f"}, - {file = "pyobjc_framework_libdispatch-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2da791f1515c64c40e2e4de552933f77fdcced8321afa1511eae7c35c0f31a30"}, - {file = "pyobjc_framework_libdispatch-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:c1f46c4dc4816274c890822bb809462cbe8c46b27be24cceb4fa0902b85e8ec0"}, - {file = "pyobjc_framework_libdispatch-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1d47e167bd6e246a1f5c9c780955d5b08ed049f0d71af23314f81715d0e98500"}, - {file = "pyobjc_framework_libdispatch-10.3.tar.gz", hash = "sha256:1f0aa2a1900788368bc8370a631d7ee83e18cd3cacc32bbfb2b3653d9d93d892"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5543aea8acd53fb02bcf962b003a2a9c2bdacf28dc290c31a3d2de7543ef8392"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3e0db3138aae333f0b87b42586bc016430a76638af169aab9cef6afee4e5f887"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b209dbc9338cd87e053ede4d782b8c445bcc0b9a3d0365a6ffa1f9cd5143c301"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a74e62314376dc2d34bc5d4a86cedaf5795786178ebccd0553c58e8fa73400a3"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e8fb27ac86d48605eb2107ac408ed8de281751df81f5430fe66c8228d7626b8"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0a7a19afef70c98b3b527fb2c9adb025444bcb50f65c8d7b949f1efb51bde577"}, + {file = "pyobjc_framework_libdispatch-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:109044cddecb3332cbb75f14819cd01b98aacfefe91204c776b491eccc58a112"}, + {file = "pyobjc_framework_libdispatch-10.3.1.tar.gz", hash = "sha256:f5c3475498cb32f54d75e21952670e4a32c8517fb2db2e90869f634edc942446"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-libxpc" -version = "10.3" +version = "10.3.1" description = "Wrappers for xpc on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_libxpc-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b64eef0b36efccf926e529f0cfd55d416fee667ee71371679cba8675959947"}, - {file = "pyobjc_framework_libxpc-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af837591e4a2cd5dfbf37017c92d4f30b448293fe56a7ac10e1033d5aaf692a3"}, - {file = "pyobjc_framework_libxpc-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c10a1a8a5863099b163e71f808c7d42d6e052611e5851924e13ab260fab12b36"}, - {file = "pyobjc_framework_libxpc-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:ff4a24534e7fc6b5da6af2503afc76d33bc8148693f04d9585a1f1062171e21f"}, - {file = "pyobjc_framework_libxpc-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c406f029c57ccead3b0bb53fb20046cbf72552fb3b06e922893cffa2a84b54f3"}, - {file = "pyobjc_framework_libxpc-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7717d83d440d66742d153d081bb52bf8493fce7db21debace77b87012df21bde"}, - {file = "pyobjc_framework_libxpc-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fafaf57f13eb3fe09dd1f93cc7895d2b50178933f2e163fe9abb06940f553d00"}, - {file = "pyobjc_framework_libxpc-10.3.tar.gz", hash = "sha256:b69f3e73ecca92e07ded276544f8cae15f915fda314144dda18fadc7f2f127b9"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9e287591a708f96e4e3d1929425a50c4e83188eb8bf3094b688de149946ac752"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0afba29b6bf5c3de3ef51f60e06c026ab7be7ce44600047dece5d3bf4e758af"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:123b72dff148a56d48120448bd9742190326f87661f4ae6f5363e112de0e554f"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:72a35a21f4bbbfb4a5c4c23e3180c3273b7720fe4cd150b975cb5d08cbc4fe13"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d14f6fa976df50de90affa41b4dc2381554fe1e8503564f54cd71a8c6cc4b0eb"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0d8a5d29952db92d9d7112c642ba7cdc9d8496118ec14e8186f93353b092a818"}, + {file = "pyobjc_framework_libxpc-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f4232996766f4c21f80da51344296651f40ec8fc14f353fca0bc75af718ee950"}, + {file = "pyobjc_framework_libxpc-10.3.1.tar.gz", hash = "sha256:b3c9e9fd281b5610e3bef486e91570b0afa8ab8eb0c01c0baa5e2ec49ccb7329"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-linkpresentation" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework LinkPresentation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_LinkPresentation-10.3-py2.py3-none-any.whl", hash = "sha256:180cf53bc4149c5873ef9d6c93026ce73c5ae8b522fb7e38850c94243d9879af"}, - {file = "pyobjc_framework_linkpresentation-10.3.tar.gz", hash = "sha256:9a5696d126ded58cf9362b19e8846c51c70ee17d546d3be55ff4d279f791aaf1"}, + {file = "pyobjc_framework_LinkPresentation-10.3.1-py2.py3-none-any.whl", hash = "sha256:e49ac094eb3a60a87f37edc24657feb051614a4d4464ad2580831288ead521f9"}, + {file = "pyobjc_framework_linkpresentation-10.3.1.tar.gz", hash = "sha256:535d452cc33d61074ba9bad7707d6c0a23d474fb045ed4322e5f87bfb0b7e865"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-localauthentication" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework LocalAuthentication on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_LocalAuthentication-10.3-py2.py3-none-any.whl", hash = "sha256:d8dbf68c2073cd5cd3894d6d73f3538bb35afccde4273cdeac45ad1489691c17"}, - {file = "pyobjc_framework_localauthentication-10.3.tar.gz", hash = "sha256:073716dacdc1d8ca28db778ea133c9a4bff8678af9a6066a2a7e7043dc0e0169"}, + {file = "pyobjc_framework_LocalAuthentication-10.3.1-py2.py3-none-any.whl", hash = "sha256:565910d7d2075cd53c6d4ffdbb15d9b93267f1b1ba4c502d354778865d0dc2ec"}, + {file = "pyobjc_framework_localauthentication-10.3.1.tar.gz", hash = "sha256:ad85411f1899a2ba89349df6a92db99fcaa80a4232a4934a1a176c60698d46b1"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Security = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Security = ">=10.3.1" [[package]] name = "pyobjc-framework-localauthenticationembeddedui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework LocalAuthenticationEmbeddedUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-10.3-py2.py3-none-any.whl", hash = "sha256:481592e8a3ec90f51ff334509d65a5bdb22b07c01239ee47029f9cb78d2bbdd8"}, - {file = "pyobjc_framework_localauthenticationembeddedui-10.3.tar.gz", hash = "sha256:fdd6edc4a286f943d372d4aacc9587284c07efc3df19a6f8642cfff91cb74ba2"}, + {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-10.3.1-py2.py3-none-any.whl", hash = "sha256:d69ef723f4525e6476e51bd166d56e97c9274500f98aa209a659e7567793dc01"}, + {file = "pyobjc_framework_localauthenticationembeddedui-10.3.1.tar.gz", hash = "sha256:f915190f6106b9f9234750abf48f87445c364ccbca8f8dd565bba1b66ddd55a3"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-LocalAuthentication = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-LocalAuthentication = ">=10.3.1" [[package]] name = "pyobjc-framework-mailkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MailKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MailKit-10.3-py2.py3-none-any.whl", hash = "sha256:4865846f1c6b655901c3248eb2b7ea9115f023a93144ceeb07e67ee9f8229d0c"}, - {file = "pyobjc_framework_mailkit-10.3.tar.gz", hash = "sha256:e097f8db128f927ac2860696cc3326213203526bea070de82aca4e5117c409d4"}, + {file = "pyobjc_framework_MailKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:7c403525e01bed0888946552e512ca4d1b018c3f6ef3d293fff85b90dc02a411"}, + {file = "pyobjc_framework_mailkit-10.3.1.tar.gz", hash = "sha256:90ad82786ae01a275aeec842e73b1fef12d9f91a67edcde8ff6a145859dc9f92"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-mapkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MapKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MapKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:290ce559818baaea69a94817239fef6c211d0d5428ad2d9e31e6aabc06079b11"}, - {file = "pyobjc_framework_MapKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1ed74fc8a5e5989c902c304f6e5ccff7b21f871234ff3797b5903ae00de2e0f4"}, - {file = "pyobjc_framework_MapKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c9f92577550b3cebb61d40755ac3f2946be47d47a2449472495c1589ed0df3a7"}, - {file = "pyobjc_framework_mapkit-10.3.tar.gz", hash = "sha256:321cc41a26df1e4d9676d4c7df5f83ea9239b56da66f4fed077ce8949ae9e315"}, + {file = "pyobjc_framework_MapKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:cfee94ad82e673eaebc3159732b5cff1fc4f7e3bee6f17cc4fabd641c260b769"}, + {file = "pyobjc_framework_MapKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:dd65d6eff1397afc0b2108b0e9387a6c2390b1387731a8e0dd8298b8d0641635"}, + {file = "pyobjc_framework_MapKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ffadc4968c3d815dd8ffc2867e962546a8681620c704888dfe1e7aa718cb3d90"}, + {file = "pyobjc_framework_MapKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f14f90bcb68baee70a838b3cecb9d909da43175da49cbe90dd6cca57c37a6ae5"}, + {file = "pyobjc_framework_mapkit-10.3.1.tar.gz", hash = "sha256:f433228c404b9ef4a66e808995daccc1306f7123296317651078a6a734ac1ab0"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreLocation = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreLocation = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-mediaaccessibility" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MediaAccessibility on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MediaAccessibility-10.3-py2.py3-none-any.whl", hash = "sha256:95b2368b0f0ca17a618d687225d6faf1254b7819cf8762572561ef7986c1025f"}, - {file = "pyobjc_framework_mediaaccessibility-10.3.tar.gz", hash = "sha256:03d7aa15ae9a19b582003144dec91c3d99aa563a58328d559fe1f03b95cfa234"}, + {file = "pyobjc_framework_MediaAccessibility-10.3.1-py2.py3-none-any.whl", hash = "sha256:c4304ea53c7e85320b58d773cce2288f62dcb5b9c5a295be1ecfaa6645a9fea6"}, + {file = "pyobjc_framework_mediaaccessibility-10.3.1.tar.gz", hash = "sha256:c249e1eee636e77b5f00db3bf85174cb3e0cb53ca991a17e53a1f200377f4289"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-medialibrary" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MediaLibrary on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MediaLibrary-10.3-py2.py3-none-any.whl", hash = "sha256:2fa66b8f60aa4dc63ae064555a28bbd247842d5b867de218d1dff43ae6c71357"}, - {file = "pyobjc_framework_medialibrary-10.3.tar.gz", hash = "sha256:5084a082758e9e616789c603da539acfe12d681bb3b633041f53b035797e116f"}, + {file = "pyobjc_framework_MediaLibrary-10.3.1-py2.py3-none-any.whl", hash = "sha256:25f16d610e3ea5d983175a6c07351596bd5dd2fcca194f1eac5686c670bbdb3b"}, + {file = "pyobjc_framework_medialibrary-10.3.1.tar.gz", hash = "sha256:703ffd0904fc86d4fbfbbd4952be43e91a6d477c53ce2868e4c18c3eb295f5c6"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-mediaplayer" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MediaPlayer on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MediaPlayer-10.3-py2.py3-none-any.whl", hash = "sha256:82882aa1e901741e9b976f143cb576668845d45c2a0f51c8d5721c35700f0406"}, - {file = "pyobjc_framework_mediaplayer-10.3.tar.gz", hash = "sha256:b7571fbec3fecf9333e9c0c1a4b21a8c1c6ac4f776d431c3d0f2468ff96595ce"}, + {file = "pyobjc_framework_MediaPlayer-10.3.1-py2.py3-none-any.whl", hash = "sha256:5b428cc28e57c1778bd431156c3adb948650f7503f266689559d0ece94b34e8a"}, + {file = "pyobjc_framework_mediaplayer-10.3.1.tar.gz", hash = "sha256:97043df5ef89d4fbe217813e8f4ee1e226d8a43dee4eac00fff95e6b8a7772be"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-AVFoundation = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-AVFoundation = ">=10.3.1" [[package]] name = "pyobjc-framework-mediatoolbox" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MediaToolbox on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MediaToolbox-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fb293ab6085277b151a289b1fb3f6eec4c0214e2147d3fbeb0a8d9a666808d2"}, - {file = "pyobjc_framework_MediaToolbox-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a7c692ac7dcab5c83c4a01db83400f06ea2c46bb3940ee477d0002a2cc824c6f"}, - {file = "pyobjc_framework_MediaToolbox-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4b0b40879ac673b7211fe6e4363bdf0628ce3dab38d47b94bc83043d155063f5"}, - {file = "pyobjc_framework_mediatoolbox-10.3.tar.gz", hash = "sha256:d63da415403ebb759b604adbefd3abe37ac68c5a301faf2eb8d934a85e3b7d26"}, + {file = "pyobjc_framework_MediaToolbox-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:d4ef616e233c40fcac99298ee4ab95a9b6439cffe28e96ce07b66c00f598bd30"}, + {file = "pyobjc_framework_MediaToolbox-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8acfa377b593b043e8c9ff1aa6cbbde92b7feaea60578ea2d0b61ac3edd15dc"}, + {file = "pyobjc_framework_MediaToolbox-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f989f07304dae82b1307e179f185a80b66ed36b0dd15d1b3bf6ec8092b766100"}, + {file = "pyobjc_framework_MediaToolbox-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4114fb3749dacf6dd83113823b846e77671c0e8b1209ca6e4402f09e6727c185"}, + {file = "pyobjc_framework_mediatoolbox-10.3.1.tar.gz", hash = "sha256:f141056dce0dc16ec21be596fea58acb4a668045f53e12a0f250990d936b44f2"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-metal" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Metal on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Metal-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7a724a98fa6972e237c5aeaee8314b68e8716ff725790587760b1fe0f700e2e7"}, - {file = "pyobjc_framework_Metal-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1c5df37c7e02a29e1b27081bcba7fa86523fce6eddaca08f6935659a2419fd3d"}, - {file = "pyobjc_framework_Metal-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:88989bf43f1443d68fd4692e224cebd68aef6215d0a92e0606c644c2a193ec51"}, - {file = "pyobjc_framework_metal-10.3.tar.gz", hash = "sha256:f137fb82175bf477e56de5c788e96caa2ad1f83b65a4fc374f9dbd1f1f9e91cc"}, + {file = "pyobjc_framework_Metal-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4a42f3aa47eb5e0d3f29bf07f239c2ba33725701546ea6d3c5d019133e0fbce1"}, + {file = "pyobjc_framework_Metal-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:cc33d05e376d3a2f42da24b397f6353d9cb8e5990c79c9255a82637b7b8f256c"}, + {file = "pyobjc_framework_Metal-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:22762ba170d0fc4538dd7f582da1fd7673160e369eca74efe3d6d35bfdd50522"}, + {file = "pyobjc_framework_Metal-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7fef3ebfd6cfbd7cbfe45aaa86dd32034303d933871d8450f4c990dbdefda176"}, + {file = "pyobjc_framework_metal-10.3.1.tar.gz", hash = "sha256:495307db0bfd2063f28b7c8fa350af71afcfbf5f5f2186a6a751b4cb2ef46a1a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-metalfx" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MetalFX on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MetalFX-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:980d113befb87cc04d59e821a7a9c8e3f938e2350a644a272132aef964f5d14c"}, - {file = "pyobjc_framework_MetalFX-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9fb93254978f105dd2f3781f8319131a8164c34b90dbf367084beb5fcef11b63"}, - {file = "pyobjc_framework_MetalFX-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bcf5e8d550e47d5d4aadd7661ea17853ad91e5645aae8674ad4837d649b4b865"}, - {file = "pyobjc_framework_metalfx-10.3.tar.gz", hash = "sha256:a0235e213e7b54db43d2690062d1d938cbe8f3923abd2a61e8b91cf35b57a639"}, + {file = "pyobjc_framework_MetalFX-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:ea4bed69e6a9ab4cd4fa6160554cb7df72316e849a34b839bf8d9c69ab445b24"}, + {file = "pyobjc_framework_MetalFX-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f3ecae357688a4730191d57ffbc3db6abb950b756e8b98f23689d4bf08f34c20"}, + {file = "pyobjc_framework_MetalFX-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0179ce8ac828b6d6e2542d2d4f68850290eb3f16112205a758419225dd51b448"}, + {file = "pyobjc_framework_MetalFX-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b3ae624f7e0a5c60b856889753af560b7cbd1a5f47db01f120a668e429afd1c9"}, + {file = "pyobjc_framework_metalfx-10.3.1.tar.gz", hash = "sha256:3ea0f259397523a84a320b3925dcaaa5c039494accc3cb412b63e6f7f66f9513"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Metal = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Metal = ">=10.3.1" [[package]] name = "pyobjc-framework-metalkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MetalKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MetalKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3c5c1e84984d4d8788cdd08eb7c5db8c75a96fbdda72f4ab66d19eb525d9f76a"}, - {file = "pyobjc_framework_MetalKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f8cb173e0fa120f1858cf0ef05ca61f07e84c9636ffe3cd6a34c12d92a511ca9"}, - {file = "pyobjc_framework_MetalKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1426937d86371d9b2371027f70f282e896e39e63a0d6486f0ba7984dfd0b6766"}, - {file = "pyobjc_framework_metalkit-10.3.tar.gz", hash = "sha256:de8cfbc63531e574bc3fef34960590820b3e7ead2efa48a6295c4a7eea20a9d9"}, + {file = "pyobjc_framework_MetalKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:c198c61d967812837538a793b1ff862bbd868d954abcd6ee558662c45c4dbf12"}, + {file = "pyobjc_framework_MetalKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7c0155d731766be52cf18de6ad61339c16217bde330e17ef50808366856c1b85"}, + {file = "pyobjc_framework_MetalKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:48ae5e7c81c97e231c52036c8e2acb22bb59feaf0cb13f7678c87b16d9faaf9f"}, + {file = "pyobjc_framework_MetalKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:de632a7cdca1a0a13097a363dd441b9550ad91de6da6c88952c77acfd4b3a100"}, + {file = "pyobjc_framework_metalkit-10.3.1.tar.gz", hash = "sha256:905eaad9dce29082efd5cc56195337d2e8bff86ccfad36ec5127f818155ec038"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Metal = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Metal = ">=10.3.1" [[package]] name = "pyobjc-framework-metalperformanceshaders" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MetalPerformanceShaders on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MetalPerformanceShaders-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3b71ad3993d18564e5566e48c782a06eb4315af9e03c64f8ef6fd20d09d8783e"}, - {file = "pyobjc_framework_MetalPerformanceShaders-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2ea02d5c65a4cda05a66ce7f5642ff3c3942e9a305abbc30a2a3770fdd02d4d3"}, - {file = "pyobjc_framework_MetalPerformanceShaders-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7cd0e7d0e10f3a2619fc13653eab142c18168fd05718ee0d459a8cb54b68b576"}, - {file = "pyobjc_framework_metalperformanceshaders-10.3.tar.gz", hash = "sha256:602bdc6c2ac75c330897f473661b52cfb1bed32d606a351962fd36180bf09001"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:a6f72fd528033ff0b176e909394edfc34f90b711fc6dcb225ba41b042929b71a"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:59c971d79c0d02a451571cd0122296aba05b46d7eecedea75ed8ce892d1119a1"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:969bc8caea30d71f963fb763c8d837f36d403e47c1ff6ed449ceb09783322944"}, + {file = "pyobjc_framework_MetalPerformanceShaders-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b02da6a5dc9088cadf38dce21aa39027bc668493876d3af684b91f039f123df2"}, + {file = "pyobjc_framework_metalperformanceshaders-10.3.1.tar.gz", hash = "sha256:1a9e91dc9e748834c95b7a596b943203761f6533352631c7abe612f804b23d50"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Metal = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Metal = ">=10.3.1" [[package]] name = "pyobjc-framework-metalperformanceshadersgraph" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MetalPerformanceShadersGraph on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MetalPerformanceShadersGraph-10.3-py2.py3-none-any.whl", hash = "sha256:afb9d542458d98402546700a844b0b93877a71988b3fc4e56109065d2a7652b6"}, - {file = "pyobjc_framework_metalperformanceshadersgraph-10.3.tar.gz", hash = "sha256:fbb3b6f5f91fb4419e7e3023c7b8729eae42aca0d48b2bb985f96af6718ae4a6"}, + {file = "pyobjc_framework_MetalPerformanceShadersGraph-10.3.1-py2.py3-none-any.whl", hash = "sha256:a0288c53a024bc47348da2ccd8dc980d389dacc9d1d33b3412614e88732dc424"}, + {file = "pyobjc_framework_metalperformanceshadersgraph-10.3.1.tar.gz", hash = "sha256:4bf2045036f97dcaabbf16ee8527f1787c7e9366611b9b9ed4bfabc81c19343f"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-MetalPerformanceShaders = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-MetalPerformanceShaders = ">=10.3.1" [[package]] name = "pyobjc-framework-metrickit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MetricKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MetricKit-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6944badc0ea077a1f2e9c9e16137293534a1566e2a2f411ab861d4d21090b2a8"}, - {file = "pyobjc_framework_MetricKit-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a18d89bf6583ea70aa67bc964a48e6c57a12470c5ed2eb0ef1b797368eeba3aa"}, - {file = "pyobjc_framework_MetricKit-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c5fce19ea55a0ef4da7b597626c76553b69b2ca2c87fa33811752e52d8db012d"}, - {file = "pyobjc_framework_MetricKit-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:7a065292b8331bc5fe2e736ebf39ff9edde9fe32994eb32b4987b901d756b36e"}, - {file = "pyobjc_framework_MetricKit-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c6b369b7a0daeb75bc40d05a527953f77162499a25c6fa6b59719ddd4490a556"}, - {file = "pyobjc_framework_MetricKit-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:13c6fd6110e640fee48ad72d0965eabc5049038cf70c3fc1157cd57a9b6812fb"}, - {file = "pyobjc_framework_MetricKit-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:21ad79f98474da198003e32de23a66f10d819e9e572f86ed81d7588ba4e72824"}, - {file = "pyobjc_framework_metrickit-10.3.tar.gz", hash = "sha256:0daaca29f60f0806e3f2a08bfe5ee2dfdbb8bf3ad2c7adef50f90cc523f34530"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad28bb10e452b33af285137fb89f573294759571fa02d66201b78304add91513"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:59b6959d6f79f71080d386ad08665c19e52d0cc57943716da180bbb3369c9569"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f73d240b5e8f2351d6c2258b71a6d06b45ec964523f54acf05af50dc4ffac821"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:58dbfc7b9ae7701a59b9b2a5a5f874a9e393f10b27f39155714d1b49ea725226"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f462b68c22632f952d52b7c858d03727315107bb22c0a2152994baec1350534b"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:321ea41e7dcfb142f6ef91916cdfb5296a9888571f7c1ccd8799e51b1fc4a6c5"}, + {file = "pyobjc_framework_MetricKit-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3460fad9a31f6331884775905bb55d38db621b2f3613f44fd037777eb304d787"}, + {file = "pyobjc_framework_metrickit-10.3.1.tar.gz", hash = "sha256:f0b96fe9da0e26759f38d9e4cdf7d9c8be9c6ba35403bc8e675183a6f81dd0b3"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-mlcompute" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MLCompute on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MLCompute-10.3-py2.py3-none-any.whl", hash = "sha256:5845c232ac703be2e1cd5139e6e4c758493602562565e9b57cc8aec0e8630583"}, - {file = "pyobjc_framework_mlcompute-10.3.tar.gz", hash = "sha256:551139df816a78d0cdb4e70ddf01cd705ecb4b88ba121baebf4db4297c4ca274"}, + {file = "pyobjc_framework_MLCompute-10.3.1-py2.py3-none-any.whl", hash = "sha256:e5f8d98ee43fc795f44dab322299cf8957d7e6acb54139cecebfc7f4b2562b6c"}, + {file = "pyobjc_framework_mlcompute-10.3.1.tar.gz", hash = "sha256:9ac94b0a9511fedceacda846865daa05358eec5a4bf62be534b69eb4d7aced9b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-modelio" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ModelIO on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ModelIO-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d348fb8fa7339e152059ee08ed5ccb70d75bb92db2c4e60aba2ca8be79640c15"}, - {file = "pyobjc_framework_ModelIO-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3f2534d4a3920a77572acc4a6803f7514eabb6ef780c858ed2b63c2b4af502c7"}, - {file = "pyobjc_framework_ModelIO-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ec49cdf8e17f77c3f76ba3f159c7383778dfdfd73330be92c7136244c875e348"}, - {file = "pyobjc_framework_modelio-10.3.tar.gz", hash = "sha256:851e411bb075e0c7f813ee188610d5b87630f8552393657061bc3de58c20655f"}, + {file = "pyobjc_framework_ModelIO-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:e841be15f1847ffe1d30e0efdbc57d3c6f1a2db7553946bc15dde0d8f57b620d"}, + {file = "pyobjc_framework_ModelIO-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:53d4cc794e0dbc94e622ed164556f82db723f9c3b2d9dbf72bdf44468eb4efa5"}, + {file = "pyobjc_framework_ModelIO-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:856e8d63c10238f4b23d30b9fb903d64b9f2b44e4f30f30a28bfc665e1adc5ac"}, + {file = "pyobjc_framework_ModelIO-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b59069c79c0865334e0036b1938e009addf035bfec36f7d4d871037c14c7accd"}, + {file = "pyobjc_framework_modelio-10.3.1.tar.gz", hash = "sha256:b1da37d10c38c63006d5173b49d18891b2db2c9acdbb6dbd21c73f17c0ccab7e"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-multipeerconnectivity" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework MultipeerConnectivity on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_MultipeerConnectivity-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8013e0298f7d98cb060ed7ca491ba393999030c589c86900a143cbcc5ba8767f"}, - {file = "pyobjc_framework_MultipeerConnectivity-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6802c1fc6f77cec5f4a117f8b2bcb4c02d8fe8216278e9dbb49df31ee0626a47"}, - {file = "pyobjc_framework_MultipeerConnectivity-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f38409f8b9c6744222c9f5d4a3a0079ca844a9700b2e9e711f150df317147132"}, - {file = "pyobjc_framework_multipeerconnectivity-10.3.tar.gz", hash = "sha256:ee4ab1f39bcb50354602bf05b0064cf4698db95b504551c0beebda554eef5f8f"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:1c0b65734f1e9b907c6198b035ad47c49819711c49694fe73cdf475be37db82e"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:f0e466da15a3daf2c140be66da99ac0526b584fbd6dc08ed82e542e706964449"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5538caad124908481ee43755d439898f9d7eb0f200856ba246c730ca5fd77e15"}, + {file = "pyobjc_framework_MultipeerConnectivity-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:5350d13115b252bf6fa374dba1ef13ffd746b15b16f45d1b77b9231aebdf5b57"}, + {file = "pyobjc_framework_multipeerconnectivity-10.3.1.tar.gz", hash = "sha256:eb801d44194eb7eafcb0a21094c4ce78bcf41ed727125b048755838b59de3271"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-naturallanguage" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework NaturalLanguage on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_NaturalLanguage-10.3-py2.py3-none-any.whl", hash = "sha256:1c002762da454c59b7465d9bec0337c796f4a255e789c37fc091e734b7ee1f60"}, - {file = "pyobjc_framework_naturallanguage-10.3.tar.gz", hash = "sha256:af031d2e3bf184ad3120f15b99cd9219fb5372372024c50e494767b1dbb2dab7"}, + {file = "pyobjc_framework_NaturalLanguage-10.3.1-py2.py3-none-any.whl", hash = "sha256:d0e47fad66bb74fa68b50093500f5cb49d8a772b522f8c92e725f2e65942dd9c"}, + {file = "pyobjc_framework_naturallanguage-10.3.1.tar.gz", hash = "sha256:49f19d0dba34802696a270d690db310ff03f1c85d6fb411734cb13667db90dd9"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-netfs" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework NetFS on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_NetFS-10.3-py2.py3-none-any.whl", hash = "sha256:3b223f96aeb2e3317e11b9f53fbe4d0c06033279bdef5570cb77ca9c12c0a8f4"}, - {file = "pyobjc_framework_netfs-10.3.tar.gz", hash = "sha256:119a6c4080f9a07d0dd5355bd8eeea1272477b8f128c3d532aa04e883763569c"}, + {file = "pyobjc_framework_NetFS-10.3.1-py2.py3-none-any.whl", hash = "sha256:84faa7325c4ecc2f4ad199d8c52cebcb520ad2e7713f356c7a5a849839398d77"}, + {file = "pyobjc_framework_netfs-10.3.1.tar.gz", hash = "sha256:46466917f7b0aca3772bf4dfd586b583992c60ecd71c39f7d28ff7665d057637"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-network" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Network on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Network-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:40ea746241e8199b793389a17ebb4e699e7d9e9fc17407133bb217ea2aff74f4"}, - {file = "pyobjc_framework_Network-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:951dc751a8f8fe62dcc6f888fd3c53be84835815bc0c3989f3bc9203e482c326"}, - {file = "pyobjc_framework_Network-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c029aab42580af9846a5e97d6afe76a97b870254433900faf55b1b726ce91369"}, - {file = "pyobjc_framework_network-10.3.tar.gz", hash = "sha256:34d63495b8e1bfd8008a55299c3b14a743a082bf1cbce25fb741db57284e2bc4"}, + {file = "pyobjc_framework_Network-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:56df88c10b948b3b09dd6d0e9061da33683e294d0450efd9076354f41e214f58"}, + {file = "pyobjc_framework_Network-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0336fc0b80a2481d3a032b94e7dfddbb8d0f1ec10e36e80ad424a028b00679ac"}, + {file = "pyobjc_framework_Network-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1e2cbc4d209b6789d8a3bd85cfe472bae50ca2d54355beb25b8336ed65d846e0"}, + {file = "pyobjc_framework_Network-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c665f3dcfb1375835dd0c6ce10079f22be73f92213fc3d48b176d9c67fc221a9"}, + {file = "pyobjc_framework_network-10.3.1.tar.gz", hash = "sha256:87a5839d4ab2ae452b4e563bd7a00569557ede4b8cd1eb77c973cdf45fb8f5ab"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-networkextension" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework NetworkExtension on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_NetworkExtension-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2f4a2ef0ac9619052ec2db1681ed5ce7d568ad0c73f570fb6c119ec33b25fee2"}, - {file = "pyobjc_framework_NetworkExtension-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f5f2e8f23f89d754ac82d7db6b607634bb40c390b8507b0367f94d70493eea3b"}, - {file = "pyobjc_framework_NetworkExtension-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:387e2bb13540d66cdd6222f4e3b44f8fa49525c03ec987acaf26a235393c51ed"}, - {file = "pyobjc_framework_networkextension-10.3.tar.gz", hash = "sha256:0798f951be920e4d3a2867d559ea2b2103f2f6f53c03b53cc752915807fb1887"}, + {file = "pyobjc_framework_NetworkExtension-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:baacdb4ad595d5c5ce9660e10ea476fab9bfd1a1def2357eae7918f5019bb8c0"}, + {file = "pyobjc_framework_NetworkExtension-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c1efc35dc4ddced3f0e5400e8ae9b28b7585f0cf5701023dd957f3cbd58d361f"}, + {file = "pyobjc_framework_NetworkExtension-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aeba32d9b9809bb1296d85da00f0c221daf54b25fd864dc9bf03a7007f5ad601"}, + {file = "pyobjc_framework_NetworkExtension-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1c8ef5fce8846fb3bf459bedf7a31ff0428a9c3184c8b26ced8e322c956e8ec0"}, + {file = "pyobjc_framework_networkextension-10.3.1.tar.gz", hash = "sha256:c5a094862061565ca6d37457db42f55f344ec24dd7604ddf5d72e20ae7f63fdd"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-notificationcenter" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework NotificationCenter on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_NotificationCenter-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2ffae68cfe70bf1f1ceee56971fed5f3f1a52ff26a857948923805d4f71b7844"}, - {file = "pyobjc_framework_NotificationCenter-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f3a25f6f7273f875f8e567421708d863a86e6f6f00963c958dfcc31ebbedaed5"}, - {file = "pyobjc_framework_NotificationCenter-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:58627e5236f70cf75ddb75f8ff944749c2b91f89fa7b56a28fe2535192ae831d"}, - {file = "pyobjc_framework_notificationcenter-10.3.tar.gz", hash = "sha256:2a0de17db42fc5a31c097f344ebbe61c3479d7018a6762944d9c387af0e5bf92"}, + {file = "pyobjc_framework_NotificationCenter-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:2818922c2c3f45721515733b452d20a507368a87b793fa976c21945773582abc"}, + {file = "pyobjc_framework_NotificationCenter-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e08264759b84a21631e143afce1696920207d418be7f8853dbde18dbc7881667"}, + {file = "pyobjc_framework_NotificationCenter-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1560edad4e9fe01cbf3a70bb6e2668985e13903497d3fdc92276d6cecf9e4742"}, + {file = "pyobjc_framework_NotificationCenter-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:992ea7c86d0330cf10113b829525d74a95d97d0d7245e4e277f75ecbb37b596e"}, + {file = "pyobjc_framework_notificationcenter-10.3.1.tar.gz", hash = "sha256:3e6efe0fe6389601bb87086f5585fa7e74b2143236b7d5afd02b617a73656419"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-opendirectory" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework OpenDirectory on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_OpenDirectory-10.3-py2.py3-none-any.whl", hash = "sha256:5d9770afc8f5f3293a633ead3bd5e5b843262a515dc37fab99808b3fb111548a"}, - {file = "pyobjc_framework_opendirectory-10.3.tar.gz", hash = "sha256:750a74323a6bdd032bba3ea50dc4b442c92682536cb9a456515c48d2c6e30a13"}, + {file = "pyobjc_framework_OpenDirectory-10.3.1-py2.py3-none-any.whl", hash = "sha256:7e787e65409aad082faed2ed0c2cd52cccea61702d9c83b6acdcac3fa50a562f"}, + {file = "pyobjc_framework_opendirectory-10.3.1.tar.gz", hash = "sha256:cddc25632eebeb6bf0d886ae0fc919d574e458c597691226ba15bbf134ab51a6"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-osakit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework OSAKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_OSAKit-10.3-py2.py3-none-any.whl", hash = "sha256:ffa00d345700c3b75ad4fec6b6cc28b2d34a565d4d611df288c708f5837b664e"}, - {file = "pyobjc_framework_osakit-10.3.tar.gz", hash = "sha256:c784228de4d8838e37ef0d01c031879f863c7839493e227ab3bcc877926dd639"}, + {file = "pyobjc_framework_OSAKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:aaa60e6f455febe45f9be6487c59f11450de81bd7f49a6e4db576a38bcaf1c68"}, + {file = "pyobjc_framework_osakit-10.3.1.tar.gz", hash = "sha256:0af326b831fa29fca11ffe2b641807ad3c233be9eb403e62328fa784528da4ab"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-oslog" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework OSLog on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_OSLog-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e13e40fb8d014b3668777969cf11e5757721d6e35309d60f2fecf0280181a98"}, - {file = "pyobjc_framework_OSLog-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ffca1c49760eb76022ece753d8646162750939583263e2f55ea6bffea6e03c90"}, - {file = "pyobjc_framework_OSLog-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:14e5efaf7f50607c3c43f3dc9eb2d5b6af56ccf3f22b7f65fd1b92cccb9318e1"}, - {file = "pyobjc_framework_oslog-10.3.tar.gz", hash = "sha256:198a582cdaac5306cd7a6ff8c65047602766b18230a953baf95f9e6120709127"}, + {file = "pyobjc_framework_OSLog-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:4799619f9ae12287923e2bc39fc021c75ea4e8bcb0e8ff44201f1018d017db98"}, + {file = "pyobjc_framework_OSLog-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7ff719367249c09318a87df47ef8e1c8d18ab5f4b9e94862e7ca9c8fad21ed9a"}, + {file = "pyobjc_framework_OSLog-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:5ae0848bf6de69c95802f11bb4aff5c2edac5c5e6179b9a06a0e4fe05ed48b53"}, + {file = "pyobjc_framework_OSLog-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:cded4c706fcf3fd78ef257ab096f4f8cefc70cca81553d2fae88841aaf5d620d"}, + {file = "pyobjc_framework_oslog-10.3.1.tar.gz", hash = "sha256:592c3e50cf824c2c07779771aa0065de2dbb4c615de43e8949b39d19ba04d744"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-passkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PassKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PassKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:88a5a3e57337b8ad7c31499844496932ad25a7b175604c605bedfc02912cff89"}, - {file = "pyobjc_framework_PassKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1e215af948065631c0cc752a2ac5fe2df52eba894cd70cc88caf88a5359e5fe1"}, - {file = "pyobjc_framework_PassKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c1e03659e061d29d6a907642cd5e8829b1e67cf7b36ec94e0c32a44a5edb170f"}, - {file = "pyobjc_framework_passkit-10.3.tar.gz", hash = "sha256:9a4464f1a3359ee7bfff8a60c80dddd07b4519082ffe5316ef8532491ea99a9c"}, + {file = "pyobjc_framework_PassKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:ce09205aae4e15d3639d76a558c072ae106e8c7dafe9a451c5e27967498b74cd"}, + {file = "pyobjc_framework_PassKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:79ff6fa8ad4c0f9b4a992122b22e2b2b4200534221eb1bfe86bf473fb3c7ca23"}, + {file = "pyobjc_framework_PassKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bbb71ac6fc51da06d0fd6cb4d83eb79b704c2bab694a93899d3f83c753c9740b"}, + {file = "pyobjc_framework_PassKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d41409ee24eee2318023c3ba23218db152fc262ebcbea9021dc533fe80a73f32"}, + {file = "pyobjc_framework_passkit-10.3.1.tar.gz", hash = "sha256:4c3eea19c1ae3edf6e7858ab815bcd8ecf517a146928ce6a843910729372f010"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-pencilkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PencilKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PencilKit-10.3-py2.py3-none-any.whl", hash = "sha256:9c0e3d504b55cf7c8a52e8efcca0188b8f7657108d8ef4e41990e99bb3b8ae43"}, - {file = "pyobjc_framework_pencilkit-10.3.tar.gz", hash = "sha256:dd7c9ef5482c975ad4674ec8e9a547b91fc3095e29343fbdfcfecf1b276d4483"}, + {file = "pyobjc_framework_PencilKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:dc05376fbc5887391ff4e778b6f4b2fa20264aac58cd5fe5f47e4930186c1674"}, + {file = "pyobjc_framework_pencilkit-10.3.1.tar.gz", hash = "sha256:4dfd8e0179be5ecf67b768317a88d86d93df1c8674d422afa14957cf80e6e01f"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-phase" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PHASE on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PHASE-10.3-py2.py3-none-any.whl", hash = "sha256:947291b108f95008042fbaf9b967f19726e0b2b521d7e8d57b9411b47f0e2ad1"}, - {file = "pyobjc_framework_phase-10.3.tar.gz", hash = "sha256:f38712f38eedc9da80e5e99665f9a5654031886ffeab03879fbf6cb14c5c40b7"}, + {file = "pyobjc_framework_PHASE-10.3.1-py2.py3-none-any.whl", hash = "sha256:eec5a38983d65a4cf022dd01dc6f290ec163399e79592203443b4115ea3c8510"}, + {file = "pyobjc_framework_phase-10.3.1.tar.gz", hash = "sha256:5be2ea5d36ea9620f5278f5ad3b02cc243511be3b137aa28b1523e8f6da54f99"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-AVFoundation = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-AVFoundation = ">=10.3.1" [[package]] name = "pyobjc-framework-photos" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Photos on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Photos-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:eb921df4c5f61f518c156681131159f1a640d2654d98811a129f3df8eef976a2"}, - {file = "pyobjc_framework_Photos-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ba6b9df97e76d5342298ae93d8c6bb2dc0c9561c8b03efd87499512af962f6f6"}, - {file = "pyobjc_framework_Photos-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:26409575fc656b8967e52efb699c1ef2dab57ea60657dab3b7180515029f485f"}, - {file = "pyobjc_framework_photos-10.3.tar.gz", hash = "sha256:621c058e84df654af49a5cfc1e0799b5de07fb37449d83562ff11c4bb40530eb"}, + {file = "pyobjc_framework_Photos-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:9a382201dd14a3f3076d8689267d63520803a1ad1716fb66df5c1bb578bc6384"}, + {file = "pyobjc_framework_Photos-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9c72efff52bed483b0dfaa569a21355f7620f25672a0245c5db8c1df86abc7b8"}, + {file = "pyobjc_framework_Photos-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:4841948ce4fe3d5060ec08e760b0b6e476e923782f32b9af2ffe8eb2a4fbb385"}, + {file = "pyobjc_framework_Photos-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:50710703d18d0b13c48e02ab4edcca72a67ee20aac2a75664bfb725c8cb3a677"}, + {file = "pyobjc_framework_photos-10.3.1.tar.gz", hash = "sha256:8d538c399720062523694f7669aa82dcb75a7b192fb4aca93cf782d04e4c39be"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-photosui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PhotosUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PhotosUI-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2579e6f77668500ae2621f133ceec5bf5931c908a87d53ecd0a0fca0cf32608f"}, - {file = "pyobjc_framework_PhotosUI-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1e2ead7e15aab8fb34aaa55bbd55faa48b3fbc9cb6994af730fad1fe9e8f229d"}, - {file = "pyobjc_framework_PhotosUI-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:9e50ca9c56187e7394def35c57238b556cb48d61c1c7fb59bc4cd2cee1e2e10b"}, - {file = "pyobjc_framework_photosui-10.3.tar.gz", hash = "sha256:1acc78ac2eaa487a63d1e732f22e7cf9a9e620ed7cac1d10af03ad08f125eb9c"}, + {file = "pyobjc_framework_PhotosUI-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:88665561d9ef7e9fd2ceb4e7e5da0fc3412a397d4c48a2121250462781106d30"}, + {file = "pyobjc_framework_PhotosUI-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3254605c33e090742d0303a3b5b8ddab5489dbf28ea8a287566106e6887ee561"}, + {file = "pyobjc_framework_PhotosUI-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9370e36bb4ae1e7128006ff6a6b43448ebf8586784749e2a1fa30bbb2ef8fedf"}, + {file = "pyobjc_framework_PhotosUI-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:a756c3bbf945ceaa7d184c41053c2a9c1a89b32ffcdf752664b1180927b22cb2"}, + {file = "pyobjc_framework_photosui-10.3.1.tar.gz", hash = "sha256:e9eb961c6be1f3e00d76cc0a8ec15b50ac0692bd5b5c86268ad08f6d09cf390d"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-preferencepanes" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PreferencePanes on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PreferencePanes-10.3-py2.py3-none-any.whl", hash = "sha256:d82b67f9ba6c4f6524dff93f8bf705ff703d281985d42d85d703743ccf89cf5b"}, - {file = "pyobjc_framework_preferencepanes-10.3.tar.gz", hash = "sha256:39b927fe60ff5883b79df7bf25cba2bfd2b13a33153754a3ecd29e1636ec188c"}, + {file = "pyobjc_framework_PreferencePanes-10.3.1-py2.py3-none-any.whl", hash = "sha256:319b58b6c8f876f67e879b3a4f74afd6d892aa43a7f9ef4320819265b281c9e5"}, + {file = "pyobjc_framework_preferencepanes-10.3.1.tar.gz", hash = "sha256:eef150416a39a0109a8a37e9978ac4a55ad0b125ef6053a7431524ede5c69783"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-pubsub" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PubSub on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PubSub-10.3-py2.py3-none-any.whl", hash = "sha256:5da1ab453671d73c801d21e509537492a27d56bd8ea0d4b060a21768594e9ca2"}, - {file = "pyobjc_framework_pubsub-10.3.tar.gz", hash = "sha256:060949b977a647922ca7c92951f0316815a98f54a1293c9733573706907f8041"}, + {file = "pyobjc_framework_PubSub-10.3.1-py2.py3-none-any.whl", hash = "sha256:dd8bc334b3acbdd82163d511bc71af7addc98dfaf473736545487f3168836dcd"}, + {file = "pyobjc_framework_pubsub-10.3.1.tar.gz", hash = "sha256:d123e75288c2f9d785ed1c4d92a96e5118c4b6f1cd9c55605eb4b4a74c2e36f4"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-pushkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework PushKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_PushKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b3ef9d2928d31735c03e909b2a7aabb2b22b4ab962aba15b0c5b1691c5a0197f"}, - {file = "pyobjc_framework_PushKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:262121afe7aa5a44dfcd50b87f0416288907ace5e5dc374fb0cf15ac3c8407ca"}, - {file = "pyobjc_framework_PushKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f98e8abc8e69b48858829f00723c818b579018525cdc89ba7fb2aa8fcbc0f1a1"}, - {file = "pyobjc_framework_pushkit-10.3.tar.gz", hash = "sha256:942d5a77b13cd3f7310cd50ac86fa563c502e5d6a0d4d2eecb3ee67587a8e844"}, + {file = "pyobjc_framework_PushKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:39e21ac2b9a529e99d6d33c439c96d4d2bb97d2c56bd6d92b2c5bd497e925851"}, + {file = "pyobjc_framework_PushKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e20f94ad3fbebf34c613c880e655d0f918d891b0a70763f99bb5d11e0af65c73"}, + {file = "pyobjc_framework_PushKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:79f0e66b88473e7fdef304dce06d7d63c3e5e38b12deafcd06a5bd3506ed9398"}, + {file = "pyobjc_framework_PushKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ee90959fc7b171930cffdf07cb7865d56a2cb4b723c5826ccf95d6e865dee4bd"}, + {file = "pyobjc_framework_pushkit-10.3.1.tar.gz", hash = "sha256:cc4da5382cf48c29637af1c633490203358a6ab0c76f0c006079cf144eeb9568"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-quartz" -version = "10.3" +version = "10.3.1" description = "Wrappers for the Quartz frameworks on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Quartz-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ab809262f8a1a2880a0e9d9e65035992cba684883f422c375bd320848f4e9a43"}, - {file = "pyobjc_framework_Quartz-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2187dd8a8d15fb731c9e3ae24b7311b9e21681a53377650ee6f9b519e1f78432"}, - {file = "pyobjc_framework_Quartz-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:caf489c498b2137bf2909ad19f6461ddfb66106f678694805184daaa0dec7919"}, - {file = "pyobjc_framework_Quartz-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:cca8f2233d93b3b84bca2745ad74b603c23a77c38c1c5847ac590eab0c335fd5"}, - {file = "pyobjc_framework_Quartz-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71d9f590d5842191c68a5a8aee812d5516d61240e5dea8f604d8a9f769bbda4f"}, - {file = "pyobjc_framework_Quartz-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:75094e160492e4724347a7fdde5a6f4c9f186c31d528c247f359e2c1606d9fb2"}, - {file = "pyobjc_framework_Quartz-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:465ae4c1ecceca59831e7698c5fbe62d8e1e987c7fbbb000737954f2085762b9"}, - {file = "pyobjc_framework_quartz-10.3.tar.gz", hash = "sha256:4c4441e5a338ebe2e1d44a3bdf78e6bfb849ac167732814646dc438c3a08f595"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5ef4fd315ed2bc42ef77fdeb2bae28a88ec986bd7b8079a87ba3b3475348f96e"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:96578d4a3e70164efe44ad7dc320ecd4e211758ffcde5dcd694de1bbdfe090a4"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ca35f92486869a41847a1703bb176aab8a53dbfd8e678d1f4d68d8e6e1581c71"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:00a0933267e3a46ea4afcc35d117b2efb920f06de797fa66279c52e7057e3590"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a161bedb4c5257a02ad56a910cd7eefb28bdb0ea78607df0d70ed4efe4ea54c1"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:d7a8028e117a94923a511944bfa9daf9744e212f06cf89010c60934a479863a5"}, + {file = "pyobjc_framework_Quartz-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de00c983b3267eb26fa42c6ed9f15e2bf006bde8afa7fe2b390646aa21a5d6fc"}, + {file = "pyobjc_framework_quartz-10.3.1.tar.gz", hash = "sha256:b6d7e346d735c9a7f147cd78e6da79eeae416a0b7d3874644c83a23786c6f886"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-quicklookthumbnailing" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework QuickLookThumbnailing on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_QuickLookThumbnailing-10.3-py2.py3-none-any.whl", hash = "sha256:245970d34a6c2faa591a4f597336591867f1f3577b91ba510cfa74461e50a0d3"}, - {file = "pyobjc_framework_quicklookthumbnailing-10.3.tar.gz", hash = "sha256:657793496b4f906d8d651505f049d624e00b9cd4e12af617f3818d5674cef5db"}, + {file = "pyobjc_framework_QuickLookThumbnailing-10.3.1-py2.py3-none-any.whl", hash = "sha256:e5095c0ad8cf1f91a6ed9aa5c4fb7c9b1da122d495ce131bae8d7faa06da9505"}, + {file = "pyobjc_framework_quicklookthumbnailing-10.3.1.tar.gz", hash = "sha256:ee26be78df9ce46ffa6f971f4ce167a0e98f38167aeb86cfc1b41270f15c96a3"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-replaykit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ReplayKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ReplayKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:429d2b47cd60dd4e7c239ffc3185c93d07f2a78c45b575d0d04af6cafa93e0cc"}, - {file = "pyobjc_framework_ReplayKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0656092eefe1e7484e4f35147d25f037ce22dcbca8ac68489b93fa1827d452d1"}, - {file = "pyobjc_framework_ReplayKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:88e74ce344bf9790d306d30c62789746b5c2fdf8eaf7bf77cfef12961451c9dd"}, - {file = "pyobjc_framework_replaykit-10.3.tar.gz", hash = "sha256:b1c87606d3b90b93d2549b792af2ca1915827788e7c0c3a534df0d068b39c012"}, + {file = "pyobjc_framework_ReplayKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:1d89020e770763947c0e3e3a201b541b81b455656e574d390ad0b0e32a67640a"}, + {file = "pyobjc_framework_ReplayKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b753658337d25964acb83f5edc465b772f276b4c88fc8bd03ad633b4466f6bd4"}, + {file = "pyobjc_framework_ReplayKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:fafbc37ef6e44ac5019b4a4b751b3de6d5983500705e8dea2fc62134f8c0dc24"}, + {file = "pyobjc_framework_ReplayKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:22ca748ae8325e41e0526f13822d2c477ab879cb2d454eee1db47ca91353c986"}, + {file = "pyobjc_framework_replaykit-10.3.1.tar.gz", hash = "sha256:21762c8674b629fb670c3cbd515c593f1b5f98ee24ee4834a09055cb08849068"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-safariservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SafariServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SafariServices-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:7e2bdd40f0399076840e4f95599d409df2ad7be06ef8593cc59cc12c84b39ca6"}, - {file = "pyobjc_framework_SafariServices-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7ed3bc6b71575082f21b6edb6360a3d3093fb2d40d1f57749f4d25264041e394"}, - {file = "pyobjc_framework_SafariServices-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:8c9ff1b7fbcbdabaeabbd9866e89208d7dfde1e125c372d91d047799e0b3682b"}, - {file = "pyobjc_framework_safariservices-10.3.tar.gz", hash = "sha256:678fd2013ed3451b9c249f6515e8cb712f8c68f76050e2e0b8911dcdd1bb1df0"}, + {file = "pyobjc_framework_SafariServices-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:c8afb977b5858d3fd27136146db46a9f2ec43c35f5af269dbcb51c46a422dd7e"}, + {file = "pyobjc_framework_SafariServices-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:adb0332cbfa086892524efa253c873ecc4a8b00c60db45be3362759c4b4ae87d"}, + {file = "pyobjc_framework_SafariServices-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7a171f08527c6bd297633e72bc597d68ec74419b5315f8c8122311537a8a6340"}, + {file = "pyobjc_framework_SafariServices-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:aaba0ea92410820d94fef0b93d337478f0e416967cb2aa4e667dd4d1bb561c1e"}, + {file = "pyobjc_framework_safariservices-10.3.1.tar.gz", hash = "sha256:9c5278576e7c28c3d93e74ebe5d39d07c5c91572ddf03ea01cc45d9a06dc8d0a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-safetykit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SafetyKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SafetyKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:01da686c3be43dece5935b671335f7567ad02490557d72a273465223c7390444"}, - {file = "pyobjc_framework_SafetyKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:7439880b24a51f62520e96597b9cd3cf6f987390fb0c7a6d4c1c756b452e3865"}, - {file = "pyobjc_framework_SafetyKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:9c1a74ab089cc953fc385d47ab1bb2b434f6ae3a5c4bca4856a3df5dec2e2989"}, - {file = "pyobjc_framework_safetykit-10.3.tar.gz", hash = "sha256:4d04ff2919b3061c15bd013d87a88bd532cc76cd7a94ab76d70ac8dc5d63022c"}, + {file = "pyobjc_framework_SafetyKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:e554cb94bc2f89f525ccaa4ed827390d188eba8bb24049acdc764f3dfee9af08"}, + {file = "pyobjc_framework_SafetyKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8eb160cc4f3b7e6d58f2eecc205f016afd5f4278b9641e49d5ef9c4df7b6df8c"}, + {file = "pyobjc_framework_SafetyKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3674b92d8b72d0a6006cb899ec2f605d1d5a6a59ff2d90c51ee2ccfd0f069d10"}, + {file = "pyobjc_framework_SafetyKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ac700aa2cbddc8a31626815886e42d0d1591572914c2b15df2dd07871ee84568"}, + {file = "pyobjc_framework_safetykit-10.3.1.tar.gz", hash = "sha256:8421be801ce29053e67a2c91673913562c3ad9d4bb1fbaa934a3a365d8bff12d"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-scenekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SceneKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SceneKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:95feb8d312ab140b7e064a2792c477a2f366b184bf89a676f134a9b5c8bad391"}, - {file = "pyobjc_framework_SceneKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:40335d7a8a4e20091e3e34958da779b06a91613736521634c3cb00c83c7d9f17"}, - {file = "pyobjc_framework_SceneKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ac8afdfaf8a4b0352ce53228e3088e52813813a3ea92719f17e12f2f49df607f"}, - {file = "pyobjc_framework_scenekit-10.3.tar.gz", hash = "sha256:aeb4182d2a2d3d2887afe4b4f18f44bb64bf89aff62a22e69522b67bdb1fc6eb"}, + {file = "pyobjc_framework_SceneKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:7a108ef1a660a7928d1d44e415c84f544d296745d5350235addaab82777b080a"}, + {file = "pyobjc_framework_SceneKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:08fb5dd8c10a5624a0bf3dd9f448b2fe4c8b9c7c3c98708d28b0b4c72dd2a107"}, + {file = "pyobjc_framework_SceneKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:08601223416fa048d9468f961b170e3c2009d7e2434eea92c12ee12f6c672961"}, + {file = "pyobjc_framework_SceneKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2984a543221190547bff603a6a59c931cda7099b91ac7412e11c962e8f6c3bc1"}, + {file = "pyobjc_framework_scenekit-10.3.1.tar.gz", hash = "sha256:99cf0db3055d9bae0a8643400e528a8c012235db8ee6a1864ea0b03a0854c9d0"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-screencapturekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ScreenCaptureKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11e0804885f3c6d40818a644a2732a1eea8047641b9f6e70cd300f05c5aa5eca"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:496d16ef5fe2ffda8dda6d1d01f9f66e6585194d281fa989dc659646d7661513"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:cbb8583032093e2e1f142c333574d6b9e785aac4186f7f4d25286f0e3545b2f5"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:4885bd0147f08c14430e660280b42bbc00023e5c3ec80605f62f644239a686bd"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6dd224b70f67dda55a53972d6679281d305a787e128206e583ce1ef1acf3c41e"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:136e63f4e1868129cf8f42c81cd84cc03078b098666fb941e068732100563ba9"}, - {file = "pyobjc_framework_ScreenCaptureKit-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fa91c9c266d19afbd7e1f2c51015be6d707f645d5a4546ca7d301326a6d18dc"}, - {file = "pyobjc_framework_screencapturekit-10.3.tar.gz", hash = "sha256:96cd9da48212b13c749b9fdfba570c7e374f1cd3b6fa07b89f09c017d3463ca6"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e69a1e15502543c80c084399d7e06d6ebfb089a3afd248860e24dd03e654456a"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0953f8d43bd7f0012decebe34401d361c4a64472190960204b3214e4850e4ef2"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a80928dc483046ac72294fd576c53f793045aad700b740ec9591b23a3ccc011d"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4d8e280a076e7bc40eaa9730f97da84421b891c30f6e3fdea4f6c30bdb298243"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:757a62e30ae68307d4705288bb808d91e10569c8ba3b54192bb5bbaaddcfa802"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:c55a2bdc3ff934841a668db1b5b2f74b9352696419ce87fea31637b89a04b6c7"}, + {file = "pyobjc_framework_ScreenCaptureKit-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a0ccf558123fe0b7fcfbb74280678aa0f0973c96765a03cb658fd4d8c5e732e9"}, + {file = "pyobjc_framework_screencapturekit-10.3.1.tar.gz", hash = "sha256:cb1a2e746e0f98ea14a11ea35d059d38587340beeeb905812085e2c7ceb14e0c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" [[package]] name = "pyobjc-framework-screensaver" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ScreenSaver on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ScreenSaver-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9676a820ee37fd570831ff6f55d237e2c7169529dba90efaedc4aca4eb38e687"}, - {file = "pyobjc_framework_ScreenSaver-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c02a8ea32a5361542c7578b836414d08a9f913bdbd1fb3e479be3f55b1f349f3"}, - {file = "pyobjc_framework_ScreenSaver-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2634591a4c2e689655e3f28023177d36a6e8f287f0b71f51306eab8ebb8ca903"}, - {file = "pyobjc_framework_screensaver-10.3.tar.gz", hash = "sha256:32ad91df0ad95c94f757a48e9338caf92afb90a492e3800de749aa37d4590a63"}, + {file = "pyobjc_framework_ScreenSaver-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:31bffb17ec131509c4cc584e98328497310ea644c764b50fb6bf7850617ec5a5"}, + {file = "pyobjc_framework_ScreenSaver-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ff25ad7cfffa116feaa117989f0a4b68dd6b7318aea4320ece6f75caf0092cfa"}, + {file = "pyobjc_framework_ScreenSaver-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:51e5bce05a3ada526c5c19b21cfb383cd7653d78f175c5abaf500a67ddab1c19"}, + {file = "pyobjc_framework_ScreenSaver-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:616ffb4bac2a56108778e33be6fe75b28f19511157abc411960b72324276635d"}, + {file = "pyobjc_framework_screensaver-10.3.1.tar.gz", hash = "sha256:0bbc5b574f12e95f6f6e48ced40b601e46e560ef6786845c15c57d78e6cd083e"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-screentime" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ScreenTime on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ScreenTime-10.3-py2.py3-none-any.whl", hash = "sha256:79447a4513362d38a9fc691ffa45d37a16daa11fc1c89cc1a93ae13dd8198e3d"}, - {file = "pyobjc_framework_screentime-10.3.tar.gz", hash = "sha256:8698e56883fb58402f912e7d90e833c6092d8345fe53683a6f6f90dc739fbc5d"}, + {file = "pyobjc_framework_ScreenTime-10.3.1-py2.py3-none-any.whl", hash = "sha256:d4f8a0784dc7d7060dadae2e4b5aae5e1afe8bbf453ce49cbb1860b8920114c3"}, + {file = "pyobjc_framework_screentime-10.3.1.tar.gz", hash = "sha256:351179d5bf951aa754c72f50ba8785212adf1b26abe10149c750fafd0a3108ae"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-scriptingbridge" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ScriptingBridge on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ScriptingBridge-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:56c26806bd77d9241773d92f21da6c86eccc82617dc3d4d9f4515e5473d7d253"}, - {file = "pyobjc_framework_ScriptingBridge-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ec2d52aaf0f7dcc07896e0390a37f07bda3f3bfe8ac2f4a26a773409650d5123"}, - {file = "pyobjc_framework_ScriptingBridge-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:19f6a8f5466b65d53f2620f9ef9e9a74a47f23e79ad244efb38fcaf8a3dcb101"}, - {file = "pyobjc_framework_scriptingbridge-10.3.tar.gz", hash = "sha256:d4c33a6c5aca98cae0175821ec8df487d0ed49a8763f046cb0c518d4fe83603f"}, + {file = "pyobjc_framework_ScriptingBridge-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:3a88e1a6c6b7d8935ab4baa9dcdeccb9cb08a44906bdd69b77302f48c88408d9"}, + {file = "pyobjc_framework_ScriptingBridge-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:66b55a9c12572f9bd6c00fd0a5aa5353354e7b717e37ffd1e843614d2fbde3d5"}, + {file = "pyobjc_framework_ScriptingBridge-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:387c0720842a1285afde5b56c43d9ed1332736ff8f6119ba6c6a551018552182"}, + {file = "pyobjc_framework_ScriptingBridge-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:90022f44f2bf0563bf5a75669198b9d778f76ece719f237750e9c5fcb00a601d"}, + {file = "pyobjc_framework_scriptingbridge-10.3.1.tar.gz", hash = "sha256:6bfb45efd0a1cda38a37154afe69f86ea086d5cbdfbc33b3e31c0bda97537fe9"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-searchkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SearchKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SearchKit-10.3-py2.py3-none-any.whl", hash = "sha256:24e883795b2649cfc51bd8b055fbc8565182e7b2396cfba4c8ff3a156c941fde"}, - {file = "pyobjc_framework_searchkit-10.3.tar.gz", hash = "sha256:5e81256dac0bff081dfe3f95c0d7f6fe5d0a4ba7e7ed2cad15edc60348a7f614"}, + {file = "pyobjc_framework_SearchKit-10.3.1-py2.py3-none-any.whl", hash = "sha256:48ec776603e350405c7311f29d5941e0e9d6b6a75e2aec69e0acd28be0979905"}, + {file = "pyobjc_framework_searchkit-10.3.1.tar.gz", hash = "sha256:7efb76b7af9d8f0f08efb91543f4dba0b00261ed41abb121ada80175cc82d65d"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-CoreServices = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-CoreServices = ">=10.3.1" [[package]] name = "pyobjc-framework-security" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Security on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Security-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e4df7ea48f93034dd784277d4456c83abd79060a9a5847c5604f664d39ea45da"}, - {file = "pyobjc_framework_Security-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9dc80b7b694ff5594742624a9fade022829a09a79c1c6b97eef97d33d49f7f4c"}, - {file = "pyobjc_framework_Security-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:6d1ddb3fd3cc11aa621f414277c9daf9481894fa5fbe99e2430a3fd2773e81a2"}, - {file = "pyobjc_framework_Security-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:aa8737b6a367550e3d12e0c71c267346b5ec235b62364bc17d0a2b883d175933"}, - {file = "pyobjc_framework_Security-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2fbd7a004361a28cbf4775820589a9b79443f13720d0cf755df066dc3fbbb98b"}, - {file = "pyobjc_framework_Security-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:e3d342a0741bb13da470dda087499a67c9e2bf27ee0d3a490e797ffb88cf9443"}, - {file = "pyobjc_framework_Security-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:07b34541ce0960e924be8ef4a40b35a3b85104b61684d67a3063826f657122c2"}, - {file = "pyobjc_framework_security-10.3.tar.gz", hash = "sha256:1be270a9205d9f392a658a267dec9ec602d6a98448419541f0005dc80da97013"}, + {file = "pyobjc_framework_Security-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9de850e5d29cb8605c0d7f7fb4a8d29ad5ece6c58a2ab16fba3f985e6b9ee05a"}, + {file = "pyobjc_framework_Security-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:499372b4b87de0198601e0c6b3d3e43d48605218149a5808c6567b601147a9bf"}, + {file = "pyobjc_framework_Security-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b3daed9661bd80245dd8dbc738a17870226969db27f6dbb3424ec0ebdbb6ba83"}, + {file = "pyobjc_framework_Security-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6120e91282985bcec3b44c1bc4f9c26d40cd07b4ac3dc81f745d73c13f8b5523"}, + {file = "pyobjc_framework_Security-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:43450895cd84256b313b547c9b256a4c0dc4b91195ec3e744f4f247d3cda0b77"}, + {file = "pyobjc_framework_Security-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:de52be2ce5ea98f2c224fea248227dcb3e7028d9814d0894ea6ea3c6da0f9160"}, + {file = "pyobjc_framework_Security-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:df39effeeb79482dd5805fd05e34a7c3ab30233a6e06e251cf7f8620430574fe"}, + {file = "pyobjc_framework_security-10.3.1.tar.gz", hash = "sha256:0d4e679a8aebaef9b54bd24e2fe2794ad5c28d601b6d140ed38370594bcb6fa0"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-securityfoundation" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SecurityFoundation on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SecurityFoundation-10.3-py2.py3-none-any.whl", hash = "sha256:6befffef47d857cad2f76087fee8e8648f210803ca883ab2af4aedceb58a9bef"}, - {file = "pyobjc_framework_securityfoundation-10.3.tar.gz", hash = "sha256:aaac1ccfed767de7d4469a46378fa48d29dcf55fa0209fa04b576464481e7ebc"}, + {file = "pyobjc_framework_SecurityFoundation-10.3.1-py2.py3-none-any.whl", hash = "sha256:c352cde672c9c2afa89575c362a0714e589c118485cec49ba230327e92c8a9a6"}, + {file = "pyobjc_framework_securityfoundation-10.3.1.tar.gz", hash = "sha256:414b13acabfae584729cd614e27247d250ec225d31140e8d971aa08536d6150c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Security = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Security = ">=10.3.1" [[package]] name = "pyobjc-framework-securityinterface" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SecurityInterface on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SecurityInterface-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:91403223d8ed6ebc67b6d641988119b39be5933e477ab2466a56ffefbcf9a94a"}, - {file = "pyobjc_framework_SecurityInterface-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6bb826b244d18350591631434be2ef0a788a9c18421501dd00026c182b43b457"}, - {file = "pyobjc_framework_SecurityInterface-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ab2e22755467ffaddb1ae35115fdac2a6d9a06a49cb682e04b7ec02008ae332e"}, - {file = "pyobjc_framework_securityinterface-10.3.tar.gz", hash = "sha256:e7d002e70f7474205002e13d7689ec464263e29d6021d2753424558420549089"}, + {file = "pyobjc_framework_SecurityInterface-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:7a9bbca70e8a27bd79a0b8846f7d08b693dd309ff780f92f713fee57ff9d3ddf"}, + {file = "pyobjc_framework_SecurityInterface-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b964ecbde276611c14fd70884ab9c08c4aae75633deda1a29813dbe42dc83dd6"}, + {file = "pyobjc_framework_SecurityInterface-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8c2998c09767f0214891c553fadb8ec72a8273c95fca820c44cb11f3b0cdb8a4"}, + {file = "pyobjc_framework_SecurityInterface-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:d913d30d04c9f01679ead33c95ad53dade587995f48c778a6de4d7da239b43e3"}, + {file = "pyobjc_framework_securityinterface-10.3.1.tar.gz", hash = "sha256:cd25f342a2b53cbffd134443506d5e75c96ba7145135debb8932c1252d57269a"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Security = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Security = ">=10.3.1" [[package]] name = "pyobjc-framework-sensitivecontentanalysis" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SensitiveContentAnalysis on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SensitiveContentAnalysis-10.3-py2.py3-none-any.whl", hash = "sha256:4ae985f6412c5cd277fb40fe16c10a4622407a07db8aa476fbf64c140ae0429a"}, - {file = "pyobjc_framework_sensitivecontentanalysis-10.3.tar.gz", hash = "sha256:1989765de0bf77d7578ef45c5d1973b364555bfa26b9fd6c41431646d31a650d"}, + {file = "pyobjc_framework_SensitiveContentAnalysis-10.3.1-py2.py3-none-any.whl", hash = "sha256:6b5cfe771a28300d766ff14ff81313fda946943d54a039d5574478a070933e03"}, + {file = "pyobjc_framework_sensitivecontentanalysis-10.3.1.tar.gz", hash = "sha256:ac8dd18d77ccc0bb4eb24839cf39da9981db64e53f52b09636e47bd7b3066f84"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-servicemanagement" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ServiceManagement on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ServiceManagement-10.3-py2.py3-none-any.whl", hash = "sha256:923baa4178f9c0de6e615ffd5afe35715e9704829eb1d5ae35bbfde711ca0872"}, - {file = "pyobjc_framework_servicemanagement-10.3.tar.gz", hash = "sha256:e874633a4332cab1824aeed8f59eed3700448daea7c2fe9b621e14886894244e"}, + {file = "pyobjc_framework_ServiceManagement-10.3.1-py2.py3-none-any.whl", hash = "sha256:6b7ca0de9cf74439df0947aae29f5f31d58eeacb0ff55e1465faed540d31de4b"}, + {file = "pyobjc_framework_servicemanagement-10.3.1.tar.gz", hash = "sha256:d048a803ad34c997dcc99ba778fca9d91cc5adfa1d115202e4bf22d9b04fd92c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-sharedwithyou" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SharedWithYou on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SharedWithYou-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a1663d0136b378c4ed6ebdc2536c5f43de576c323af900648f8d2a1cfa07b1f8"}, - {file = "pyobjc_framework_SharedWithYou-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ac3ec93544b4b93a2d40f125ce0242ba4f9d55c62396888347613f5b70e91ae5"}, - {file = "pyobjc_framework_SharedWithYou-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1422bc1df5d89e47573b2ba78b91c390b105a9631f780f14d781e6b51d75a645"}, - {file = "pyobjc_framework_sharedwithyou-10.3.tar.gz", hash = "sha256:a9742bdc4a0449c83dc7f704908da3cd1c64829a00007aad4d999749b20d5ad9"}, + {file = "pyobjc_framework_SharedWithYou-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:175cb32c93c55511f86ccf02b1da2fdcbc2a0f92422d451ff5dd4a864b3f3faf"}, + {file = "pyobjc_framework_SharedWithYou-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:8a1ee78d6220e02e073c5fe6fea8f223ef870086c1afe60f346e7bb3dbdcb165"}, + {file = "pyobjc_framework_SharedWithYou-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:824d56ecf85dbaa938a2db42bf2f5a55a4e9f94019dee2dc90578040cc2bbd3c"}, + {file = "pyobjc_framework_SharedWithYou-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bc37e1c86f460095085a5060149ca013d4dcb9b54337887bff86a2e07302c0f1"}, + {file = "pyobjc_framework_sharedwithyou-10.3.1.tar.gz", hash = "sha256:7e35b631bc77b040151515e4fee9c8f47bc313924fc3e5970e940f1343db039b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-SharedWithYouCore = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-SharedWithYouCore = ">=10.3.1" [[package]] name = "pyobjc-framework-sharedwithyoucore" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SharedWithYouCore on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SharedWithYouCore-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ba335881c9505832336c53f273d073f146240c3ca4575351a04606273dc19000"}, - {file = "pyobjc_framework_SharedWithYouCore-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0f6ce6989fb3995329516dd08570936c96c848a26430ad54ec2bd0e4b79d4e83"}, - {file = "pyobjc_framework_SharedWithYouCore-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e3ef63867c4f9305b5b9f384f0dce3bb9a4ad14d6aa8a45520ef6eb94f3b0efd"}, - {file = "pyobjc_framework_sharedwithyoucore-10.3.tar.gz", hash = "sha256:862a0b554bed5c944a31e4b14918af49b55fe6497cc8c25956200cbc7bcde811"}, + {file = "pyobjc_framework_SharedWithYouCore-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:b0fb4e84e15765d913d5383b61004b7ff9a637f198ec7c3dee07632f3a4e2b4c"}, + {file = "pyobjc_framework_SharedWithYouCore-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9b480058016216e5a3715e3ff50f5430159ec4235dcd110141f53637f5dbb51d"}, + {file = "pyobjc_framework_SharedWithYouCore-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:17a5e29f832d395030b1ab5dfcf43dad2a9c0f917e6b443ac383dea06e3aa304"}, + {file = "pyobjc_framework_SharedWithYouCore-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:1e51f315b5b16b340a1a12d4a0f3244f1925f14c9e148ca4dfdcfad6baa7ee5a"}, + {file = "pyobjc_framework_sharedwithyoucore-10.3.1.tar.gz", hash = "sha256:e4768b7fdb18730e225bbebc9c9f9acfa7e44e648875816aff8c7e7f0e82afbf"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-shazamkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ShazamKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ShazamKit-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9641a02efdd4c38c35c8c3e684ff66be2aeec6a786819045e4141ff365bec19f"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:997eb038d951b850fea3e26151c0815756ed1ca781a8f5af39c0ae94cbbfea85"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b08cf45e30625487fcb1e1e253a1e5dba17f2764549a72f1cb1a71266fd76454"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:27e567d8ff3cd103accc72695881ba82ef4ef707b176d06726a3f66052e8fa51"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9bc70b8d520a27e6c65f1458d28165e4a0d08dd984367ab1b35e4c1412565d32"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:501233d67cd0f7d439b8eea2db740a53238d265a96ecca41bd724959406e54ac"}, - {file = "pyobjc_framework_ShazamKit-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cc0bacb7db45b8f88007c718f0c2685a11455992fa0a2bdc2349d457be3ef953"}, - {file = "pyobjc_framework_shazamkit-10.3.tar.gz", hash = "sha256:89467af0f3d353c6ebc3a53995cc01078a8bcbb6ccbb648aa95b7d480fd2c05f"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dac6a729d7fed5e96ac4cb2a7894c79002670b4c06559ef4795dfe8c6fa15dda"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc77fde1503ec1f96d7b9a05ad784d29d94065732f0cfe089321be423e5045f3"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:012560cab1997c1da6e19388b5192f68dcdf806c2f8d7bd1e66da37512d18b30"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4356bdcb9ca50da243b9d79da27851b799483865072f7c86a8a9674300d31819"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:26dafb6ac23c15d8cdee4c2083757aac29fad4f945b97f120f6351aed5cdab72"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:95e4e717cb7a675544e08c53fb86d55715aa5d633b4ec35737fb02293098d368"}, + {file = "pyobjc_framework_ShazamKit-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:808bdfe5dcfc44d4c1df3ae3f384396908e9a1d3832e34408950db522859e91e"}, + {file = "pyobjc_framework_shazamkit-10.3.1.tar.gz", hash = "sha256:deef11a43e773b876df31eeadbfc447892fda0607e314ca2afb2c012284cfa32"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-social" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Social on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Social-10.3-py2.py3-none-any.whl", hash = "sha256:5a8eb2b80857912de19677506f834893c9f22351f1c745f93649d964fa4530de"}, - {file = "pyobjc_framework_social-10.3.tar.gz", hash = "sha256:aa7adeaf0849b311236e6f400a65b10aa910b4e6ff202e7b50c6ca0a46de0e9c"}, + {file = "pyobjc_framework_Social-10.3.1-py2.py3-none-any.whl", hash = "sha256:f83617c07db7c8bd15b3b9e0878ab2b6a286dcbd9a8c7f451da204f75db880e9"}, + {file = "pyobjc_framework_social-10.3.1.tar.gz", hash = "sha256:d1303cf3860ad02a8795c099e17888923505a9c45be407da50721a9a8a5b2efd"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-soundanalysis" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SoundAnalysis on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SoundAnalysis-10.3-py2.py3-none-any.whl", hash = "sha256:06ff451ac1fa977d291417a1e2409ee12d28e65a2b45671e52d30e4692c67115"}, - {file = "pyobjc_framework_soundanalysis-10.3.tar.gz", hash = "sha256:ff540b99f9d70aaea1a2dd72fdb76c397fc8b7545f1f66e160e1dff505d04efd"}, + {file = "pyobjc_framework_SoundAnalysis-10.3.1-py2.py3-none-any.whl", hash = "sha256:ef67207ff4045e5db37f017bdcd07d4b42464c86fe6c3b56524f6f22a9cde216"}, + {file = "pyobjc_framework_soundanalysis-10.3.1.tar.gz", hash = "sha256:faa533644231f99dbdc2fcc3ecb9181c5df4f4dc68d42856729214021c83c881"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-speech" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Speech on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Speech-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5838e6fa05aa8d490ae8b508cf0c70321864ca16c7e996c94b1e65236f3a7b9"}, - {file = "pyobjc_framework_Speech-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1c216a7475ee3d0f9614da518897cc30c6911ae71a80188a8b5fe0dadf9aa162"}, - {file = "pyobjc_framework_Speech-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:3e5f7b9cde46a64e753f99baf2ed4901a325c4e52864459735b86743a1077beb"}, - {file = "pyobjc_framework_speech-10.3.tar.gz", hash = "sha256:c720a06da6e57c04757c34fae8f0f02456f8d266d03c66649688f3a7462838d7"}, + {file = "pyobjc_framework_Speech-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:07afd82d76b98b67a78c07098a814a0b862bcf00fc072d49d8da435202008a18"}, + {file = "pyobjc_framework_Speech-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:444994d062286ff2769e07425d511503b2047b381afad1d64c8517ef4e44d01f"}, + {file = "pyobjc_framework_Speech-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e7fad907f9c0c49c5272f316d20e66ba0415038203ca277381753b035c16061a"}, + {file = "pyobjc_framework_Speech-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2294b60e1ab59b1340b820e6fee67766a959edd580d73e3b938f15653805d64c"}, + {file = "pyobjc_framework_speech-10.3.1.tar.gz", hash = "sha256:5b77b1d1ced0d1ad7244037b865dda2b83e8f9562d76d1e9fa4fea3b89e437b8"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-spritekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SpriteKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SpriteKit-10.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cebd65a82fbbbf992687a6c117213a105360132e6636563f44130b36e2df5176"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bf3b501d579870c17dda4448bd63bf97004b2856cbcecf72493673dd5888932d"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:409a66c21e966593438feec3c156264fbead7adb7133512fc3626e0db586b95b"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp313-cp313-macosx_10_9_universal2.whl", hash = "sha256:d40e89a90a32f7238b75cc6132df86a1280486e8c9b4b778950609926403cabf"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7da06167a43e6ff6548cb68cdbfe200f73c02bd3670f453c9c9a56218f27ae4e"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:3da69814e8660671dcb336cf8d2639d6187d249574c8ac833583b4c079fdd925"}, - {file = "pyobjc_framework_SpriteKit-10.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34a60b707588808858e43d12bb24fa0e716d450f3787e6474514273b0d8d16bf"}, - {file = "pyobjc_framework_spritekit-10.3.tar.gz", hash = "sha256:52d5a91b13d222757c05c5c0daea629ecc3afca1df9a2b0bf6d7e5b5b1823919"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:31a5ce3ba471bf12f3e9ae3b5865d400e4e70ab4bb94317880783ee04c07b1f5"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af355eccc18437e0932e1b327817e8f50d194bfa471b65b4733185ba606ab792"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c3fd6aaecd7abd6ebc83d4c37a22950d55b75911fdb99628b2677f44085a0212"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a1f0537bc0331cca58cc50307f3b114ab8bfd51576df3038b6037353aa77085f"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ffe7a07c8a3e17552e73b517b4fdcff7b2e6ca7e89b093a5daccfc285708216c"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:e1d79aab298f7b42436b2468e37ff84718f1b8b579c1440de7002a55d5f8762e"}, + {file = "pyobjc_framework_SpriteKit-10.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cd08925baf8b3f511842f49fb5512ae56875a923d23254fcc022124788180d47"}, + {file = "pyobjc_framework_spritekit-10.3.1.tar.gz", hash = "sha256:2c11f35f48302f487c51ba8030f5cf79493a9dc0993dd901016ae4b8d8047c8b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-storekit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework StoreKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_StoreKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5ba61f886e6a7709e45640d8caee632e8b0ff43082cfaae62660061701a8186f"}, - {file = "pyobjc_framework_StoreKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e999085df79e16dd7ac2963390dadacfbdcb0c9a57ad6b27a4b24fa25ac945c8"}, - {file = "pyobjc_framework_StoreKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4e716f93d14cb4743e90d7eb759359217602119a97e54b0b4a306e018af40306"}, - {file = "pyobjc_framework_storekit-10.3.tar.gz", hash = "sha256:235996fa6270dc8844d9ca447d10833bc835ce842a9f4c4daf71f2bcefd01b9c"}, + {file = "pyobjc_framework_StoreKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:f9c50a980846b236884504ad42690d49935bda3de5d779fca3cdfb16d43fa8d1"}, + {file = "pyobjc_framework_StoreKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:b3846b249a6fc5d26c80320098858978e0a16f46e98fc998075f16f539ac89fc"}, + {file = "pyobjc_framework_StoreKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c3575facbb3d238b8c9f3054c1422488414d89a42906dbcbfdbb47ef8be3da66"}, + {file = "pyobjc_framework_StoreKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:2b5848f0e08b42dd4dabe5822b436b904a697e923f529ccaad910dfb822b2b9d"}, + {file = "pyobjc_framework_storekit-10.3.1.tar.gz", hash = "sha256:913b4aad7dc31df7d8011c54a695da65cc57819f4b48c98abaed4e6d9ff7d323"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-symbols" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Symbols on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Symbols-10.3-py2.py3-none-any.whl", hash = "sha256:51ea45ea4183359f0954be9276a2a7e739791119e6e90a5f9be00c102f8ae43f"}, - {file = "pyobjc_framework_symbols-10.3.tar.gz", hash = "sha256:04187be130368080ac7eed34d452fad485067cbd1cd001354e931c5ea30b4c1f"}, + {file = "pyobjc_framework_Symbols-10.3.1-py2.py3-none-any.whl", hash = "sha256:6e171da5af2612e186cc4cf896ad7f2672c021a1fc18bc8ef49b79c4c831202d"}, + {file = "pyobjc_framework_symbols-10.3.1.tar.gz", hash = "sha256:3e3f35ef3646b5f9c0653d9dbf5693cf87de3df04420cb2679dad74c75965d18"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-syncservices" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SyncServices on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SyncServices-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:15f3beaac7b1a57222812fe75654b465b99684553631ae02042f864518179a74"}, - {file = "pyobjc_framework_SyncServices-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:8ac1da78e4b939bfc74378bc0a57584103d164796467054d7a09db32429a32da"}, - {file = "pyobjc_framework_SyncServices-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6715c4b12953629108f35be0029d7f590718c92060359a28915d5c501106bfb6"}, - {file = "pyobjc_framework_syncservices-10.3.tar.gz", hash = "sha256:90140a0a993d5d4fe60be1b378b72cb0d9285a80819a16226bb611aec0c4013b"}, + {file = "pyobjc_framework_SyncServices-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:aa98a38f59f230da7817dc08055c8049fa961193af16caa262c51e4ec8b5de20"}, + {file = "pyobjc_framework_SyncServices-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:9d3798cc745143d44da101bb0eb9d482326b761f48c3699251191e9c3656ee6c"}, + {file = "pyobjc_framework_SyncServices-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:97020a88d743a6f12ed3f72d062ab96712a7cc0e7b0293c7c5860c014002cc73"}, + {file = "pyobjc_framework_SyncServices-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:b9b7bc58b04654172968cdc1cfe74b43ca0ad2e03c24c7921234a57be2c22985"}, + {file = "pyobjc_framework_syncservices-10.3.1.tar.gz", hash = "sha256:1cd5e3eaf85a11996184afad1da47037cd921e302ccb35fe388b19f91a685669"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreData = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreData = ">=10.3.1" [[package]] name = "pyobjc-framework-systemconfiguration" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SystemConfiguration on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SystemConfiguration-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:5aa695972ed09a8d8284e6b1a8019b8958be826a2db7c24ffb8a9b05f73c34d2"}, - {file = "pyobjc_framework_SystemConfiguration-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e474133579db7f5711f876a2f34e433a152d9f51c5df82886729f284836c6ab4"}, - {file = "pyobjc_framework_SystemConfiguration-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:66946d2d8dfd646d37ff066f53267d7bbfeb0ec82b2fef1622eacd23ade6575a"}, - {file = "pyobjc_framework_systemconfiguration-10.3.tar.gz", hash = "sha256:48f8fd81f02891b5431b77fcf11831aab46b093ea56f35a4695cbb63281bf69c"}, + {file = "pyobjc_framework_SystemConfiguration-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:200c4b7d3483e5ccb86d4d5783ace8c26d4b3f9130684280f30080d53f62d4c5"}, + {file = "pyobjc_framework_SystemConfiguration-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:403392b0e2085cf528547d468bc523fbee418381bb61446eb4aa1f9a1c8a8494"}, + {file = "pyobjc_framework_SystemConfiguration-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:f38a824261a30dc9961e13a7b9759dd0c77e1c7c4681e3c80c5751c560735289"}, + {file = "pyobjc_framework_SystemConfiguration-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4e8816524cbb6c6ea9e1c596fc9a16c91f2063eba394135be9437bdbd469e125"}, + {file = "pyobjc_framework_systemconfiguration-10.3.1.tar.gz", hash = "sha256:1bf6ffe98faa4e208bf594c857ba23cd56fe404bc579188ff53b704844d9c402"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-systemextensions" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework SystemExtensions on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_SystemExtensions-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:39275100899586ce856b57120bef7582e3e16b33aa8a23d0066881fa2bba37ab"}, - {file = "pyobjc_framework_SystemExtensions-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e50596f8afd14c6f00faac499b1d4904f37fcd48df94e6fbf4a73a920559e20f"}, - {file = "pyobjc_framework_SystemExtensions-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:76b6534e61a19c12ef64a9edf6dde634e29be14e657fb0e63cd28e51fcca99cb"}, - {file = "pyobjc_framework_systemextensions-10.3.tar.gz", hash = "sha256:5811fdbfb1c14f1db288455038bef0c8c61c1266e3b61da4f5cfb2bb6adf0333"}, + {file = "pyobjc_framework_SystemExtensions-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:b24edd33c71cb02a16bdd9b26d3a229a6b2a815c26a4c908b1b8b6cdf4f6c84a"}, + {file = "pyobjc_framework_SystemExtensions-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:e2a24501a782d2b6f7fa339619eb5c988db6b31a6043d029f40f67c54fd9399e"}, + {file = "pyobjc_framework_SystemExtensions-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:1cacd2356142307cf221d568f3e7adda654c28c90c223db3830746f4c2b12aea"}, + {file = "pyobjc_framework_SystemExtensions-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6561876b2fd5c40620073fae9b924f2d8e0110e8573756ffc9521e4fbc825249"}, + {file = "pyobjc_framework_systemextensions-10.3.1.tar.gz", hash = "sha256:34412e75c95a585d222ea23efc3eba436210ec0345cec6c7dc78d16e027d03e1"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-threadnetwork" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework ThreadNetwork on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_ThreadNetwork-10.3-py2.py3-none-any.whl", hash = "sha256:84b50c566bcde4d607b0e92fad21b64102032056281ecb83a1ad80acde74aa19"}, - {file = "pyobjc_framework_threadnetwork-10.3.tar.gz", hash = "sha256:d8d1cb19d1426cbc4a531bb047551ff819d57c7c54777d27c4de959b6dbac234"}, + {file = "pyobjc_framework_ThreadNetwork-10.3.1-py2.py3-none-any.whl", hash = "sha256:95ddbed8a114cc1f05db613bb53247465ec48ccaad2b56f5da466317808fc32b"}, + {file = "pyobjc_framework_threadnetwork-10.3.1.tar.gz", hash = "sha256:1038210a8e5dfa86aefd10894563913e767e95d1c1bd4333ae5f9c6cabbb3ce9"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-uniformtypeidentifiers" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework UniformTypeIdentifiers on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_UniformTypeIdentifiers-10.3-py2.py3-none-any.whl", hash = "sha256:2219841495944ba998c3241f7c5b1f0642b1110c46a2731cad42e8d0e203c099"}, - {file = "pyobjc_framework_uniformtypeidentifiers-10.3.tar.gz", hash = "sha256:ec16633648537d2d8017e1151fedb37c344c5f1922bc8b3097616d0b3e3437f1"}, + {file = "pyobjc_framework_UniformTypeIdentifiers-10.3.1-py2.py3-none-any.whl", hash = "sha256:8bd1516ccec1807e2ad92a071242d83e9d1eda08ddbfae04dacc30d76c3d734c"}, + {file = "pyobjc_framework_uniformtypeidentifiers-10.3.1.tar.gz", hash = "sha256:1985fee7e1f1157db36f3c19ee0ad273677eeff10467f575086246bbeffcdf50"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-usernotifications" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework UserNotifications on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_UserNotifications-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:c9a7e745828e3c6df44ebdaea3092ddc3c56f638130e5a0f47a2e0ae3ea405fb"}, - {file = "pyobjc_framework_UserNotifications-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:e5bf6e386243eb7ad518b9ba102471713ed5b0bd05ea8a3f62478a7201754e37"}, - {file = "pyobjc_framework_UserNotifications-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:e6ff9ca6de68b7635f111da623c68b533bd78fcf90ae620cfc23825bfc75ec4a"}, - {file = "pyobjc_framework_usernotifications-10.3.tar.gz", hash = "sha256:2e2172f3ca50e083ea6b20f18efb0c23c174cb6be19f91252ab770f51f5e3b06"}, + {file = "pyobjc_framework_UserNotifications-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:d85c293e0520530ac7152b3f293c5606f0495b7727de331ef4e198278bf40e98"}, + {file = "pyobjc_framework_UserNotifications-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:0001bb25f15e6f8cac81bcb58cab8161a15a6fe41f6c475e8da364c913bdb090"}, + {file = "pyobjc_framework_UserNotifications-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:0bba49b0f290f5597b94a80608c785b61d61aa3885cdf05529862e47fe1cec67"}, + {file = "pyobjc_framework_UserNotifications-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:59294fa6110778de145c9299c220990d057a6a171d37ab5d8a6ab1780bf7888f"}, + {file = "pyobjc_framework_usernotifications-10.3.1.tar.gz", hash = "sha256:ddb5de88fb659c2241429b6408ddcabbfc0c2c9e4a7f5f543a6fab1c4953403b"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-usernotificationsui" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework UserNotificationsUI on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_UserNotificationsUI-10.3-py2.py3-none-any.whl", hash = "sha256:f809685da10d3eb1b0e659870df7584de79f228d8b49f00167d2a694249ead55"}, - {file = "pyobjc_framework_usernotificationsui-10.3.tar.gz", hash = "sha256:0a843e3dad58650c595097e25cf2ca234216920abb8f92dfbd96822ca3afbb88"}, + {file = "pyobjc_framework_UserNotificationsUI-10.3.1-py2.py3-none-any.whl", hash = "sha256:bc6cb92a6ac947e8fe9685f3c1964c5a9f98e576b936b0bbff8c528f47f976d2"}, + {file = "pyobjc_framework_usernotificationsui-10.3.1.tar.gz", hash = "sha256:80390b5361bb6014dc32d0afbf581280e7762a4f67460a736f461f613d397094"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-UserNotifications = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-UserNotifications = ">=10.3.1" [[package]] name = "pyobjc-framework-videosubscriberaccount" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework VideoSubscriberAccount on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_VideoSubscriberAccount-10.3-py2.py3-none-any.whl", hash = "sha256:0519c0eaec8aabb9d89e6bf1ab968e59ae3434365a0c98e4eeb3c8837a712d76"}, - {file = "pyobjc_framework_videosubscriberaccount-10.3.tar.gz", hash = "sha256:c65a74c087b354b3d73fba2be2396985e9d51bbe5fc42c00acdb4cd3d78aa0ba"}, + {file = "pyobjc_framework_VideoSubscriberAccount-10.3.1-py2.py3-none-any.whl", hash = "sha256:4b489f0007dce8ea17f37316175dac2768cd173a4d4c7a1d5f87fb3991c1e518"}, + {file = "pyobjc_framework_videosubscriberaccount-10.3.1.tar.gz", hash = "sha256:f62509e976b805bc76ff5928444677ac542b52dd9f7781ac0731d7c4b22bed96"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-videotoolbox" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework VideoToolbox on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_VideoToolbox-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e34b41b5816101414e3089b1a770e0bf8831acd62755945a625f7917a49c1bd"}, - {file = "pyobjc_framework_VideoToolbox-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:cb5d91a6fc213ad853eeea410289cb5f6e87e7a8c4df2c6e0bb5e9c977b9b010"}, - {file = "pyobjc_framework_VideoToolbox-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:df7047d9f077690fa4f82f33cf82b740c418ebfdb03ac6dcf36e7786ffe6718f"}, - {file = "pyobjc_framework_videotoolbox-10.3.tar.gz", hash = "sha256:801d1140de6acaa62e249fd50e2852c307b3ad461288c348f81c623704138519"}, + {file = "pyobjc_framework_VideoToolbox-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:bc52aa91f568060e0087762f2a4d876bf7b683e5396779e93925252e26f0330b"}, + {file = "pyobjc_framework_VideoToolbox-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:3d20ea92b597f4758f24ed8e19f7a7a372faf6478d739e7cb7f7cd73d3e8617a"}, + {file = "pyobjc_framework_VideoToolbox-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:761e3cd05090f5d9e9fbae2c25e3f352f19aa86a0d02a1189b94ec5c4bc37111"}, + {file = "pyobjc_framework_VideoToolbox-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:7d4fb38f95e91f62d14b05fafcc6197775e9eaf4e5b698bc1fb313756f59b10d"}, + {file = "pyobjc_framework_videotoolbox-10.3.1.tar.gz", hash = "sha256:7ebc281523b2b37aff17ce6eabd0c81081864b3e3e4a83ae72b18fd70c57c521"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreMedia = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreMedia = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-virtualization" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Virtualization on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Virtualization-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:ca9b15238573459bde886b3d1930a75904f447ee033032c004582b19141b751d"}, - {file = "pyobjc_framework_Virtualization-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6113d9e10f671ea43ac07fdfe91e16f41bdc06fccfd1f8b9ce014ab4e7a08335"}, - {file = "pyobjc_framework_Virtualization-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:f60f3f22cb5d832429fc072368911f6989fc5e66fc164fe0e15b66102e8da7c6"}, - {file = "pyobjc_framework_virtualization-10.3.tar.gz", hash = "sha256:eb40b50a05d8fd574c1cd4265dbe5a6fd19dddd223ae37a22c27279bffc56de3"}, + {file = "pyobjc_framework_Virtualization-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:c046abcebf6a64a47ea50311f3e4aaae424dbac719e847cd15b375ebe99a51ed"}, + {file = "pyobjc_framework_Virtualization-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:dc14f6c3deaf367adff18b509e766dc78c4695a4cd76e4aad3ff4b1e207a4635"}, + {file = "pyobjc_framework_Virtualization-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:bd79c1bb45113957f24cbf8b6d0ff175361c52c97e326313ecd76cfa015f6cef"}, + {file = "pyobjc_framework_Virtualization-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:6e5e6645e31acd07d30b1607c4cdaf0ae0e4d8223471a8a089004c2deb6fdea5"}, + {file = "pyobjc_framework_virtualization-10.3.1.tar.gz", hash = "sha256:8348ddef18eb943d151e5b5977e4d410012ee2e3f6048c16f7cfe0c1a73536cb"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyobjc-framework-vision" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework Vision on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_Vision-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:d89b51e4732ae90ae5640fe68b018d4dbdfd200bc2705663c1e590d1dd8a7863"}, - {file = "pyobjc_framework_Vision-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:22cbb17f3a6b76133357ab427bcf553cb604d2720a80a9b27c0a42f6c2a7138a"}, - {file = "pyobjc_framework_Vision-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:bcb1e04a7248d57bce443ecaec0660e14d2eb635a2deff43d8c03867a3df21c3"}, - {file = "pyobjc_framework_vision-10.3.tar.gz", hash = "sha256:fe82dfbc120d04dbe8771d576f5210dcdb5b981feac7e75fcc2384ab8ffa31eb"}, + {file = "pyobjc_framework_Vision-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:dff3582678930461a0bb11bf070854d49f6944a851dc89edc63fac93c75ddf39"}, + {file = "pyobjc_framework_Vision-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:32626183c51674efb3b5738e2884c3fea37edca010117cf71bd72cb3c49c869a"}, + {file = "pyobjc_framework_Vision-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2473b346a112c51ac485184305bd13c402e0db45f2df3d277315bd49efba18e9"}, + {file = "pyobjc_framework_Vision-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:4302e2c5f68c9667ecd4273809cbc4611af6368b123d69596e5b088f1b1aa16b"}, + {file = "pyobjc_framework_vision-10.3.1.tar.gz", hash = "sha256:aa071656d395afc2d624600a9f30d6a3344aa747bf37f613ff3972158c40881c"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" -pyobjc-framework-CoreML = ">=10.3" -pyobjc-framework-Quartz = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" +pyobjc-framework-CoreML = ">=10.3.1" +pyobjc-framework-Quartz = ">=10.3.1" [[package]] name = "pyobjc-framework-webkit" -version = "10.3" +version = "10.3.1" description = "Wrappers for the framework WebKit on macOS" optional = false python-versions = ">=3.8" files = [ - {file = "pyobjc_framework_WebKit-10.3-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:2f66212dffcf419a7b8a462fca22f76d7a2d534b4deb15a499d38e026f005985"}, - {file = "pyobjc_framework_WebKit-10.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d6d1174d63b6d9ea3247761431812ce30722fbdac93443d6563b4ea45a3323d"}, - {file = "pyobjc_framework_WebKit-10.3-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:ca76f5c17f559c59338cd55342d6bd9d2f24f536c64095383b55802b6639d648"}, - {file = "pyobjc_framework_webkit-10.3.tar.gz", hash = "sha256:600a0033bf42114795b032c23139c0679aad236cb964961130ba3cd96da026ff"}, + {file = "pyobjc_framework_WebKit-10.3.1-cp36-abi3-macosx_10_13_universal2.whl", hash = "sha256:df52913e4c3cb77d4551d9848e30be01b82cace54cede850c88a7e0ab41a20a9"}, + {file = "pyobjc_framework_WebKit-10.3.1-cp36-abi3-macosx_10_9_universal2.whl", hash = "sha256:207a7aa57817d3ab3fa033e42ab612f8c00521f13ff2871547c92cd94ed51f85"}, + {file = "pyobjc_framework_WebKit-10.3.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c0d4c1ba0fafae503a8df95e7b6bd4236951ba72508ec62809e37825f382c635"}, + {file = "pyobjc_framework_WebKit-10.3.1-cp36-abi3-macosx_11_0_universal2.whl", hash = "sha256:c8e3334978a1bd927ea14ed73f56d6741561a69d31d082d2b23d1b48446917c8"}, + {file = "pyobjc_framework_webkit-10.3.1.tar.gz", hash = "sha256:7ad9f4eb91a6dff39848d9c2ab71f170aeab4b6396bcec8e5a780739f9be4222"}, ] [package.dependencies] -pyobjc-core = ">=10.3" -pyobjc-framework-Cocoa = ">=10.3" +pyobjc-core = ">=10.3.1" +pyobjc-framework-Cocoa = ">=10.3.1" [[package]] name = "pyopencl" @@ -8047,5 +8113,5 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" -python-versions = "~3.11" -content-hash = "8f581b34273378265dba62166f3cd5abbb931b9375d95fb260dcaf192cfacc86" +python-versions = ">=3.11, <3.13" +content-hash = "c5654418f3c97420a4a2195b42ebfec250623b600658aae03385b2bcf4c058bd" diff --git a/pyproject.toml b/pyproject.toml index 01885c7ac3..6e4741ddaf 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -88,7 +88,7 @@ repository = "https://github.com/commaai/openpilot" documentation = "https://docs.comma.ai" [tool.poetry.dependencies] -python = "~3.11" +python = ">=3.11, <3.13" # multiple users sounddevice = "*" # micd + soundd @@ -154,15 +154,14 @@ inputs = "*" Jinja2 = "*" lru-dict = "*" matplotlib = "*" -# No release for this fix https://github.com/metadriverse/metadrive/issues/632. Pinned to this commit until next release -metadrive-simulator = {git = "https://github.com/metadriverse/metadrive.git", rev ="233a3a1698be7038ec3dd050ca10b547b4b3324c", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies +metadrive-simulator = { git = "https://github.com/commaai/metadrive.git", branch = "python3.12", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies mpld3 = "*" mypy = "*" myst-parser = "*" natsort = "*" opencv-python-headless = "*" parameterized = "^0.8" -pprofile = "*" +#pprofile = "*" polyline = "*" pre-commit = "*" pyautogui = "*" diff --git a/selfdrive/test/test_updated.py b/selfdrive/test/test_updated.py index f8eae94823..ea945d94c2 100644 --- a/selfdrive/test/test_updated.py +++ b/selfdrive/test/test_updated.py @@ -164,7 +164,7 @@ class TestUpdated: # make sure LastUpdateTime is recent t = self._read_param("LastUpdateTime") last_update_time = datetime.datetime.fromisoformat(t) - td = datetime.datetime.utcnow() - last_update_time + td = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - last_update_time assert td.total_seconds() < 10 self.params.remove("LastUpdateTime") diff --git a/system/athena/registration.py b/system/athena/registration.py index 6574d9ac20..97289e4199 100755 --- a/system/athena/registration.py +++ b/system/athena/registration.py @@ -4,7 +4,7 @@ import json import jwt from pathlib import Path -from datetime import datetime, timedelta +from datetime import datetime, timedelta, UTC from openpilot.common.api import api_get from openpilot.common.params import Params from openpilot.common.spinner import Spinner @@ -66,7 +66,7 @@ def register(show_spinner=False) -> str | None: start_time = time.monotonic() while True: try: - register_token = jwt.encode({'register': True, 'exp': datetime.utcnow() + timedelta(hours=1)}, private_key, algorithm='RS256') + register_token = jwt.encode({'register': True, 'exp': datetime.now(UTC).replace(tzinfo=None) + timedelta(hours=1)}, private_key, algorithm='RS256') cloudlog.info("getting pilotauth") resp = api_get("v2/pilotauth/", method='POST', timeout=15, imei=imei1, imei2=imei2, serial=serial, public_key=public_key, register_token=register_token) diff --git a/system/manager/manager.py b/system/manager/manager.py index 6d1b8d9c22..2a173ac90e 100755 --- a/system/manager/manager.py +++ b/system/manager/manager.py @@ -42,7 +42,7 @@ def manager_init() -> None: ("LongitudinalPersonality", str(log.LongitudinalPersonality.standard)), ] if not PC: - default_params.append(("LastUpdateTime", datetime.datetime.utcnow().isoformat().encode('utf8'))) + default_params.append(("LastUpdateTime", datetime.datetime.now(datetime.UTC).replace(tzinfo=None).isoformat().encode('utf8'))) if params.get_bool("RecordFrontLock"): params.put_bool("RecordFront", True) diff --git a/system/qcomgpsd/qcomgpsd.py b/system/qcomgpsd/qcomgpsd.py index 21c7995a77..43ddb89939 100755 --- a/system/qcomgpsd/qcomgpsd.py +++ b/system/qcomgpsd/qcomgpsd.py @@ -173,7 +173,7 @@ def setup_quectel(diag: ModemDiag) -> bool: os.remove(ASSIST_DATA_FILE) #at_cmd("AT+QGPSXTRADATA?") if system_time_valid(): - time_str = datetime.datetime.utcnow().strftime("%Y/%m/%d,%H:%M:%S") + time_str = datetime.datetime.now(datetime.UTC).replace(tzinfo=None).strftime("%Y/%m/%d,%H:%M:%S") at_cmd(f"AT+QGPSXTRATIME=0,\"{time_str}\",1,1,1000") at_cmd("AT+QGPSCFG=\"outport\",\"usbnmea\"") diff --git a/system/qcomgpsd/tests/test_qcomgpsd.py b/system/qcomgpsd/tests/test_qcomgpsd.py index ef23737dd7..716bc33ed2 100644 --- a/system/qcomgpsd/tests/test_qcomgpsd.py +++ b/system/qcomgpsd/tests/test_qcomgpsd.py @@ -85,7 +85,7 @@ class TestRawgpsd: if should_be_loaded: assert valid_duration == "10080" # should be max time injected_time = datetime.datetime.strptime(injected_time_str.replace("\"", ""), "%Y/%m/%d,%H:%M:%S") - assert abs((datetime.datetime.utcnow() - injected_time).total_seconds()) < 60*60*12 + assert abs((datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - injected_time).total_seconds()) < 60*60*12 else: valid_duration, injected_time_str = out.split(",", 1) injected_time_str = injected_time_str.replace('\"', '').replace('\'', '') diff --git a/system/statsd.py b/system/statsd.py index 2b5a7bb3a7..5e76b73ae9 100755 --- a/system/statsd.py +++ b/system/statsd.py @@ -133,7 +133,7 @@ def main() -> NoReturn: # flush when started state changes or after FLUSH_TIME_S if (time.monotonic() > last_flush_time + STATS_FLUSH_TIME_S) or (sm['deviceState'].started != started_prev): result = "" - current_time = datetime.utcnow().replace(tzinfo=UTC) + current_time = datetime.now(UTC) tags['started'] = sm['deviceState'].started for key, value in gauges.items(): diff --git a/system/ubloxd/pigeond.py b/system/ubloxd/pigeond.py index 5711992cfb..8809689dcd 100755 --- a/system/ubloxd/pigeond.py +++ b/system/ubloxd/pigeond.py @@ -6,7 +6,7 @@ import serial import struct import requests import urllib.parse -from datetime import datetime +from datetime import datetime, UTC from cereal import messaging from openpilot.common.params import Params @@ -196,7 +196,7 @@ def initialize_pigeon(pigeon: TTYPigeon) -> bool: cloudlog.error(f"failed to restore almanac backup, status: {restore_status}") # sending time to ublox - t_now = datetime.utcnow() + t_now = datetime.now(UTC).replace(tzinfo=None) if t_now >= datetime(2021, 6, 1): cloudlog.warning("Sending current time to ublox") diff --git a/system/updated/updated.py b/system/updated/updated.py index d43f439af5..005c52bc8b 100755 --- a/system/updated/updated.py +++ b/system/updated/updated.py @@ -60,7 +60,7 @@ class WaitTimeHelper: self.ready_event.wait(timeout=t) def write_time_to_param(params, param) -> None: - t = datetime.datetime.utcnow() + t = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) params.put(param, t.isoformat().encode('utf8')) def read_time_from_param(params, param) -> datetime.datetime | None: @@ -279,7 +279,7 @@ class Updater: if len(self.branches): self.params.put("UpdaterAvailableBranches", ','.join(self.branches.keys())) - last_update = datetime.datetime.utcnow() + last_update = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) if update_success: write_time_to_param(self.params, "LastUpdateTime") else: @@ -323,7 +323,7 @@ class Updater: for alert in ("Offroad_UpdateFailed", "Offroad_ConnectivityNeeded", "Offroad_ConnectivityNeededPrompt"): set_offroad_alert(alert, False) - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.UTC).replace(tzinfo=None) dt = now - last_update build_metadata = get_build_metadata() if failed_count > 15 and exception is not None and self.has_internet: @@ -429,7 +429,7 @@ def main() -> None: cloudlog.event("update installed") if not params.get("InstallDate"): - t = datetime.datetime.utcnow().isoformat() + t = datetime.datetime.now(datetime.UTC).replace(tzinfo=None).isoformat() params.put("InstallDate", t.encode('utf8')) updater = Updater() @@ -469,7 +469,7 @@ def main() -> None: # 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)) + timed_out = last_fetch is None or (datetime.datetime.now(datetime.UTC).replace(tzinfo=None) - 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") diff --git a/system/webrtc/tests/test_stream_session.py b/system/webrtc/tests/test_stream_session.py index e89e42e440..46d55ecd90 100644 --- a/system/webrtc/tests/test_stream_session.py +++ b/system/webrtc/tests/test_stream_session.py @@ -3,6 +3,7 @@ import json # for aiortc and its dependencies import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) +warnings.filterwarnings("ignore", category=RuntimeWarning) # TODO: remove this when google-crc32c publish a python3.12 wheel from aiortc import RTCDataChannel from aiortc.mediastreams import VIDEO_CLOCK_RATE, VIDEO_TIME_BASE diff --git a/system/webrtc/tests/test_webrtcd.py b/system/webrtc/tests/test_webrtcd.py index d4b659a3aa..4fa6d8953f 100644 --- a/system/webrtc/tests/test_webrtcd.py +++ b/system/webrtc/tests/test_webrtcd.py @@ -4,6 +4,7 @@ import json # for aiortc and its dependencies import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) +warnings.filterwarnings("ignore", category=RuntimeWarning) # TODO: remove this when google-crc32c publish a python3.12 wheel from openpilot.system.webrtc.webrtcd import get_stream diff --git a/system/webrtc/webrtcd.py b/system/webrtc/webrtcd.py index afd346857f..79c5b4888f 100755 --- a/system/webrtc/webrtcd.py +++ b/system/webrtc/webrtcd.py @@ -11,6 +11,7 @@ from typing import Any, TYPE_CHECKING # aiortc and its dependencies have lots of internal warnings :( import warnings warnings.filterwarnings("ignore", category=DeprecationWarning) +warnings.filterwarnings("ignore", category=RuntimeWarning) # TODO: remove this when google-crc32c publish a python3.12 wheel import capnp from aiohttp import web diff --git a/tools/lib/azure_container.py b/tools/lib/azure_container.py index f5a3a8bfb1..a5d650e98f 100644 --- a/tools/lib/azure_container.py +++ b/tools/lib/azure_container.py @@ -1,5 +1,5 @@ import os -from datetime import datetime, timedelta +from datetime import datetime, timedelta, UTC from functools import lru_cache from pathlib import Path from typing import IO @@ -20,7 +20,7 @@ def get_azure_credential(): @lru_cache def get_container_sas(account_name: str, container_name: str): from azure.storage.blob import BlobServiceClient, ContainerSasPermissions, generate_container_sas - start_time = datetime.utcnow() + start_time = datetime.now(UTC).replace(tzinfo=None) expiry_time = start_time + timedelta(hours=1) blob_service = BlobServiceClient( account_url=f"https://{account_name}.blob.core.windows.net", From c9475ed2f2c2687edc957af8a50d271e043a0bb6 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 11 Jun 2024 14:47:39 -0700 Subject: [PATCH 013/168] release checklist (#32709) --- release/README.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 release/README.md diff --git a/release/README.md b/release/README.md new file mode 100644 index 0000000000..1d3e784936 --- /dev/null +++ b/release/README.md @@ -0,0 +1,36 @@ +# openpilot releases + +## release checklist + +**Go to `devel-staging`** +- [ ] update `devel-staging`: `git reset --hard origin/master-ci` +- [ ] open a pull request from `devel-staging` to `devel` + +**Go to `devel`** +- [ ] update RELEASES.md +- [ ] close out milestone +- [ ] post on Discord dev channel +- [ ] bump version on master: `common/version.h` and `RELEASES.md` +- [ ] merge the pull request + +tests: +- [ ] update from previous release -> new release +- [ ] update from new release -> previous release +- [ ] fresh install with `openpilot-test.comma.ai` +- [ ] drive on fresh install +- [ ] comma body test +- [ ] no submodules or LFS +- [ ] check sentry, MTBF, etc. + +**Go to `release3`** +- [ ] publish the blog post +- [ ] `git reset --hard origin/release3-staging` +- [ ] tag the release +``` +git tag v0.X.X +git push origin v0.X.X +``` +- [ ] create GitHub release +- [ ] final test install on `openpilot.comma.ai` +- [ ] update production +- [ ] Post on Discord, X, etc. From df87ce3709cad7bfa392973c8eee2114d63c6a92 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 11 Jun 2024 14:57:47 -0700 Subject: [PATCH 014/168] add Ford and Volkswagen fuzzy fingerprinting --- RELEASES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASES.md b/RELEASES.md index 18c011e111..21cf208ce9 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -11,6 +11,7 @@ Version 0.9.7 (2024-06-13) * Adjust driving personality with the follow distance button * Support for hybrid variants of supported Ford models * Fingerprinting without the OBD-II port on all cars +* Improved fuzzy fingerprinting for Ford and Volkswagen Version 0.9.6 (2024-02-27) ======================== From 0e39d5bcf267b9db53f6e363356d17ca79662210 Mon Sep 17 00:00:00 2001 From: ZwX1616 Date: Tue, 11 Jun 2024 15:55:18 -0700 Subject: [PATCH 015/168] DM model notes --- RELEASES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/RELEASES.md b/RELEASES.md index 21cf208ce9..57f6979117 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -8,6 +8,8 @@ Version 0.9.7 (2024-06-13) * Inputs the past curvature for smoother and more accurate lateral control * Simplified neural network architecture in the model's last layers * Minor fixes to desire augmentation and weight decay +* New driver monitoring model + * Improved end-to-end bit for phone detection * Adjust driving personality with the follow distance button * Support for hybrid variants of supported Ford models * Fingerprinting without the OBD-II port on all cars From 188843533f620b8d80c5c21afd17b92224ec112e Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 11 Jun 2024 16:14:24 -0700 Subject: [PATCH 016/168] bump msgq: fix body web streaming (#32713) * bump msgq: fix body web streaming * bump msgq --- msgq_repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/msgq_repo b/msgq_repo index 381fc3d9df..74074d650f 160000 --- a/msgq_repo +++ b/msgq_repo @@ -1 +1 @@ -Subproject commit 381fc3d9dfe7d2ff40a075ff8c1f980ae2a62d19 +Subproject commit 74074d650f5d516a33962c1681a2a15b1d603537 From 05669df1027fbb296884772b15876aff1191f61e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Tue, 11 Jun 2024 16:17:25 -0700 Subject: [PATCH 017/168] Update cereal README.md --- cereal/README.md | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/cereal/README.md b/cereal/README.md index e3326aab0e..ad940facdc 100644 --- a/cereal/README.md +++ b/cereal/README.md @@ -1,11 +1,6 @@ -# What is cereal? [![cereal tests](https://github.com/commaai/cereal/workflows/tests/badge.svg?event=push)](https://github.com/commaai/cereal/actions) [![codecov](https://codecov.io/gh/commaai/cereal/branch/master/graph/badge.svg)](https://codecov.io/gh/commaai/cereal) +# What is cereal? -cereal is both a messaging spec for robotics systems as well as generic high performance IPC pub sub messaging with a single publisher and multiple subscribers. - -Imagine this use case: -* A sensor process reads gyro measurements directly from an IMU and publishes a `sensorEvents` packet -* A calibration process subscribes to the `sensorEvents` packet to use the IMU -* A localization process subscribes to the `sensorEvents` packet to use the IMU also +cereal is the messaging system for openpilot. It uses [msgq](https://github.com/commaai/msgq) as a pub/sub backend, and [Cap'n proto](https://capnproto.org/capnp-tool.html) for serialization of the structs. ## Messaging Spec @@ -32,11 +27,7 @@ Forks of [openpilot](https://github.com/commaai/openpilot) might want to add thi spec, however this could conflict with future changes made in mainline cereal/openpilot. Rebasing against mainline openpilot then means breaking backwards-compatibility with all old logs of your fork. So we added reserved events in [custom.capnp](custom.capnp) that we will leave empty in mainline cereal/openpilot. **If you only modify those, you can ensure your -fork will remain backwards-compatible with all versions of mainline cereal/openpilot and your fork.** - -## Pub Sub Backends - -cereal supports two backends, one based on [zmq](https://zeromq.org/) and another called [msgq](messaging/msgq.cc), a custom pub sub based on shared memory that doesn't require the bytes to pass through the kernel. +fork will remain backwards-compatible with all versions of mainline openpilot and your fork.** Example --- From ddfb31f1bfa241aee1c250f5da5f2d364c51f610 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 11 Jun 2024 16:25:24 -0700 Subject: [PATCH 018/168] remove .python-version (#32714) * remove .python-version * no cp --- .python-version | 1 - Dockerfile.openpilot_base | 2 +- tools/install_python_dependencies.sh | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) delete mode 100644 .python-version diff --git a/.python-version b/.python-version deleted file mode 100644 index 455808f8e1..0000000000 --- a/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.12.4 diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index 6818195d72..45b29bdcb1 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -68,7 +68,7 @@ ENV PYENV_VERSION=3.12.4 ENV PYENV_ROOT="/home/$USER/pyenv" ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH" -COPY --chown=$USER pyproject.toml poetry.lock .python-version /tmp/ +COPY --chown=$USER pyproject.toml poetry.lock /tmp/ COPY --chown=$USER tools/install_python_dependencies.sh /tmp/tools/ RUN cd /tmp && \ diff --git a/tools/install_python_dependencies.sh b/tools/install_python_dependencies.sh index df815b582f..af25ec6424 100755 --- a/tools/install_python_dependencies.sh +++ b/tools/install_python_dependencies.sh @@ -41,7 +41,7 @@ fi export MAKEFLAGS="-j$(nproc)" -PYENV_PYTHON_VERSION=$(cat $ROOT/.python-version) +PYENV_PYTHON_VERSION="3.12.4" if ! pyenv prefix ${PYENV_PYTHON_VERSION} &> /dev/null; then # no pyenv update on mac if [ "$(uname)" == "Linux" ]; then From 0bdab824231a9ba3069777791e7dff76cfce838e Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Tue, 11 Jun 2024 17:27:47 -0700 Subject: [PATCH 019/168] Remove aarch64 ci test (#32715) * remove aarch64 * comment + remove test --- .github/workflows/selfdrive_tests.yaml | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index 417fe20449..35bab255cb 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -69,11 +69,8 @@ jobs: build: strategy: matrix: - arch: ${{ fromJson( - ((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-latest' }} + arch: ${{ fromJson('["x86_64"]') }} # TODO: Re-add build test for aarch64 once we switched to ubuntu-2404 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: @@ -90,23 +87,6 @@ jobs: - uses: ./.github/workflows/compile-openpilot timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 15 || 30) }} # allow more time when we missed the scons cache - docker_push_multiarch: - name: docker push multiarch tag - runs-on: ubuntu-latest - if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot' - needs: [build] - steps: - - uses: actions/checkout@v4 - with: - submodules: false - - name: Setup docker - run: | - $DOCKER_LOGIN - - name: Merge x64 and arm64 tags - run: | - export PUSH_IMAGE=true - scripts/retry.sh selfdrive/test/docker_tag_multiarch.sh base x86_64 aarch64 - static_analysis: name: static analysis runs-on: ${{ ((github.repository == 'commaai/openpilot') && From 684209e077d77da0c3a12e8fda528649c5fe9edc Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 11 Jun 2024 21:31:10 -0700 Subject: [PATCH 020/168] remove uiPlan (#32721) * remove uiPlan from ui * remove publishing * Update log.capnp * Update services.py * no uiPlan here * Update ref_commit --- cereal/log.capnp | 2 +- cereal/services.py | 1 - selfdrive/controls/plannerd.py | 14 ++------------ .../test/process_replay/process_replay.py | 2 +- selfdrive/test/process_replay/ref_commit | 2 +- selfdrive/ui/qt/onroad/annotated_camera.cc | 5 ++--- selfdrive/ui/ui.cc | 19 +++++++------------ selfdrive/ui/ui.h | 3 +-- 8 files changed, 15 insertions(+), 33 deletions(-) diff --git a/cereal/log.capnp b/cereal/log.capnp index 36ca692dcc..67c6f836a4 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -2244,7 +2244,6 @@ struct Event { carControl @23 :Car.CarControl; carOutput @127 :Car.CarOutput; longitudinalPlan @24 :LongitudinalPlan; - uiPlan @106 :UiPlan; ubloxGnss @34 :UbloxGnss; ubloxRaw @39 :Data; qcomGnss @31 :QcomGnss; @@ -2365,5 +2364,6 @@ struct Event { sensorEventsDEPRECATED @11 :List(SensorEventData); lateralPlanDEPRECATED @64 :LateralPlan; navModelDEPRECATED @104 :NavModelData; + uiPlanDEPRECATED @106 :UiPlan; } } diff --git a/cereal/services.py b/cereal/services.py index 2ab28f6d52..ca9139c431 100755 --- a/cereal/services.py +++ b/cereal/services.py @@ -66,7 +66,6 @@ _services: dict[str, tuple] = { "navInstruction": (True, 1., 10), "navRoute": (True, 0.), "navThumbnail": (True, 0.), - "uiPlan": (True, 20., 40.), "qRoadEncodeIdx": (False, 20.), "userFlag": (True, 0., 1), "microphone": (True, 10., 10), diff --git a/selfdrive/controls/plannerd.py b/selfdrive/controls/plannerd.py index eeeeda050e..681518be19 100755 --- a/selfdrive/controls/plannerd.py +++ b/selfdrive/controls/plannerd.py @@ -6,16 +6,6 @@ from openpilot.common.swaglog import cloudlog from openpilot.selfdrive.controls.lib.longitudinal_planner import LongitudinalPlanner import cereal.messaging as messaging -def publish_ui_plan(sm, pm, longitudinal_planner): - ui_send = messaging.new_message('uiPlan') - ui_send.valid = sm.all_checks(service_list=['carState', 'controlsState', 'modelV2']) - uiPlan = ui_send.uiPlan - uiPlan.frameId = sm['modelV2'].frameId - uiPlan.position.x = list(sm['modelV2'].position.x) - uiPlan.position.y = list(sm['modelV2'].position.y) - uiPlan.position.z = list(sm['modelV2'].position.z) - uiPlan.accel = longitudinal_planner.a_desired_trajectory_full.tolist() - pm.send('uiPlan', ui_send) def plannerd_thread(): config_realtime_process(5, Priority.CTRL_LOW) @@ -27,7 +17,7 @@ def plannerd_thread(): cloudlog.info("plannerd got CarParams: %s", CP.carName) longitudinal_planner = LongitudinalPlanner(CP) - pm = messaging.PubMaster(['longitudinalPlan', 'uiPlan']) + pm = messaging.PubMaster(['longitudinalPlan']) sm = messaging.SubMaster(['carControl', 'carState', 'controlsState', 'radarState', 'modelV2'], poll='modelV2', ignore_avg_freq=['radarState']) @@ -36,7 +26,7 @@ def plannerd_thread(): if sm.updated['modelV2']: longitudinal_planner.update(sm) longitudinal_planner.publish(sm, pm) - publish_ui_plan(sm, pm, longitudinal_planner) + def main(): plannerd_thread() diff --git a/selfdrive/test/process_replay/process_replay.py b/selfdrive/test/process_replay/process_replay.py index 739efcb985..a55396002b 100755 --- a/selfdrive/test/process_replay/process_replay.py +++ b/selfdrive/test/process_replay/process_replay.py @@ -505,7 +505,7 @@ CONFIGS = [ ProcessConfig( proc_name="plannerd", pubs=["modelV2", "carControl", "carState", "controlsState", "radarState"], - subs=["longitudinalPlan", "uiPlan"], + subs=["longitudinalPlan"], ignore=["logMonoTime", "longitudinalPlan.processingDelay", "longitudinalPlan.solverExecutionTime"], init_callback=get_car_params_callback, should_recv_callback=FrequencyBasedRcvCallback("modelV2"), diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index eaf61ccb81..227202839f 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -0ba779ec9f624872b1d038acb15095b726ff8983 +6438bd5edad674c2de3c7e2d126271cb2576383d diff --git a/selfdrive/ui/qt/onroad/annotated_camera.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc index f7fb6b480f..241bb6ed34 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -235,8 +235,7 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) { QLinearGradient bg(0, height(), 0, 0); if (sm["controlsState"].getControlsState().getExperimentalMode()) { // The first half of track_vertices are the points for the right side of the path - // and the indices match the positions of accel from uiPlan - const auto &acceleration = sm["uiPlan"].getUiPlan().getAccel(); + const auto &acceleration = sm["modelV2"].getModelV2().getAcceleration().getX(); const int max_len = std::min(scene.track_vertices.length() / 2, acceleration.size()); for (int i = 0; i < max_len; ++i) { @@ -403,7 +402,7 @@ void AnnotatedCameraWidget::paintGL() { painter.setPen(Qt::NoPen); if (s->scene.world_objects_visible) { - update_model(s, model, sm["uiPlan"].getUiPlan()); + update_model(s, model); drawLaneLines(painter, s); if (s->scene.longitudinal_control && sm.rcv_frame("radarState") > s->scene.started_frame) { diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index c70b7594c9..06b8b13bc1 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -77,14 +77,10 @@ void update_line_data(const UIState *s, const cereal::XYZTData::Reader &line, } void update_model(UIState *s, - const cereal::ModelDataV2::Reader &model, - const cereal::UiPlan::Reader &plan) { + const cereal::ModelDataV2::Reader &model) { UIScene &scene = s->scene; - auto plan_position = plan.getPosition(); - if (plan_position.getX().size() < model.getPosition().getX().size()) { - plan_position = model.getPosition(); - } - float max_distance = std::clamp(*(plan_position.getX().end() - 1), + auto model_position = model.getPosition(); + float max_distance = std::clamp(*(model_position.getX().end() - 1), MIN_DRAW_DISTANCE, MAX_DRAW_DISTANCE); // update lane lines @@ -110,8 +106,8 @@ void update_model(UIState *s, const float lead_d = lead_one.getDRel() * 2.; max_distance = std::clamp((float)(lead_d - fmin(lead_d * 0.35, 10.)), 0.0f, max_distance); } - max_idx = get_path_length_idx(plan_position, max_distance); - update_line_data(s, plan_position, 0.9, 1.22, &scene.track_vertices, max_idx, false); + max_idx = get_path_length_idx(model_position, max_distance); + update_line_data(s, model_position, 0.9, 1.22, &scene.track_vertices, max_idx, false); } void update_dmonitoring(UIState *s, const cereal::DriverStateV2::Reader &driverstate, float dm_fade_state, bool is_rhd) { @@ -212,8 +208,7 @@ static void update_state(UIState *s) { scene.world_objects_visible = scene.world_objects_visible || (scene.started && sm.rcv_frame("liveCalibration") > scene.started_frame && - sm.rcv_frame("modelV2") > scene.started_frame && - sm.rcv_frame("uiPlan") > scene.started_frame); + sm.rcv_frame("modelV2") > scene.started_frame); } void ui_update_params(UIState *s) { @@ -249,7 +244,7 @@ UIState::UIState(QObject *parent) : QObject(parent) { sm = std::make_unique>({ "modelV2", "controlsState", "liveCalibration", "radarState", "deviceState", "pandaStates", "carParams", "driverMonitoringState", "carState", "liveLocationKalman", "driverStateV2", - "wideRoadCameraState", "managerState", "navInstruction", "navRoute", "uiPlan", "clocks", + "wideRoadCameraState", "managerState", "navInstruction", "navRoute", "clocks", }); Params params; diff --git a/selfdrive/ui/ui.h b/selfdrive/ui/ui.h index 7238159dda..9ef79b2eff 100644 --- a/selfdrive/ui/ui.h +++ b/selfdrive/ui/ui.h @@ -184,8 +184,7 @@ Device *device(); void ui_update_params(UIState *s); int get_path_length_idx(const cereal::XYZTData::Reader &line, const float path_height); void update_model(UIState *s, - const cereal::ModelDataV2::Reader &model, - const cereal::UiPlan::Reader &plan); + const cereal::ModelDataV2::Reader &model); void update_dmonitoring(UIState *s, const cereal::DriverStateV2::Reader &driverstate, float dm_fade_state, bool is_rhd); void update_leads(UIState *s, const cereal::RadarState::Reader &radar_state, const cereal::XYZTData::Reader &line); void update_line_data(const UIState *s, const cereal::XYZTData::Reader &line, From 81dc33e56994c364a2100978654c5abf4cacbe4e Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 11 Jun 2024 21:36:13 -0700 Subject: [PATCH 021/168] Fixup qlog size (#32719) * stash * Revert "stash" This reverts commit 5a22b44919d4cb8681cc08d99656954423abda93. * improvements * rm * method 2 * Revert "method 2" This reverts commit 7112d95b3eead8bfdd8efb1dcefd4edbe9107680. * unreal for now * stash * Revert "stash" This reverts commit a7c5b31d8043b8da96c21a8d40281cece3cada61. * clean up * update description --- selfdrive/debug/internal/qlog_size.py | 39 ++++++++++----------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/selfdrive/debug/internal/qlog_size.py b/selfdrive/debug/internal/qlog_size.py index b51cb3af2f..0b816604aa 100755 --- a/selfdrive/debug/internal/qlog_size.py +++ b/selfdrive/debug/internal/qlog_size.py @@ -5,24 +5,30 @@ from collections import defaultdict import matplotlib.pyplot as plt -from cereal.services import SERVICE_LIST from openpilot.tools.lib.logreader import LogReader -from openpilot.tools.lib.route import Route MIN_SIZE = 0.5 # Percent size of total to show as separate entry def make_pie(msgs, typ): - compressed_length_by_type = {k: len(bz2.compress(b"".join(v))) for k, v in msgs.items()} + msgs_by_type = defaultdict(list) + for m in msgs: + msgs_by_type[m.which()].append(m.as_builder().to_bytes()) + + length_by_type = {k: len(b"".join(v)) for k, v in msgs_by_type.items()} + compressed_length_by_type = {k: len(bz2.compress(b"".join(v))) for k, v in msgs_by_type.items()} total = sum(compressed_length_by_type.values()) + uncompressed_total = len(b"".join([m.as_builder().to_bytes() for m in msgs])) sizes = sorted(compressed_length_by_type.items(), key=lambda kv: kv[1]) - print(f"{typ} - Total {total / 1024:.2f} kB") + print("name - comp. size (uncomp. size)") for (name, sz) in sizes: - print(f"{name} - {sz / 1024:.2f} kB") + print(f"{name:<22} - {sz / 1024:.2f} kB ({length_by_type[name] / 1024:.2f} kB)") print() + print(f"{typ} - Total {total / 1024:.2f} kB") + print(f"{typ} - Uncompressed total {uncompressed_total / 1024 / 1024:.2f} MB") sizes_large = [(k, sz) for (k, sz) in sizes if sz >= total * MIN_SIZE / 100] sizes_large += [('other', sum(sz for (_, sz) in sizes if sz < total * MIN_SIZE / 100))] @@ -35,28 +41,11 @@ def make_pie(msgs, typ): if __name__ == "__main__": - parser = argparse.ArgumentParser(description='Check qlog size based on a rlog') + parser = argparse.ArgumentParser(description='View log size breakdown by message type') parser.add_argument('route', help='route to use') - parser.add_argument('segment', type=int, help='segment number to use') args = parser.parse_args() - r = Route(args.route) - rlog = r.log_paths()[args.segment] - msgs = list(LogReader(rlog)) + msgs = list(LogReader(args.route)) - msgs_by_type = defaultdict(list) - for m in msgs: - msgs_by_type[m.which()].append(m.as_builder().to_bytes()) - - qlog_by_type = defaultdict(list) - for name, service in SERVICE_LIST.items(): - if service.decimation is None: - continue - - for i, msg in enumerate(msgs_by_type[name]): - if i % service.decimation == 0: - qlog_by_type[name].append(msg) - - make_pie(msgs_by_type, 'rlog') - make_pie(qlog_by_type, 'qlog') + make_pie(msgs, 'qlog') plt.show() From 83ac80c6c899dbf4b5b2d422947b02b57d83bccd Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Tue, 11 Jun 2024 21:57:32 -0700 Subject: [PATCH 022/168] Remove `setproctitle` (#32716) * Custom setproctitle (#32667) * add custom setproctitle * add test * Update poetry.lock * fix lint * support only Linux * test only Linux * final lint * Update test_setproctitle.py * Update setproctitle.py * convert to threadnames * delete proctitles * Check str len and use PR_GET_NAME * fix poetry.lock * lint fix * Update common/threadname.py --------- Co-authored-by: reddyn12 Co-authored-by: Adeeb Shihadeh * revert that for now * use last 15 * fix * use name * update those * and modeld * rm --------- Co-authored-by: schlimeszn <138847413+schlimeszn@users.noreply.github.com> Co-authored-by: reddyn12 Co-authored-by: Comma Device --- common/realtime.py | 6 +- common/tests/test_threadname.py | 8 +++ common/threadname.py | 19 ++++++ poetry.lock | 112 ++------------------------------ pyproject.toml | 1 - scripts/waste.py | 4 +- selfdrive/modeld/modeld.py | 12 ++-- selfdrive/test/test_onroad.py | 32 ++++----- system/manager/process.py | 4 +- 9 files changed, 61 insertions(+), 137 deletions(-) create mode 100644 common/tests/test_threadname.py create mode 100644 common/threadname.py diff --git a/common/realtime.py b/common/realtime.py index dd97ea3d78..e7265406ac 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -4,7 +4,7 @@ import os import time from collections import deque -from setproctitle import getproctitle +from openpilot.common.threadname import getthreadname from openpilot.system.hardware import PC @@ -52,7 +52,7 @@ class Ratekeeper: self._print_delay_threshold = print_delay_threshold self._frame = 0 self._remaining = 0.0 - self._process_name = getproctitle() + self._thread_name = getthreadname() self._dts = deque([self._interval], maxlen=100) self._last_monitor_time = time.monotonic() @@ -87,7 +87,7 @@ class Ratekeeper: remaining = self._next_frame_time - time.monotonic() self._next_frame_time += self._interval if self._print_delay_threshold is not None and remaining < -self._print_delay_threshold: - print(f"{self._process_name} lagging by {-remaining * 1000:.2f} ms") + print(f"{self._thread_name} lagging by {-remaining * 1000:.2f} ms") lagged = True self._frame += 1 self._remaining = remaining diff --git a/common/tests/test_threadname.py b/common/tests/test_threadname.py new file mode 100644 index 0000000000..38e5e1d498 --- /dev/null +++ b/common/tests/test_threadname.py @@ -0,0 +1,8 @@ +from openpilot.common.threadname import setthreadname, getthreadname, LINUX + +class TestThreadName: + def test_set_get_threadname(self): + if LINUX: + name = 'TESTING' + setthreadname(name) + assert name == getthreadname() diff --git a/common/threadname.py b/common/threadname.py new file mode 100644 index 0000000000..7c415721f4 --- /dev/null +++ b/common/threadname.py @@ -0,0 +1,19 @@ +import ctypes +import os + +LINUX = os.name == 'posix' and os.uname().sysname == 'Linux' + +if LINUX: + libc = ctypes.CDLL('libc.so.6') + +def setthreadname(name: str) -> None: + if LINUX: + name = name[-15:] + '\0' + libc.prctl(15, str.encode(name), 0, 0, 0) + +def getthreadname() -> str: + if LINUX: + name = ctypes.create_string_buffer(16) + libc.prctl(16, name) + return name.value.decode('utf-8') + return "" diff --git a/poetry.lock b/poetry.lock index f4925a17fe..7e772276ed 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.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -2730,7 +2730,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, @@ -2740,8 +2739,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] [[package]] @@ -2752,7 +2751,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-headless-4.10.0.82.tar.gz", hash = "sha256:de9e742c1b9540816fbd115b0b03841d41ed0c65566b0d7a5371f98b131b7e6d"}, - {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a09ed50ba21cc5bf5d436cb0e784ad09c692d6b1d1454252772f6c8f2c7b4088"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:977a5fd21e1fe0d3d2134887db4441f8725abeae95150126302f31fcd9f548fa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4ec6755838b0be12510bfc9ffb014779c612418f11f4f7e6f505c36124a3aa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a37fa5276967ecf6eb297295b16b28b7a2eb3b568ca0ee469fb1a5954de298"}, @@ -2762,8 +2760,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] [[package]] @@ -2927,8 +2925,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -7367,106 +7365,6 @@ starlette = ["starlette (>=0.19.1)"] starlite = ["starlite (>=1.48)"] tornado = ["tornado (>=5)"] -[[package]] -name = "setproctitle" -version = "1.3.3" -description = "A Python module to customize the process title" -optional = false -python-versions = ">=3.7" -files = [ - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, - {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, - {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, - {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, - {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, - {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, - {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, - {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, - {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, - {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, - {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, - {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, - {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, - {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, - {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, - {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, - {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, - {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, - {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, - {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, - {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, - {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, - {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, - {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, - {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, - {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, - {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, - {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, - {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, - {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, - {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, - {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, - {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, - {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, - {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, - {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, - {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, - {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, -] - -[package.extras] -test = ["pytest"] - [[package]] name = "setuptools" version = "70.0.0" @@ -8114,4 +8012,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "c5654418f3c97420a4a2195b42ebfec250623b600658aae03385b2bcf4c058bd" +content-hash = "b5c62b81368f0e972fbcf0dbb88746f3ae930ebdc171ad004c926f3588d1f244" diff --git a/pyproject.toml b/pyproject.toml index 6e4741ddaf..7b780c87f0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -137,7 +137,6 @@ future-fstrings = "*" # these should be removed psutil = "*" timezonefinder = "*" # just used for nav ETA -setproctitle = "*" pycryptodome = "*" # used in updated/casync, panda, body, and a test [tool.poetry.group.dev.dependencies] diff --git a/scripts/waste.py b/scripts/waste.py index 0764ff77c3..bf92710fee 100755 --- a/scripts/waste.py +++ b/scripts/waste.py @@ -3,7 +3,7 @@ import os import time import numpy as np from multiprocessing import Process -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname def waste(core): os.sched_setaffinity(0, [core,]) @@ -16,7 +16,7 @@ def waste(core): j = 0 while 1: if (i % 100) == 0: - setproctitle("%3d: %8d" % (core, i)) + setthreadname("%3d: %8d" % (core, i)) lt = time.monotonic() print("%3d: %8d %f %.2f" % (core, i, lt-st, j)) st = lt diff --git a/selfdrive/modeld/modeld.py b/selfdrive/modeld/modeld.py index 3ac80aad91..1e33b7b3f0 100755 --- a/selfdrive/modeld/modeld.py +++ b/selfdrive/modeld/modeld.py @@ -6,7 +6,7 @@ import numpy as np import cereal.messaging as messaging from cereal import car, log from pathlib import Path -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname from cereal.messaging import PubMaster, SubMaster from msgq.visionipc import VisionIpcClient, VisionStreamType, VisionBuf from openpilot.common.swaglog import cloudlog @@ -24,7 +24,7 @@ from openpilot.selfdrive.modeld.fill_model_msg import fill_model_msg, fill_pose_ from openpilot.selfdrive.modeld.constants import ModelConstants from openpilot.selfdrive.modeld.models.commonmodel_pyx import ModelFrame, CLContext -PROCESS_NAME = "selfdrive.modeld.modeld" +THREAD_NAME = "selfdrive.modeld.modeld" SEND_RAW_PRED = os.getenv('SEND_RAW_PRED') MODEL_PATHS = { @@ -114,9 +114,9 @@ class ModelState: def main(demo=False): cloudlog.warning("modeld init") - sentry.set_tag("daemon", PROCESS_NAME) - cloudlog.bind(daemon=PROCESS_NAME) - setproctitle(PROCESS_NAME) + sentry.set_tag("daemon", THREAD_NAME) + cloudlog.bind(daemon=THREAD_NAME) + setthreadname("modeld") config_realtime_process(7, 54) cloudlog.warning("setting up CL context") @@ -286,7 +286,7 @@ if __name__ == "__main__": args = parser.parse_args() main(demo=args.demo) except KeyboardInterrupt: - cloudlog.warning(f"child {PROCESS_NAME} got SIGINT") + cloudlog.warning(f"child {THREAD_NAME} got SIGINT") except Exception: sentry.capture_exception() raise diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 75585e2f14..7b44a3b80e 100644 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -36,26 +36,26 @@ PROCS = { # Baseline CPU usage by process "selfdrive.controls.controlsd": 32.0, "selfdrive.car.card": 22.0, - "./loggerd": 14.0, - "./encoderd": 17.0, - "./camerad": 14.5, - "./locationd": 11.0, + "loggerd": 14.0, + "encoderd": 17.0, + "camerad": 14.5, + "locationd": 11.0, "selfdrive.controls.plannerd": 11.0, - "./ui": 18.0, + "ui": 18.0, "selfdrive.locationd.paramsd": 9.0, - "./sensord": 7.0, + "sensord": 7.0, "selfdrive.controls.radard": 7.0, - "selfdrive.modeld.modeld": 13.0, + "modeld": 13.0, "selfdrive.modeld.dmonitoringmodeld": 8.0, "system.hardware.hardwared": 3.87, "selfdrive.locationd.calibrationd": 2.0, "selfdrive.locationd.torqued": 5.0, "selfdrive.ui.soundd": 3.5, "selfdrive.monitoring.dmonitoringd": 4.0, - "./proclogd": 1.54, + "proclogd": 1.54, "system.logmessaged": 0.2, "system.tombstoned": 0, - "./logcatd": 0, + "logcatd": 0, "system.micd": 6.0, "system.timed": 0, "selfdrive.pandad.pandad": 0, @@ -67,12 +67,12 @@ PROCS = { PROCS.update({ "tici": { - "./pandad": 4.0, - "./ubloxd": 0.02, + "pandad": 4.0, + "ubloxd": 0.02, "system.ubloxd.pigeond": 6.0, }, "tizi": { - "./pandad": 19.0, + "pandad": 19.0, "system.qcomgpsd.qcomgpsd": 1.0, } }.get(HARDWARE.get_device_type(), {})) @@ -247,8 +247,7 @@ class TestOnroad: for pl in self.service_msgs['procLog']: for x in pl.procLog.procs: if len(x.cmdline) > 0: - n = list(x.cmdline)[0] - plogs_by_proc[n].append(x) + plogs_by_proc[x.name].append(x) print(plogs_by_proc.keys()) cpu_ok = True @@ -256,8 +255,9 @@ class TestOnroad: for proc_name, expected_cpu in PROCS.items(): err = "" + exp = "???" cpu_usage = 0. - x = plogs_by_proc[proc_name] + x = plogs_by_proc[proc_name[-15:]] if len(x) > 2: cpu_time = cputime_total(x[-1]) - cputime_total(x[0]) cpu_usage = cpu_time / dt * 100. @@ -309,7 +309,7 @@ class TestOnroad: assert max(mems) - min(mems) <= 3.0 def test_gpu_usage(self): - assert self.gpu_procs == {"weston", "ui", "camerad", "selfdrive.modeld.modeld"} + assert self.gpu_procs == {"weston", "ui", "camerad", "modeld"} def test_camera_processing_time(self): result = "\n" diff --git a/system/manager/process.py b/system/manager/process.py index 36f299ae62..9214e417c1 100644 --- a/system/manager/process.py +++ b/system/manager/process.py @@ -8,7 +8,7 @@ from collections.abc import Callable, ValuesView from abc import ABC, abstractmethod from multiprocessing import Process -from setproctitle import setproctitle +from openpilot.common.threadname import setthreadname from cereal import car, log import cereal.messaging as messaging @@ -27,7 +27,7 @@ def launcher(proc: str, name: str) -> None: mod = importlib.import_module(proc) # rename the process - setproctitle(proc) + setthreadname(proc) # create new context since we forked messaging.context = messaging.Context() From e798caa3e5c44ed5aa7e480101a052d59612ad95 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Tue, 11 Jun 2024 22:55:42 -0700 Subject: [PATCH 023/168] qlog_size.py: more accurate msg size breakdown (#32723) * grouping changes outcome * clean up * clean up * clean up * clean up * clean up --- selfdrive/debug/internal/qlog_size.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/selfdrive/debug/internal/qlog_size.py b/selfdrive/debug/internal/qlog_size.py index 0b816604aa..2d17a1ee28 100755 --- a/selfdrive/debug/internal/qlog_size.py +++ b/selfdrive/debug/internal/qlog_size.py @@ -6,6 +6,7 @@ from collections import defaultdict import matplotlib.pyplot as plt from openpilot.tools.lib.logreader import LogReader +from tqdm import tqdm MIN_SIZE = 0.5 # Percent size of total to show as separate entry @@ -15,19 +16,23 @@ def make_pie(msgs, typ): for m in msgs: msgs_by_type[m.which()].append(m.as_builder().to_bytes()) - length_by_type = {k: len(b"".join(v)) for k, v in msgs_by_type.items()} - compressed_length_by_type = {k: len(bz2.compress(b"".join(v))) for k, v in msgs_by_type.items()} - - total = sum(compressed_length_by_type.values()) + total = len(bz2.compress(b"".join([m.as_builder().to_bytes() for m in msgs]))) uncompressed_total = len(b"".join([m.as_builder().to_bytes() for m in msgs])) + length_by_type = {k: len(b"".join(v)) for k, v in msgs_by_type.items()} + # calculate compressed size by calculating diff when removed from the segment + compressed_length_by_type = {} + for k in tqdm(msgs_by_type.keys(), desc="Compressing"): + compressed_length_by_type[k] = total - len(bz2.compress(b"".join([m.as_builder().to_bytes() for m in msgs if m.which() != k]))) + sizes = sorted(compressed_length_by_type.items(), key=lambda kv: kv[1]) print("name - comp. size (uncomp. size)") for (name, sz) in sizes: print(f"{name:<22} - {sz / 1024:.2f} kB ({length_by_type[name] / 1024:.2f} kB)") print() - print(f"{typ} - Total {total / 1024:.2f} kB") + print(f"{typ} - Real total {total / 1024:.2f} kB") + print(f"{typ} - Breakdown total {sum(compressed_length_by_type.values()) / 1024:.2f} kB") print(f"{typ} - Uncompressed total {uncompressed_total / 1024 / 1024:.2f} MB") sizes_large = [(k, sz) for (k, sz) in sizes if sz >= total * MIN_SIZE / 100] From 8065b454c9dd57f1c61ac1a9e8475e694bb38bf1 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Wed, 12 Jun 2024 16:48:09 +0800 Subject: [PATCH 024/168] pandad: removed the redundant .c_str() call (#32724) Removed the redundant .c_str() call --- selfdrive/pandad/panda_comms.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/pandad/panda_comms.cc b/selfdrive/pandad/panda_comms.cc index 4e8a0a27ba..59908f0cde 100644 --- a/selfdrive/pandad/panda_comms.cc +++ b/selfdrive/pandad/panda_comms.cc @@ -120,7 +120,7 @@ std::vector PandaUsbHandle::list() { libusb_close(handle); if (ret < 0) { goto finish; } - serials.push_back(std::string((char *)desc_serial, ret).c_str()); + serials.push_back(std::string((char *)desc_serial, ret)); } } From c64bca97bac68462a63b47d33aedf869d21ac97e Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Thu, 13 Jun 2024 05:20:06 +0800 Subject: [PATCH 025/168] logreader.py: optimize event loading and sorting in _LogFileReader (#32729) * improve logfilereader * less changes --- tools/lib/logreader.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 669c1520db..48a04b28de 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -46,15 +46,15 @@ class _LogFileReader: ents = capnp_log.Event.read_multiple_bytes(dat) - _ents = [] + self._ents = [] try: for e in ents: - _ents.append(e) + self._ents.append(e) except capnp.KjException: warnings.warn("Corrupted events detected", RuntimeWarning, stacklevel=1) - self._ents = list(sorted(_ents, key=lambda x: x.logMonoTime) if sort_by_time else _ents) - self._ts = [x.logMonoTime for x in self._ents] + if sort_by_time: + self._ents.sort(key=lambda x: x.logMonoTime) def __iter__(self) -> Iterator[capnp._DynamicStructReader]: for ent in self._ents: From 7dbf60b4bce04a071eafcbc3eb0815e968e401be Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Jun 2024 17:16:30 -0700 Subject: [PATCH 026/168] controlsd: exit on any exception (#32730) * exit on any exception * finally so we don't catch --- 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 4f5bd19405..aeeb3489b5 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -835,7 +835,7 @@ class Controls: while True: self.step() self.rk.monitor_time() - except SystemExit: + finally: e.set() t.join() From 742a3a94e39440706c8ccff7ad1dcdce506a0c8a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Jun 2024 19:26:34 -0700 Subject: [PATCH 027/168] Hyundai: add note about fwdRadar FW (#32733) comment --- 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 d115283dd5..c3d3dcd037 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -2,6 +2,9 @@ from cereal import car from openpilot.selfdrive.car.hyundai.values import CAR +# The existence of SCC or RDR in the fwdRadar FW usually determines the radar's function, +# i.e. if it sends the SCC messages or if another ECU like the camera or ADAS Driving ECU does + Ecu = car.CarParams.Ecu FINGERPRINTS = { From 4539c973491bedabb4cd6cf8791d090987c56629 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Jun 2024 19:36:26 -0700 Subject: [PATCH 028/168] Improve ECU address finder script (#32734) * put pandad in good state * obd option * fix * it's rx --- selfdrive/car/ecu_addrs.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/selfdrive/car/ecu_addrs.py b/selfdrive/car/ecu_addrs.py index e7a9fbcf2c..756cd7f963 100755 --- a/selfdrive/car/ecu_addrs.py +++ b/selfdrive/car/ecu_addrs.py @@ -71,25 +71,35 @@ def get_ecu_addrs(logcan: messaging.SubSocket, sendcan: messaging.PubSocket, que if __name__ == "__main__": import argparse + from openpilot.common.params import Params + from openpilot.selfdrive.car.fw_versions import set_obd_multiplexing parser = argparse.ArgumentParser(description='Get addresses of all ECUs') parser.add_argument('--debug', action='store_true') parser.add_argument('--bus', type=int, default=1) + parser.add_argument('--no-obd', action='store_true') parser.add_argument('--timeout', type=float, default=1.0) args = parser.parse_args() logcan = messaging.sub_sock('can') sendcan = messaging.pub_sock('sendcan') - time.sleep(1.0) + # Set up params for pandad + params = Params() + params.remove("FirmwareQueryDone") + params.put_bool("IsOnroad", False) + time.sleep(0.2) # thread is 10 Hz + params.put_bool("IsOnroad", True) + + set_obd_multiplexing(params, not args.no_obd) print("Getting ECU addresses ...") ecu_addrs = get_all_ecu_addrs(logcan, sendcan, args.bus, args.timeout, debug=args.debug) print() - print("Found ECUs on addresses:") + print("Found ECUs on rx addresses:") for addr, subaddr, _ in ecu_addrs: - msg = f" 0x{hex(addr)}" + msg = f" {hex(addr)}" if subaddr is not None: msg += f" (sub-address: {hex(subaddr)})" print(msg) From 04a93dd849461df7a3496706c6172d95e83149c9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Wed, 12 Jun 2024 21:14:23 -0700 Subject: [PATCH 029/168] add zstd Python library (#32731) * add zstd * fix * uploader * logreader: zst support * caps * only logreader --- poetry.lock | 103 +++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 1 + tools/lib/logreader.py | 8 +++- 3 files changed, 106 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 7e772276ed..c5f372173c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2730,6 +2730,7 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, + {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, @@ -2751,6 +2752,7 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-headless-4.10.0.82.tar.gz", hash = "sha256:de9e742c1b9540816fbd115b0b03841d41ed0c65566b0d7a5371f98b131b7e6d"}, + {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a09ed50ba21cc5bf5d436cb0e784ad09c692d6b1d1454252772f6c8f2c7b4088"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:977a5fd21e1fe0d3d2134887db4441f8725abeae95150126302f31fcd9f548fa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4ec6755838b0be12510bfc9ffb014779c612418f11f4f7e6f505c36124a3aa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a37fa5276967ecf6eb297295b16b28b7a2eb3b568ca0ee469fb1a5954de298"}, @@ -3459,8 +3461,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"}, @@ -7020,7 +7020,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"}, @@ -8009,7 +8008,103 @@ files = [ doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] +[[package]] +name = "zstd" +version = "1.5.5.1" +description = "ZSTD Bindings for Python" +optional = false +python-versions = "*" +files = [ + {file = "zstd-1.5.5.1-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:555779789bc75cd05089c3ba857f45a0a8c4b87d45e5ced02fec77fa8719237a"}, + {file = "zstd-1.5.5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:86496bd4830cdb7b4b05a9ce6ce2baee87d327ff90845da4ee308452bfbbed4e"}, + {file = "zstd-1.5.5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:b487c2e67ed42a4e0d47997d209f4456b01b334023083ef61873f79577c84c62"}, + {file = "zstd-1.5.5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:45ccd45a5b681088fca1a863ca9236ded5112b8011f1d5bf69e908f5eb32023a"}, + {file = "zstd-1.5.5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8403fe84207d8b0c7b17bca6c4caad431ac765b1b9b626ad9fae4bb93a64a9d8"}, + {file = "zstd-1.5.5.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:0ab979c6357b8927f0c025ea2f72f25e15d03ce17a8a6c1789e2d5b108bf39ae"}, + {file = "zstd-1.5.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:98cbee6c1b2fe85f02fd475d885f98363c63bc64eebc249d7eb7469a0ff70283"}, + {file = "zstd-1.5.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9962714b89641301029f3832bdf07c20f60b9e64e39e8d7b6253451a82b54f5c"}, + {file = "zstd-1.5.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f59cc92d71537f8082306f75aa403ddb4a4a1069a39f104525673110e4d23f7"}, + {file = "zstd-1.5.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:569f13d0c926ddafceebce8ac73baddfc2bd9cbbbbc922b6b3073338cc43dae6"}, + {file = "zstd-1.5.5.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba530c44f252016acc6ef906d7d2070c1ad0cfe835c498fdcd37493e4772ac6e"}, + {file = "zstd-1.5.5.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ee3496ed8fff3add6c6e658b207f18d96474c3db0c28ab7a69623380b1a0a8c"}, + {file = "zstd-1.5.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:530d69bea2791cde8afa7fe988f3a37c3ba37015f6a1d5593c0500f089f3090e"}, + {file = "zstd-1.5.5.1-cp310-cp310-win32.whl", hash = "sha256:cf179e51f447b6a7ff47e449fcb98fb5fe15aedcc90401697cf7c93dd6e4434e"}, + {file = "zstd-1.5.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:5f5e6e0805d710d7509c8d175a467eb89c631a4142b1a630ceeb8e3e3138d152"}, + {file = "zstd-1.5.5.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:022f935a8666e08f0fff6204938a84d9fe4fcd8235a205787275933a07a164fb"}, + {file = "zstd-1.5.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3d15a2d18dac8bcafdde52fdf5d40ecae1f73b7de19b171f42339d2e51346d0"}, + {file = "zstd-1.5.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45b9c67989f50ba63ffa0c50c9eaa037c2d14abacb0813e838ad705135245b4b"}, + {file = "zstd-1.5.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97da6a842ba7e4acf8bba7c596057143ee39b3c4a467196c2096d460e44accd6"}, + {file = "zstd-1.5.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dafd492fb8ee4ae04c81ab00f5f137860e7071f611335dd4cdb1c38bd8f11bc"}, + {file = "zstd-1.5.5.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:9ee83e0bcbfd776200b026b3b9e86c6c86b8f414749f58d87c85dcf456b27066"}, + {file = "zstd-1.5.5.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ae2fd4bc8ea772a7b5f1acd1cac9e34bb9cd8fcde191f170092fdeea779a3a12"}, + {file = "zstd-1.5.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:edea52a0109f48fd46f4763689d3d356dcafd20ddf6789c559a1bd2e62b40a32"}, + {file = "zstd-1.5.5.1-cp311-cp311-win32.whl", hash = "sha256:88410481209520298ec4430e0d1d57e004c45e0b27c3035674fb182ccd2d8b7b"}, + {file = "zstd-1.5.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:dce18aaefbacf8b133367be86beec670baf68c0420bfcca49be08dbdbf933db6"}, + {file = "zstd-1.5.5.1-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:634dc632f7cf87e95dabf74dcf682e3507bd5cb9dd1bcdb81f92a6521aab0bd2"}, + {file = "zstd-1.5.5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:608414eb75ead573891d97a1e529848b8f31749d21a440e80838548a19d8c0e6"}, + {file = "zstd-1.5.5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:384128f7a731e3f45da49976591cec03fc4079e70653df10d9ea43a1d3b49d50"}, + {file = "zstd-1.5.5.1-cp35-cp35m-win32.whl", hash = "sha256:4bce254174ef05cea01021d67e18489d5d08db1168e758b62ecee121572a52a9"}, + {file = "zstd-1.5.5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:3f0ff81232b49d7eb4f4d9e6f92443c9d242c139ad98ffedac0e889568f900ce"}, + {file = "zstd-1.5.5.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:a871df41b801a260cc849c2c76f300ebb9d286c4b7a1fd6ce45fe0c91340b767"}, + {file = "zstd-1.5.5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a53860dbfbea281eb690ce09cae28967cf1df8e6d7560e4a8bf5b9fcb258147"}, + {file = "zstd-1.5.5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a37cbc0580fdfd66c8b3ec65f9af00a4a34e9781b54dfb89f04d301dc375c90a"}, + {file = "zstd-1.5.5.1-cp36-cp36m-win32.whl", hash = "sha256:5531b683539ae1f7b2ad23dacee8a73e5d7eaa6702ea8df5a24bd3318647dee1"}, + {file = "zstd-1.5.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eeaff418269b41eee8c7971fbba9d32d07d3f6aa26f962a72aff725071096a1b"}, + {file = "zstd-1.5.5.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:8bd6a9050de8bbe844447348372ca17d01bc05207619f6a5d448567d111b5cd9"}, + {file = "zstd-1.5.5.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2ece3d20ef357370584f304407fbd1e4ff9c231209320e08a889b8e3725d56e"}, + {file = "zstd-1.5.5.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:687f9e03dc9f9b8803840425bb23bf6bc700888b4860afcf43c4f238102752d2"}, + {file = "zstd-1.5.5.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a649daac9c8f1b37d29f2b3d0a43f134061659b54877fe4b0da6df2965dc91f"}, + {file = "zstd-1.5.5.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bddc7e3c3ce31c01fe1edaa7c03c0b9e71eadf4ce1609746d32f86d95a0449e6"}, + {file = "zstd-1.5.5.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:12bf8e04add8bb84f9fe9117f3de6d9394eade6a5a82fe4d6bd95914fc6ef423"}, + {file = "zstd-1.5.5.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9e6a15fa4d2e65c5902ab2a4e41279ac126cb371ce6c3c75ad5789bb20dd1f54"}, + {file = "zstd-1.5.5.1-cp37-cp37m-win32.whl", hash = "sha256:a1c269243a4321beb948635b544ccbe6390846358ace620fd000ab7099011d9c"}, + {file = "zstd-1.5.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:91366e36773241cb4b049a32f4495d33dd274df1eea5b55396f5f3984a3de22e"}, + {file = "zstd-1.5.5.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:d3ce2cb310690994274d133ea7f269dd4b81799fdbce158690556209723d7d4e"}, + {file = "zstd-1.5.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e0c87bfbfa9d852f79c90bcd7426c3ba46cf3285e6984013636d4fc854ba9230"}, + {file = "zstd-1.5.5.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce6d829d515f272fddb3a87e1a5f32cc0f1a7b0cba24d360c89f4a165b74b"}, + {file = "zstd-1.5.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e05f81f346213b23ed1b12d84fc1f72e65eacd8978e1e88facf185c82bd3d053"}, + {file = "zstd-1.5.5.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43ec66c4c3a76351c672c6ef9f0ff3412fca9ede0a56d18dddaf6418a93faef8"}, + {file = "zstd-1.5.5.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:58e554e91e0d49f4f2b2df390cdd0f64aa9b6fd5f4dcb208c094bfd079b30f3a"}, + {file = "zstd-1.5.5.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:883c6d3b6f5574e1765ca97f4b6a41b69094a41be56175552faebc0e0e43b65e"}, + {file = "zstd-1.5.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d52b6932cab5419c434bccfea3e5640e755369fc9eeb51e3d17e15bf8e8cb103"}, + {file = "zstd-1.5.5.1-cp38-cp38-win32.whl", hash = "sha256:dcaf44270ec88552e969be4dd3359b34aa3065663ccd8168a257c78f150a356c"}, + {file = "zstd-1.5.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:627f12cb7035723c8f3d8d4cefcad6d950ed9cba33fd3eb46bae04ccab479234"}, + {file = "zstd-1.5.5.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:c0dab132c1a5a7cc838a7c3e4e380ad153b9d7bd1fadafabf6cfeb780b916201"}, + {file = "zstd-1.5.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4ab0a5dd9a41d3b083304beee7ada40ee36431acbeb75132032f4fe5cf0490a"}, + {file = "zstd-1.5.5.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f6e38f496d287020658c6b4cdb5e815ecc6998889bd0f1f9ab0825f2e3d74ef"}, + {file = "zstd-1.5.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0096c8ee0ed4bfe406bc961019f55552109e19771bfd3eb32d2af56ea27085c"}, + {file = "zstd-1.5.5.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a0f1527728c50b6aa8f04b47a07580f0ae13cfc6c6d9c96bb0bdf5259487559"}, + {file = "zstd-1.5.5.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6a64e420c904063c5c3de53c00ec0993ebc0a48cebbef97dc6c768562c5abab5"}, + {file = "zstd-1.5.5.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:03444e357b7632c64480a81ce7095242dab9d7f8aed317326563ef6c663263eb"}, + {file = "zstd-1.5.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:88b9a10f80d2b87bf8cc1a1fc20a815ed92b5eefdc15cbe8062021f0b5a26a10"}, + {file = "zstd-1.5.5.1-cp39-cp39-win32.whl", hash = "sha256:c91cc1606eb8b3a6fed11faaef4c6e55f1133d70cf0db0c829a2cf9c2ac1dfd9"}, + {file = "zstd-1.5.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:f462e2ebf26dcbfc2c8dddd6b5c56859683f0b77edb8f268e637f7d390a58f74"}, + {file = "zstd-1.5.5.1-pp27-pypy_73-macosx_10_14_x86_64.whl", hash = "sha256:c63f916732e3e309e49ec95e7a0af5d37ff1321f3df2aac10e507bd2b56fceda"}, + {file = "zstd-1.5.5.1-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:50d4850d758bb033df50722cc13ed913b2afcd5385250be4f3ffb79a26b319c3"}, + {file = "zstd-1.5.5.1-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:0412d666515e78a91ada7e2d78e9dd6b25ddda1b41623b145b99653275c7f3ce"}, + {file = "zstd-1.5.5.1-pp36-pypy36_pp73-macosx_10_14_x86_64.whl", hash = "sha256:0ea91f74869a3cdcb2dde08f8f30ee3da72782c5d1737afed9c703232815864e"}, + {file = "zstd-1.5.5.1-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:477548897dc2b8b595af7bec5f0f55dcba8e9a282335f687cc663b52b171357b"}, + {file = "zstd-1.5.5.1-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:c518938b57a56001ee04dcf79a432152f5bd431416f3b22819ba959bc6054d89"}, + {file = "zstd-1.5.5.1-pp36-pypy36_pp73-win32.whl", hash = "sha256:894a8fe0228d5e24dc286a8d98eb0ce2883f8e2e57f3b7e7619ebdb67967120a"}, + {file = "zstd-1.5.5.1-pp37-pypy37_pp73-macosx_10_14_x86_64.whl", hash = "sha256:42ec0a4ae9bedd9909fa4f580f3c800469da1b631faeaa94f204e1b66c767fa2"}, + {file = "zstd-1.5.5.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d56dedaa04ab8ecc23492972b12e0bf8529f64c9bceb28c11f43c2369c9768b3"}, + {file = "zstd-1.5.5.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5b060770d796e4c01f5848b345c3cea8a177ab4e7cd95a1963a355042d429e1"}, + {file = "zstd-1.5.5.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fea04805ef6e1cb93d6e5d6bbc7a03bc75a5c733fd352d5aaa81109986fdf1ef"}, + {file = "zstd-1.5.5.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:405c28a35756e57a434bbd7ed29dc5e6490cd2fc2118cbf78b60eaebd134f5e9"}, + {file = "zstd-1.5.5.1-pp38-pypy38_pp73-macosx_10_14_x86_64.whl", hash = "sha256:c42e630443b01a891277426365a51a2aa630b059ce675992c70c1928d30eccb4"}, + {file = "zstd-1.5.5.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1520d23f24f26cdfbcdb4dc86947446b8f694838bfce728d7fc4b3492397357c"}, + {file = "zstd-1.5.5.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4730737f63cf802321743ded6acc85e747e7f5587c5ba2e51a760bf009f7de"}, + {file = "zstd-1.5.5.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f8c014395e89ad7f67ffe873c0fa1d8e9b4dea8b1801d24e8d9ccd8259858d"}, + {file = "zstd-1.5.5.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5d9ba4f6af0945809bfa3387c6a1208a22937a876521b9ec347e7183d623311b"}, + {file = "zstd-1.5.5.1-pp39-pypy39_pp73-macosx_10_14_x86_64.whl", hash = "sha256:04dfd9f46b0b0b1bc413884fe028b726febcb726d4f66e3cf8afc00c2d9026bf"}, + {file = "zstd-1.5.5.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af52436a2eb5caa925d95461973984cb34d472a963b6be1c0a9f2dfbafad096f"}, + {file = "zstd-1.5.5.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610928b888a2e7ae9d2018ffa814859d47ec4ba75f89a1188ab4eb9232636ee5"}, + {file = "zstd-1.5.5.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee3c9feea99c7f4ff43129a885da056b5aa0cde3f7876bf6397bfb9433f44352"}, + {file = "zstd-1.5.5.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c6ac9768eeb3c6b530db93de2fec9b363776075dc8a00ee4049612ba5397ca8e"}, + {file = "zstd-1.5.5.1.tar.gz", hash = "sha256:1ef980abf0e1e072b028d2d76ef95b476632651c96225cf30b619c6eef625672"}, +] + [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "b5c62b81368f0e972fbcf0dbb88746f3ae930ebdc171ad004c926f3588d1f244" +content-hash = "877bf9463a547f2e1b11d057f20504459e75cf21b5f0dab341d6205a4de1f54c" diff --git a/pyproject.toml b/pyproject.toml index 7b780c87f0..edc515771a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -187,6 +187,7 @@ tabulate = "*" types-requests = "*" types-tabulate = "*" tqdm = "*" +zstd = "*" # this is only pinned since 5.15.11 is broken pyqt5 = { version = "==5.15.2", markers = "platform_machine == 'x86_64'" } # no aarch64 wheels for macOS/linux diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 48a04b28de..2430f1542c 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -10,6 +10,7 @@ import sys import tqdm import urllib.parse import warnings +import zstd from collections.abc import Callable, Iterable, Iterator from urllib.parse import parse_qs, urlparse @@ -34,8 +35,8 @@ class _LogFileReader: ext = None if not dat: _, ext = os.path.splitext(urllib.parse.urlparse(fn).path) - if ext not in ('', '.bz2'): - # old rlogs weren't bz2 compressed + if ext not in ('', '.bz2', '.zst'): + # old rlogs weren't compressed raise Exception(f"unknown extension {ext}") with FileReader(fn) as f: @@ -43,6 +44,9 @@ class _LogFileReader: if ext == ".bz2" or dat.startswith(b'BZh9'): dat = bz2.decompress(dat) + elif ext == ".zst" or dat.startswith(b'\x28\xB5\x2F\xFD'): + # https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#zstandard-frames + dat = zstd.decompress(dat) ents = capnp_log.Event.read_multiple_bytes(dat) From f449ed144ea47d8d5f558254c9c4cf04e959fbee Mon Sep 17 00:00:00 2001 From: markalan020 Date: Thu, 13 Jun 2024 03:55:52 -0400 Subject: [PATCH 030/168] Hyundai: add fwdCamera FW for Ioniq 5 2024 (US) (#32623) * Update fingerprints.py Add Support for 2024 Hyundai Ioniq 5 * docs --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 4 ++-- selfdrive/car/hyundai/fingerprints.py | 1 + selfdrive/car/hyundai/values.py | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 3b163dcee3..2feabb5574 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -91,8 +91,8 @@ A supported vehicle is one that just works when you install a comma device. All |Hyundai|Genesis 2015-16|Smart Cruise Control (SCC)|Stock|19 mph|37 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.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[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 5 (with HDA II) 2022-24[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-24[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-24[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
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index c3d3dcd037..b1e50f8358 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -998,6 +998,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 USA LHD 1.00 1.00 99211-GI100 230915', ], }, CAR.HYUNDAI_IONIQ_6: { diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index c489ea0042..b6f8da2189 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -307,8 +307,8 @@ class CAR(Platforms): 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])), - HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-23", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), + HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-24", "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, From 0319379431732ec3855fc7a60ddaa7e5ddb30def Mon Sep 17 00:00:00 2001 From: Mustafa Akcanca Date: Thu, 13 Jun 2024 11:06:45 +0300 Subject: [PATCH 031/168] Hyundai docs: change Ioniq 5 Southeast Asia only to Non-US only (#32701) * Update values.py * ev6 too is probably the same --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 4 ++-- selfdrive/car/hyundai/values.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 2feabb5574..c0b6e15468 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -90,7 +90,7 @@ 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-empty.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[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 (Non-US 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-24[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-24[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-24[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
|| @@ -127,7 +127,7 @@ A supported vehicle is one that just works when you install a comma device. All |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-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 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 (Non-US only) 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 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-24[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-24[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)|6 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.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/values.py b/selfdrive/car/hyundai/values.py index b6f8da2189..f34c45f770 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -306,7 +306,7 @@ class CAR(Platforms): ) 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 (Non-US only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), ], @@ -478,7 +478,7 @@ class CAR(Platforms): ) KIA_EV6 = HyundaiCanFDPlatformConfig( [ - HyundaiCarDocs("Kia EV6 (Southeast Asia only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), + HyundaiCarDocs("Kia EV6 (Non-US only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_p])), HyundaiCarDocs("Kia EV6 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])), HyundaiCarDocs("Kia EV6 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_p])) ], From 06828f1e80435fbc3a27781b096e3e2bbc86da69 Mon Sep 17 00:00:00 2001 From: Mustafa Akcanca Date: Thu, 13 Jun 2024 11:08:03 +0300 Subject: [PATCH 032/168] Hyundai: add fwdCamera FW for Ioniq 5 2024 (EUR) (#32648) * Update fingerprints.py Adding FW fingerprints for Ioniq 5 2024 EU, non-HDA, fwd camera * bump my! --------- Co-authored-by: Shane Smiskol --- docs/CARS.md | 2 +- selfdrive/car/hyundai/fingerprints.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/CARS.md b/docs/CARS.md index c0b6e15468..43bd8a8b30 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -90,7 +90,7 @@ 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-empty.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 (Non-US 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 (Non-US only) 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 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-24[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-24[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-24[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
|| diff --git a/selfdrive/car/hyundai/fingerprints.py b/selfdrive/car/hyundai/fingerprints.py index b1e50f8358..e489a3cf64 100644 --- a/selfdrive/car/hyundai/fingerprints.py +++ b/selfdrive/car/hyundai/fingerprints.py @@ -999,6 +999,7 @@ FW_VERSIONS = { 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 USA LHD 1.00 1.00 99211-GI100 230915', + b'\xf1\x00NE1 MFC AT EUR LHD 1.00 1.00 99211-GI100 230915', ], }, CAR.HYUNDAI_IONIQ_6: { From 4708332abee61116e13da7a4a186ca1b77511dd9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 13 Jun 2024 01:39:17 -0700 Subject: [PATCH 033/168] Update docs --- 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 f34c45f770..8cb29c803c 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -306,7 +306,7 @@ class CAR(Platforms): ) HYUNDAI_IONIQ_5 = HyundaiCanFDPlatformConfig( [ - HyundaiCarDocs("Hyundai Ioniq 5 (Non-US only) 2022-23", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), + HyundaiCarDocs("Hyundai Ioniq 5 (Non-US only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_q])), HyundaiCarDocs("Hyundai Ioniq 5 (without HDA II) 2022-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_k])), HyundaiCarDocs("Hyundai Ioniq 5 (with HDA II) 2022-24", "Highway Driving Assist II", car_parts=CarParts.common([CarHarness.hyundai_q])), ], From f08137f6182d2667803ac6e75e86fb605d0a8b1c Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Thu, 13 Jun 2024 10:29:57 -0700 Subject: [PATCH 034/168] pandad: update test thresholds --- selfdrive/pandad/tests/test_pandad_spi.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/selfdrive/pandad/tests/test_pandad_spi.py b/selfdrive/pandad/tests/test_pandad_spi.py index 11e20e72cc..9c5990cd3f 100644 --- a/selfdrive/pandad/tests/test_pandad_spi.py +++ b/selfdrive/pandad/tests/test_pandad_spi.py @@ -84,8 +84,8 @@ class TestBoarddSpi: ps = m.peripheralState assert ps.pandaType == "tres" assert 4000 < ps.voltage < 14000 - assert 100 < ps.current < 1000 - assert ps.fanSpeedRpm < 8000 + assert 50 < ps.current < 1000 + assert ps.fanSpeedRpm < 10000 time.sleep(0.5) et = time.monotonic() - st From 9ffd973be9bdfe1be1097f9a2618ba76991616e4 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Thu, 13 Jun 2024 13:41:32 -0700 Subject: [PATCH 035/168] Separate python dep into groups (#32739) * split * only zstd --- poetry.lock | 21 +++++++++------- pyproject.toml | 68 +++++++++++++++++++++++++++----------------------- 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/poetry.lock b/poetry.lock index c5f372173c..16fb764d57 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.3 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" @@ -1074,18 +1074,18 @@ files = [ [[package]] name = "filelock" -version = "3.14.0" +version = "3.15.1" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.14.0-py3-none-any.whl", hash = "sha256:43339835842f110ca7ae60f1e1c160714c5a6afd15a2873419ab185334975c0f"}, - {file = "filelock-3.14.0.tar.gz", hash = "sha256:6ea72da3be9b8c82afd3edcf99f2fffbb5076335a5ae4d03248bb5b6c3eae78a"}, + {file = "filelock-3.15.1-py3-none-any.whl", hash = "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac"}, + {file = "filelock-3.15.1.tar.gz", hash = "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8"}, ] [package.extras] 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)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-asyncio (>=0.21)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -2740,8 +2740,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -2762,8 +2762,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] [[package]] @@ -2927,8 +2927,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3461,6 +3461,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"}, @@ -7020,6 +7022,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"}, @@ -8107,4 +8110,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "877bf9463a547f2e1b11d057f20504459e75cf21b5f0dab341d6205a4de1f54c" +content-hash = "51f233c6af3795be4fd3f54b7b462777bc65f547de0821c0de7ac0c3c056b0a6" diff --git a/pyproject.toml b/pyproject.toml index edc515771a..e46f7d51a2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -139,35 +139,17 @@ psutil = "*" timezonefinder = "*" # just used for nav ETA pycryptodome = "*" # used in updated/casync, panda, body, and a test -[tool.poetry.group.dev.dependencies] -av = "*" -azure-identity = "*" -azure-storage-blob = "*" -breathe = "*" -control = "*" -coverage = "*" -dictdiffer = "*" -flaky = "*" -hypothesis = "~6.47" -inputs = "*" +[tool.poetry.group.docs.dependencies] Jinja2 = "*" -lru-dict = "*" -matplotlib = "*" -metadrive-simulator = { git = "https://github.com/commaai/metadrive.git", branch = "python3.12", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies -mpld3 = "*" +sphinx = "*" +sphinx-rtd-theme = "*" +sphinx-sitemap = "*" + +[tool.poetry.group.testing.dependencies] +coverage = "*" +hypothesis = "~6.47" mypy = "*" -myst-parser = "*" -natsort = "*" -opencv-python-headless = "*" -parameterized = "^0.8" -#pprofile = "*" -polyline = "*" pre-commit = "*" -pyautogui = "*" -pyopencl = { version = "*", markers = "platform_machine != 'aarch64'" } # broken on arm64 -pygame = "*" -pywinctl = "*" -pyprof2calltree = "*" pytest = "*" pytest-cov = "*" pytest-cpp = "*" @@ -178,16 +160,40 @@ pytest-randomly = "*" pytest-asyncio = "*" pytest-mock = "*" pytest-repeat = "*" -rerun-sdk = "*" ruff = "*" -sphinx = "*" -sphinx-rtd-theme = "*" -sphinx-sitemap = "*" + +[tool.poetry.group.tools.dependencies] +zstd = "*" + +[tool.poetry.group.dev.dependencies] +av = "*" +azure-identity = "*" +azure-storage-blob = "*" +breathe = "*" +control = "*" +dictdiffer = "*" +flaky = "*" +inputs = "*" +lru-dict = "*" +matplotlib = "*" +metadrive-simulator = { git = "https://github.com/commaai/metadrive.git", branch = "python3.12", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies +mpld3 = "*" +myst-parser = "*" +natsort = "*" +opencv-python-headless = "*" +parameterized = "^0.8" +#pprofile = "*" +polyline = "*" +pyautogui = "*" +pygame = "*" +pyopencl = { version = "*", markers = "platform_machine != 'aarch64'" } # broken on arm64 +pywinctl = "*" +pyprof2calltree = "*" +rerun-sdk = "*" tabulate = "*" types-requests = "*" types-tabulate = "*" tqdm = "*" -zstd = "*" # this is only pinned since 5.15.11 is broken pyqt5 = { version = "==5.15.2", markers = "platform_machine == 'x86_64'" } # no aarch64 wheels for macOS/linux From 6552d4ecb87211b91310ca5d7a7bcb918df36021 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Thu, 13 Jun 2024 14:46:19 -0700 Subject: [PATCH 036/168] Move zstd to normal deps (#32741) move zstd --- poetry.lock | 2 +- pyproject.toml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index 16fb764d57..2467d6be2d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8110,4 +8110,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "51f233c6af3795be4fd3f54b7b462777bc65f547de0821c0de7ac0c3c056b0a6" +content-hash = "83dbbf76ea5f3e1022233a164d6f342706ebf64ad8bbbf742a55d5f49474d863" diff --git a/pyproject.toml b/pyproject.toml index e46f7d51a2..5353b39887 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -139,6 +139,9 @@ psutil = "*" timezonefinder = "*" # just used for nav ETA pycryptodome = "*" # used in updated/casync, panda, body, and a test +#logreader +zstd = "*" + [tool.poetry.group.docs.dependencies] Jinja2 = "*" sphinx = "*" @@ -162,9 +165,6 @@ pytest-mock = "*" pytest-repeat = "*" ruff = "*" -[tool.poetry.group.tools.dependencies] -zstd = "*" - [tool.poetry.group.dev.dependencies] av = "*" azure-identity = "*" From 3ede1e2a7c850622beef2549315f320aa018105a Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 13 Jun 2024 22:37:00 -0700 Subject: [PATCH 037/168] LogReader: improve error messages (#32747) * better error messages * clean up --- tools/lib/logreader.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 2430f1542c..737ef46152 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -166,7 +166,8 @@ def get_invalid_files(files): def check_source(source: Source, *args) -> LogPaths: files = source(*args) - assert next(get_invalid_files(files), False) is False + assert len(files) > 0, "No files on source" + assert not any(get_invalid_files(files)), f"Invalid files: {files}" return files @@ -175,7 +176,7 @@ def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: return comma_car_segments_source(sr, mode) SOURCES: list[Source] = [internal_source, openpilotci_source, comma_api_source, comma_car_segments_source,] - exceptions = [] + 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]: @@ -190,9 +191,10 @@ def auto_source(sr: SegmentRange, mode=ReadMode.RLOG) -> LogPaths: try: return check_source(source, sr, mode) except Exception as e: - exceptions.append(e) + exceptions[source.__name__] = e - raise Exception(f"auto_source could not find any valid source, exceptions for sources: {exceptions}") + raise Exception("auto_source could not find any valid source, exceptions for sources:\n - " + + "\n - ".join([f"{k}: {repr(v)}" for k, v in exceptions.items()])) def parse_useradmin(identifier: str): From a0bbc005b62f1e6183ce4fd167e78b4fedb06df0 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 13 Jun 2024 22:43:24 -0700 Subject: [PATCH 038/168] LogReader: support reading zst logs from Azure (#32745) * staging api * other stuff * ugh this should really not be duplicated, we already check the max segnum in Route class * better error message!! * more better * clean up * clean up * breaks again --- tools/lib/route.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/route.py b/tools/lib/route.py index d5fd41108b..5734d1c74a 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -9,7 +9,7 @@ from openpilot.tools.lib.auth_config import get_token from openpilot.tools.lib.api import CommaApi from openpilot.tools.lib.helpers import RE -QLOG_FILENAMES = ['qlog', 'qlog.bz2'] +QLOG_FILENAMES = ['qlog', 'qlog.bz2', 'qlog.zst'] QCAMERA_FILENAMES = ['qcamera.ts'] LOG_FILENAMES = ['rlog', 'rlog.bz2', 'raw_log.bz2'] CAMERA_FILENAMES = ['fcamera.hevc', 'video.hevc'] From d5ce4b308588f2bd4eee300110ddcd66e787a110 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Thu, 13 Jun 2024 23:19:32 -0700 Subject: [PATCH 039/168] SegmentRange: remove timestamp (#32750) * add deprecation warning * remove timestamp * Update logreader.py --- tools/lib/logreader.py | 2 +- tools/lib/route.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 737ef46152..0f7ae0dba1 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -135,7 +135,7 @@ def internal_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: raise InternalUnavailableException def get_internal_url(sr: SegmentRange, seg, file): - return f"cd:/{sr.dongle_id}/{sr.timestamp}/{seg}/{file}.bz2" + return f"cd:/{sr.dongle_id}/{sr.log_id}/{seg}/{file}.bz2" 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] diff --git a/tools/lib/route.py b/tools/lib/route.py index 5734d1c74a..6ff5d19208 100644 --- a/tools/lib/route.py +++ b/tools/lib/route.py @@ -260,10 +260,6 @@ class SegmentRange: def dongle_id(self) -> str: return self.m.group("dongle_id") - @property - def timestamp(self) -> str: - return self.m.group("timestamp") - @property def log_id(self) -> str: return self.m.group("log_id") From 38529c5057a6146768a71654a05e5c552695d805 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Fri, 14 Jun 2024 14:38:02 +0800 Subject: [PATCH 040/168] cabana: Fix visibility issue for a single data point in series (#32749) Fix visibility issue for a single data point in series --- 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 fcf171a858..c8537845b1 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -277,7 +277,7 @@ void ChartView::updateSeriesPoints() { } ((QScatterSeries *)s.series)->setMarkerSize(size); } else { - s.series->setPointsVisible(pixels_per_point > 20); + s.series->setPointsVisible(num_points == 1 || pixels_per_point > 20); } } } From bc303df6a0a4a9d52a2e92e5976b6c7aa5138b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Sch=C3=A4fer?= Date: Fri, 14 Jun 2024 00:08:58 -0700 Subject: [PATCH 041/168] long control: new API (#32706) * Simplify long control * Seperate * Rename * Try new api for toyota * rm v_pid everywhere * No speed in reset * 0 is better default * unassigned variable * Update other cars * Update gm * SIMPLIFY * simplify more * fix API boundry * Fix stopping bug * Small fixes * Update ref --- cereal/car.capnp | 4 +- cereal/log.capnp | 8 +- selfdrive/car/ford/interface.py | 4 - selfdrive/car/gm/interface.py | 12 +-- selfdrive/car/honda/interface.py | 8 +- selfdrive/car/hyundai/interface.py | 4 - selfdrive/car/interfaces.py | 6 +- selfdrive/car/subaru/interface.py | 5 -- selfdrive/car/tesla/interface.py | 5 -- selfdrive/car/tests/test_car_interfaces.py | 1 - selfdrive/car/toyota/interface.py | 21 ++--- selfdrive/car/volkswagen/interface.py | 2 - selfdrive/controls/controlsd.py | 6 +- selfdrive/controls/lib/drive_helpers.py | 10 --- selfdrive/controls/lib/longcontrol.py | 78 +++++-------------- .../controls/lib/longitudinal_planner.py | 33 +++++++- selfdrive/test/process_replay/ref_commit | 2 +- tools/replay/ui.py | 1 - 18 files changed, 74 insertions(+), 136 deletions(-) diff --git a/cereal/car.capnp b/cereal/car.capnp index 7f3f64c911..c17e1c063f 100644 --- a/cereal/car.capnp +++ b/cereal/car.capnp @@ -541,8 +541,8 @@ struct CarParams { kiBP @2 :List(Float32); kiV @3 :List(Float32); kf @6 :Float32; - deadzoneBP @4 :List(Float32); - deadzoneV @5 :List(Float32); + deadzoneBPDEPRECATED @4 :List(Float32); + deadzoneVDEPRECATED @5 :List(Float32); } struct LateralINDITuning { diff --git a/cereal/log.capnp b/cereal/log.capnp index 67c6f836a4..3c720d4526 100644 --- a/cereal/log.capnp +++ b/cereal/log.capnp @@ -698,7 +698,6 @@ struct ControlsState @0x97ff69c53601abf1 { personality @66 :LongitudinalPersonality; longControlState @30 :Car.CarControl.Actuators.LongControlState; - vPid @2 :Float32; vTargetLead @3 :Float32; vCruise @22 :Float32; # actual set speed vCruiseCluster @63 :Float32; # set speed to display in the UI @@ -866,6 +865,7 @@ struct ControlsState @0x97ff69c53601abf1 { canMonoTimesDEPRECATED @21 :List(UInt64); desiredCurvatureRateDEPRECATED @62 :Float32; canErrorCounterDEPRECATED @57 :UInt32; + vPidDEPRECATED @2 :Float32; } # All SI units and in device frame @@ -1060,6 +1060,11 @@ struct LongitudinalPlan @0xe00b5b3eba12876c { accels @32 :List(Float32); speeds @33 :List(Float32); jerks @34 :List(Float32); + aTarget @18 :Float32; + shouldStop @37: Bool; + allowThrottle @38: Bool; + allowBrake @39: Bool; + solverExecutionTime @35 :Float32; @@ -1076,7 +1081,6 @@ struct LongitudinalPlan @0xe00b5b3eba12876c { aCruiseDEPRECATED @17 :Float32; vTargetDEPRECATED @3 :Float32; vTargetFutureDEPRECATED @14 :Float32; - aTargetDEPRECATED @18 :Float32; vStartDEPRECATED @26 :Float32; aStartDEPRECATED @27 :Float32; vMaxDEPRECATED @20 :Float32; diff --git a/selfdrive/car/ford/interface.py b/selfdrive/car/ford/interface.py index 2ef5d427e6..54cf865109 100644 --- a/selfdrive/car/ford/interface.py +++ b/selfdrive/car/ford/interface.py @@ -22,10 +22,6 @@ class CarInterface(CarInterfaceBase): ret.steerActuatorDelay = 0.2 ret.steerLimitTimer = 1.0 - ret.longitudinalTuning.kpBP = [0.] - ret.longitudinalTuning.kpV = [0.5] - ret.longitudinalTuning.kiV = [0.] - CAN = CanBus(fingerprint=fingerprint) cfgs = [get_safety_config(car.CarParams.SafetyModel.ford)] if CAN.main >= 4: diff --git a/selfdrive/car/gm/interface.py b/selfdrive/car/gm/interface.py index 2e194b12f2..5ea2b19891 100755 --- a/selfdrive/car/gm/interface.py +++ b/selfdrive/car/gm/interface.py @@ -94,11 +94,7 @@ class CarInterface(CarInterfaceBase): else: ret.transmissionType = TransmissionType.automatic - ret.longitudinalTuning.deadzoneBP = [0.] - ret.longitudinalTuning.deadzoneV = [0.15] - - ret.longitudinalTuning.kpBP = [5., 35.] - ret.longitudinalTuning.kiBP = [0.] + ret.longitudinalTuning.kiBP = [5., 35.] if candidate in CAMERA_ACC_CAR: ret.experimentalLongitudinalAvailable = True @@ -110,8 +106,7 @@ class CarInterface(CarInterfaceBase): ret.minSteerSpeed = 10 * CV.KPH_TO_MS # Tuning for experimental long - ret.longitudinalTuning.kpV = [2.0, 1.5] - ret.longitudinalTuning.kiV = [0.72] + ret.longitudinalTuning.kiV = [2.0, 1.5] ret.stoppingDecelRate = 2.0 # reach brake quickly after enabling ret.vEgoStopping = 0.25 ret.vEgoStarting = 0.25 @@ -131,8 +126,7 @@ class CarInterface(CarInterfaceBase): ret.minSteerSpeed = 7 * CV.MPH_TO_MS # Tuning - ret.longitudinalTuning.kpV = [2.4, 1.5] - ret.longitudinalTuning.kiV = [0.36] + ret.longitudinalTuning.kiV = [2.4, 1.5] # 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 diff --git a/selfdrive/car/honda/interface.py b/selfdrive/car/honda/interface.py index 43a4454b90..fdcba8bb81 100755 --- a/selfdrive/car/honda/interface.py +++ b/selfdrive/car/honda/interface.py @@ -72,17 +72,13 @@ class CarInterface(CarInterfaceBase): ret.lateralTuning.pid.kf = 0.00006 # conservative feed-forward if candidate in HONDA_BOSCH: - ret.longitudinalTuning.kpV = [0.25] - ret.longitudinalTuning.kiV = [0.05] ret.longitudinalActuatorDelay = 0.5 # s if candidate in HONDA_BOSCH_RADARLESS: ret.stopAccel = CarControllerParams.BOSCH_ACCEL_MIN # stock uses -4.0 m/s^2 once stopped but limited by safety model else: # default longitudinal tuning for all hondas - ret.longitudinalTuning.kpBP = [0., 5., 35.] - ret.longitudinalTuning.kpV = [1.2, 0.8, 0.5] - ret.longitudinalTuning.kiBP = [0., 35.] - ret.longitudinalTuning.kiV = [0.18, 0.12] + ret.longitudinalTuning.kiBP = [0., 5., 35.] + ret.longitudinalTuning.kiV = [1.2, 0.8, 0.5] eps_modified = False for fw in car_fw: diff --git a/selfdrive/car/hyundai/interface.py b/selfdrive/car/hyundai/interface.py index 0ba4dcb5e3..ecedf3fd7c 100644 --- a/selfdrive/car/hyundai/interface.py +++ b/selfdrive/car/hyundai/interface.py @@ -80,12 +80,8 @@ class CarInterface(CarInterfaceBase): # *** longitudinal control *** if candidate in CANFD_CAR: - ret.longitudinalTuning.kpV = [0.1] - ret.longitudinalTuning.kiV = [0.0] ret.experimentalLongitudinalAvailable = candidate not in (CANFD_UNSUPPORTED_LONGITUDINAL_CAR | CANFD_RADAR_SCC_CAR) else: - ret.longitudinalTuning.kpV = [0.5] - ret.longitudinalTuning.kiV = [0.0] ret.experimentalLongitudinalAvailable = candidate not in (UNSUPPORTED_LONGITUDINAL_CAR | CAMERA_SCC_CAR) ret.openpilotLongitudinalControl = experimental_long and ret.experimentalLongitudinalAvailable ret.pcmCruise = not ret.openpilotLongitudinalControl diff --git a/selfdrive/car/interfaces.py b/selfdrive/car/interfaces.py index 5eac6062aa..e5762ed52a 100644 --- a/selfdrive/car/interfaces.py +++ b/selfdrive/car/interfaces.py @@ -202,13 +202,11 @@ class CarInterfaceBase(ABC): ret.vEgoStopping = 0.5 ret.vEgoStarting = 0.5 ret.stoppingControl = True - ret.longitudinalTuning.deadzoneBP = [0.] - ret.longitudinalTuning.deadzoneV = [0.] ret.longitudinalTuning.kf = 1. ret.longitudinalTuning.kpBP = [0.] - ret.longitudinalTuning.kpV = [1.] + ret.longitudinalTuning.kpV = [0.] ret.longitudinalTuning.kiBP = [0.] - ret.longitudinalTuning.kiV = [1.] + ret.longitudinalTuning.kiV = [0.] # TODO estimate car specific lag, use .15s for now ret.longitudinalActuatorDelay = 0.15 ret.steerLimitTimer = 1.0 diff --git a/selfdrive/car/subaru/interface.py b/selfdrive/car/subaru/interface.py index 1aa4bd95ea..cb00934376 100644 --- a/selfdrive/car/subaru/interface.py +++ b/selfdrive/car/subaru/interface.py @@ -91,11 +91,6 @@ class CarInterface(CarInterfaceBase): ret.flags |= SubaruFlags.DISABLE_EYESIGHT.value if ret.openpilotLongitudinalControl: - ret.longitudinalTuning.kpBP = [0., 5., 35.] - ret.longitudinalTuning.kpV = [0.8, 1.0, 1.5] - ret.longitudinalTuning.kiBP = [0., 35.] - ret.longitudinalTuning.kiV = [0.54, 0.36] - ret.stoppingControl = True ret.safetyConfigs[0].safetyParam |= Panda.FLAG_SUBARU_LONG diff --git a/selfdrive/car/tesla/interface.py b/selfdrive/car/tesla/interface.py index 09de10b54d..deb0e00230 100755 --- a/selfdrive/car/tesla/interface.py +++ b/selfdrive/car/tesla/interface.py @@ -18,11 +18,6 @@ class CarInterface(CarInterfaceBase): ret.steerControlType = car.CarParams.SteerControlType.angle - # Set kP and kI to 0 over the whole speed range to have the planner accel as actuator command - ret.longitudinalTuning.kpBP = [0] - ret.longitudinalTuning.kpV = [0] - ret.longitudinalTuning.kiBP = [0] - ret.longitudinalTuning.kiV = [0] ret.longitudinalActuatorDelay = 0.5 # s ret.radarTimeStep = (1.0 / 8) # 8Hz diff --git a/selfdrive/car/tests/test_car_interfaces.py b/selfdrive/car/tests/test_car_interfaces.py index 19096c23e5..a6f74d685f 100644 --- a/selfdrive/car/tests/test_car_interfaces.py +++ b/selfdrive/car/tests/test_car_interfaces.py @@ -75,7 +75,6 @@ class TestCarInterfaces: # Longitudinal sanity checks assert len(car_params.longitudinalTuning.kpV) == len(car_params.longitudinalTuning.kpBP) assert len(car_params.longitudinalTuning.kiV) == len(car_params.longitudinalTuning.kiBP) - assert len(car_params.longitudinalTuning.deadzoneV) == len(car_params.longitudinalTuning.deadzoneBP) # Lateral sanity checks if car_params.steerControlType != car.CarParams.SteerControlType.angle: diff --git a/selfdrive/car/toyota/interface.py b/selfdrive/car/toyota/interface.py index 3ea05f9fef..98f63597ec 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -142,22 +142,15 @@ class CarInterface(CarInterfaceBase): 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: - tune.kpBP = [0., 5., 20.] - tune.kpV = [1.3, 1.0, 0.7] - tune.kiBP = [0., 5., 12., 20., 27.] - tune.kiV = [.35, .23, .20, .17, .1] - if candidate in TSS2_CAR: - ret.vEgoStopping = 0.25 - ret.vEgoStarting = 0.25 - ret.stoppingDecelRate = 0.3 # reach stopping target smoothly + tune.kpV = [0.0] + tune.kiV = [0.5] + ret.vEgoStopping = 0.25 + ret.vEgoStarting = 0.25 + ret.stoppingDecelRate = 0.3 # reach stopping target smoothly else: - tune.kpBP = [0., 5., 35.] - tune.kiBP = [0., 35.] - tune.kpV = [3.6, 2.4, 1.5] - tune.kiV = [0.54, 0.36] + tune.kiBP = [0., 5., 35.] + tune.kiV = [3.6, 2.4, 1.5] return ret diff --git a/selfdrive/car/volkswagen/interface.py b/selfdrive/car/volkswagen/interface.py index 91cd300e92..77e56875bf 100644 --- a/selfdrive/car/volkswagen/interface.py +++ b/selfdrive/car/volkswagen/interface.py @@ -96,8 +96,6 @@ class CarInterface(CarInterfaceBase): ret.stopAccel = -0.55 ret.vEgoStarting = 0.1 ret.vEgoStopping = 0.5 - ret.longitudinalTuning.kpV = [0.1] - ret.longitudinalTuning.kiV = [0.0] ret.autoResumeSng = ret.minEnableSpeed == -1 return ret diff --git a/selfdrive/controls/controlsd.py b/selfdrive/controls/controlsd.py index aeeb3489b5..f147766c91 100755 --- a/selfdrive/controls/controlsd.py +++ b/selfdrive/controls/controlsd.py @@ -563,13 +563,12 @@ class Controls: if not CC.latActive: self.LaC.reset() if not CC.longActive: - self.LoC.reset(v_pid=CS.vEgo) + self.LoC.reset() 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.recv_frame['longitudinalPlan']) * DT_CTRL - actuators.accel = self.LoC.update(CC.longActive, CS, long_plan, pid_accel_limits, t_since_plan) + actuators.accel = self.LoC.update(CC.longActive, CS, long_plan.aTarget, long_plan.shouldStop, pid_accel_limits) # Steering PID loop and lateral MPC self.desired_curvature = clip_curvature(CS.vEgo, self.desired_curvature, model_v2.action.desiredCurvature) @@ -752,7 +751,6 @@ class Controls: controlsState.state = self.state controlsState.engageable = not self.events.contains(ET.NO_ENTRY) controlsState.longControlState = self.LoC.long_control_state - controlsState.vPid = float(self.LoC.v_pid) controlsState.vCruise = float(self.v_cruise_helper.v_cruise_kph) controlsState.vCruiseCluster = float(self.v_cruise_helper.v_cruise_cluster_kph) controlsState.upAccelCmd = float(self.LoC.pid.p) diff --git a/selfdrive/controls/lib/drive_helpers.py b/selfdrive/controls/lib/drive_helpers.py index 6a5b22f686..cfc6374a1d 100644 --- a/selfdrive/controls/lib/drive_helpers.py +++ b/selfdrive/controls/lib/drive_helpers.py @@ -141,16 +141,6 @@ class VCruiseHelper: self.v_cruise_cluster_kph = self.v_cruise_kph -def apply_deadzone(error, deadzone): - if error > deadzone: - error -= deadzone - elif error < - deadzone: - error += deadzone - else: - error = 0. - return error - - def apply_center_deadzone(error, deadzone): if (error > - deadzone) and (error < deadzone): error = 0. diff --git a/selfdrive/controls/lib/longcontrol.py b/selfdrive/controls/lib/longcontrol.py index a619c47634..e4841c705f 100644 --- a/selfdrive/controls/lib/longcontrol.py +++ b/selfdrive/controls/lib/longcontrol.py @@ -1,7 +1,7 @@ from cereal import car -from openpilot.common.numpy_fast import clip, interp +from openpilot.common.numpy_fast import clip from openpilot.common.realtime import DT_CTRL -from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N, apply_deadzone +from openpilot.selfdrive.controls.lib.drive_helpers import CONTROL_N from openpilot.selfdrive.controls.lib.pid import PIDController from openpilot.selfdrive.modeld.constants import ModelConstants @@ -10,18 +10,10 @@ CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] 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): - accelerating = v_target_1sec > v_target - planned_stop = (v_target < CP.vEgoStopping and - v_target_1sec < CP.vEgoStopping and - not accelerating) - stay_stopped = (v_ego < CP.vEgoStopping and - (brake_pressed or cruise_standstill)) - stopping_condition = planned_stop or stay_stopped - - starting_condition = (v_target_1sec > CP.vEgoStarting and - accelerating and +def long_control_state_trans(CP, active, long_control_state, v_ego, + should_stop, brake_pressed, cruise_standstill): + stopping_condition = should_stop + starting_condition = (not should_stop and not cruise_standstill and not brake_pressed) started_condition = v_ego > CP.vEgoStarting @@ -34,7 +26,6 @@ def long_control_state_trans(CP, active, long_control_state, v_ego, v_target, long_control_state = LongCtrlState.pid if stopping_condition: long_control_state = LongCtrlState.stopping - elif long_control_state == LongCtrlState.stopping: if starting_condition and CP.startingState: long_control_state = LongCtrlState.starting @@ -49,78 +40,45 @@ def long_control_state_trans(CP, active, long_control_state, v_ego, v_target, return long_control_state - class LongControl: def __init__(self, CP): self.CP = CP - self.long_control_state = LongCtrlState.off # initialized to off + self.long_control_state = LongCtrlState.off self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV), (CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV), k_f=CP.longitudinalTuning.kf, rate=1 / DT_CTRL) - self.v_pid = 0.0 self.last_output_accel = 0.0 - def reset(self, v_pid): - """Reset PID controller and change setpoint""" + def reset(self): self.pid.reset() - self.v_pid = v_pid - def update(self, active, CS, long_plan, accel_limits, t_since_plan): + def update(self, active, CS, a_target, should_stop, accel_limits): """Update longitudinal control. This updates the state machine and runs a PID loop""" - # Interp control trajectory - speeds = long_plan.speeds - if len(speeds) == CONTROL_N: - v_target_now = interp(t_since_plan, CONTROL_N_T_IDX, speeds) - a_target_now = interp(t_since_plan, CONTROL_N_T_IDX, long_plan.accels) - - v_target = interp(self.CP.longitudinalActuatorDelay + t_since_plan, CONTROL_N_T_IDX, speeds) - a_target = 2 * (v_target - v_target_now) / self.CP.longitudinalActuatorDelay - a_target_now - - v_target_1sec = interp(self.CP.longitudinalActuatorDelay + t_since_plan + 1.0, CONTROL_N_T_IDX, speeds) - else: - v_target = 0.0 - v_target_now = 0.0 - v_target_1sec = 0.0 - a_target = 0.0 - self.pid.neg_limit = accel_limits[0] self.pid.pos_limit = accel_limits[1] - output_accel = self.last_output_accel self.long_control_state = long_control_state_trans(self.CP, active, self.long_control_state, CS.vEgo, - v_target, v_target_1sec, CS.brakePressed, + should_stop, CS.brakePressed, CS.cruiseState.standstill) - if self.long_control_state == LongCtrlState.off: - self.reset(CS.vEgo) + self.reset() output_accel = 0. elif self.long_control_state == LongCtrlState.stopping: + output_accel = self.last_output_accel if output_accel > self.CP.stopAccel: output_accel = min(output_accel, 0.0) output_accel -= self.CP.stoppingDecelRate * DT_CTRL - self.reset(CS.vEgo) + self.reset() elif self.long_control_state == LongCtrlState.starting: output_accel = self.CP.startAccel - self.reset(CS.vEgo) + self.reset() - elif self.long_control_state == LongCtrlState.pid: - self.v_pid = v_target_now - - # Toyota starts braking more when it thinks you want to stop - # Freeze the integrator so we don't accelerate to compensate, and don't allow positive acceleration - # TODO too complex, needs to be simplified and tested on toyotas - prevent_overshoot = not self.CP.stoppingControl and CS.vEgo < 1.5 and v_target_1sec < 0.7 and v_target_1sec < self.v_pid - deadzone = interp(CS.vEgo, self.CP.longitudinalTuning.deadzoneBP, self.CP.longitudinalTuning.deadzoneV) - freeze_integrator = prevent_overshoot - - error = self.v_pid - CS.vEgo - error_deadzone = apply_deadzone(error, deadzone) - output_accel = self.pid.update(error_deadzone, speed=CS.vEgo, - feedforward=a_target, - freeze_integrator=freeze_integrator) + else: # LongCtrlState.pid + error = a_target - CS.aEgo + output_accel = self.pid.update(error, speed=CS.vEgo, + feedforward=a_target) self.last_output_accel = clip(output_accel, accel_limits[0], accel_limits[1]) - return self.last_output_accel diff --git a/selfdrive/controls/lib/longitudinal_planner.py b/selfdrive/controls/lib/longitudinal_planner.py index ff5f901b52..8772fadb47 100755 --- a/selfdrive/controls/lib/longitudinal_planner.py +++ b/selfdrive/controls/lib/longitudinal_planner.py @@ -19,6 +19,7 @@ LON_MPC_STEP = 0.2 # first step is 0.2s A_CRUISE_MIN = -1.2 A_CRUISE_MAX_VALS = [1.6, 1.2, 0.8, 0.6] A_CRUISE_MAX_BP = [0., 10.0, 25., 40.] +CONTROL_N_T_IDX = ModelConstants.T_IDXS[:CONTROL_N] # Lookup table for turns _A_TOTAL_MAX_V = [1.7, 3.2] @@ -34,7 +35,6 @@ def limit_accel_in_turns(v_ego, angle_steers, a_target, CP): This function returns a limited long acceleration allowed, depending on the existing lateral acceleration this should avoid accelerating when losing the target in turns """ - # FIXME: This function to calculate lateral accel is incorrect and should use the VehicleModel # The lookup table for turns should also be updated if we do this a_total_max = interp(v_ego, _A_TOTAL_MAX_BP, _A_TOTAL_MAX_V) @@ -44,6 +44,26 @@ def limit_accel_in_turns(v_ego, angle_steers, a_target, CP): return [a_target[0], min(a_target[1], a_x_allowed)] +def get_accel_from_plan(CP, long_plan): + speeds = long_plan.speeds + if len(speeds) == CONTROL_N: + v_target_now = interp(DT_MDL, CONTROL_N_T_IDX, speeds) + a_target_now = interp(DT_MDL, CONTROL_N_T_IDX, long_plan.accels) + + v_target = interp(CP.longitudinalActuatorDelay + DT_MDL, CONTROL_N_T_IDX, speeds) + a_target = 2 * (v_target - v_target_now) / CP.longitudinalActuatorDelay - a_target_now + + v_target_1sec = interp(CP.longitudinalActuatorDelay + DT_MDL + 1.0, CONTROL_N_T_IDX, speeds) + else: + v_target = 0.0 + v_target_now = 0.0 + v_target_1sec = 0.0 + a_target = 0.0 + should_stop = (v_target < CP.vEgoStopping and + v_target_1sec < CP.vEgoStopping) + return a_target, should_stop + + class LongitudinalPlanner: def __init__(self, CP, init_v=0.0, init_a=0.0, dt=DT_MDL): self.CP = CP @@ -142,9 +162,14 @@ class LongitudinalPlanner: plan_send.valid = sm.all_checks(service_list=['carState', 'controlsState']) + longitudinalPlan = plan_send.longitudinalPlan longitudinalPlan.modelMonoTime = sm.logMonoTime['modelV2'] longitudinalPlan.processingDelay = (plan_send.logMonoTime / 1e9) - sm.logMonoTime['modelV2'] + longitudinalPlan.solverExecutionTime = self.mpc.solve_time + + longitudinalPlan.allowBrake = True + longitudinalPlan.allowThrottle = True longitudinalPlan.speeds = self.v_desired_trajectory.tolist() longitudinalPlan.accels = self.a_desired_trajectory.tolist() @@ -154,6 +179,10 @@ class LongitudinalPlanner: longitudinalPlan.longitudinalPlanSource = self.mpc.source longitudinalPlan.fcw = self.fcw - longitudinalPlan.solverExecutionTime = self.mpc.solve_time + a_target, should_stop = get_accel_from_plan(self.CP, longitudinalPlan) + longitudinalPlan.aTarget = a_target + longitudinalPlan.shouldStop = should_stop + longitudinalPlan.allowBrake = True + longitudinalPlan.allowThrottle = True pm.send('longitudinalPlan', plan_send) diff --git a/selfdrive/test/process_replay/ref_commit b/selfdrive/test/process_replay/ref_commit index 227202839f..96161a42de 100644 --- a/selfdrive/test/process_replay/ref_commit +++ b/selfdrive/test/process_replay/ref_commit @@ -1 +1 @@ -6438bd5edad674c2de3c7e2d126271cb2576383d +8737e368e17f859291164286feb4246e00c0b4a5 diff --git a/tools/replay/ui.py b/tools/replay/ui.py index a790f14ff0..b1fe70ef3c 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -158,7 +158,6 @@ def ui_thread(addr): # TODO brake is deprecated plot_arr[-1, name_to_arr_idx['computer_brake']] = clip(-sm['carControl'].actuators.accel/4.0, 0.0, 1.0) plot_arr[-1, name_to_arr_idx['v_ego']] = sm['carState'].vEgo - plot_arr[-1, name_to_arr_idx['v_pid']] = sm['controlsState'].vPid plot_arr[-1, name_to_arr_idx['v_cruise']] = sm['carState'].cruiseState.speed plot_arr[-1, name_to_arr_idx['a_ego']] = sm['carState'].aEgo From 68e22faa296d335f2d497c52339f536f761602c3 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 14 Jun 2024 00:29:59 -0700 Subject: [PATCH 042/168] LogReader: revert broken check it returns files OR None --- tools/lib/logreader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index 0f7ae0dba1..e524a152fb 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -167,7 +167,7 @@ def get_invalid_files(files): def check_source(source: Source, *args) -> LogPaths: files = source(*args) assert len(files) > 0, "No files on source" - assert not any(get_invalid_files(files)), f"Invalid files: {files}" + assert next(get_invalid_files(files), False) is False, "Some files are invalid" return files From b45caf403366ed4161516e49b9e433805d9de6c4 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Fri, 14 Jun 2024 01:12:19 -0700 Subject: [PATCH 043/168] LogReader: try zst on internal source (#32751) * internal source list files like azure api * messy but works * no limit * simpler * clean up * clean up * clean up * that's obvious * better * we need to unfortunately return a url, so best to take a naive approach for now * todo * fix * clean up --- tools/lib/logreader.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tools/lib/logreader.py b/tools/lib/logreader.py index e524a152fb..98c10941bb 100755 --- a/tools/lib/logreader.py +++ b/tools/lib/logreader.py @@ -130,12 +130,12 @@ def comma_api_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: return apply_strategy(mode, rlog_paths, qlog_paths, valid_file=valid_file) -def internal_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: +def internal_source(sr: SegmentRange, mode: ReadMode, file_ext: str = "bz2") -> LogPaths: if not internal_source_available(): raise InternalUnavailableException def get_internal_url(sr: SegmentRange, seg, file): - return f"cd:/{sr.dongle_id}/{sr.log_id}/{seg}/{file}.bz2" + return f"cd:/{sr.dongle_id}/{sr.log_id}/{seg}/{file}.{file_ext}" 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] @@ -143,6 +143,10 @@ def internal_source(sr: SegmentRange, mode: ReadMode) -> LogPaths: return apply_strategy(mode, rlog_paths, qlog_paths) +def internal_source_zst(sr: SegmentRange, mode: ReadMode, file_ext: str = "zst") -> LogPaths: + return internal_source(sr, mode, file_ext) + + 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] @@ -175,7 +179,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, internal_source_zst, 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 From 02ed9c584c7d04d53d3c0f0955e95ab2a58de5de Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Sun, 16 Jun 2024 12:20:15 -0700 Subject: [PATCH 044/168] sim: remove docker script --- tools/sim/start_openpilot_docker.sh | 37 ----------------------------- 1 file changed, 37 deletions(-) delete mode 100755 tools/sim/start_openpilot_docker.sh diff --git a/tools/sim/start_openpilot_docker.sh b/tools/sim/start_openpilot_docker.sh deleted file mode 100755 index 3dce660579..0000000000 --- a/tools/sim/start_openpilot_docker.sh +++ /dev/null @@ -1,37 +0,0 @@ -#!/bin/bash - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" -cd $DIR - -OPENPILOT_DIR="/tmp/openpilot" -if ! [[ -z "$MOUNT_OPENPILOT" ]]; then - OPENPILOT_DIR="$(dirname $(dirname $DIR))" - EXTRA_ARGS="-v $OPENPILOT_DIR:$OPENPILOT_DIR -e PYTHONPATH=$OPENPILOT_DIR:$PYTHONPATH" -fi - -if [[ "$CI" ]]; then - CMD="CI=1 ${OPENPILOT_DIR}/tools/sim/tests/test_metadrive_integration.py" -else - # expose X to the container - xhost +local:root - - docker pull ghcr.io/commaai/openpilot-sim:latest - CMD="./tmux_script.sh $*" - EXTRA_ARGS="${EXTRA_ARGS} -it" -fi - -docker kill openpilot_client || true -docker run --net=host\ - --name openpilot_client \ - --rm \ - --gpus all \ - --device=/dev/dri:/dev/dri \ - --device=/dev/input:/dev/input \ - -v /tmp/.X11-unix:/tmp/.X11-unix \ - --shm-size 1G \ - -e DISPLAY=$DISPLAY \ - -e QT_X11_NO_MITSHM=1 \ - -w "$OPENPILOT_DIR/tools/sim" \ - $EXTRA_ARGS \ - ghcr.io/commaai/openpilot-sim:latest \ - /bin/bash -c "$CMD" From 865b98a5c45335dcdf736ab38e89b5a1dcde2d59 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 17 Jun 2024 03:32:45 +0800 Subject: [PATCH 045/168] cabana: avoid dead locks and improve responsiveness (#32740) avoid dead locks and improve responsive --- tools/cabana/chart/chart.cc | 2 +- tools/cabana/chart/chartswidget.cc | 24 ++++--- tools/cabana/chart/chartswidget.h | 16 ++--- tools/cabana/mainwin.cc | 1 - tools/cabana/streams/abstractstream.cc | 22 ++++++- tools/cabana/streams/abstractstream.h | 8 ++- tools/cabana/streams/replaystream.cc | 7 +- tools/cabana/streams/replaystream.h | 3 - tools/cabana/videowidget.cc | 23 ++++--- tools/cabana/videowidget.h | 8 +-- tools/replay/camera.cc | 1 - tools/replay/logreader.cc | 6 +- tools/replay/replay.cc | 88 +++++++++++++++----------- tools/replay/replay.h | 11 ++-- tools/replay/util.cc | 36 ++++------- tools/replay/util.h | 2 +- 16 files changed, 135 insertions(+), 123 deletions(-) diff --git a/tools/cabana/chart/chart.cc b/tools/cabana/chart/chart.cc index c8537845b1..7a056c7674 100644 --- a/tools/cabana/chart/chart.cc +++ b/tools/cabana/chart/chart.cc @@ -513,7 +513,7 @@ void ChartView::mouseReleaseEvent(QMouseEvent *event) { // no rubber dragged, seek to mouse position can->seekTo(min); } else if (rubber->width() > 10 && (max - min) > MIN_ZOOM_SECONDS) { - charts_widget->zoom_undo_stack->push(new ZoomCommand(charts_widget, {min, max})); + charts_widget->zoom_undo_stack->push(new ZoomCommand({min, max})); } else { viewport()->update(); } diff --git a/tools/cabana/chart/chartswidget.cc b/tools/cabana/chart/chartswidget.cc index a7bdd74646..59c188afbc 100644 --- a/tools/cabana/chart/chartswidget.cc +++ b/tools/cabana/chart/chartswidget.cc @@ -103,6 +103,8 @@ ChartsWidget::ChartsWidget(QWidget *parent) : QFrame(parent) { QObject::connect(dbc(), &DBCManager::DBCFileChanged, this, &ChartsWidget::removeAll); QObject::connect(can, &AbstractStream::eventsMerged, this, &ChartsWidget::eventsMerged); QObject::connect(can, &AbstractStream::msgsReceived, this, &ChartsWidget::updateState); + QObject::connect(can, &AbstractStream::seeking, this, &ChartsWidget::updateState); + QObject::connect(can, &AbstractStream::timeRangeChanged, this, &ChartsWidget::timeRangeChanged); QObject::connect(range_slider, &QSlider::valueChanged, this, &ChartsWidget::setMaxChartRange); QObject::connect(new_plot_btn, &QToolButton::clicked, this, &ChartsWidget::newChart); QObject::connect(remove_all_btn, &QToolButton::clicked, this, &ChartsWidget::removeAll); @@ -159,16 +161,13 @@ void ChartsWidget::eventsMerged(const MessageEventsMap &new_events) { } } -void ChartsWidget::setZoom(double min, double max) { - zoomed_range = {min, max}; - is_zoomed = zoomed_range != display_range; +void ChartsWidget::timeRangeChanged(const std::optional> &time_range) { updateToolBar(); updateState(); - emit rangeChanged(min, max, is_zoomed); } void ChartsWidget::zoomReset() { - setZoom(display_range.first, display_range.second); + can->setTimeRange(std::nullopt); zoom_undo_stack->clear(); } @@ -186,8 +185,9 @@ void ChartsWidget::showValueTip(double sec) { void ChartsWidget::updateState() { if (charts.isEmpty()) return; + const auto &time_range = can->timeRange(); const double cur_sec = can->currentSec(); - if (!is_zoomed) { + if (!time_range.has_value()) { double pos = (cur_sec - display_range.first) / std::max(1.0, max_chart_range); if (pos < 0 || pos > 0.8) { display_range.first = std::max(0.0, cur_sec - max_chart_range * 0.1); @@ -195,13 +195,9 @@ void ChartsWidget::updateState() { double max_sec = std::min(display_range.first + max_chart_range, can->totalSeconds()); display_range.first = std::max(0.0, max_sec - max_chart_range); 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 - QTimer::singleShot(0, [ts = zoomed_range.first]() { can->seekTo(ts);}); - return; } - const auto &range = is_zoomed ? zoomed_range : display_range; + const auto &range = time_range ? *time_range : display_range; for (auto c : charts) { c->updatePlot(cur_sec, range.first, range.second); } @@ -217,12 +213,14 @@ void ChartsWidget::updateToolBar() { title_label->setText(tr("Charts: %1").arg(charts.size())); columns_action->setText(tr("Column: %1").arg(column_count)); range_lb->setText(utils::formatSeconds(max_chart_range)); + + bool is_zoomed = can->timeRange().has_value(); range_lb_action->setVisible(!is_zoomed); range_slider_action->setVisible(!is_zoomed); undo_zoom_action->setVisible(is_zoomed); redo_zoom_action->setVisible(is_zoomed); reset_zoom_action->setVisible(is_zoomed); - reset_zoom_btn->setText(is_zoomed ? tr("%1-%2").arg(zoomed_range.first, 0, 'f', 2).arg(zoomed_range.second, 0, 'f', 2) : ""); + reset_zoom_btn->setText(is_zoomed ? tr("%1-%2").arg(can->timeRange()->first, 0, 'f', 2).arg(can->timeRange()->second, 0, 'f', 2) : ""); remove_all_btn->setEnabled(!charts.isEmpty()); dock_btn->setIcon(docking ? "arrow-up-right-square" : "arrow-down-left-square"); dock_btn->setToolTip(docking ? tr("Undock charts") : tr("Dock charts")); @@ -252,7 +250,7 @@ ChartView *ChartsWidget::findChart(const MessageId &id, const cabana::Signal *si } ChartView *ChartsWidget::createChart() { - auto chart = new ChartView(is_zoomed ? zoomed_range : display_range, this); + auto chart = new ChartView(can->timeRange().value_or(display_range), this); chart->setFixedHeight(settings.chart_height); chart->setMinimumWidth(CHART_MIN_WIDTH); chart->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); diff --git a/tools/cabana/chart/chartswidget.h b/tools/cabana/chart/chartswidget.h index a39b4d73a5..a9ac05db23 100644 --- a/tools/cabana/chart/chartswidget.h +++ b/tools/cabana/chart/chartswidget.h @@ -46,11 +46,10 @@ public: public slots: void setColumnCount(int n); void removeAll(); - void setZoom(double min, double max); + void timeRangeChanged(const std::optional> &time_range); signals: void dock(bool floating); - void rangeChanged(double min, double max, bool is_zommed); void seriesChanged(); private: @@ -102,9 +101,7 @@ private: ChartsContainer *charts_container; QScrollArea *charts_scroll; uint32_t max_chart_range = 0; - bool is_zoomed = false; std::pair display_range; - std::pair zoomed_range; QAction *columns_action; int column_count = 1; int current_column_count = 0; @@ -119,12 +116,11 @@ private: class ZoomCommand : public QUndoCommand { public: - ZoomCommand(ChartsWidget *charts, std::pair range) : charts(charts), range(range), QUndoCommand() { - prev_range = charts->is_zoomed ? charts->zoomed_range : charts->display_range; + ZoomCommand(std::pair range) : range(range), QUndoCommand() { + prev_range = can->timeRange(); setText(QObject::tr("Zoom to %1-%2").arg(range.first, 0, 'f', 2).arg(range.second, 0, 'f', 2)); } - void undo() override { charts->setZoom(prev_range.first, prev_range.second); } - void redo() override { charts->setZoom(range.first, range.second); } - ChartsWidget *charts; - std::pair prev_range, range; + void undo() override { can->setTimeRange(prev_range); } + void redo() override { can->setTimeRange(range); } + std::optional> prev_range, range; }; diff --git a/tools/cabana/mainwin.cc b/tools/cabana/mainwin.cc index e6c9b49ca1..d099fcec99 100644 --- a/tools/cabana/mainwin.cc +++ b/tools/cabana/mainwin.cc @@ -192,7 +192,6 @@ void MainWindow::createDockWidgets() { video_splitter = new QSplitter(Qt::Vertical, this); video_widget = new VideoWidget(this); video_splitter->addWidget(video_widget); - QObject::connect(charts_widget, &ChartsWidget::rangeChanged, video_widget, &VideoWidget::updateTimeRange); video_splitter->addWidget(charts_container); video_splitter->setStretchFactor(1, 1); diff --git a/tools/cabana/streams/abstractstream.cc b/tools/cabana/streams/abstractstream.cc index 2e6ca9662e..2584106ce4 100644 --- a/tools/cabana/streams/abstractstream.cc +++ b/tools/cabana/streams/abstractstream.cc @@ -92,13 +92,23 @@ void AbstractStream::updateLastMessages() { std::set msgs; { std::lock_guard lk(mutex_); + double max_sec = 0; for (const auto &id : new_msgs_) { const auto &can_data = messages_[id]; - current_sec_ = std::max(current_sec_, can_data.ts); + max_sec = std::max(max_sec, can_data.ts); last_msgs[id] = can_data; sources.insert(id.source); } - msgs = std::move(new_msgs_); + + if (!new_msgs_.empty()) { + msgs = std::move(new_msgs_); + current_sec_ = max_sec; + } + } + + if (time_range_ && (current_sec_ < time_range_->first || current_sec_ >= time_range_->second)) { + seekTo(time_range_->first); + return; } if (sources.size() != prev_src_size) { @@ -108,6 +118,14 @@ void AbstractStream::updateLastMessages() { emit msgsReceived(&msgs, prev_msg_size != last_msgs.size()); } +void AbstractStream::setTimeRange(const std::optional> &range) { + time_range_ = range; + if (time_range_ && (current_sec_ < time_range_->first || current_sec_ >= time_range_->second)) { + seekTo(time_range_->first); + } + emit timeRangeChanged(time_range_); +} + void AbstractStream::updateEvent(const MessageId &id, double sec, const uint8_t *data, uint8_t size) { std::lock_guard lk(mutex_); messages_[id].compute(id, data, size, sec, getSpeed(), masks_[id]); diff --git a/tools/cabana/streams/abstractstream.h b/tools/cabana/streams/abstractstream.h index cfd423b368..822dd03d84 100644 --- a/tools/cabana/streams/abstractstream.h +++ b/tools/cabana/streams/abstractstream.h @@ -3,8 +3,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -77,6 +79,8 @@ public: virtual double getSpeed() { return 1; } virtual bool isPaused() const { return false; } virtual void pause(bool pause) {} + void setTimeRange(const std::optional> &range); + const std::optional> &timeRange() const { return time_range_; } inline const std::unordered_map &lastMessages() const { return last_msgs; } inline const MessageEventsMap &eventsMap() const { return events_; } @@ -91,8 +95,9 @@ public: signals: void paused(); void resume(); - void seekingTo(double sec); + void seeking(double sec); void seekedTo(double sec); + void timeRangeChanged(const std::optional> &range); void streamStarted(); void eventsMerged(const MessageEventsMap &events_map); void msgsReceived(const std::set *new_msgs, bool has_new_ids); @@ -110,6 +115,7 @@ protected: std::vector all_events_; double current_sec_ = 0; + std::optional> time_range_; uint64_t lastest_event_ts = 0; private: diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index 5fda6b0487..5d4925a67a 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -53,9 +53,9 @@ bool ReplayStream::loadRoute(const QString &route, const QString &data_dir, uint {}, nullptr, replay_flags, data_dir, this)); replay->setSegmentCacheLimit(settings.max_cached_minutes); replay->installEventFilter(event_filter, this); + QObject::connect(replay.get(), &Replay::seeking, this, &AbstractStream::seeking); QObject::connect(replay.get(), &Replay::seekedTo, this, &AbstractStream::seekedTo); QObject::connect(replay.get(), &Replay::segmentsMerged, this, &ReplayStream::mergeSegments); - QObject::connect(replay.get(), &Replay::qLogLoaded, this, &ReplayStream::qLogLoaded, Qt::QueuedConnection); return replay->load(); } @@ -92,12 +92,7 @@ bool ReplayStream::eventFilter(const Event *event) { } 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); } diff --git a/tools/cabana/streams/replaystream.h b/tools/cabana/streams/replaystream.h index 049ccddafb..ced78680d1 100644 --- a/tools/cabana/streams/replaystream.h +++ b/tools/cabana/streams/replaystream.h @@ -34,9 +34,6 @@ public: void pause(bool pause) override; static AbstractOpenStreamWidget *widget(AbstractStream **stream); -signals: - void qLogLoaded(int segnum, std::shared_ptr qlog); - private: void mergeSegments(); std::unique_ptr replay = nullptr; diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index 7fca45c393..d2f78babc1 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -38,6 +38,8 @@ VideoWidget::VideoWidget(QWidget *parent) : QFrame(parent) { QObject::connect(can, &AbstractStream::paused, this, &VideoWidget::updatePlayBtnState); QObject::connect(can, &AbstractStream::resume, this, &VideoWidget::updatePlayBtnState); QObject::connect(can, &AbstractStream::msgsReceived, this, &VideoWidget::updateState); + QObject::connect(can, &AbstractStream::seeking, this, &VideoWidget::updateState); + QObject::connect(can, &AbstractStream::timeRangeChanged, this, &VideoWidget::timeRangeChanged); updatePlayBtnState(); setWhatsThis(tr(R"( @@ -150,14 +152,16 @@ 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, [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); QObject::connect(camera_tab, &QTabBar::currentChanged, [this](int index) { if (index != -1) cam_widget->setStreamType((VisionStreamType)camera_tab->tabData(index).toInt()); }); + + auto replay = static_cast(can)->getReplay(); + QObject::connect(replay, &Replay::qLogLoaded, slider, &Slider::parseQLog, Qt::QueuedConnection); + QObject::connect(replay, &Replay::totalSecondsUpdated, this, &VideoWidget::setMaximumTime, Qt::QueuedConnection); return w; } @@ -198,13 +202,13 @@ void VideoWidget::setMaximumTime(double sec) { slider->setTimeRange(0, sec); } -void VideoWidget::updateTimeRange(double min, double max, bool is_zoomed) { +void VideoWidget::timeRangeChanged(const std::optional> &time_range) { if (can->liveStreaming()) { - skip_to_end_btn->setEnabled(!is_zoomed); + skip_to_end_btn->setEnabled(!time_range.has_value()); return; } - is_zoomed ? slider->setTimeRange(min, max) - : slider->setTimeRange(0, maximum_time); + time_range ? slider->setTimeRange(time_range->first, time_range->second) + : slider->setTimeRange(0, maximum_time); } QString VideoWidget::formatTime(double sec, bool include_milliseconds) { @@ -255,12 +259,7 @@ void Slider::setTimeRange(double min, double max) { setRange(min * factor, max * factor); } -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()); - } - +void Slider::parseQLog(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) { diff --git a/tools/cabana/videowidget.h b/tools/cabana/videowidget.h index b2039e09a4..7bd55cbce4 100644 --- a/tools/cabana/videowidget.h +++ b/tools/cabana/videowidget.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -40,13 +41,10 @@ public: void setTimeRange(double min, double max); AlertInfo alertInfo(double sec); QPixmap thumbnail(double sec); - void parseQLog(int segnum, std::shared_ptr qlog); + void parseQLog(std::shared_ptr qlog); const double factor = 1000.0; -signals: - void updateMaximumTime(double); - private: void mousePressEvent(QMouseEvent *e) override; void mouseMoveEvent(QMouseEvent *e) override; @@ -63,11 +61,11 @@ class VideoWidget : public QFrame { public: VideoWidget(QWidget *parnet = nullptr); - void updateTimeRange(double min, double max, bool is_zommed); void setMaximumTime(double sec); protected: QString formatTime(double sec, bool include_milliseconds = false); + void timeRangeChanged(const std::optional> &time_range); void updateState(); void updatePlayBtnState(); QWidget *createCameraWidget(); diff --git a/tools/replay/camera.cc b/tools/replay/camera.cc index 9e711149c5..b6d4ddc3a2 100644 --- a/tools/replay/camera.cc +++ b/tools/replay/camera.cc @@ -60,7 +60,6 @@ void CameraServer::cameraThread(Camera &cam) { 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; int segment_id = eidx.getSegmentId(); uint32_t frame_id = eidx.getFrameId(); diff --git a/tools/replay/logreader.cc b/tools/replay/logreader.cc index 0f1638145f..9b726e067d 100644 --- a/tools/replay/logreader.cc +++ b/tools/replay/logreader.cc @@ -42,10 +42,10 @@ bool LogReader::load(const char *data, size_t size, std::atomic *abort) { 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; + if (idx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C) { + uint64_t sof = idx.getTimestampSof(); + events.emplace_back(which, sof ? sof : mono_time, event_data, idx.getSegmentNum()); } - events.emplace_back(which, mono_time, event_data, idx.getSegmentNum()); } } } catch (const kj::Exception &e) { diff --git a/tools/replay/replay.cc b/tools/replay/replay.cc index 8616437188..c5ad2aa548 100644 --- a/tools/replay/replay.cc +++ b/tools/replay/replay.cc @@ -55,11 +55,11 @@ void Replay::stop() { rInfo("shutdown: in progress..."); if (stream_thread_ != nullptr) { exit_ = true; - paused_ = true; + pauseStreamThread(); stream_cv_.notify_one(); stream_thread_->quit(); stream_thread_->wait(); - delete stream_thread_; + stream_thread_->deleteLater(); stream_thread_ = nullptr; } timeline_future.waitForFinished(); @@ -104,28 +104,40 @@ void Replay::updateEvents(const std::function &update_events_function) { void Replay::seekTo(double seconds, bool relative) { 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; + double target_time = relative ? seconds + currentSeconds() : seconds; + target_time = std::max(double(0.0), target_time); + int target_segment = (int)target_time / 60; if (segments_.count(target_segment) == 0) { - rWarning("can't seek to %d s segment %d is invalid", (int)seeking_to_seconds_, target_segment); + rWarning("Can't seek to %d s segment %d is invalid", (int)target_time, target_segment); return true; } - rInfo("seeking to %d s, segment %d", (int)seeking_to_seconds_, target_segment); + rInfo("Seeking to %d s, segment %d", (int)target_time, 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; + cur_mono_time_ = route_start_ts_ + target_time * 1e9; + seeking_to_ = target_time; + return false; }); + + checkSeekProgress(); updateSegmentsCache(); } +void Replay::checkSeekProgress() { + if (seeking_to_) { + auto it = segments_.find(int(*seeking_to_ / 60)); + if (it != segments_.end() && it->second && it->second->isLoaded()) { + emit seekedTo(*seeking_to_); + seeking_to_ = std::nullopt; + // wake up stream thread + updateEvents([]() { return true; }); + } else { + // Emit signal indicating the ongoing seek operation + emit seeking(*seeking_to_); + } + } +} + void Replay::seekToFlag(FindFlag flag) { if (auto next = find(flag)) { seekTo(*next - 2, false); // seek to 2 seconds before next @@ -150,8 +162,9 @@ void Replay::buildTimeline() { const auto &route_segments = route_->segments(); for (auto it = route_segments.cbegin(); it != route_segments.cend() && !exit_; ++it) { std::shared_ptr log(new LogReader()); - if (!log->load(it->second.qlog.toStdString(), &exit_, !hasFlag(REPLAY_FLAG_NO_FILE_CACHE), 0, 3)) continue; + if (!log->load(it->second.qlog.toStdString(), &exit_, !hasFlag(REPLAY_FLAG_NO_FILE_CACHE), 0, 3) || log->events.empty()) continue; + std::vector> timeline; for (const Event &e : log->events) { if (e.which == cereal::Event::Which::CONTROLS_STATE) { capnp::FlatArrayMessageReader reader(e.data); @@ -160,7 +173,6 @@ void Replay::buildTimeline() { if (engaged != cs.getEnabled()) { if (engaged) { - std::lock_guard lk(timeline_lock); timeline.push_back({toSeconds(engaged_begin), toSeconds(e.mono_time), TimelineType::Engaged}); } engaged_begin = e.mono_time; @@ -169,7 +181,6 @@ void Replay::buildTimeline() { 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]}); } alert_begin = e.mono_time; @@ -178,12 +189,20 @@ void Replay::buildTimeline() { alert_status = cs.getAlertStatus(); } } 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}); } } - std::sort(timeline.begin(), timeline.end(), [](auto &l, auto &r) { return std::get<2>(l) < std::get<2>(r); }); - emit qLogLoaded(it->first, log); + + { + std::lock_guard lk(timeline_lock); + timeline_.insert(timeline_.end(), timeline.begin(), timeline.end()); + std::sort(timeline_.begin(), timeline_.end(), [](auto &l, auto &r) { return std::get<2>(l) < std::get<2>(r); }); + } + + if (it->first == route_segments.rbegin()->first) { + emit totalSecondsUpdated(toSeconds(log->events.back().mono_time)); + } + emit qLogLoaded(log); } } @@ -260,14 +279,13 @@ void Replay::updateSegmentsCache() { const auto &cur_segment = cur->second; if (stream_thread_ == nullptr && cur_segment->isLoaded()) { startStream(cur_segment.get()); - emit streamStarted(); } } 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) { + auto loadNextSegment = [this](auto first, auto last) { + auto it = std::find_if(first, last, [](const auto &seg_it) { return !seg_it.second || !seg_it.second->isLoaded(); }); + if (it != last && !it->second) { rDebug("loading segment %d...", it->first); it->second = std::make_unique(it->first, route_->at(it->first), flags_, filters_); QObject::connect(it->second.get(), &Segment::loadFinished, this, &Replay::segmentLoadFinished); @@ -276,9 +294,9 @@ void Replay::loadSegmentInRange(SegmentMap::iterator begin, SegmentMap::iterator return false; }; - // Load forward segments, then try reverse - if (!loadNext(cur, end)) { - loadNext(std::make_reverse_iterator(cur), segments_.rend()); + // Try loading forward segments, then reverse segments + if (!loadNextSegment(cur, end)) { + loadNextSegment(std::make_reverse_iterator(cur), std::make_reverse_iterator(begin)); } } @@ -316,15 +334,10 @@ void Replay::mergeSegments(const SegmentMap::iterator &begin, const SegmentMap:: 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 - } // Wake up the stream thread if the current segment is loaded or invalid. - return isSegmentMerged(current_segment_) || (segments_.count(current_segment_) == 0); + return !seeking_to_ && (isSegmentMerged(current_segment_) || (segments_.count(current_segment_) == 0)); }); + checkSeekProgress(); } void Replay::startStream(const Segment *cur_segment) { @@ -379,6 +392,7 @@ void Replay::startStream(const Segment *cur_segment) { stream_thread_->start(); timeline_future = QtConcurrent::run(this, &Replay::buildTimeline); + emit streamStarted(); } void Replay::publishMessage(const Event *e) { @@ -473,6 +487,7 @@ std::vector::const_iterator Replay::publishEvents(std::vector::con // Skip events if socket is not present if (!sockets_[evt.which]) continue; + cur_mono_time_ = evt.mono_time; 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); @@ -484,12 +499,11 @@ std::vector::const_iterator Replay::publishEvents(std::vector::con loop_start_ts = current_nanos; prev_replay_speed = speed_; } else if (time_diff > 0) { - precise_nano_sleep(time_diff); + precise_nano_sleep(time_diff, paused_); } if (paused_) break; - cur_mono_time_ = evt.mono_time; if (evt.eidx_segnum == -1) { publishMessage(&evt); } else if (camera_server_) { diff --git a/tools/replay/replay.h b/tools/replay/replay.h index 4adbc14df8..8b51ab054d 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -85,14 +85,16 @@ public: inline const std::string &carFingerprint() const { return car_fingerprint_; } inline const std::vector> getTimeline() { std::lock_guard lk(timeline_lock); - return timeline; + return timeline_; } signals: void streamStarted(); void segmentsMerged(); + void seeking(double sec); void seekedTo(double sec); - void qLogLoaded(int segnum, std::shared_ptr qlog); + void qLogLoaded(std::shared_ptr qlog); + void totalSecondsUpdated(double sec); protected slots: void segmentLoadFinished(bool success); @@ -112,6 +114,7 @@ protected: void publishMessage(const Event *e); void publishFrame(const Event *e); void buildTimeline(); + void checkSeekProgress(); inline bool isSegmentMerged(int n) const { return merged_segments_.count(n) > 0; } pthread_t stream_thread_id = 0; @@ -120,7 +123,7 @@ protected: bool user_paused_ = false; std::condition_variable stream_cv_; std::atomic current_segment_ = 0; - double seeking_to_seconds_ = -1; + std::optional seeking_to_; SegmentMap segments_; // the following variables must be protected with stream_lock_ std::atomic exit_ = false; @@ -143,7 +146,7 @@ protected: std::mutex timeline_lock; QFuture timeline_future; - std::vector> timeline; + std::vector> timeline_; std::string car_fingerprint_; std::atomic speed_ = 1.0; replayEventFilter event_filter = nullptr; diff --git a/tools/replay/util.cc b/tools/replay/util.cc index c8203fd79d..a08b3b3d5e 100644 --- a/tools/replay/util.cc +++ b/tools/replay/util.cc @@ -318,33 +318,23 @@ std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic return {}; } -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 +void precise_nano_sleep(int64_t nanoseconds, std::atomic &should_exit) { 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) { + req.tv_sec = nanoseconds / 1000000000; + req.tv_nsec = nanoseconds % 1000000000; + while (!should_exit) { +#ifdef __APPLE_ + int ret = nanosleep(&req, &rem); + if (ret == 0 || errno != EINTR) + break; +#else + int ret = clock_nanosleep(CLOCK_MONOTONIC, 0, &req, &rem); + if (ret == 0 || ret != EINTR) + break; +#endif // Retry sleep if interrupted by a signal req = rem; } -#endif } std::string sha256(const std::string &str) { diff --git a/tools/replay/util.h b/tools/replay/util.h index 750c133555..97516e1814 100644 --- a/tools/replay/util.h +++ b/tools/replay/util.h @@ -37,7 +37,7 @@ private: }; std::string sha256(const std::string &str); -void precise_nano_sleep(int64_t nanoseconds); +void precise_nano_sleep(int64_t nanoseconds, std::atomic &should_exit); 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 2b6bfe32f45d6acdaae6818b00d58ad0748ef8ae Mon Sep 17 00:00:00 2001 From: Jason Wen Date: Sun, 16 Jun 2024 19:32:10 -0400 Subject: [PATCH 046/168] Custom Stock Longitudinal ControL: Volkswagen: Fix missing bus argument --- selfdrive/car/volkswagen/carcontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selfdrive/car/volkswagen/carcontroller.py b/selfdrive/car/volkswagen/carcontroller.py index d690b7963d..2d15d1c18b 100644 --- a/selfdrive/car/volkswagen/carcontroller.py +++ b/selfdrive/car/volkswagen/carcontroller.py @@ -195,7 +195,7 @@ class CarController(CarControllerBase): elif self.acc_type == 1: self.cruise_button = 3 if self.cruise_button == 1 else 4 # resume, set if self.frame % self.CCP.BTN_STEP == 0: - can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, CS.gra_stock_values, frame=(self.frame // self.CCP.BTN_STEP), + can_sends.append(self.CCS.create_acc_buttons_control(self.packer_pt, self.ext_bus, CS.gra_stock_values, frame=(self.frame // self.CCP.BTN_STEP), buttons=self.cruise_button, custom_stock_long=True)) self.send_count += 1 else: From b99fe718ecfbc6044cb5fa53f34e077b9d9a2a4f Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:26:22 -0700 Subject: [PATCH 047/168] [bot] Update Python packages and pre-commit hooks (#32770) Update Python packages and pre-commit hooks Co-authored-by: Vehicle Researcher --- .pre-commit-config.yaml | 4 +-- poetry.lock | 56 ++++++++++++++++++++++------------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 61b7823644..d47630cdad 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,whit,indexIn - --builtins clear,rare,informal,usage,code,names,en-GB_to_en-US - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.8 + rev: v0.4.9 hooks: - id: ruff exclude: '^(third_party/)|(msgq/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)' @@ -98,6 +98,6 @@ repos: args: - --lock - repo: https://github.com/python-jsonschema/check-jsonschema - rev: 0.28.4 + rev: 0.28.5 hooks: - id: check-github-workflows diff --git a/poetry.lock b/poetry.lock index 2467d6be2d..13d082763c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -7219,28 +7219,28 @@ docs = ["furo (==2024.4.27)", "pyenchant (==3.2.2)", "sphinx (==7.1.2)", "sphinx [[package]] name = "ruff" -version = "0.4.8" +version = "0.4.9" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.4.8-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:7663a6d78f6adb0eab270fa9cf1ff2d28618ca3a652b60f2a234d92b9ec89066"}, - {file = "ruff-0.4.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:eeceb78da8afb6de0ddada93112869852d04f1cd0f6b80fe464fd4e35c330913"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aad360893e92486662ef3be0a339c5ca3c1b109e0134fcd37d534d4be9fb8de3"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:284c2e3f3396fb05f5f803c9fffb53ebbe09a3ebe7dda2929ed8d73ded736deb"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7354f921e3fbe04d2a62d46707e569f9315e1a613307f7311a935743c51a764"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:72584676164e15a68a15778fd1b17c28a519e7a0622161eb2debdcdabdc71883"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9678d5c9b43315f323af2233a04d747409d1e3aa6789620083a82d1066a35199"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704977a658131651a22b5ebeb28b717ef42ac6ee3b11e91dc87b633b5d83142b"}, - {file = "ruff-0.4.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d05f8d6f0c3cce5026cecd83b7a143dcad503045857bc49662f736437380ad45"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6ea874950daca5697309d976c9afba830d3bf0ed66887481d6bca1673fc5b66a"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:fc95aac2943ddf360376be9aa3107c8cf9640083940a8c5bd824be692d2216dc"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_i686.whl", hash = "sha256:384154a1c3f4bf537bac69f33720957ee49ac8d484bfc91720cc94172026ceed"}, - {file = "ruff-0.4.8-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e9d5ce97cacc99878aa0d084c626a15cd21e6b3d53fd6f9112b7fc485918e1fa"}, - {file = "ruff-0.4.8-py3-none-win32.whl", hash = "sha256:6d795d7639212c2dfd01991259460101c22aabf420d9b943f153ab9d9706e6a9"}, - {file = "ruff-0.4.8-py3-none-win_amd64.whl", hash = "sha256:e14a3a095d07560a9d6769a72f781d73259655919d9b396c650fc98a8157555d"}, - {file = "ruff-0.4.8-py3-none-win_arm64.whl", hash = "sha256:14019a06dbe29b608f6b7cbcec300e3170a8d86efaddb7b23405cb7f7dcaf780"}, - {file = "ruff-0.4.8.tar.gz", hash = "sha256:16d717b1d57b2e2fd68bd0bf80fb43931b79d05a7131aa477d66fc40fbd86268"}, + {file = "ruff-0.4.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:b262ed08d036ebe162123170b35703aaf9daffecb698cd367a8d585157732991"}, + {file = "ruff-0.4.9-py3-none-macosx_11_0_arm64.whl", hash = "sha256:98ec2775fd2d856dc405635e5ee4ff177920f2141b8e2d9eb5bd6efd50e80317"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4555056049d46d8a381f746680db1c46e67ac3b00d714606304077682832998e"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e91175fbe48f8a2174c9aad70438fe9cb0a5732c4159b2a10a3565fea2d94cde"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e8e7b95673f22e0efd3571fb5b0cf71a5eaaa3cc8a776584f3b2cc878e46bff"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:2d45ddc6d82e1190ea737341326ecbc9a61447ba331b0a8962869fcada758505"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:78de3fdb95c4af084087628132336772b1c5044f6e710739d440fc0bccf4d321"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:06b60f91bfa5514bb689b500a25ba48e897d18fea14dce14b48a0c40d1635893"}, + {file = "ruff-0.4.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88bffe9c6a454bf8529f9ab9091c99490578a593cc9f9822b7fc065ee0712a06"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:673bddb893f21ab47a8334c8e0ea7fd6598ecc8e698da75bcd12a7b9d0a3206e"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8c1aff58c31948cc66d0b22951aa19edb5af0a3af40c936340cd32a8b1ab7438"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:784d3ec9bd6493c3b720a0b76f741e6c2d7d44f6b2be87f5eef1ae8cc1d54c84"}, + {file = "ruff-0.4.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:732dd550bfa5d85af8c3c6cbc47ba5b67c6aed8a89e2f011b908fc88f87649db"}, + {file = "ruff-0.4.9-py3-none-win32.whl", hash = "sha256:8064590fd1a50dcf4909c268b0e7c2498253273309ad3d97e4a752bb9df4f521"}, + {file = "ruff-0.4.9-py3-none-win_amd64.whl", hash = "sha256:e0a22c4157e53d006530c902107c7f550b9233e9706313ab57b892d7197d8e52"}, + {file = "ruff-0.4.9-py3-none-win_arm64.whl", hash = "sha256:5d5460f789ccf4efd43f265a58538a2c24dbce15dbf560676e430375f20a8198"}, + {file = "ruff-0.4.9.tar.gz", hash = "sha256:f1cb0828ac9533ba0135d148d214e284711ede33640465e706772645483427e3"}, ] [[package]] @@ -7727,19 +7727,23 @@ widechars = ["wcwidth"] [[package]] name = "timezonefinder" -version = "6.5.0" +version = "6.5.2" description = "python package for finding the timezone of any point on earth (coordinates) offline" optional = false -python-versions = ">=3.8,<4" +python-versions = "<4,>=3.8" files = [ - {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"}, + {file = "timezonefinder-6.5.2-cp310-cp310-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7ca91f25d988d69efeae020ed828534ed01f6687646a50e464d82da4704b30"}, + {file = "timezonefinder-6.5.2-cp311-cp311-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4a3bca9933ea165380d54b336227def58e62682968437cd44223a065ecff7e9"}, + {file = "timezonefinder-6.5.2-cp312-cp312-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ac4ef31d379c7ba54710462857bea36a9630ea23550ffb15550322e6988efbd"}, + {file = "timezonefinder-6.5.2-cp38-cp38-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:524ab145a2f4ce5101e52308868ecd9da0cdcc2cb3024c13356616b41a685fd6"}, + {file = "timezonefinder-6.5.2-cp39-cp39-manylinux_2_17_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b93927a4996a5c01f0628eb6858c61b2a7f9f49e02c07bed2a95e96a8dc1b65e"}, + {file = "timezonefinder-6.5.2.tar.gz", hash = "sha256:3279e67d5b1b9a54d1a16f3bd4234169f14e2b90c0f58ed37bcfa7303645d610"}, ] [package.dependencies] cffi = ">=1.15.1,<2" h3 = ">=3.7.6,<4" -numpy = {version = ">=1.23,<2", markers = "python_version >= \"3.9\""} +numpy = {version = ">=1.23,<3", markers = "python_version >= \"3.9\""} setuptools = ">=65.5" [package.extras] @@ -7826,13 +7830,13 @@ files = [ [[package]] name = "urllib3" -version = "2.2.1" +version = "2.2.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, - {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, ] [package.extras] From a99816a08b3c30b72283a4a7b77415349a539c33 Mon Sep 17 00:00:00 2001 From: commaci-public <60409688+commaci-public@users.noreply.github.com> Date: Mon, 17 Jun 2024 09:26:34 -0700 Subject: [PATCH 048/168] [bot] Bump submodules (#32769) bump submodules Co-authored-by: Vehicle Researcher --- panda | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panda b/panda index faa1802669..7287ff0cbf 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit faa18026692f7714ee537261fe649dafe4882579 +Subproject commit 7287ff0cbf3ab405a670405f2faca419d524387d From ab96d12f2ee7bc80af3203b732be05a46894a610 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 17 Jun 2024 09:43:36 -0700 Subject: [PATCH 049/168] more fetch depth --- 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 bff8d7a28f..5305cecd3a 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 2000 origin master + git -C $submodule fetch --depth 3000 origin master git -C $submodule branch -r --contains $hash | grep "origin/master" if [ "$?" -eq 0 ]; then echo "$submodule ok" From 54da59c1feb917896538ce8aa22bf4f12af20824 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Tue, 18 Jun 2024 03:44:31 +0800 Subject: [PATCH 050/168] cabana: improved error messaging (#32768) * check user authenrication * Update tools/cabana/streams/replaystream.cc --------- Co-authored-by: Adeeb Shihadeh --- tools/cabana/streams/replaystream.cc | 27 +++++++++++++++++++++++---- tools/replay/replay.h | 1 + tools/replay/route.cc | 3 +++ tools/replay/route.h | 10 ++++++++++ 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/cabana/streams/replaystream.cc b/tools/cabana/streams/replaystream.cc index 5d4925a67a..bdb9ebb014 100644 --- a/tools/cabana/streams/replaystream.cc +++ b/tools/cabana/streams/replaystream.cc @@ -56,7 +56,28 @@ bool ReplayStream::loadRoute(const QString &route, const QString &data_dir, uint QObject::connect(replay.get(), &Replay::seeking, this, &AbstractStream::seeking); QObject::connect(replay.get(), &Replay::seekedTo, this, &AbstractStream::seekedTo); QObject::connect(replay.get(), &Replay::segmentsMerged, this, &ReplayStream::mergeSegments); - return replay->load(); + bool success = replay->load(); + if (!success) { + if (replay->lastRouteError() == RouteLoadError::AccessDenied) { + auto auth_content = util::read_file(util::getenv("HOME") + "/.comma/auth.json"); + QString message; + if (auth_content.empty()) { + message = "Authentication Required. Please run the following command to authenticate:\n\n" + "python tools/lib/auth.py\n\n" + "This will grant access to routes from your comma account."; + } else { + message = tr("Access Denied. You do not have permission to access route:\n\n%1\n\n" + "This is likely a private route.").arg(route); + } + QMessageBox::warning(nullptr, tr("Access Denied"), message); + } else if (replay->lastRouteError() == RouteLoadError::NetworkError) { + QMessageBox::warning(nullptr, tr("Network Error"), + tr("Unable to load the route:\n\n %1.\n\nPlease check your network connection and try again.").arg(route)); + } else { + QMessageBox::warning(nullptr, tr("Route Load Failed"), tr("Failed to load route: '%1'").arg(route)); + } + } + return success; } void ReplayStream::start() { @@ -144,7 +165,7 @@ OpenReplayWidget::OpenReplayWidget(AbstractStream **stream) : AbstractOpenStream bool OpenReplayWidget::open() { QString route = route_edit->text(); QString data_dir; - if (int idx = route.lastIndexOf('/'); idx != -1) { + if (int idx = route.lastIndexOf('/'); idx != -1 && util::file_exists(route.toStdString())) { data_dir = route.mid(0, idx + 1); route = route.mid(idx + 1); } @@ -161,8 +182,6 @@ bool OpenReplayWidget::open() { if (replay_stream->loadRoute(route, data_dir, flags)) { *stream = replay_stream.release(); - } else { - QMessageBox::warning(nullptr, tr("Warning"), tr("Failed to load route: '%1'").arg(route)); } } return *stream != nullptr; diff --git a/tools/replay/replay.h b/tools/replay/replay.h index 8b51ab054d..7e1815ede0 100644 --- a/tools/replay/replay.h +++ b/tools/replay/replay.h @@ -53,6 +53,7 @@ public: uint32_t flags = REPLAY_FLAG_NONE, QString data_dir = "", QObject *parent = 0); ~Replay(); bool load(); + RouteLoadError lastRouteError() const { return route_->lastError(); } void start(int seconds = 0); void stop(); void pause(bool pause); diff --git a/tools/replay/route.cc b/tools/replay/route.cc index e8e73459ea..18c962abd5 100644 --- a/tools/replay/route.cc +++ b/tools/replay/route.cc @@ -74,7 +74,10 @@ bool Route::loadFromServer(int retries) { return loadFromJson(result); } else if (err == QNetworkReply::ContentAccessDenied || err == QNetworkReply::AuthenticationRequiredError) { rWarning(">> Unauthorized. Authenticate with tools/lib/auth.py <<"); + err_ = RouteLoadError::AccessDenied; return false; + } else { + err_ = RouteLoadError::NetworkError; } rWarning("Retrying %d/%d", i, retries); util::sleep_for(3000); diff --git a/tools/replay/route.h b/tools/replay/route.h index f956497804..acc73d509a 100644 --- a/tools/replay/route.h +++ b/tools/replay/route.h @@ -12,6 +12,14 @@ #include "tools/replay/logreader.h" #include "tools/replay/util.h" +enum class RouteLoadError { + None, + AccessDenied, + NetworkError, + FileNotFound, + UnknownError +}; + struct RouteIdentifier { QString dongle_id; QString timestamp; @@ -33,6 +41,7 @@ class Route { public: Route(const QString &route, const QString &data_dir = {}); bool load(); + RouteLoadError lastError() const { return err_; } inline const QString &name() const { return route_.str; } inline const QDateTime datetime() const { return date_time_; } inline const QString &dir() const { return data_dir_; } @@ -50,6 +59,7 @@ protected: QString data_dir_; std::map segments_; QDateTime date_time_; + RouteLoadError err_ = RouteLoadError::None; }; class Segment : public QObject { From 3de6ee5ee316980f2dfea5e59c7369ac1f0a83df Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Mon, 17 Jun 2024 13:24:04 -0700 Subject: [PATCH 051/168] cabana: include optional (#32772) optional --- tools/cabana/videowidget.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/cabana/videowidget.h b/tools/cabana/videowidget.h index 7bd55cbce4..ac34c66007 100644 --- a/tools/cabana/videowidget.h +++ b/tools/cabana/videowidget.h @@ -2,6 +2,7 @@ #include #include +#include #include #include From cb63f101cadec4f2ce4362b3df849a1d2adf9e56 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Mon, 17 Jun 2024 19:18:20 -0700 Subject: [PATCH 052/168] Toyota: remove smartDSU support (#32777) --- selfdrive/car/tests/routes.py | 1 - selfdrive/car/toyota/carstate.py | 17 +++----------- selfdrive/car/toyota/interface.py | 37 +++++++++---------------------- selfdrive/car/toyota/values.py | 4 +--- 4 files changed, 14 insertions(+), 45 deletions(-) diff --git a/selfdrive/car/tests/routes.py b/selfdrive/car/tests/routes.py index dd3a8f633d..b1156f0e89 100755 --- a/selfdrive/car/tests/routes.py +++ b/selfdrive/car/tests/routes.py @@ -225,7 +225,6 @@ routes = [ 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), diff --git a/selfdrive/car/toyota/carstate.py b/selfdrive/car/toyota/carstate.py index 8315f24ae4..a596881c33 100644 --- a/selfdrive/car/toyota/carstate.py +++ b/selfdrive/car/toyota/carstate.py @@ -132,8 +132,7 @@ class CarState(CarStateBase): cp_acc = cp_cam if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR) else cp if self.CP.carFingerprint in TSS2_CAR and not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value: - if not (self.CP.flags & ToyotaFlags.SMART_DSU.value): - self.acc_type = cp_acc.vl["ACC_CONTROL"]["ACC_TYPE"] + self.acc_type = cp_acc.vl["ACC_CONTROL"]["ACC_TYPE"] ret.stockFcw = bool(cp_acc.vl["PCS_HUD"]["FCW"]) # some TSS2 cars have low speed lockout permanently set, so ignore on those cars @@ -167,13 +166,11 @@ class CarState(CarStateBase): if self.CP.carFingerprint not in UNSUPPORTED_DSU_CAR: self.pcm_follow_distance = cp.vl["PCM_CRUISE_2"]["PCM_FOLLOW_DISTANCE"] - 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): + if self.CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR): # 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 @@ -208,12 +205,9 @@ class CarState(CarStateBase): messages.append(("BSM", 1)) if CP.carFingerprint in RADAR_ACC_CAR and not CP.flags & ToyotaFlags.DISABLE_RADAR.value: - if not CP.flags & ToyotaFlags.SMART_DSU.value: - messages += [ - ("ACC_CONTROL", 33), - ] messages += [ ("PCS_HUD", 1), + ("ACC_CONTROL", 33), ] if CP.carFingerprint not in (TSS2_CAR - RADAR_ACC_CAR) and not CP.enableDsu and not CP.flags & ToyotaFlags.DISABLE_RADAR.value: @@ -221,11 +215,6 @@ 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 98f63597ec..6487257bbc 100644 --- a/selfdrive/car/toyota/interface.py +++ b/selfdrive/car/toyota/interface.py @@ -44,18 +44,9 @@ 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 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) \ - and not (ret.flags & ToyotaFlags.SMART_DSU) + ret.enableDsu = len(found_ecus) > 0 and Ecu.dsu not in found_ecus and candidate not in (NO_DSU_CAR | UNSUPPORTED_DSU_CAR) if candidate == CAR.TOYOTA_PRIUS: stop_and_go = True @@ -98,7 +89,7 @@ class CarInterface(CarInterfaceBase): # 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) + stop_and_go = stop_and_go or (ret.enableDsu and not docs) ret.centerToFront = ret.wheelbase * 0.44 @@ -110,28 +101,20 @@ 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) - # 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) if candidate in (RADAR_ACC_CAR | NO_DSU_CAR): - ret.experimentalLongitudinalAvailable = use_sdsu or candidate in RADAR_ACC_CAR + ret.experimentalLongitudinalAvailable = 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: - ret.flags |= ToyotaFlags.DISABLE_RADAR.value - else: - use_sdsu = use_sdsu and experimental_long + # Disabling radar is only supported on TSS2 radar-ACC cars + if experimental_long and candidate in RADAR_ACC_CAR: + ret.flags |= ToyotaFlags.DISABLE_RADAR.value # openpilot longitudinal enabled by default: - # - non-(TSS2 radar ACC cars) w/ smartDSU installed # - cars w/ DSU disconnected # - TSS2 cars with camera sending ACC_CONTROL where we can block it # openpilot longitudinal behind experimental long toggle: - # - TSS2 radar ACC cars w/ smartDSU installed - # - TSS2 radar ACC cars w/o smartDSU installed (disables radar) - # - 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) + # - TSS2 radar ACC cars (disables radar) + ret.openpilotLongitudinalControl = 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 if not ret.openpilotLongitudinalControl: @@ -156,7 +139,7 @@ class CarInterface(CarInterfaceBase): @staticmethod def init(CP, logcan, sendcan): - # disable radar if alpha longitudinal toggled on radar-ACC car without CAN filter/smartDSU + # disable radar if alpha longitudinal toggled on radar-ACC car if CP.flags & ToyotaFlags.DISABLE_RADAR.value: communication_control = bytes([uds.SERVICE_TYPE.COMMUNICATION_CONTROL, uds.CONTROL_TYPE.ENABLE_RX_DISABLE_TX, uds.MESSAGE_TYPE.NORMAL]) disable_ecu(logcan, sendcan, bus=0, addr=0x750, sub_addr=0xf, com_cont_req=communication_control) @@ -165,7 +148,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) or (self.CP.flags & ToyotaFlags.SMART_DSU and not self.CP.flags & ToyotaFlags.RADAR_CAN_FILTER): + 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 diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index 2e781ad0aa..8022e8b3ab 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -44,9 +44,7 @@ class CarControllerParams: class ToyotaFlags(IntFlag): # Detected flags HYBRID = 1 - SMART_DSU = 2 DISABLE_RADAR = 4 - RADAR_CAN_FILTER = 1024 # Static flags TSS2 = 8 @@ -56,7 +54,7 @@ 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 + # these cars are speculated to allow stop and go when the DSU is unplugged SNG_WITHOUT_DSU = 512 From 5c4ea14a3cb7bcb443fbee8c5b1d52c10788c9e8 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Mon, 17 Jun 2024 20:30:32 -0700 Subject: [PATCH 053/168] Ubuntu 24.04 (#32624) * noble build * workflow * symlink * map only for noble * sym * add qt to cppcheck * cppcheck noreturn in non void funct * get kaitai header * kaitai header * syntax * try new pyopencl * try this version * install lsb-core manually * support old 20.04 lsb-core * try arm * try latest pyopencl * revert * use pocl icd * no lock * no arm pyopencl * new intel opencl runtime * pin filelock * undo * glsl version * new version * build test * remove test * new metadrive * remove glsl restrictions * * Update .github/workflows/tools_tests.yaml Co-authored-by: Adeeb Shihadeh * cache * new cache --------- Co-authored-by: Adeeb Shihadeh --- .devcontainer/Dockerfile | 4 +- .github/workflows/setup/action.yaml | 2 +- .github/workflows/tools_tests.yaml | 28 ++++++++++++-- .pre-commit-config.yaml | 2 + Dockerfile.openpilot_base | 37 +++++++++++-------- SConstruct | 2 + poetry.lock | 6 +-- pyproject.toml | 2 +- selfdrive/navd/SConscript | 4 +- selfdrive/ui/SConscript | 4 +- selfdrive/ui/qt/maps/map_helpers.cc | 8 ++-- .../x86_64/lib/libQMapLibre.so.3.0.0 | 4 +- tools/README.md | 6 +-- tools/profiling/snapdragon/README.md | 2 +- tools/webcam/README.md | 2 +- 15 files changed, 71 insertions(+), 42 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index af67bdbe5d..1115c375db 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,11 +1,11 @@ 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 gdb bash-completion +RUN apt update && apt install -y vim net-tools usbutils htop ripgrep tmux wget mesa-utils xvfb libxtst6 libxv1 libglu1-mesa gdb bash-completion RUN pip install ipython jupyter jupyterlab RUN cd /tmp && \ ARCH=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) && \ - curl -L -o virtualgl.deb "https://downloads.sourceforge.net/project/virtualgl/3.1/virtualgl_3.1_$ARCH.deb" && \ + curl -L -o virtualgl.deb "https://github.com/VirtualGL/virtualgl/releases/download/3.1.1/virtualgl_3.1.1_$ARCH.deb" && \ dpkg -i virtualgl.deb RUN usermod -aG video batman diff --git a/.github/workflows/setup/action.yaml b/.github/workflows/setup/action.yaml index 970d62030d..701675942f 100644 --- a/.github/workflows/setup/action.yaml +++ b/.github/workflows/setup/action.yaml @@ -60,4 +60,4 @@ runs: find . -type f -not -executable -not -perm 644 -exec chmod 644 {} \; # build our docker image - shell: bash - run: eval ${{ env.BUILD }} \ No newline at end of file + run: eval ${{ env.BUILD }} diff --git a/.github/workflows/tools_tests.yaml b/.github/workflows/tools_tests.yaml index c2f7d86e69..9a26ca9a20 100644 --- a/.github/workflows/tools_tests.yaml +++ b/.github/workflows/tools_tests.yaml @@ -39,12 +39,13 @@ jobs: source selfdrive/test/setup_vsound.sh && \ CI=1 pytest tools/sim/tests/test_metadrive_bridge.py" - test_python311: - name: test python3.11 support - runs-on: ubuntu-latest - timeout-minutes: 5 + test_compatibility: + name: test 20.04 + 3.11 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v4 + with: + submodules: true - name: Installing ubuntu dependencies run: INSTALL_EXTRA_PACKAGES=no tools/install_ubuntu_dependencies.sh - name: Installing python @@ -57,6 +58,25 @@ jobs: run: pip install poetry==1.7.0 - name: Installing python dependencies run: poetry install --no-cache --no-root + - name: git LFS + run: git lfs pull + - run: echo "CACHE_COMMIT_DATE=$(git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d-%H:%M')" >> $GITHUB_ENV + - name: Getting scons cache + uses: 'actions/cache@v4' + with: + path: /tmp/scons_cache + key: scons-${{ runner.arch }}-ubuntu2004-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }} + restore-keys: | + scons-${{ runner.arch }}-ubuntu2004-${{ env.CACHE_COMMIT_DATE }} + scons-${{ runner.arch }}-ubuntu2004 + - name: Building openpilot + run: poetry run scons -u -j$(nproc) + - name: Saving scons cache + uses: actions/cache/save@v4 + if: github.ref == 'refs/heads/master' + with: + path: /tmp/scons_cache + key: scons-${{ runner.arch }}-ubuntu2004-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }} devcontainer: name: devcontainer diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d47630cdad..ecde9fe771 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -62,6 +62,8 @@ repos: - --quiet - --force - -j8 + - --library=qt + - --include=third_party/kaitai/kaitaistream.h - repo: https://github.com/cpplint/cpplint rev: 1.6.1 hooks: diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index 45b29bdcb1..7228d16ef9 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:24.04 ENV PYTHONUNBUFFERED 1 @@ -15,7 +15,7 @@ ENV LC_ALL en_US.UTF-8 COPY tools/install_ubuntu_dependencies.sh /tmp/tools/ RUN INSTALL_EXTRA_PACKAGES=no /tmp/tools/install_ubuntu_dependencies.sh && \ rm -rf /var/lib/apt/lists/* /tmp/* && \ - cd /usr/lib/gcc/arm-none-eabi/9.2.1 && \ + cd /usr/lib/gcc/arm-none-eabi/* && \ rm -rf arm/ thumb/nofp thumb/v6* thumb/v8* thumb/v7+fp thumb/v7-r+fp.sp # Add OpenCL @@ -30,23 +30,28 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ gcc-arm-none-eabi \ tmux \ vim \ - lsb-core \ libx11-6 \ + wget \ && 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 && \ +RUN mkdir -p /tmp/opencl-driver-intel && \ + cd /tmp/opencl-driver-intel && \ + wget https://github.com/intel/llvm/releases/download/2024-WW14/oclcpuexp-2024.17.3.0.09_rel.tar.gz && \ + wget https://github.com/oneapi-src/oneTBB/releases/download/v2021.12.0/oneapi-tbb-2021.12.0-lin.tgz && \ + mkdir -p /opt/intel/oclcpuexp_2024.17.3.0.09_rel && \ + cd /opt/intel/oclcpuexp_2024.17.3.0.09_rel && \ + tar -zxvf /tmp/opencl-driver-intel/oclcpuexp-2024.17.3.0.09_rel.tar.gz && \ 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 && \ + echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64/libintelocl.so > /etc/OpenCL/vendors/intel_expcpu.icd && \ + cd /opt/intel && \ + tar -zxvf /tmp/opencl-driver-intel/oneapi-tbb-2021.12.0-lin.tgz && \ + ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \ + ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \ + ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so.12 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \ + ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so.2 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \ + mkdir -p /etc/ld.so.conf.d && \ + echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 > /etc/ld.so.conf.d/libintelopenclexp.conf && \ + ldconfig -f /etc/ld.so.conf.d/libintelopenclexp.conf && \ cd / && \ rm -rf /tmp/opencl-driver-intel @@ -57,7 +62,7 @@ ENV QTWEBENGINE_DISABLE_SANDBOX 1 RUN dbus-uuidgen > /etc/machine-id ARG USER=batman -ARG USER_UID=1000 +ARG USER_UID=1001 RUN useradd -m -s /bin/bash -u $USER_UID $USER RUN usermod -aG sudo $USER RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers diff --git a/SConstruct b/SConstruct index 944d650d74..f53d8fb7d0 100644 --- a/SConstruct +++ b/SConstruct @@ -14,6 +14,8 @@ SCons.Warnings.warningAsException(True) TICI = os.path.isfile('/TICI') AGNOS = TICI +UBUNTU_FOCAL = int(subprocess.check_output('[ -f /etc/os-release ] && . /etc/os-release && [ "$ID" = "ubuntu" ] && [ "$VERSION_ID" = "20.04" ] && echo 1 || echo 0', shell=True, encoding='utf-8').rstrip()) +Export('UBUNTU_FOCAL') Decider('MD5-timestamp') diff --git a/poetry.lock b/poetry.lock index 13d082763c..58fa7dee66 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2270,8 +2270,8 @@ ros = ["zmq"] [package.source] type = "git" url = "https://github.com/commaai/metadrive.git" -reference = "python3.12" -resolved_reference = "0823c7491a1ab870bcd53d10a41e985a3ad1b968" +reference = "anisotropic_off" +resolved_reference = "1606c844345f98aa79f76177856e328edc6ec428" [[package]] name = "mouseinfo" @@ -8114,4 +8114,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "83dbbf76ea5f3e1022233a164d6f342706ebf64ad8bbbf742a55d5f49474d863" +content-hash = "32df734a6ad6ad6a665c94c41cd0e3643a48174904faaf6f21c5c84f350f3cec" diff --git a/pyproject.toml b/pyproject.toml index 5353b39887..374b0f46ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -176,7 +176,7 @@ flaky = "*" inputs = "*" lru-dict = "*" matplotlib = "*" -metadrive-simulator = { git = "https://github.com/commaai/metadrive.git", branch = "python3.12", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies +metadrive-simulator = { git = "https://github.com/commaai/metadrive.git", branch = "anisotropic_off", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies mpld3 = "*" myst-parser = "*" natsort = "*" diff --git a/selfdrive/navd/SConscript b/selfdrive/navd/SConscript index 295e8127db..378e762494 100644 --- a/selfdrive/navd/SConscript +++ b/selfdrive/navd/SConscript @@ -1,4 +1,4 @@ -Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations') +Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations', 'UBUNTU_FOCAL') map_env = qt_env.Clone() libs = ['qt_widgets', 'qt_util', 'QMapLibre', common, messaging, visionipc, transformations, @@ -6,7 +6,7 @@ libs = ['qt_widgets', 'qt_util', 'QMapLibre', common, messaging, visionipc, tran if arch == 'larch64': libs.append(':libEGL_mesa.so.0') -if arch in ['larch64', 'aarch64', 'x86_64']: +if arch in ['larch64', 'aarch64', 'x86_64'] and not UBUNTU_FOCAL: if arch == 'x86_64': rpath = Dir(f"#third_party/maplibre-native-qt/{arch}/lib").srcnode().abspath map_env["RPATH"] += [rpath, ] diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index e181cb9abd..e4fb32586d 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -1,6 +1,6 @@ import os import json -Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations') +Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations', 'UBUNTU_FOCAL') base_libs = [common, messaging, visionipc, transformations, 'm', 'OpenCL', 'ssl', 'crypto', 'pthread'] + qt_env["LIBS"] @@ -8,7 +8,7 @@ base_libs = [common, messaging, visionipc, transformations, if arch == 'larch64': base_libs.append('EGL') -maps = arch in ['larch64', 'aarch64', 'x86_64'] +maps = arch in ['larch64', 'aarch64', 'x86_64'] and not UBUNTU_FOCAL if arch == "Darwin": del base_libs[base_libs.index('OpenCL')] diff --git a/selfdrive/ui/qt/maps/map_helpers.cc b/selfdrive/ui/qt/maps/map_helpers.cc index 16923f7a43..50e1401164 100644 --- a/selfdrive/ui/qt/maps/map_helpers.cc +++ b/selfdrive/ui/qt/maps/map_helpers.cc @@ -143,11 +143,11 @@ std::pair map_format_distance(float d, bool is_metric) { d = std::max(d, 0.0f); if (is_metric) { - return (d > 500) ? std::pair{round_distance(d / 1000), QObject::tr("km")} - : std::pair{QString::number(50 * std::nearbyint(d / 50)), QObject::tr("m")}; + 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{round_distance(d * METER_TO_MILE), QObject::tr("mi")} - : std::pair{QString::number(50 * std::nearbyint(d / 50)), QObject::tr("ft")}; + 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")); } } diff --git a/third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so.3.0.0 b/third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so.3.0.0 index f2fcf107bc..e49d321c7c 100755 --- a/third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so.3.0.0 +++ b/third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so.3.0.0 @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b718e4ea770105893dc41f64be36f806586a9471e2bb9d18d5ad97e906434548 -size 11000296 +oid sha256:d62e192aa7806302ed79866d9e3c51efc4bc315a6fdfe0e58e448dac5b279098 +size 11549728 diff --git a/tools/README.md b/tools/README.md index 361a27deda..f465ea1234 100644 --- a/tools/README.md +++ b/tools/README.md @@ -2,11 +2,11 @@ ## System Requirements -openpilot is developed and tested on **Ubuntu 20.04**, which is the primary development target aside from the [supported embedded hardware](https://github.com/commaai/openpilot#running-on-a-dedicated-device-in-a-car). +openpilot is developed and tested on **Ubuntu 24.04**, which is the primary development target aside from the [supported embedded hardware](https://github.com/commaai/openpilot#running-on-a-dedicated-device-in-a-car). Running natively on any other system is not recommended and will require modifications. On Windows you can use WSL, and on macOS or incompatible Linux systems, it is recommended to use the dev containers. -## Native setup on Ubuntu 20.04 +## Native setup on Ubuntu 24.04 **1. Clone openpilot** @@ -55,7 +55,7 @@ GUI apps like `ui` or `cabana` can also run inside the container by leveraging X [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/about) should provide a similar experience to native Ubuntu. [WSL 2](https://docs.microsoft.com/en-us/windows/wsl/compare-versions) specifically has been reported by several users to be a seamless experience. -Follow [these instructions](https://docs.microsoft.com/en-us/windows/wsl/install) to setup the WSL and install the `Ubuntu-20.04` distribution. Once your Ubuntu WSL environment is setup, follow the Linux setup instructions to finish setting up your environment. See [these instructions](https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps) for running GUI apps. +Follow [these instructions](https://docs.microsoft.com/en-us/windows/wsl/install) to setup the WSL and install the `Ubuntu-24.04` distribution. Once your Ubuntu WSL environment is setup, follow the Linux setup instructions to finish setting up your environment. See [these instructions](https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps) for running GUI apps. **NOTE**: If you are running WSL and any GUIs are failing (segfaulting or other strange issues) even after following the steps above, you may need to enable software rendering with `LIBGL_ALWAYS_SOFTWARE=1`, e.g. `LIBGL_ALWAYS_SOFTWARE=1 selfdrive/ui/ui`. diff --git a/tools/profiling/snapdragon/README.md b/tools/profiling/snapdragon/README.md index 664814b611..f56ca182a7 100644 --- a/tools/profiling/snapdragon/README.md +++ b/tools/profiling/snapdragon/README.md @@ -3,7 +3,7 @@ snapdragon profiler * download from https://developer.qualcomm.com/software/snapdragon-profiler/tools-archive (need a qc developer account) - * choose v2021.5 (verified working with 20.04 dev environment) + * choose v2021.5 (verified working with 24.04 dev environment) * unzip to selfdrive/debug/profiling/snapdragon/SnapdragonProfiler * run ```./setup-profiler.sh``` * run ```./setup-agnos.sh``` diff --git a/tools/webcam/README.md b/tools/webcam/README.md index 7334d87b38..c756069bb5 100644 --- a/tools/webcam/README.md +++ b/tools/webcam/README.md @@ -1,7 +1,7 @@ # Run openpilot with webcam on PC What's needed: -- Ubuntu 20.04 +- Ubuntu 24.04 - GPU (recommended) - Two USB webcams, at least 720p and 78 degrees FOV (e.g. Logitech C920/C615) - [Car harness](https://comma.ai/shop/products/comma-car-harness) with black panda to connect to your car From 987b0d9e030ec2191e422e7ca8d059b8a02ef08a Mon Sep 17 00:00:00 2001 From: royjr Date: Tue, 18 Jun 2024 14:27:28 -0400 Subject: [PATCH 054/168] Ubuntu 24.04 fix setup (#32783) * fix tk-dev * fix missing pip * Update tools/install_python_dependencies.sh --------- Co-authored-by: Adeeb Shihadeh --- tools/install_python_dependencies.sh | 10 +++++++++- tools/install_ubuntu_dependencies.sh | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/install_python_dependencies.sh b/tools/install_python_dependencies.sh index af25ec6424..bb00302073 100755 --- a/tools/install_python_dependencies.sh +++ b/tools/install_python_dependencies.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash set -e +# Increase the pip timeout to handle TimeoutError +export PIP_DEFAULT_TIMEOUT=200 + DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )" ROOT=$DIR/../ cd $ROOT @@ -13,7 +16,7 @@ fi if ! command -v "pyenv" > /dev/null 2>&1; then echo "pyenv install ..." curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash - PYENV_PATH_SETUP="export PATH=\$HOME/.pyenv/bin:\$HOME/.pyenv/shims:\$PATH" + PYENV_PATH_SETUP="export PATH=\$HOME/.pyenv/bin:\$HOME/.pyenv/shims:\$HOME/.pyenv/versions/${PYENV_PYTHON_VERSION}/bin:\$PATH" fi if [ -z "$PYENV_SHELL" ] || [ -n "$PYENV_PATH_SETUP" ]; then @@ -51,7 +54,12 @@ if ! pyenv prefix ${PYENV_PYTHON_VERSION} &> /dev/null; then echo "python ${PYENV_PYTHON_VERSION} install ..." CONFIGURE_OPTS="--enable-shared" pyenv install -f ${PYENV_PYTHON_VERSION} fi + eval "$(pyenv init --path)" +eval "$(pyenv init -)" +eval "$(pyenv virtualenv-init -)" +pyenv local ${PYENV_PYTHON_VERSION} +pyenv rehash echo "update pip" pip install pip==24.0 diff --git a/tools/install_ubuntu_dependencies.sh b/tools/install_ubuntu_dependencies.sh index 1f8ef24eaf..1fc5e4fc8b 100755 --- a/tools/install_ubuntu_dependencies.sh +++ b/tools/install_ubuntu_dependencies.sh @@ -93,7 +93,8 @@ function install_ubuntu_lts_latest_requirements() { qtchooser \ qt5-qmake \ qtbase5-dev-tools \ - python3-dev + python3-dev \ + tk-dev } # Install Ubuntu 20.04 packages From 151b4530ddae30d9c08b86d104d2997cdd4c35e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20R=C4=85czy?= Date: Tue, 18 Jun 2024 17:28:52 -0700 Subject: [PATCH 055/168] Fix openpilot-prebuilt dockerfile (#32787) * Manually add symlinks to prevent docker for copying duplicate files * Copy everything --- Dockerfile.openpilot | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/Dockerfile.openpilot b/Dockerfile.openpilot index 5d8f958c48..e26a427eb1 100644 --- a/Dockerfile.openpilot +++ b/Dockerfile.openpilot @@ -8,23 +8,6 @@ ENV PYTHONPATH ${OPENPILOT_PATH}:${PYTHONPATH} RUN mkdir -p ${OPENPILOT_PATH} WORKDIR ${OPENPILOT_PATH} -COPY SConstruct ${OPENPILOT_PATH} - -COPY ./openpilot ${OPENPILOT_PATH}/openpilot -COPY ./third_party ${OPENPILOT_PATH}/third_party -COPY ./site_scons ${OPENPILOT_PATH}/site_scons -COPY ./rednose ${OPENPILOT_PATH}/rednose -COPY ./rednose_repo/site_scons ${OPENPILOT_PATH}/rednose_repo/site_scons -COPY ./tools ${OPENPILOT_PATH}/tools -COPY ./release ${OPENPILOT_PATH}/release -COPY ./common ${OPENPILOT_PATH}/common -COPY ./opendbc ${OPENPILOT_PATH}/opendbc -COPY ./cereal ${OPENPILOT_PATH}/cereal -COPY ./msgq_repo ${OPENPILOT_PATH}/msgq_repo -COPY ./msgq ${OPENPILOT_PATH}/msgq -COPY ./panda ${OPENPILOT_PATH}/panda -COPY ./selfdrive ${OPENPILOT_PATH}/selfdrive -COPY ./system ${OPENPILOT_PATH}/system -COPY ./body ${OPENPILOT_PATH}/body +COPY . ${OPENPILOT_PATH}/ RUN scons --cache-readonly -j$(nproc) From de75372880cb354df2bcb2e0f36e769213bf7072 Mon Sep 17 00:00:00 2001 From: Maxime Desroches Date: Wed, 19 Jun 2024 09:55:23 -0700 Subject: [PATCH 056/168] Remove pyenv (#32786) * no pyenv * better * check poetry * docker * syntax * manual env * pre-commit * revert * format --- Dockerfile.openpilot_base | 16 ++++---- tools/install_python_dependencies.sh | 60 ++++------------------------ tools/install_ubuntu_dependencies.sh | 2 +- 3 files changed, 16 insertions(+), 62 deletions(-) diff --git a/Dockerfile.openpilot_base b/Dockerfile.openpilot_base index 7228d16ef9..343fd29c82 100644 --- a/Dockerfile.openpilot_base +++ b/Dockerfile.openpilot_base @@ -68,20 +68,18 @@ RUN usermod -aG sudo $USER RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers USER $USER -ENV POETRY_VIRTUALENVS_CREATE=false -ENV PYENV_VERSION=3.12.4 -ENV PYENV_ROOT="/home/$USER/pyenv" -ENV PATH="$PYENV_ROOT/bin:$PYENV_ROOT/shims:$PATH" - COPY --chown=$USER pyproject.toml poetry.lock /tmp/ COPY --chown=$USER tools/install_python_dependencies.sh /tmp/tools/ -RUN cd /tmp && \ +ENV POETRY_VIRTUALENVS_CREATE=false +ENV VIRTUAL_ENV=/home/$USER/venv/.venv +RUN python3 -m venv $VIRTUAL_ENV +ENV PATH="$VIRTUAL_ENV/bin:$PATH" +RUN . $VIRTUAL_ENV/bin/activate && \ + cd /tmp && \ tools/install_python_dependencies.sh && \ rm -rf /tmp/* && \ - rm -rf /home/$USER/.cache && \ - find /home/$USER/pyenv -type d -name ".git" | xargs rm -rf && \ - rm -rf /home/$USER/pyenv/versions/3.12.4/lib/python3.12/test + rm -rf /home/$USER/.cache USER root RUN sudo git config --global --add safe.directory /tmp/openpilot diff --git a/tools/install_python_dependencies.sh b/tools/install_python_dependencies.sh index bb00302073..086fc2d14f 100755 --- a/tools/install_python_dependencies.sh +++ b/tools/install_python_dependencies.sh @@ -13,58 +13,15 @@ if [ "$(uname)" == "Darwin" ] && [ $SHELL == "/bin/bash" ]; then RC_FILE="$HOME/.bash_profile" fi -if ! command -v "pyenv" > /dev/null 2>&1; then - echo "pyenv install ..." - curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash - PYENV_PATH_SETUP="export PATH=\$HOME/.pyenv/bin:\$HOME/.pyenv/shims:\$HOME/.pyenv/versions/${PYENV_PYTHON_VERSION}/bin:\$PATH" +if ! command -v "poetry" > /dev/null 2>&1; then + echo "installing poetry..." + curl -sSL https://install.python-poetry.org | python3 - + POETRY_BIN='$HOME/.local/bin' + ADD_PATH_CMD="export PATH=\"$POETRY_BIN:\$PATH\"" + eval $ADD_PATH_CMD + printf "\n#poetry path\n$ADD_PATH_CMD\n" >> $RC_FILE fi -if [ -z "$PYENV_SHELL" ] || [ -n "$PYENV_PATH_SETUP" ]; then - echo "pyenvrc setup ..." - cat < "${HOME}/.pyenvrc" -if [ -z "\$PYENV_ROOT" ]; then - $PYENV_PATH_SETUP - export PYENV_ROOT="\$HOME/.pyenv" - eval "\$(pyenv init -)" - eval "\$(pyenv virtualenv-init -)" -fi -EOF - - SOURCE_PYENVRC="source ~/.pyenvrc" - if ! grep "^$SOURCE_PYENVRC$" $RC_FILE > /dev/null; then - printf "\n$SOURCE_PYENVRC\n" >> $RC_FILE - fi - - eval "$SOURCE_PYENVRC" - # $(pyenv init -) produces a function which is broken on bash 3.2 which ships on macOS - if [ $(uname) == "Darwin" ]; then - unset -f pyenv - fi -fi - -export MAKEFLAGS="-j$(nproc)" - -PYENV_PYTHON_VERSION="3.12.4" -if ! pyenv prefix ${PYENV_PYTHON_VERSION} &> /dev/null; then - # no pyenv update on mac - if [ "$(uname)" == "Linux" ]; then - echo "pyenv update ..." - pyenv update - fi - echo "python ${PYENV_PYTHON_VERSION} install ..." - CONFIGURE_OPTS="--enable-shared" pyenv install -f ${PYENV_PYTHON_VERSION} -fi - -eval "$(pyenv init --path)" -eval "$(pyenv init -)" -eval "$(pyenv virtualenv-init -)" -pyenv local ${PYENV_PYTHON_VERSION} -pyenv rehash - -echo "update pip" -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 @@ -77,9 +34,8 @@ fi poetry self add poetry-dotenv-plugin@^0.1.0 -echo "pip packages install..." +echo "installing python packages..." poetry install --no-cache --no-root -pyenv rehash [ -n "$POETRY_VIRTUALENVS_CREATE" ] && RUN="" || RUN="poetry run" diff --git a/tools/install_ubuntu_dependencies.sh b/tools/install_ubuntu_dependencies.sh index 1fc5e4fc8b..5c10bf5438 100755 --- a/tools/install_ubuntu_dependencies.sh +++ b/tools/install_ubuntu_dependencies.sh @@ -94,7 +94,7 @@ function install_ubuntu_lts_latest_requirements() { qt5-qmake \ qtbase5-dev-tools \ python3-dev \ - tk-dev + python3-venv } # Install Ubuntu 20.04 packages From a89201219d19c544c8b12f8124fdceaadd6b3dca Mon Sep 17 00:00:00 2001 From: Jason Young <46612682+jyoung8607@users.noreply.github.com> Date: Wed, 19 Jun 2024 18:17:25 -0400 Subject: [PATCH 057/168] VW: Rename harnesses (#32779) --- docs/CARS.md | 112 ++++++++++++++--------------- selfdrive/car/docs_definitions.py | 4 +- selfdrive/car/volkswagen/values.py | 4 +- 3 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs/CARS.md b/docs/CARS.md index 43bd8a8b30..2c32a77f0c 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,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
|| +|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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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
|| @@ -29,7 +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
|| +|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 USB-C coupler
- 1 VW J533 connector
- 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
|| @@ -185,8 +185,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-24|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-24|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|eTGE 2020-24|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 USB-C coupler
- 1 VW J533 connector
- 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-24|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 USB-C coupler
- 1 VW J533 connector
- 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
|| @@ -194,8 +194,8 @@ 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 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
|| +|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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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)
|| @@ -206,15 +206,15 @@ A supported vehicle is one that just works when you install a comma device. All |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
|| +|Š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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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
|| @@ -260,42 +260,42 @@ 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-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
|| -|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|Arteon Shooting Brake 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-24|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-24|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-24|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
|| +|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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 Shooting Brake 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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-24|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 USB-C coupler
- 1 VW J533 connector
- 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-24|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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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-24|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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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 USB-C coupler
- 1 VW J533 connector
- 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`.
diff --git a/selfdrive/car/docs_definitions.py b/selfdrive/car/docs_definitions.py index 971338e9b5..a04653c140 100644 --- a/selfdrive/car/docs_definitions.py +++ b/selfdrive/car/docs_definitions.py @@ -91,8 +91,8 @@ class CarHarness(EnumBase): subaru_d = BaseCarHarness("Subaru D connector") fca = BaseCarHarness("FCA connector") ram = BaseCarHarness("Ram connector") - vw = BaseCarHarness("VW connector") - j533 = BaseCarHarness("J533 connector", parts=[Accessory.harness_box, Cable.long_obdc_cable, Cable.usbc_coupler]) + vw_a = BaseCarHarness("VW A connector") + vw_j533 = BaseCarHarness("VW J533 connector", parts=[Accessory.harness_box, Cable.long_obdc_cable, Cable.usbc_coupler]) hyundai_a = BaseCarHarness("Hyundai A connector") hyundai_b = BaseCarHarness("Hyundai B connector") hyundai_c = BaseCarHarness("Hyundai C connector") diff --git a/selfdrive/car/volkswagen/values.py b/selfdrive/car/volkswagen/values.py index 8b58769b3f..69dd63fefd 100644 --- a/selfdrive/car/volkswagen/values.py +++ b/selfdrive/car/volkswagen/values.py @@ -188,7 +188,7 @@ class Footnote(Enum): @dataclass class VWCarDocs(CarDocs): package: str = "Adaptive Cruise Control (ACC) & Lane Assist" - car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.j533])) + car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.vw_j533])) def init_make(self, CP: car.CarParams): self.footnotes.append(Footnote.VW_EXP_LONG) @@ -196,7 +196,7 @@ class VWCarDocs(CarDocs): self.footnotes.append(Footnote.SKODA_HEATED_WINDSHIELD) if CP.carFingerprint in (CAR.VOLKSWAGEN_CRAFTER_MK2, CAR.VOLKSWAGEN_TRANSPORTER_T61): - self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.j533]) + self.car_parts = CarParts([Device.threex_angled_mount, CarHarness.vw_j533]) if abs(CP.minSteerSpeed - CarControllerParams.DEFAULT_MIN_STEER_SPEED) < 1e-3: self.min_steer_speed = 0 From e491c9d964a2aef07eeaa7b47f4aa9f992130482 Mon Sep 17 00:00:00 2001 From: Adeeb Shihadeh Date: Wed, 19 Jun 2024 19:14:13 -0700 Subject: [PATCH 058/168] remove navigation (#32773) * remove navigation * lil more * fix cabana * revert for now * fix docs * move that over * lock * rm assets --- .vscode/launch.json | 1 - SConstruct | 9 +- common/params.cc | 6 - docs/c_docs.rst | 2 - poetry.lock | 27 +- pyproject.toml | 2 - selfdrive/SConscript | 1 - selfdrive/assets/img_map.png | 3 - .../assets/navigation/default_marker.svg | 3 - .../assets/navigation/direction_arrive.png | 3 - .../navigation/direction_arrive_left.png | 3 - .../navigation/direction_arrive_right.png | 3 - .../navigation/direction_arrive_straight.png | 3 - .../assets/navigation/direction_close.png | 3 - .../assets/navigation/direction_continue.png | 3 - .../navigation/direction_continue_left.png | 3 - .../navigation/direction_continue_right.png | 3 - .../direction_continue_slight_left.png | 3 - .../direction_continue_slight_right.png | 3 - .../direction_continue_straight.png | 3 - .../navigation/direction_continue_uturn.png | 3 - .../assets/navigation/direction_depart.png | 3 - .../navigation/direction_depart_left.png | 3 - .../navigation/direction_depart_right.png | 3 - .../navigation/direction_depart_straight.png | 3 - .../navigation/direction_end_of_road_left.png | 3 - .../direction_end_of_road_right.png | 3 - .../assets/navigation/direction_flag.png | 3 - .../assets/navigation/direction_fork.png | 3 - .../assets/navigation/direction_fork_left.png | 3 - .../navigation/direction_fork_right.png | 3 - .../navigation/direction_fork_slight_left.png | 3 - .../direction_fork_slight_right.png | 3 - .../navigation/direction_fork_straight.png | 3 - .../assets/navigation/direction_invalid.png | 3 - .../navigation/direction_invalid_left.png | 3 - .../navigation/direction_invalid_right.png | 3 - .../direction_invalid_slight_left.png | 3 - .../direction_invalid_slight_right.png | 3 - .../navigation/direction_invalid_straight.png | 3 - .../navigation/direction_invalid_uturn.png | 3 - .../navigation/direction_merge_left.png | 3 - .../navigation/direction_merge_right.png | 3 - .../direction_merge_slight_left.png | 3 - .../direction_merge_slight_right.png | 3 - .../navigation/direction_merge_straight.png | 3 - .../navigation/direction_new_name_left.png | 3 - .../navigation/direction_new_name_right.png | 3 - .../direction_new_name_sharp_left.png | 3 - .../direction_new_name_sharp_right.png | 3 - .../direction_new_name_slight_left.png | 3 - .../direction_new_name_slight_right.png | 3 - .../direction_new_name_straight.png | 3 - .../direction_notification_left.png | 3 - .../direction_notification_right.png | 3 - .../direction_notification_sharp_left.png | 3 - .../direction_notification_sharp_right.png | 3 - .../direction_notification_slight_left.png | 3 - .../direction_notification_slight_right.png | 3 - .../direction_notification_straight.png | 3 - .../navigation/direction_off_ramp_left.png | 3 - .../navigation/direction_off_ramp_right.png | 3 - .../direction_off_ramp_slight_left.png | 3 - .../direction_off_ramp_slight_right.png | 3 - .../navigation/direction_on_ramp_left.png | 3 - .../navigation/direction_on_ramp_right.png | 3 - .../direction_on_ramp_sharp_left.png | 3 - .../direction_on_ramp_sharp_right.png | 3 - .../direction_on_ramp_slight_left.png | 3 - .../direction_on_ramp_slight_right.png | 3 - .../navigation/direction_on_ramp_straight.png | 3 - .../assets/navigation/direction_rotary.png | 3 - .../navigation/direction_rotary_left.png | 3 - .../navigation/direction_rotary_right.png | 3 - .../direction_rotary_sharp_left.png | 3 - .../direction_rotary_sharp_right.png | 3 - .../direction_rotary_slight_left.png | 3 - .../direction_rotary_slight_right.png | 3 - .../navigation/direction_rotary_straight.png | 3 - .../navigation/direction_roundabout.png | 3 - .../navigation/direction_roundabout_left.png | 3 - .../navigation/direction_roundabout_right.png | 3 - .../direction_roundabout_sharp_left.png | 3 - .../direction_roundabout_sharp_right.png | 3 - .../direction_roundabout_slight_left.png | 3 - .../direction_roundabout_slight_right.png | 3 - .../direction_roundabout_straight.png | 3 - .../assets/navigation/direction_turn_left.png | 3 - .../direction_turn_left_inactive.png | 3 - .../navigation/direction_turn_right.png | 3 - .../direction_turn_right_inactive.png | 3 - .../navigation/direction_turn_sharp_left.png | 3 - .../navigation/direction_turn_sharp_right.png | 3 - .../navigation/direction_turn_slight_left.png | 3 - .../direction_turn_slight_left_inactive.png | 3 - .../direction_turn_slight_right.png | 3 - .../direction_turn_slight_right_inactive.png | 3 - .../navigation/direction_turn_straight.png | 3 - .../direction_turn_straight_inactive.png | 3 - .../navigation/direction_turn_uturn.png | 3 - .../assets/navigation/direction_updown.png | 3 - selfdrive/assets/navigation/home.png | 3 - selfdrive/assets/navigation/home.svg | 3 - selfdrive/assets/navigation/home_inactive.png | 3 - .../assets/navigation/icon_directions.svg | 3 - .../navigation/icon_directions_outlined.svg | 3 - selfdrive/assets/navigation/icon_favorite.svg | 3 - selfdrive/assets/navigation/icon_home.svg | 3 - selfdrive/assets/navigation/icon_recent.svg | 3 - selfdrive/assets/navigation/icon_settings.svg | 3 - selfdrive/assets/navigation/icon_work.svg | 3 - selfdrive/assets/navigation/work.png | 3 - selfdrive/assets/navigation/work.svg | 3 - selfdrive/assets/navigation/work_inactive.png | 3 - selfdrive/assets/offroad/icon_map.png | 3 - selfdrive/assets/offroad/icon_map_speed.png | 3 - selfdrive/navd/.gitignore | 6 - selfdrive/navd/README.md | 24 -- selfdrive/navd/SConscript | 20 - selfdrive/navd/__init__.py | 0 selfdrive/navd/helpers.py | 189 --------- selfdrive/navd/main.cc | 29 -- selfdrive/navd/map_renderer.cc | 338 --------------- selfdrive/navd/map_renderer.h | 61 --- selfdrive/navd/map_renderer.py | 100 ----- selfdrive/navd/navd.py | 368 ----------------- selfdrive/navd/set_destination.py | 33 -- selfdrive/navd/style.json | 1 - selfdrive/navd/tests/test_map_renderer.py | 212 ---------- selfdrive/navd/tests/test_navd.py | 57 --- selfdrive/test/test_onroad.py | 1 - selfdrive/ui/SConscript | 11 +- selfdrive/ui/qt/home.cc | 20 +- selfdrive/ui/qt/maps/map.cc | 390 ------------------ selfdrive/ui/qt/maps/map.h | 86 ---- selfdrive/ui/qt/maps/map_eta.cc | 59 --- selfdrive/ui/qt/maps/map_eta.h | 23 -- selfdrive/ui/qt/maps/map_helpers.cc | 153 ------- selfdrive/ui/qt/maps/map_helpers.h | 32 -- selfdrive/ui/qt/maps/map_instructions.cc | 144 ------- selfdrive/ui/qt/maps/map_instructions.h | 38 -- selfdrive/ui/qt/maps/map_panel.cc | 43 -- selfdrive/ui/qt/maps/map_panel.h | 21 - selfdrive/ui/qt/maps/map_settings.cc | 385 ----------------- selfdrive/ui/qt/maps/map_settings.h | 102 ----- selfdrive/ui/qt/offroad/settings.cc | 14 - selfdrive/ui/qt/onroad/annotated_camera.cc | 9 - selfdrive/ui/qt/onroad/annotated_camera.h | 2 - selfdrive/ui/qt/onroad/buttons.cc | 15 - selfdrive/ui/qt/onroad/buttons.h | 13 - selfdrive/ui/qt/onroad/onroad_home.cc | 53 --- selfdrive/ui/qt/onroad/onroad_home.h | 1 - selfdrive/ui/qt/widgets/prime.cc | 8 +- selfdrive/ui/qt/widgets/prime.h | 1 - selfdrive/ui/translations/main_ar.ts | 104 +---- selfdrive/ui/translations/main_de.ts | 106 +---- selfdrive/ui/translations/main_fr.ts | 104 +---- selfdrive/ui/translations/main_ja.ts | 104 +---- selfdrive/ui/translations/main_ko.ts | 108 +---- selfdrive/ui/translations/main_pt-BR.ts | 108 +---- selfdrive/ui/translations/main_th.ts | 104 +---- selfdrive/ui/translations/main_tr.ts | 102 +---- selfdrive/ui/translations/main_zh-CHS.ts | 108 +---- selfdrive/ui/translations/main_zh-CHT.ts | 108 +---- selfdrive/ui/ui.cc | 4 + selfdrive/ui/watch3.cc | 1 - system/athena/athenad.py | 13 - system/manager/process_config.py | 1 - third_party/maplibre-native-qt/.gitignore | 1 - third_party/maplibre-native-qt/aarch64 | 1 - third_party/maplibre-native-qt/build.sh | 36 -- .../include/conversion_p.hpp | 241 ----------- .../include/export_core.hpp | 20 - .../include/export_location.hpp | 20 - .../include/export_widgets.hpp | 20 - .../maplibre-native-qt/include/geojson_p.hpp | 30 -- .../maplibre-native-qt/include/gl_widget.hpp | 56 --- .../include/gl_widget_p.hpp | 42 -- .../maplibre-native-qt/include/map.hpp | 205 --------- .../include/map_observer_p.hpp | 54 --- .../maplibre-native-qt/include/map_p.hpp | 79 ---- .../include/map_renderer_p.hpp | 63 --- .../maplibre-native-qt/include/qgeomap.hpp | 54 --- .../maplibre-native-qt/include/qgeomap_p.hpp | 93 ----- .../maplibre-native-qt/include/qmaplibre.hpp | 9 - .../include/qmaplibrewidgets.hpp | 6 - .../include/qt_mapping_engine.hpp | 31 -- .../maplibre-native-qt/include/settings.hpp | 125 ------ .../maplibre-native-qt/include/settings_p.hpp | 57 --- .../include/style_change_utils_p.hpp | 34 -- .../include/texture_node.hpp | 42 -- .../maplibre-native-qt/include/types.hpp | 206 --------- .../maplibre-native-qt/include/utils.hpp | 28 -- .../larch64/include/QMapLibre/Export | 1 - .../larch64/include/QMapLibre/LayerParameter | 1 - .../larch64/include/QMapLibre/Map | 1 - .../larch64/include/QMapLibre/QMapLibre | 1 - .../larch64/include/QMapLibre/Settings | 1 - .../larch64/include/QMapLibre/SourceParameter | 1 - .../larch64/include/QMapLibre/StyleParameter | 1 - .../larch64/include/QMapLibre/Types | 1 - .../larch64/include/QMapLibre/Utils | 1 - .../larch64/lib/libQMapLibre.so | 3 - .../larch64/lib/libQMapLibre.so.3.0.0 | 3 - .../x86_64/include/QMapLibre/Export | 1 - .../x86_64/include/QMapLibre/LayerParameter | 1 - .../x86_64/include/QMapLibre/Map | 1 - .../x86_64/include/QMapLibre/QMapLibre | 1 - .../x86_64/include/QMapLibre/Settings | 1 - .../x86_64/include/QMapLibre/SourceParameter | 1 - .../x86_64/include/QMapLibre/StyleParameter | 1 - .../x86_64/include/QMapLibre/Types | 1 - .../x86_64/include/QMapLibre/Utils | 1 - .../x86_64/lib/libQMapLibre.so | 1 - .../x86_64/lib/libQMapLibre.so.3.0.0 | 3 - tools/sim/README.md | 2 +- 216 files changed, 51 insertions(+), 6044 deletions(-) delete mode 100644 selfdrive/assets/img_map.png delete mode 100644 selfdrive/assets/navigation/default_marker.svg delete mode 100644 selfdrive/assets/navigation/direction_arrive.png delete mode 100644 selfdrive/assets/navigation/direction_arrive_left.png delete mode 100644 selfdrive/assets/navigation/direction_arrive_right.png delete mode 100644 selfdrive/assets/navigation/direction_arrive_straight.png delete mode 100644 selfdrive/assets/navigation/direction_close.png delete mode 100644 selfdrive/assets/navigation/direction_continue.png delete mode 100644 selfdrive/assets/navigation/direction_continue_left.png delete mode 100644 selfdrive/assets/navigation/direction_continue_right.png delete mode 100644 selfdrive/assets/navigation/direction_continue_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_continue_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_continue_straight.png delete mode 100644 selfdrive/assets/navigation/direction_continue_uturn.png delete mode 100644 selfdrive/assets/navigation/direction_depart.png delete mode 100644 selfdrive/assets/navigation/direction_depart_left.png delete mode 100644 selfdrive/assets/navigation/direction_depart_right.png delete mode 100644 selfdrive/assets/navigation/direction_depart_straight.png delete mode 100644 selfdrive/assets/navigation/direction_end_of_road_left.png delete mode 100644 selfdrive/assets/navigation/direction_end_of_road_right.png delete mode 100644 selfdrive/assets/navigation/direction_flag.png delete mode 100644 selfdrive/assets/navigation/direction_fork.png delete mode 100644 selfdrive/assets/navigation/direction_fork_left.png delete mode 100644 selfdrive/assets/navigation/direction_fork_right.png delete mode 100644 selfdrive/assets/navigation/direction_fork_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_fork_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_fork_straight.png delete mode 100644 selfdrive/assets/navigation/direction_invalid.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_left.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_right.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_straight.png delete mode 100644 selfdrive/assets/navigation/direction_invalid_uturn.png delete mode 100644 selfdrive/assets/navigation/direction_merge_left.png delete mode 100644 selfdrive/assets/navigation/direction_merge_right.png delete mode 100644 selfdrive/assets/navigation/direction_merge_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_merge_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_merge_straight.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_left.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_right.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_new_name_straight.png delete mode 100644 selfdrive/assets/navigation/direction_notification_left.png delete mode 100644 selfdrive/assets/navigation/direction_notification_right.png delete mode 100644 selfdrive/assets/navigation/direction_notification_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_notification_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_notification_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_notification_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_notification_straight.png delete mode 100644 selfdrive/assets/navigation/direction_off_ramp_left.png delete mode 100644 selfdrive/assets/navigation/direction_off_ramp_right.png delete mode 100644 selfdrive/assets/navigation/direction_off_ramp_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_off_ramp_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_left.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_right.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_on_ramp_straight.png delete mode 100644 selfdrive/assets/navigation/direction_rotary.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_left.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_right.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_rotary_straight.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_left.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_right.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_roundabout_straight.png delete mode 100644 selfdrive/assets/navigation/direction_turn_left.png delete mode 100644 selfdrive/assets/navigation/direction_turn_left_inactive.png delete mode 100644 selfdrive/assets/navigation/direction_turn_right.png delete mode 100644 selfdrive/assets/navigation/direction_turn_right_inactive.png delete mode 100644 selfdrive/assets/navigation/direction_turn_sharp_left.png delete mode 100644 selfdrive/assets/navigation/direction_turn_sharp_right.png delete mode 100644 selfdrive/assets/navigation/direction_turn_slight_left.png delete mode 100644 selfdrive/assets/navigation/direction_turn_slight_left_inactive.png delete mode 100644 selfdrive/assets/navigation/direction_turn_slight_right.png delete mode 100644 selfdrive/assets/navigation/direction_turn_slight_right_inactive.png delete mode 100644 selfdrive/assets/navigation/direction_turn_straight.png delete mode 100644 selfdrive/assets/navigation/direction_turn_straight_inactive.png delete mode 100644 selfdrive/assets/navigation/direction_turn_uturn.png delete mode 100644 selfdrive/assets/navigation/direction_updown.png delete mode 100644 selfdrive/assets/navigation/home.png delete mode 100644 selfdrive/assets/navigation/home.svg delete mode 100644 selfdrive/assets/navigation/home_inactive.png delete mode 100644 selfdrive/assets/navigation/icon_directions.svg delete mode 100644 selfdrive/assets/navigation/icon_directions_outlined.svg delete mode 100644 selfdrive/assets/navigation/icon_favorite.svg delete mode 100644 selfdrive/assets/navigation/icon_home.svg delete mode 100644 selfdrive/assets/navigation/icon_recent.svg delete mode 100644 selfdrive/assets/navigation/icon_settings.svg delete mode 100644 selfdrive/assets/navigation/icon_work.svg delete mode 100644 selfdrive/assets/navigation/work.png delete mode 100644 selfdrive/assets/navigation/work.svg delete mode 100644 selfdrive/assets/navigation/work_inactive.png delete mode 100644 selfdrive/assets/offroad/icon_map.png delete mode 100644 selfdrive/assets/offroad/icon_map_speed.png delete mode 100644 selfdrive/navd/.gitignore delete mode 100644 selfdrive/navd/README.md delete mode 100644 selfdrive/navd/SConscript delete mode 100644 selfdrive/navd/__init__.py delete mode 100644 selfdrive/navd/helpers.py delete mode 100644 selfdrive/navd/main.cc delete mode 100644 selfdrive/navd/map_renderer.cc delete mode 100644 selfdrive/navd/map_renderer.h delete mode 100755 selfdrive/navd/map_renderer.py delete mode 100755 selfdrive/navd/navd.py delete mode 100755 selfdrive/navd/set_destination.py delete mode 100644 selfdrive/navd/style.json delete mode 100644 selfdrive/navd/tests/test_map_renderer.py delete mode 100644 selfdrive/navd/tests/test_navd.py delete mode 100644 selfdrive/ui/qt/maps/map.cc delete mode 100644 selfdrive/ui/qt/maps/map.h delete mode 100644 selfdrive/ui/qt/maps/map_eta.cc delete mode 100644 selfdrive/ui/qt/maps/map_eta.h delete mode 100644 selfdrive/ui/qt/maps/map_helpers.cc delete mode 100644 selfdrive/ui/qt/maps/map_helpers.h delete mode 100644 selfdrive/ui/qt/maps/map_instructions.cc delete mode 100644 selfdrive/ui/qt/maps/map_instructions.h delete mode 100644 selfdrive/ui/qt/maps/map_panel.cc delete mode 100644 selfdrive/ui/qt/maps/map_panel.h delete mode 100644 selfdrive/ui/qt/maps/map_settings.cc delete mode 100644 selfdrive/ui/qt/maps/map_settings.h delete mode 100644 third_party/maplibre-native-qt/.gitignore delete mode 120000 third_party/maplibre-native-qt/aarch64 delete mode 100755 third_party/maplibre-native-qt/build.sh delete mode 100644 third_party/maplibre-native-qt/include/conversion_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/export_core.hpp delete mode 100644 third_party/maplibre-native-qt/include/export_location.hpp delete mode 100644 third_party/maplibre-native-qt/include/export_widgets.hpp delete mode 100644 third_party/maplibre-native-qt/include/geojson_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/gl_widget.hpp delete mode 100644 third_party/maplibre-native-qt/include/gl_widget_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/map.hpp delete mode 100644 third_party/maplibre-native-qt/include/map_observer_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/map_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/map_renderer_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/qgeomap.hpp delete mode 100644 third_party/maplibre-native-qt/include/qgeomap_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/qmaplibre.hpp delete mode 100644 third_party/maplibre-native-qt/include/qmaplibrewidgets.hpp delete mode 100644 third_party/maplibre-native-qt/include/qt_mapping_engine.hpp delete mode 100644 third_party/maplibre-native-qt/include/settings.hpp delete mode 100644 third_party/maplibre-native-qt/include/settings_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/style_change_utils_p.hpp delete mode 100644 third_party/maplibre-native-qt/include/texture_node.hpp delete mode 100644 third_party/maplibre-native-qt/include/types.hpp delete mode 100644 third_party/maplibre-native-qt/include/utils.hpp delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/Export delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/LayerParameter delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/Map delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/QMapLibre delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/Settings delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/SourceParameter delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/StyleParameter delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/Types delete mode 100644 third_party/maplibre-native-qt/larch64/include/QMapLibre/Utils delete mode 100755 third_party/maplibre-native-qt/larch64/lib/libQMapLibre.so delete mode 100755 third_party/maplibre-native-qt/larch64/lib/libQMapLibre.so.3.0.0 delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/Export delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/LayerParameter delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/Map delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/QMapLibre delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/Settings delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/SourceParameter delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/StyleParameter delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/Types delete mode 100644 third_party/maplibre-native-qt/x86_64/include/QMapLibre/Utils delete mode 120000 third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so delete mode 100755 third_party/maplibre-native-qt/x86_64/lib/libQMapLibre.so.3.0.0 diff --git a/.vscode/launch.json b/.vscode/launch.json index 3b3953c3f4..a6b341d9ea 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,6 @@ "description": "Select the process to debug", "options": [ "selfdrive/controls/controlsd.py", - "selfdrive/navd/navd.py", "system/timed/timed.py", "tools/sim/run_bridge.py" ] diff --git a/SConstruct b/SConstruct index f53d8fb7d0..0c4dbee18e 100644 --- a/SConstruct +++ b/SConstruct @@ -14,8 +14,6 @@ SCons.Warnings.warningAsException(True) TICI = os.path.isfile('/TICI') AGNOS = TICI -UBUNTU_FOCAL = int(subprocess.check_output('[ -f /etc/os-release ] && . /etc/os-release && [ "$ID" = "ubuntu" ] && [ "$VERSION_ID" = "20.04" ] && echo 1 || echo 0', shell=True, encoding='utf-8').rstrip()) -Export('UBUNTU_FOCAL') Decider('MD5-timestamp') @@ -213,8 +211,6 @@ env = Environment( "#cereal", "#msgq", "#opendbc/can", - "#third_party/maplibre-native-qt/include", - f"#third_party/maplibre-native-qt/{arch}/include" ], CC='clang', @@ -279,7 +275,7 @@ Export('envCython') # Qt build environment qt_env = env.Clone() -qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia", "Quick", "Qml", "QuickWidgets", "Location", "Positioning", "DBus", "Xml"] +qt_modules = ["Widgets", "Gui", "Core", "Network", "Concurrent", "Multimedia", "Quick", "Qml", "QuickWidgets", "DBus", "Xml"] qt_libs = [] if arch == "Darwin": @@ -332,8 +328,7 @@ qt_flags = [ "-DQT_MESSAGELOGCONTEXT", ] qt_env['CXXFLAGS'] += qt_flags -qt_env['LIBPATH'] += ['#selfdrive/ui', f"#third_party/maplibre-native-qt/{arch}/lib"] -qt_env['RPATH'] += [Dir(f"#third_party/maplibre-native-qt/{arch}/lib").srcnode().abspath] +qt_env['LIBPATH'] += ['#selfdrive/ui', ] qt_env['LIBS'] = qt_libs if GetOption("clazy"): diff --git a/common/params.cc b/common/params.cc index 2330160173..6e6bba8867 100644 --- a/common/params.cc +++ b/common/params.cc @@ -91,7 +91,6 @@ std::unordered_map keys = { {"AccessToken", CLEAR_ON_MANAGER_START | DONT_LOG}, {"AlwaysOnDM", PERSISTENT}, {"ApiCache_Device", PERSISTENT}, - {"ApiCache_NavDestinations", PERSISTENT}, {"AssistNowToken", PERSISTENT}, {"AthenadPid", PERSISTENT}, {"AthenadUploadQueue", PERSISTENT}, @@ -160,11 +159,6 @@ std::unordered_map keys = { {"LiveParameters", PERSISTENT}, {"LiveTorqueParameters", PERSISTENT | DONT_LOG}, {"LongitudinalPersonality", PERSISTENT}, - {"NavDestination", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, - {"NavDestinationWaypoints", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION}, - {"NavPastDestinations", PERSISTENT}, - {"NavSettingLeftSide", PERSISTENT}, - {"NavSettingTime24h", PERSISTENT}, {"NetworkMetered", PERSISTENT}, {"ObdMultiplexingChanged", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, {"ObdMultiplexingEnabled", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION}, diff --git a/docs/c_docs.rst b/docs/c_docs.rst index 3b89fe9874..0d65423c08 100644 --- a/docs/c_docs.rst +++ b/docs/c_docs.rst @@ -50,8 +50,6 @@ qt "" .. autodoxygenindex:: :project: selfdrive_ui_qt_offroad -.. autodoxygenindex:: - :project: selfdrive_ui_qt_maps proclogd ^^^^^^^^ diff --git a/poetry.lock b/poetry.lock index 58fa7dee66..d81773b9f2 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.3 and should not be changed by hand. [[package]] name = "aiohttp" @@ -2730,7 +2730,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-4.10.0.82.tar.gz", hash = "sha256:dbc021eaa310c4145c47cd648cb973db69bb5780d6e635386cd53d3ea76bd2d5"}, - {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:5f78652339957ec24b80a782becfb32f822d2008a865512121fad8c3ce233e9a"}, {file = "opencv_python-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:e6be19a0615aa8c4e0d34e0c7b133e26e386f4b7e9b557b69479104ab2c133ec"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b49e530f7fd86f671514b39ffacdf5d14ceb073bc79d0de46bbb6b0cad78eaf"}, {file = "opencv_python-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955c5ce8ac90c9e4636ad7f5c0d9c75b80abbe347182cfd09b0e3eec6e50472c"}, @@ -2740,8 +2739,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] [[package]] @@ -2752,7 +2751,6 @@ optional = false python-versions = ">=3.6" files = [ {file = "opencv-python-headless-4.10.0.82.tar.gz", hash = "sha256:de9e742c1b9540816fbd115b0b03841d41ed0c65566b0d7a5371f98b131b7e6d"}, - {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:a09ed50ba21cc5bf5d436cb0e784ad09c692d6b1d1454252772f6c8f2c7b4088"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-macosx_12_0_x86_64.whl", hash = "sha256:977a5fd21e1fe0d3d2134887db4441f8725abeae95150126302f31fcd9f548fa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db4ec6755838b0be12510bfc9ffb014779c612418f11f4f7e6f505c36124a3aa"}, {file = "opencv_python_headless-4.10.0.82-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10a37fa5276967ecf6eb297295b16b28b7a2eb3b568ca0ee469fb1a5954de298"}, @@ -2762,8 +2760,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.5", markers = "python_version >= \"3.11\" and python_version < \"3.12\""}, ] [[package]] @@ -2927,8 +2925,8 @@ files = [ [package.dependencies] numpy = [ - {version = ">=1.23.2", markers = "python_version == \"3.11\""}, {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -3090,21 +3088,6 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] -[[package]] -name = "polyline" -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.2-py3-none-any.whl", hash = "sha256:389655c893bdabf2863c6aaa49490cf83dcdcec86ae715f67044ee98be57bef5"}, - {file = "polyline-2.0.2.tar.gz", hash = "sha256:10541e759c5fd51f746ee304e9af94744089a4055b6257b293b3afd1df64e369"}, -] - -[package.extras] -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]] name = "portalocker" version = "2.8.2" @@ -8114,4 +8097,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = ">=3.11, <3.13" -content-hash = "32df734a6ad6ad6a665c94c41cd0e3643a48174904faaf6f21c5c84f350f3cec" +content-hash = "163f468ff6cad9a08ccf51dfad6ef024ecc0037a0fbbcdbf2fb3b4e95ac3e744" diff --git a/pyproject.toml b/pyproject.toml index 374b0f46ca..1aa20b5b8e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,7 +25,6 @@ testpaths = [ "selfdrive/controls", "selfdrive/locationd", "selfdrive/monitoring", - "selfdrive/navd/tests", "selfdrive/test/longitudinal_maneuvers", "selfdrive/test/process_replay/test_fuzzy.py", "system/updated", @@ -183,7 +182,6 @@ natsort = "*" opencv-python-headless = "*" parameterized = "^0.8" #pprofile = "*" -polyline = "*" pyautogui = "*" pygame = "*" pyopencl = { version = "*", markers = "platform_machine != 'aarch64'" } # broken on arm64 diff --git a/selfdrive/SConscript b/selfdrive/SConscript index 52898f758f..0b49e69116 100644 --- a/selfdrive/SConscript +++ b/selfdrive/SConscript @@ -2,6 +2,5 @@ SConscript(['pandad/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/assets/img_map.png b/selfdrive/assets/img_map.png deleted file mode 100644 index a8646491d7..0000000000 --- a/selfdrive/assets/img_map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4a197665ae2a7fc05109903474d513379711f7b7f555c4148ca99d589c95baf7 -size 31990 diff --git a/selfdrive/assets/navigation/default_marker.svg b/selfdrive/assets/navigation/default_marker.svg deleted file mode 100644 index 4b11ee7623..0000000000 --- a/selfdrive/assets/navigation/default_marker.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a950b541c4e676475e3571aaa806060c3309c7f44b08a59f1ada19881b42493d -size 389 diff --git a/selfdrive/assets/navigation/direction_arrive.png b/selfdrive/assets/navigation/direction_arrive.png deleted file mode 100644 index f8c5bdc2d8..0000000000 --- a/selfdrive/assets/navigation/direction_arrive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae17f4c1896c88a6d520f1acdca99ab23d4ce1140a500b64bea3185041f8ecd9 -size 1246 diff --git a/selfdrive/assets/navigation/direction_arrive_left.png b/selfdrive/assets/navigation/direction_arrive_left.png deleted file mode 100644 index 6f59ab3711..0000000000 --- a/selfdrive/assets/navigation/direction_arrive_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:86a2eaf6070d6b93df385945bd7f4a6e9bb78b7cc42eb5b7ef9a9b6c075c80ce -size 1581 diff --git a/selfdrive/assets/navigation/direction_arrive_right.png b/selfdrive/assets/navigation/direction_arrive_right.png deleted file mode 100644 index 318e041339..0000000000 --- a/selfdrive/assets/navigation/direction_arrive_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:398f30c89e396bb4bdbac1ba6dfe292f6e3278923e14113e705f4d0591671f32 -size 1528 diff --git a/selfdrive/assets/navigation/direction_arrive_straight.png b/selfdrive/assets/navigation/direction_arrive_straight.png deleted file mode 100644 index f8c5bdc2d8..0000000000 --- a/selfdrive/assets/navigation/direction_arrive_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ae17f4c1896c88a6d520f1acdca99ab23d4ce1140a500b64bea3185041f8ecd9 -size 1246 diff --git a/selfdrive/assets/navigation/direction_close.png b/selfdrive/assets/navigation/direction_close.png deleted file mode 100644 index 0e9e478d45..0000000000 --- a/selfdrive/assets/navigation/direction_close.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e23cac9bec0de20f9632d19618be9b05eedb010c6e23b0ba7a8e3cc8225f64e -size 865 diff --git a/selfdrive/assets/navigation/direction_continue.png b/selfdrive/assets/navigation/direction_continue.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_continue.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_continue_left.png b/selfdrive/assets/navigation/direction_continue_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_continue_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_continue_right.png b/selfdrive/assets/navigation/direction_continue_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_continue_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_continue_slight_left.png b/selfdrive/assets/navigation/direction_continue_slight_left.png deleted file mode 100644 index 29f4440460..0000000000 --- a/selfdrive/assets/navigation/direction_continue_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c -size 1334 diff --git a/selfdrive/assets/navigation/direction_continue_slight_right.png b/selfdrive/assets/navigation/direction_continue_slight_right.png deleted file mode 100644 index 755935b84c..0000000000 --- a/selfdrive/assets/navigation/direction_continue_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106 -size 1347 diff --git a/selfdrive/assets/navigation/direction_continue_straight.png b/selfdrive/assets/navigation/direction_continue_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_continue_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_continue_uturn.png b/selfdrive/assets/navigation/direction_continue_uturn.png deleted file mode 100644 index ff9d97893f..0000000000 --- a/selfdrive/assets/navigation/direction_continue_uturn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9 -size 1780 diff --git a/selfdrive/assets/navigation/direction_depart.png b/selfdrive/assets/navigation/direction_depart.png deleted file mode 100644 index aa4e4f7115..0000000000 --- a/selfdrive/assets/navigation/direction_depart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f83214c1fa6aba33ca3e1fe29db09733a275efe19864866b9edecbb59abb171 -size 1234 diff --git a/selfdrive/assets/navigation/direction_depart_left.png b/selfdrive/assets/navigation/direction_depart_left.png deleted file mode 100644 index 76937eb5d3..0000000000 --- a/selfdrive/assets/navigation/direction_depart_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:459fe6410e061542876fa7de93efaf901d15937f891e801e1b93f8270e750130 -size 1613 diff --git a/selfdrive/assets/navigation/direction_depart_right.png b/selfdrive/assets/navigation/direction_depart_right.png deleted file mode 100644 index 149626b171..0000000000 --- a/selfdrive/assets/navigation/direction_depart_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e3f5fb80d62c92876a5e490917f549e2a443dfc683a6787506747bbbeb75d33b -size 1538 diff --git a/selfdrive/assets/navigation/direction_depart_straight.png b/selfdrive/assets/navigation/direction_depart_straight.png deleted file mode 100644 index aa4e4f7115..0000000000 --- a/selfdrive/assets/navigation/direction_depart_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8f83214c1fa6aba33ca3e1fe29db09733a275efe19864866b9edecbb59abb171 -size 1234 diff --git a/selfdrive/assets/navigation/direction_end_of_road_left.png b/selfdrive/assets/navigation/direction_end_of_road_left.png deleted file mode 100644 index 32a602bdef..0000000000 --- a/selfdrive/assets/navigation/direction_end_of_road_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b9c86ddd75ea1ed2c49c1bdc2e7f98ed15d12226938073688dda1b0bbdf62308 -size 1439 diff --git a/selfdrive/assets/navigation/direction_end_of_road_right.png b/selfdrive/assets/navigation/direction_end_of_road_right.png deleted file mode 100644 index 68915cee25..0000000000 --- a/selfdrive/assets/navigation/direction_end_of_road_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc7248e62d11cf36f9a13d408a0954a51ff0eee9b8e03d8910a2eb2cb6a09ffd -size 1456 diff --git a/selfdrive/assets/navigation/direction_flag.png b/selfdrive/assets/navigation/direction_flag.png deleted file mode 100644 index 26e8a220f2..0000000000 --- a/selfdrive/assets/navigation/direction_flag.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8509bd5dbf96e44f73421dc09ca8f7c1dddf2dc21f3b4b15650472b3e06b3470 -size 658 diff --git a/selfdrive/assets/navigation/direction_fork.png b/selfdrive/assets/navigation/direction_fork.png deleted file mode 100644 index c3019a5991..0000000000 --- a/selfdrive/assets/navigation/direction_fork.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5198a3fdb610001358501ca76ab52fe0979b9254ed85cbbb2ce1fab1cb77929a -size 2015 diff --git a/selfdrive/assets/navigation/direction_fork_left.png b/selfdrive/assets/navigation/direction_fork_left.png deleted file mode 100644 index a847257e9b..0000000000 --- a/selfdrive/assets/navigation/direction_fork_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:752424da0ad8430c619045455a86c640b576f8bbe6d3d8b5b6a599b1c61ef489 -size 1863 diff --git a/selfdrive/assets/navigation/direction_fork_right.png b/selfdrive/assets/navigation/direction_fork_right.png deleted file mode 100644 index 102ddf753c..0000000000 --- a/selfdrive/assets/navigation/direction_fork_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6590df8da1f30ec61b3bdf729fda1956d340c5abab448ea0062105500cc5da5 -size 1841 diff --git a/selfdrive/assets/navigation/direction_fork_slight_left.png b/selfdrive/assets/navigation/direction_fork_slight_left.png deleted file mode 100644 index 945ef744e0..0000000000 --- a/selfdrive/assets/navigation/direction_fork_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b4fbd63acf8f5e7f734b332a96e9ad138ad22ee07000ad425712e71b77ce0728 -size 1800 diff --git a/selfdrive/assets/navigation/direction_fork_slight_right.png b/selfdrive/assets/navigation/direction_fork_slight_right.png deleted file mode 100644 index 65db839df9..0000000000 --- a/selfdrive/assets/navigation/direction_fork_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7a7f5bcab30ce961ff7e345c460cfbd133e45c66da1fe1f0e7bc7c826b05f30 -size 1805 diff --git a/selfdrive/assets/navigation/direction_fork_straight.png b/selfdrive/assets/navigation/direction_fork_straight.png deleted file mode 100644 index 74528d230c..0000000000 --- a/selfdrive/assets/navigation/direction_fork_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:676cbe95f9a663816dd77c55dbcf2c346bfae2454be7832914b5527219aba91f -size 2473 diff --git a/selfdrive/assets/navigation/direction_invalid.png b/selfdrive/assets/navigation/direction_invalid.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_invalid.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_invalid_left.png b/selfdrive/assets/navigation/direction_invalid_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_invalid_right.png b/selfdrive/assets/navigation/direction_invalid_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_invalid_slight_left.png b/selfdrive/assets/navigation/direction_invalid_slight_left.png deleted file mode 100644 index 29f4440460..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c -size 1334 diff --git a/selfdrive/assets/navigation/direction_invalid_slight_right.png b/selfdrive/assets/navigation/direction_invalid_slight_right.png deleted file mode 100644 index 755935b84c..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106 -size 1347 diff --git a/selfdrive/assets/navigation/direction_invalid_straight.png b/selfdrive/assets/navigation/direction_invalid_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_invalid_uturn.png b/selfdrive/assets/navigation/direction_invalid_uturn.png deleted file mode 100644 index ff9d97893f..0000000000 --- a/selfdrive/assets/navigation/direction_invalid_uturn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9 -size 1780 diff --git a/selfdrive/assets/navigation/direction_merge_left.png b/selfdrive/assets/navigation/direction_merge_left.png deleted file mode 100644 index 7812f9eb94..0000000000 --- a/selfdrive/assets/navigation/direction_merge_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:08245891301f814fc0245133e39df3fb14720025cc3e4bc7131f953ead47edc8 -size 1535 diff --git a/selfdrive/assets/navigation/direction_merge_right.png b/selfdrive/assets/navigation/direction_merge_right.png deleted file mode 100644 index 3c44c8fc75..0000000000 --- a/selfdrive/assets/navigation/direction_merge_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8c629c7273fe2613538295aba807edfddbbae86ae77d6f9b0b60b0486e3f7ca9 -size 1484 diff --git a/selfdrive/assets/navigation/direction_merge_slight_left.png b/selfdrive/assets/navigation/direction_merge_slight_left.png deleted file mode 100644 index 756fb01853..0000000000 --- a/selfdrive/assets/navigation/direction_merge_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:72c1ef39486f3dc3f7a0a97777bce16c7c369cc85bf6c82629d6780803804967 -size 1765 diff --git a/selfdrive/assets/navigation/direction_merge_slight_right.png b/selfdrive/assets/navigation/direction_merge_slight_right.png deleted file mode 100644 index b8d42b741f..0000000000 --- a/selfdrive/assets/navigation/direction_merge_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b8bfd8019320127ed0fe03d4a1bddab57d5c2345b6cdeab66558ea9b53c0266 -size 1699 diff --git a/selfdrive/assets/navigation/direction_merge_straight.png b/selfdrive/assets/navigation/direction_merge_straight.png deleted file mode 100644 index 60035c1f01..0000000000 --- a/selfdrive/assets/navigation/direction_merge_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d10bdde82e7896de072de28da46412d5e2f6c902fd5643c6b48a8fc79ed4232f -size 113 diff --git a/selfdrive/assets/navigation/direction_new_name_left.png b/selfdrive/assets/navigation/direction_new_name_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_new_name_right.png b/selfdrive/assets/navigation/direction_new_name_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_left.png b/selfdrive/assets/navigation/direction_new_name_sharp_left.png deleted file mode 100644 index ae1f3741ef..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0457b0597386d0b7d3cc06d961df5fb34211ee575da7fab2f81e424d9954bb42 -size 1549 diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_right.png b/selfdrive/assets/navigation/direction_new_name_sharp_right.png deleted file mode 100644 index 0d8cd3ed53..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f6e1556f0b888afb6856f8cf3e16632959190f88dd66c4d9db4832a8269cbc5 -size 1552 diff --git a/selfdrive/assets/navigation/direction_new_name_slight_left.png b/selfdrive/assets/navigation/direction_new_name_slight_left.png deleted file mode 100644 index 29f4440460..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c -size 1334 diff --git a/selfdrive/assets/navigation/direction_new_name_slight_right.png b/selfdrive/assets/navigation/direction_new_name_slight_right.png deleted file mode 100644 index 755935b84c..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106 -size 1347 diff --git a/selfdrive/assets/navigation/direction_new_name_straight.png b/selfdrive/assets/navigation/direction_new_name_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_new_name_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_notification_left.png b/selfdrive/assets/navigation/direction_notification_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_notification_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_notification_right.png b/selfdrive/assets/navigation/direction_notification_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_notification_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_notification_sharp_left.png b/selfdrive/assets/navigation/direction_notification_sharp_left.png deleted file mode 100644 index d2f1d491a0..0000000000 --- a/selfdrive/assets/navigation/direction_notification_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f2016b7bac3accf541f100a2c83871618214e1806e95e4d80867d30d1dfcf03 -size 1546 diff --git a/selfdrive/assets/navigation/direction_notification_sharp_right.png b/selfdrive/assets/navigation/direction_notification_sharp_right.png deleted file mode 100644 index f338742e58..0000000000 --- a/selfdrive/assets/navigation/direction_notification_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7 -size 1551 diff --git a/selfdrive/assets/navigation/direction_notification_slight_left.png b/selfdrive/assets/navigation/direction_notification_slight_left.png deleted file mode 100644 index 29f4440460..0000000000 --- a/selfdrive/assets/navigation/direction_notification_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c -size 1334 diff --git a/selfdrive/assets/navigation/direction_notification_slight_right.png b/selfdrive/assets/navigation/direction_notification_slight_right.png deleted file mode 100644 index 755935b84c..0000000000 --- a/selfdrive/assets/navigation/direction_notification_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106 -size 1347 diff --git a/selfdrive/assets/navigation/direction_notification_straight.png b/selfdrive/assets/navigation/direction_notification_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_notification_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_off_ramp_left.png b/selfdrive/assets/navigation/direction_off_ramp_left.png deleted file mode 100644 index d01bb4fce3..0000000000 --- a/selfdrive/assets/navigation/direction_off_ramp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6736b6c2123cbaf90d2c8e4da79a4089ba42c0e7a220a596e45afd511166da9b -size 1524 diff --git a/selfdrive/assets/navigation/direction_off_ramp_right.png b/selfdrive/assets/navigation/direction_off_ramp_right.png deleted file mode 100644 index 013ec5a4c9..0000000000 --- a/selfdrive/assets/navigation/direction_off_ramp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6a636d33568c658b05e460e05a1eac5c4e1cfced204044657a04191027c44c4c -size 1580 diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_left.png b/selfdrive/assets/navigation/direction_off_ramp_slight_left.png deleted file mode 100644 index 39497c8d41..0000000000 --- a/selfdrive/assets/navigation/direction_off_ramp_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a27d55d704f77bca4beaac30a2c5b5abee304986627d09f971b2a2e0367e8477 -size 1478 diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_right.png b/selfdrive/assets/navigation/direction_off_ramp_slight_right.png deleted file mode 100644 index a68d28d674..0000000000 --- a/selfdrive/assets/navigation/direction_off_ramp_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e711c8e2184440f4ddead06897c90758470e7475fa7e0cf8b2db567e491c8e57 -size 1519 diff --git a/selfdrive/assets/navigation/direction_on_ramp_left.png b/selfdrive/assets/navigation/direction_on_ramp_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_on_ramp_right.png b/selfdrive/assets/navigation/direction_on_ramp_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png deleted file mode 100644 index ae1f3741ef..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0457b0597386d0b7d3cc06d961df5fb34211ee575da7fab2f81e424d9954bb42 -size 1549 diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png deleted file mode 100644 index f338742e58..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7 -size 1551 diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_left.png b/selfdrive/assets/navigation/direction_on_ramp_slight_left.png deleted file mode 100644 index e640fe3404..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b2f19864347794510da5e13ebaed40cc01d45bbd649c3e5097052607af52fa7 -size 1334 diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_right.png b/selfdrive/assets/navigation/direction_on_ramp_slight_right.png deleted file mode 100644 index d309f2d14e..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d2704d4d480568deb63598a48b741b024f4e55f5936e3eeb9cdc3daf6618837 -size 1346 diff --git a/selfdrive/assets/navigation/direction_on_ramp_straight.png b/selfdrive/assets/navigation/direction_on_ramp_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_on_ramp_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_rotary.png b/selfdrive/assets/navigation/direction_rotary.png deleted file mode 100644 index 20b4052015..0000000000 --- a/selfdrive/assets/navigation/direction_rotary.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1868ec727cd761aad76fb6cb7705360ed9f70a92aea97f4c3b945b043996d1e2 -size 1906 diff --git a/selfdrive/assets/navigation/direction_rotary_left.png b/selfdrive/assets/navigation/direction_rotary_left.png deleted file mode 100644 index f610501286..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2d41ab080452ce24ce27ed833f24790a6e6218dc4a5df4b35d23d6cfc425fbb -size 1543 diff --git a/selfdrive/assets/navigation/direction_rotary_right.png b/selfdrive/assets/navigation/direction_rotary_right.png deleted file mode 100644 index 9b8ea37ddf..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94251b2485f1f8bd0b22eb32fd59459626229c38e4de9aa538ff249b3cc16505 -size 1743 diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_left.png b/selfdrive/assets/navigation/direction_rotary_sharp_left.png deleted file mode 100644 index cbc0882791..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6fbc14fb3720b7452c34c64af8c9b6ce4c953a5e65f3b28ad1ed17b5b2bc47f0 -size 1532 diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_right.png b/selfdrive/assets/navigation/direction_rotary_sharp_right.png deleted file mode 100644 index c7d4ba3175..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe99a15432706ac8bdd5766d3ed4869042b50e0d3c54665b63ba8eb2aaaef20 -size 1855 diff --git a/selfdrive/assets/navigation/direction_rotary_slight_left.png b/selfdrive/assets/navigation/direction_rotary_slight_left.png deleted file mode 100644 index 9b5912030b..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:45115d7c0d4a6285406777787b19b5f6f9c8231ba773aaaa86ab62b7f94b1c51 -size 1699 diff --git a/selfdrive/assets/navigation/direction_rotary_slight_right.png b/selfdrive/assets/navigation/direction_rotary_slight_right.png deleted file mode 100644 index bc5e6b0d2e..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ea0a56d30f763f69ba1c5051f05eac13e61a715ae4d80412b1e0570f3263e27 -size 1821 diff --git a/selfdrive/assets/navigation/direction_rotary_straight.png b/selfdrive/assets/navigation/direction_rotary_straight.png deleted file mode 100644 index ac4eec685e..0000000000 --- a/selfdrive/assets/navigation/direction_rotary_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77c42dadeda4d9fdc5b8e7915319880908dd61acb46e289e88f8e067b8e57410 -size 1736 diff --git a/selfdrive/assets/navigation/direction_roundabout.png b/selfdrive/assets/navigation/direction_roundabout.png deleted file mode 100644 index 20b4052015..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1868ec727cd761aad76fb6cb7705360ed9f70a92aea97f4c3b945b043996d1e2 -size 1906 diff --git a/selfdrive/assets/navigation/direction_roundabout_left.png b/selfdrive/assets/navigation/direction_roundabout_left.png deleted file mode 100644 index f610501286..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b2d41ab080452ce24ce27ed833f24790a6e6218dc4a5df4b35d23d6cfc425fbb -size 1543 diff --git a/selfdrive/assets/navigation/direction_roundabout_right.png b/selfdrive/assets/navigation/direction_roundabout_right.png deleted file mode 100644 index 9b8ea37ddf..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94251b2485f1f8bd0b22eb32fd59459626229c38e4de9aa538ff249b3cc16505 -size 1743 diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_left.png b/selfdrive/assets/navigation/direction_roundabout_sharp_left.png deleted file mode 100644 index 204586589d..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e7423462cc52bf5d97b6d2e05626f8066a6580b03922bc35589690b15d04a222 -size 1532 diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_right.png b/selfdrive/assets/navigation/direction_roundabout_sharp_right.png deleted file mode 100644 index c7d4ba3175..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0fe99a15432706ac8bdd5766d3ed4869042b50e0d3c54665b63ba8eb2aaaef20 -size 1855 diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_left.png b/selfdrive/assets/navigation/direction_roundabout_slight_left.png deleted file mode 100644 index d8b806137c..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2b6cdda3bc23add330fa03095fc46251dbe2516f974d4ae44c321d87dc662d54 -size 1702 diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_right.png b/selfdrive/assets/navigation/direction_roundabout_slight_right.png deleted file mode 100644 index bc5e6b0d2e..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ea0a56d30f763f69ba1c5051f05eac13e61a715ae4d80412b1e0570f3263e27 -size 1821 diff --git a/selfdrive/assets/navigation/direction_roundabout_straight.png b/selfdrive/assets/navigation/direction_roundabout_straight.png deleted file mode 100644 index ac4eec685e..0000000000 --- a/selfdrive/assets/navigation/direction_roundabout_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:77c42dadeda4d9fdc5b8e7915319880908dd61acb46e289e88f8e067b8e57410 -size 1736 diff --git a/selfdrive/assets/navigation/direction_turn_left.png b/selfdrive/assets/navigation/direction_turn_left.png deleted file mode 100644 index 438532ee29..0000000000 --- a/selfdrive/assets/navigation/direction_turn_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:579d6a27e062779d41beb9320abf5797bc8ec81de1f355a4197c3b3ee0766f28 -size 1400 diff --git a/selfdrive/assets/navigation/direction_turn_left_inactive.png b/selfdrive/assets/navigation/direction_turn_left_inactive.png deleted file mode 100644 index 7f461a1967..0000000000 --- a/selfdrive/assets/navigation/direction_turn_left_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5229d184ca31e027d8c8d493b7d02a34c8097348aab97e10adc7fd78acf6a7fc -size 7221 diff --git a/selfdrive/assets/navigation/direction_turn_right.png b/selfdrive/assets/navigation/direction_turn_right.png deleted file mode 100644 index 4ee7ebc3b4..0000000000 --- a/selfdrive/assets/navigation/direction_turn_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a4010c8122af918dbdb50e88629adbf79f7733f022bba263e6f44f6ffae3e7a5 -size 1371 diff --git a/selfdrive/assets/navigation/direction_turn_right_inactive.png b/selfdrive/assets/navigation/direction_turn_right_inactive.png deleted file mode 100644 index bc0a98dccf..0000000000 --- a/selfdrive/assets/navigation/direction_turn_right_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc6c17196f0e345e7c79b60faadd931755b3d1572125557ff263247e7b3a0b4b -size 7239 diff --git a/selfdrive/assets/navigation/direction_turn_sharp_left.png b/selfdrive/assets/navigation/direction_turn_sharp_left.png deleted file mode 100644 index d2f1d491a0..0000000000 --- a/selfdrive/assets/navigation/direction_turn_sharp_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4f2016b7bac3accf541f100a2c83871618214e1806e95e4d80867d30d1dfcf03 -size 1546 diff --git a/selfdrive/assets/navigation/direction_turn_sharp_right.png b/selfdrive/assets/navigation/direction_turn_sharp_right.png deleted file mode 100644 index f338742e58..0000000000 --- a/selfdrive/assets/navigation/direction_turn_sharp_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57dbfdabe88f6abbb8993982eef72803ac504842e9a9d388e7dde1623f69f0d7 -size 1551 diff --git a/selfdrive/assets/navigation/direction_turn_slight_left.png b/selfdrive/assets/navigation/direction_turn_slight_left.png deleted file mode 100644 index 29f4440460..0000000000 --- a/selfdrive/assets/navigation/direction_turn_slight_left.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89041889817454869d98adfb5a16fae33596c038d5484ec734fe3a5cc532c45c -size 1334 diff --git a/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png b/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png deleted file mode 100644 index 7c970ebb81..0000000000 --- a/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5ce2ea01f9ed172048c86b93e0ebfa8f468473de49be92ad200fb54d688434cb -size 3696 diff --git a/selfdrive/assets/navigation/direction_turn_slight_right.png b/selfdrive/assets/navigation/direction_turn_slight_right.png deleted file mode 100644 index 755935b84c..0000000000 --- a/selfdrive/assets/navigation/direction_turn_slight_right.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e691dd43947c9430fcd73e6bede94aa5fd8995e9303eba53cc0ac589a7c9f106 -size 1347 diff --git a/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png b/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png deleted file mode 100644 index 15611decaa..0000000000 --- a/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c1a3d5ee5f493093848b0b5f09e3572bf3cb8a6f79907fcb1b1bd4d690bc634 -size 3743 diff --git a/selfdrive/assets/navigation/direction_turn_straight.png b/selfdrive/assets/navigation/direction_turn_straight.png deleted file mode 100644 index ce2c42c43d..0000000000 --- a/selfdrive/assets/navigation/direction_turn_straight.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:008cf037b8713c710eacd1129973119faa2527ab1c19aee5340a16dc0659df8a -size 1063 diff --git a/selfdrive/assets/navigation/direction_turn_straight_inactive.png b/selfdrive/assets/navigation/direction_turn_straight_inactive.png deleted file mode 100644 index d864e58bd9..0000000000 --- a/selfdrive/assets/navigation/direction_turn_straight_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2cd32abafe04c8f79d3249a79a32473102ddab7770cb8be29d51b2743869fdaa -size 5452 diff --git a/selfdrive/assets/navigation/direction_turn_uturn.png b/selfdrive/assets/navigation/direction_turn_uturn.png deleted file mode 100644 index ff9d97893f..0000000000 --- a/selfdrive/assets/navigation/direction_turn_uturn.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e02ac2720f12f9373ae2d86d91fffb6203e18aba04b493bd6f41d2953a11cbc9 -size 1780 diff --git a/selfdrive/assets/navigation/direction_updown.png b/selfdrive/assets/navigation/direction_updown.png deleted file mode 100644 index 3c9e3fe22e..0000000000 --- a/selfdrive/assets/navigation/direction_updown.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41adb4c64ca3cecf2f6de7dcca8826980369995959ad0eb3d7ec584bbac9b4a6 -size 1327 diff --git a/selfdrive/assets/navigation/home.png b/selfdrive/assets/navigation/home.png deleted file mode 100644 index 321cef4163..0000000000 --- a/selfdrive/assets/navigation/home.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e2fcc5b07c69bb71506257a37d0fd6abe3bd53892f34d6600a3a09795174da5 -size 6128 diff --git a/selfdrive/assets/navigation/home.svg b/selfdrive/assets/navigation/home.svg deleted file mode 100644 index 9d9c60da39..0000000000 --- a/selfdrive/assets/navigation/home.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:62f1548c61503d8fdb03592413c38204834d52b30b6fb18d1a9982229616a97e -size 2713 diff --git a/selfdrive/assets/navigation/home_inactive.png b/selfdrive/assets/navigation/home_inactive.png deleted file mode 100644 index 9ffaf2b87b..0000000000 --- a/selfdrive/assets/navigation/home_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d5dc1f7709720d51911e1c2bd61a6bed9fe30c48807b9f26f542e280c54c1a74 -size 9165 diff --git a/selfdrive/assets/navigation/icon_directions.svg b/selfdrive/assets/navigation/icon_directions.svg deleted file mode 100644 index c36e27316e..0000000000 --- a/selfdrive/assets/navigation/icon_directions.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:935cd01600d56350cda1941cf382c7c86cd959fa7a0a574bdba8b3011a350578 -size 466 diff --git a/selfdrive/assets/navigation/icon_directions_outlined.svg b/selfdrive/assets/navigation/icon_directions_outlined.svg deleted file mode 100644 index 356a1e7456..0000000000 --- a/selfdrive/assets/navigation/icon_directions_outlined.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0e5f0b26a56397872f8ac6085a18b666fba4cdf01299f73d704cb29b22c64606 -size 780 diff --git a/selfdrive/assets/navigation/icon_favorite.svg b/selfdrive/assets/navigation/icon_favorite.svg deleted file mode 100644 index 0eb0e43688..0000000000 --- a/selfdrive/assets/navigation/icon_favorite.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff184bf0239c54060ffbaf465573f17cbc92bd8d3d38ce10e1bd02cdd2b21575 -size 315 diff --git a/selfdrive/assets/navigation/icon_home.svg b/selfdrive/assets/navigation/icon_home.svg deleted file mode 100644 index ca90cc7bf6..0000000000 --- a/selfdrive/assets/navigation/icon_home.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1673f8d46251a05787b60346193852991739345506dc7e9b106dfb370d3611ed -size 489 diff --git a/selfdrive/assets/navigation/icon_recent.svg b/selfdrive/assets/navigation/icon_recent.svg deleted file mode 100644 index 76b5a620b1..0000000000 --- a/selfdrive/assets/navigation/icon_recent.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5fbce167d2005d08e8bc2113e0a9d5d3e2ed113db8e2a020df1ee14633cd3eed -size 1279 diff --git a/selfdrive/assets/navigation/icon_settings.svg b/selfdrive/assets/navigation/icon_settings.svg deleted file mode 100644 index 3fd31459c3..0000000000 --- a/selfdrive/assets/navigation/icon_settings.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1fa72d94b5e05884129dd502babd5de78666c349bb5d12e19872fdbc9fe2100e -size 910 diff --git a/selfdrive/assets/navigation/icon_work.svg b/selfdrive/assets/navigation/icon_work.svg deleted file mode 100644 index dc18914a39..0000000000 --- a/selfdrive/assets/navigation/icon_work.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7ea949d3b66896ac3404d20aea9445a5cd00fefd18623f1c7160293a1de5f807 -size 364 diff --git a/selfdrive/assets/navigation/work.png b/selfdrive/assets/navigation/work.png deleted file mode 100644 index 589087a8aa..0000000000 --- a/selfdrive/assets/navigation/work.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:49aef21620a5d2666c87975b28c6eb1cc8e613c80e504d97f5278cde25872c9d -size 5570 diff --git a/selfdrive/assets/navigation/work.svg b/selfdrive/assets/navigation/work.svg deleted file mode 100644 index 0f6a9ba65b..0000000000 --- a/selfdrive/assets/navigation/work.svg +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d2495943fec4ab00b1df5e4e6227bbec45ec57b19b25be561d616292316212f8 -size 2188 diff --git a/selfdrive/assets/navigation/work_inactive.png b/selfdrive/assets/navigation/work_inactive.png deleted file mode 100644 index c1ce69b004..0000000000 --- a/selfdrive/assets/navigation/work_inactive.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:93e6a2b405bbbdf48d54fc7c37612430f6688cf8541ee59b984d6add3b8f02a7 -size 8446 diff --git a/selfdrive/assets/offroad/icon_map.png b/selfdrive/assets/offroad/icon_map.png deleted file mode 100644 index 82c0236a48..0000000000 --- a/selfdrive/assets/offroad/icon_map.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57a92adcf88c7223b07697f8c2b315f4f4a34b32a866284610d5250144863c6f -size 28235 diff --git a/selfdrive/assets/offroad/icon_map_speed.png b/selfdrive/assets/offroad/icon_map_speed.png deleted file mode 100644 index 4ed1de314b..0000000000 --- a/selfdrive/assets/offroad/icon_map_speed.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e950f121f7ed564b149dd430527c8f0ef976b6d9af66a61fb7b5ebaf7170185 -size 29822 diff --git a/selfdrive/navd/.gitignore b/selfdrive/navd/.gitignore deleted file mode 100644 index 4801d60a2c..0000000000 --- a/selfdrive/navd/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -moc_* -*.moc - -mapsd -map_renderer -libmap_renderer.so diff --git a/selfdrive/navd/README.md b/selfdrive/navd/README.md deleted file mode 100644 index 81de8ae39f..0000000000 --- a/selfdrive/navd/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# navigation - -This directory contains two daemons, `navd` and `mapsd`, which support navigation in the openpilot stack. - -### navd - -`navd` takes in a route through the `NavDestination` param and sends out two packets: `navRoute` and `navInstruction`. These packets contain the coordinates of the planned route and turn-by-turn instructions. - -### map renderer - -The map renderer listens for the `navRoute` and publishes a simplified rendered map view over VisionIPC. The rendered maps look like this: - -![](https://i.imgur.com/oZLfmwq.png) - -## development - -Currently, [mapbox](https://www.mapbox.com/) is used for navigation. - -* get an API token: https://docs.mapbox.com/help/glossary/access-token/ -* set an API token using the `MAPBOX_TOKEN` environment variable -* routes/destinations are set through the `NavDestination` param - * use `set_destination.py` for debugging -* edit the map: https://www.mapbox.com/contribute -* mapbox API playground: https://docs.mapbox.com/playground/ diff --git a/selfdrive/navd/SConscript b/selfdrive/navd/SConscript deleted file mode 100644 index 378e762494..0000000000 --- a/selfdrive/navd/SConscript +++ /dev/null @@ -1,20 +0,0 @@ -Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations', 'UBUNTU_FOCAL') - -map_env = qt_env.Clone() -libs = ['qt_widgets', 'qt_util', 'QMapLibre', common, messaging, visionipc, transformations, - 'm', 'OpenCL', 'ssl', 'crypto', 'pthread', 'json11'] + map_env["LIBS"] -if arch == 'larch64': - libs.append(':libEGL_mesa.so.0') - -if arch in ['larch64', 'aarch64', 'x86_64'] and not UBUNTU_FOCAL: - if arch == 'x86_64': - rpath = Dir(f"#third_party/maplibre-native-qt/{arch}/lib").srcnode().abspath - map_env["RPATH"] += [rpath, ] - - style_path = File("style.json").abspath - map_env['CXXFLAGS'].append(f'-DSTYLE_PATH=\\"{style_path}\\"') - - map_env["RPATH"].append(Dir('.').abspath) - map_env["LIBPATH"].append(Dir('.').abspath) - maplib = map_env.SharedLibrary("maprender", ["map_renderer.cc"], LIBS=libs) - # map_env.Program("mapsd", ["main.cc", ], LIBS=[maplib[0].get_path(), ] + libs) diff --git a/selfdrive/navd/__init__.py b/selfdrive/navd/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/selfdrive/navd/helpers.py b/selfdrive/navd/helpers.py deleted file mode 100644 index 0f0410c2c7..0000000000 --- a/selfdrive/navd/helpers.py +++ /dev/null @@ -1,189 +0,0 @@ -from __future__ import annotations - -import json -import math -from typing import Any, cast - -from openpilot.common.conversions import Conversions -from openpilot.common.numpy_fast import clip -from openpilot.common.params import Params - -DIRECTIONS = ('left', 'right', 'straight') -MODIFIABLE_DIRECTIONS = ('left', 'right') - -EARTH_MEAN_RADIUS = 6371007.2 -SPEED_CONVERSIONS = { - 'km/h': Conversions.KPH_TO_MS, - 'mph': Conversions.MPH_TO_MS, - } - - -class Coordinate: - def __init__(self, latitude: float, longitude: float) -> None: - self.latitude = latitude - self.longitude = longitude - self.annotations: dict[str, float] = {} - - @classmethod - def from_mapbox_tuple(cls, t: tuple[float, float]) -> Coordinate: - return cls(t[1], t[0]) - - def as_dict(self) -> dict[str, float]: - return {'latitude': self.latitude, 'longitude': self.longitude} - - def __str__(self) -> str: - return f'Coordinate({self.latitude}, {self.longitude})' - - def __repr__(self) -> str: - return self.__str__() - - def __eq__(self, other) -> bool: - if not isinstance(other, Coordinate): - return False - return (self.latitude == other.latitude) and (self.longitude == other.longitude) - - def __sub__(self, other: Coordinate) -> Coordinate: - return Coordinate(self.latitude - other.latitude, self.longitude - other.longitude) - - def __add__(self, other: Coordinate) -> Coordinate: - return Coordinate(self.latitude + other.latitude, self.longitude + other.longitude) - - def __mul__(self, c: float) -> Coordinate: - return Coordinate(self.latitude * c, self.longitude * c) - - def dot(self, other: Coordinate) -> float: - return self.latitude * other.latitude + self.longitude * other.longitude - - def distance_to(self, other: Coordinate) -> float: - # Haversine formula - dlat = math.radians(other.latitude - self.latitude) - dlon = math.radians(other.longitude - self.longitude) - - haversine_dlat = math.sin(dlat / 2.0) - haversine_dlat *= haversine_dlat - haversine_dlon = math.sin(dlon / 2.0) - haversine_dlon *= haversine_dlon - - y = haversine_dlat \ - + math.cos(math.radians(self.latitude)) \ - * math.cos(math.radians(other.latitude)) \ - * haversine_dlon - x = 2 * math.asin(math.sqrt(y)) - return x * EARTH_MEAN_RADIUS - - -def minimum_distance(a: Coordinate, b: Coordinate, p: Coordinate): - if a.distance_to(b) < 0.01: - return a.distance_to(p) - - ap = p - a - ab = b - a - t = clip(ap.dot(ab) / ab.dot(ab), 0.0, 1.0) - projection = a + ab * t - return projection.distance_to(p) - - -def distance_along_geometry(geometry: list[Coordinate], pos: Coordinate) -> float: - if len(geometry) <= 2: - return geometry[0].distance_to(pos) - - # 1. Find segment that is closest to current position - # 2. Total distance is sum of distance to start of closest segment - # + all previous segments - total_distance = 0.0 - total_distance_closest = 0.0 - closest_distance = 1e9 - - for i in range(len(geometry) - 1): - d = minimum_distance(geometry[i], geometry[i + 1], pos) - - if d < closest_distance: - closest_distance = d - total_distance_closest = total_distance + geometry[i].distance_to(pos) - - total_distance += geometry[i].distance_to(geometry[i + 1]) - - return total_distance_closest - - -def coordinate_from_param(param: str, params: Params = None) -> Coordinate | None: - if params is None: - params = Params() - - json_str = params.get(param) - if json_str is None: - return None - - pos = json.loads(json_str) - if 'latitude' not in pos or 'longitude' not in pos: - return None - - return Coordinate(pos['latitude'], pos['longitude']) - - -def string_to_direction(direction: str) -> str: - for d in DIRECTIONS: - if d in direction: - if 'slight' in direction and d in MODIFIABLE_DIRECTIONS: - return 'slight' + d.capitalize() - return d - return 'none' - - -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 - - -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) -> dict[str, Any] | None: - if not len(banners): - return None - - instruction = {} - - # A segment can contain multiple banners, find one that we need to show now - current_banner = banners[0] - for banner in banners: - if distance_to_maneuver < banner['distanceAlongGeometry']: - current_banner = banner - - # Only show banner when close enough to maneuver - instruction['showFull'] = distance_to_maneuver < current_banner['distanceAlongGeometry'] - - # Primary - p = current_banner['primary'] - if field_valid(p, 'text'): - instruction['maneuverPrimaryText'] = p['text'] - if field_valid(p, 'type'): - instruction['maneuverType'] = p['type'] - if field_valid(p, 'modifier'): - instruction['maneuverModifier'] = p['modifier'] - - # Secondary - if field_valid(current_banner, 'secondary'): - instruction['maneuverSecondaryText'] = current_banner['secondary']['text'] - - # Lane lines - if field_valid(current_banner, 'sub'): - lanes = [] - for component in current_banner['sub']['components']: - if component['type'] != 'lane': - continue - - lane = { - 'active': component['active'], - 'directions': [string_to_direction(d) for d in component['directions']], - } - - if field_valid(component, 'active_direction'): - lane['activeDirection'] = string_to_direction(component['active_direction']) - - lanes.append(lane) - instruction['lanes'] = lanes - - return instruction diff --git a/selfdrive/navd/main.cc b/selfdrive/navd/main.cc deleted file mode 100644 index 2e7b4d3b60..0000000000 --- a/selfdrive/navd/main.cc +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include - -#include -#include - -#include "common/util.h" -#include "selfdrive/ui/qt/util.h" -#include "selfdrive/ui/qt/maps/map_helpers.h" -#include "selfdrive/navd/map_renderer.h" -#include "system/hardware/hw.h" - -int main(int argc, char *argv[]) { - Hardware::config_cpu_rendering(true); - - qInstallMessageHandler(swagLogMessageHandler); - setpriority(PRIO_PROCESS, 0, -20); - int ret = util::set_core_affinity({0, 1, 2, 3}); - assert(ret == 0); - - QApplication app(argc, argv); - std::signal(SIGINT, sigTermHandler); - std::signal(SIGTERM, sigTermHandler); - - MapRenderer * m = new MapRenderer(get_mapbox_settings()); - assert(m); - - return app.exec(); -} diff --git a/selfdrive/navd/map_renderer.cc b/selfdrive/navd/map_renderer.cc deleted file mode 100644 index 1e57ad3e7c..0000000000 --- a/selfdrive/navd/map_renderer.cc +++ /dev/null @@ -1,338 +0,0 @@ -#include "selfdrive/navd/map_renderer.h" - -#include -#include -#include -#include - -#include "common/util.h" -#include "common/timing.h" -#include "common/swaglog.h" -#include "selfdrive/ui/qt/maps/map_helpers.h" - -const float DEFAULT_ZOOM = 13.5; // Don't go below 13 or features will start to disappear -const int HEIGHT = 256, WIDTH = 256; -const int NUM_VIPC_BUFFERS = 4; - -const int EARTH_CIRCUMFERENCE_METERS = 40075000; -const int EARTH_RADIUS_METERS = 6378137; -const int PIXELS_PER_TILE = 256; -const int MAP_OFFSET = 128; - -const bool TEST_MODE = getenv("MAP_RENDER_TEST_MODE"); -const int LLK_DECIMATION = TEST_MODE ? 1 : 10; - -float get_zoom_level_for_scale(float lat, float meters_per_pixel) { - float meters_per_tile = meters_per_pixel * PIXELS_PER_TILE; - float num_tiles = cos(DEG2RAD(lat)) * EARTH_CIRCUMFERENCE_METERS / meters_per_tile; - return log2(num_tiles) - 1; -} - -QMapLibre::Coordinate get_point_along_line(float lat, float lon, float bearing, float dist) { - float ang_dist = dist / EARTH_RADIUS_METERS; - float lat1 = DEG2RAD(lat), lon1 = DEG2RAD(lon), bearing1 = DEG2RAD(bearing); - float lat2 = asin(sin(lat1)*cos(ang_dist) + cos(lat1)*sin(ang_dist)*cos(bearing1)); - float lon2 = lon1 + atan2(sin(bearing1)*sin(ang_dist)*cos(lat1), cos(ang_dist)-sin(lat1)*sin(lat2)); - return QMapLibre::Coordinate(RAD2DEG(lat2), RAD2DEG(lon2)); -} - - -MapRenderer::MapRenderer(const QMapLibre::Settings &settings, bool online) : m_settings(settings) { - QSurfaceFormat fmt; - fmt.setRenderableType(QSurfaceFormat::OpenGLES); - - m_settings.setMapMode(QMapLibre::Settings::MapMode::Static); - - ctx = std::make_unique(); - ctx->setFormat(fmt); - ctx->create(); - assert(ctx->isValid()); - - surface = std::make_unique(); - surface->setFormat(ctx->format()); - surface->create(); - - ctx->makeCurrent(surface.get()); - assert(QOpenGLContext::currentContext() == ctx.get()); - - gl_functions.reset(ctx->functions()); - gl_functions->initializeOpenGLFunctions(); - - QOpenGLFramebufferObjectFormat fbo_format; - fbo.reset(new QOpenGLFramebufferObject(WIDTH, HEIGHT, fbo_format)); - - std::string style = util::read_file(STYLE_PATH); - m_map.reset(new QMapLibre::Map(nullptr, m_settings, fbo->size(), 1)); - m_map->setCoordinateZoom(QMapLibre::Coordinate(0, 0), DEFAULT_ZOOM); - m_map->setStyleJson(style.c_str()); - m_map->createRenderer(); - ever_loaded = false; - - m_map->resize(fbo->size()); - m_map->setFramebufferObject(fbo->handle(), fbo->size()); - gl_functions->glViewport(0, 0, WIDTH, HEIGHT); - - QObject::connect(m_map.data(), &QMapLibre::Map::mapChanged, [=](QMapLibre::Map::MapChange change) { - // Ignore expected signals - // https://github.com/mapbox/mapbox-gl-native/blob/cf734a2fec960025350d8de0d01ad38aeae155a0/platform/qt/include/qmapboxgl.hpp#L116 - if (ever_loaded) { - if (change != QMapLibre::Map::MapChange::MapChangeRegionWillChange && - change != QMapLibre::Map::MapChange::MapChangeRegionDidChange && - change != QMapLibre::Map::MapChange::MapChangeWillStartRenderingFrame && - change != QMapLibre::Map::MapChange::MapChangeDidFinishRenderingFrameFullyRendered) { - LOGD("New map state: %d", change); - } - } - }); - - QObject::connect(m_map.data(), &QMapLibre::Map::mapLoadingFailed, [=](QMapLibre::Map::MapLoadingFailure err_code, const QString &reason) { - 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); - vipc_server->start_listener(); - - pm.reset(new PubMaster({"navThumbnail", "mapRenderState"})); - sm.reset(new SubMaster({"liveLocationKalman", "navRoute"}, {"liveLocationKalman"})); - - timer = new QTimer(this); - timer->setSingleShot(true); - QObject::connect(timer, SIGNAL(timeout()), this, SLOT(msgUpdate())); - timer->start(0); - } -} - -void MapRenderer::msgUpdate() { - sm->update(1000); - - if (sm->updated("liveLocationKalman")) { - auto location = (*sm)["liveLocationKalman"].getLiveLocationKalman(); - auto pos = location.getPositionGeodetic(); - auto orientation = location.getCalibratedOrientationNED(); - - if ((sm->rcv_frame("liveLocationKalman") % LLK_DECIMATION) == 0) { - float bearing = RAD2DEG(orientation.getValue()[2]); - updatePosition(get_point_along_line(pos.getValue()[0], pos.getValue()[1], bearing, MAP_OFFSET), bearing); - - if (!rendering) { - update(); - } - - if (!rendered()) { - publish(0, false); - } - } - - - } - - if (sm->updated("navRoute")) { - QList route; - auto coords = (*sm)["navRoute"].getNavRoute().getCoordinates(); - for (auto const &c : coords) { - route.push_back(QGeoCoordinate(c.getLatitude(), c.getLongitude())); - } - updateRoute(route); - } - - // schedule next update - timer->start(0); -} - -void MapRenderer::updatePosition(QMapLibre::Coordinate position, float bearing) { - if (m_map.isNull()) { - return; - } - - // Choose a scale that ensures above 13 zoom level up to and above 75deg of lat - float meters_per_pixel = 2; - float zoom = get_zoom_level_for_scale(position.first, meters_per_pixel); - - m_map->setCoordinate(position); - m_map->setBearing(bearing); - m_map->setZoom(zoom); - if (!rendering) { - update(); - } -} - -bool MapRenderer::loaded() { - return m_map->isFullyLoaded(); -} - -void MapRenderer::update() { - rendering = true; - gl_functions->glClear(GL_COLOR_BUFFER_BIT); - start_render_t = millis_since_boot(); - m_map->startStaticRender(); -} - -void MapRenderer::sendThumbnail(const uint64_t ts, const kj::Array &buf) { - MessageBuilder msg; - auto thumbnaild = msg.initEvent().initNavThumbnail(); - thumbnaild.setFrameId(frame_id); - thumbnaild.setTimestampEof(ts); - thumbnaild.setThumbnail(buf); - pm->send("navThumbnail", msg); -} - -void MapRenderer::publish(const double render_time, const bool loaded) { - QImage cap = fbo->toImage().convertToFormat(QImage::Format_RGB888, Qt::AutoColor); - - auto location = (*sm)["liveLocationKalman"].getLiveLocationKalman(); - bool valid = loaded && (location.getStatus() == cereal::LiveLocationKalman::Status::VALID) && location.getPositionGeodetic().getValid(); - ever_loaded = ever_loaded || loaded; - uint64_t ts = nanos_since_boot(); - VisionBuf* buf = vipc_server->get_buffer(VisionStreamType::VISION_STREAM_MAP); - VisionIpcBufExtra extra = { - .frame_id = frame_id, - .timestamp_sof = (*sm)["liveLocationKalman"].getLogMonoTime(), - .timestamp_eof = ts, - .valid = valid, - }; - - assert(cap.sizeInBytes() >= buf->len); - uint8_t* dst = (uint8_t*)buf->addr; - uint8_t* src = cap.bits(); - - // RGB to greyscale - memset(dst, 128, buf->len); - for (int i = 0; i < WIDTH * HEIGHT; i++) { - dst[i] = src[i * 3]; - } - - vipc_server->send(buf, &extra); - - // Send thumbnail - if (TEST_MODE) { - // Full image in thumbnails in test mode - kj::Array buffer_kj = kj::heapArray((const capnp::byte*)cap.bits(), cap.sizeInBytes()); - sendThumbnail(ts, buffer_kj); - } else if (frame_id % 100 == 0) { - // Write jpeg into buffer - QByteArray buffer_bytes; - QBuffer buffer(&buffer_bytes); - buffer.open(QIODevice::WriteOnly); - cap.save(&buffer, "JPG", 50); - - kj::Array buffer_kj = kj::heapArray((const capnp::byte*)buffer_bytes.constData(), buffer_bytes.size()); - sendThumbnail(ts, buffer_kj); - } - - // Send state msg - MessageBuilder msg; - auto evt = msg.initEvent(); - auto state = evt.initMapRenderState(); - evt.setValid(valid); - state.setLocationMonoTime((*sm)["liveLocationKalman"].getLogMonoTime()); - state.setRenderTime(render_time); - state.setFrameId(frame_id); - pm->send("mapRenderState", msg); - - frame_id++; -} - -uint8_t* MapRenderer::getImage() { - QImage cap = fbo->toImage().convertToFormat(QImage::Format_RGB888, Qt::AutoColor); - - uint8_t* src = cap.bits(); - uint8_t* dst = new uint8_t[WIDTH * HEIGHT]; - - // RGB to greyscale - for (int i = 0; i < WIDTH * HEIGHT; i++) { - dst[i] = src[i * 3]; - } - - return dst; -} - -void MapRenderer::updateRoute(QList coordinates) { - if (m_map.isNull()) return; - initLayers(); - - auto route_points = coordinate_list_to_collection(coordinates); - QMapLibre::Feature feature(QMapLibre::Feature::LineStringType, route_points, {}, {}); - QVariantMap navSource; - navSource["type"] = "geojson"; - navSource["data"] = QVariant::fromValue(feature); - m_map->updateSource("navSource", navSource); - m_map->setLayoutProperty("navLayer", "visibility", "visible"); -} - -void MapRenderer::initLayers() { - if (!m_map->layerExists("navLayer")) { - LOGD("Initializing navLayer"); - QVariantMap nav; - nav["type"] = "line"; - nav["source"] = "navSource"; - m_map->addLayer("navLayer", nav, "road-intersection"); - m_map->setPaintProperty("navLayer", "line-color", QColor("grey")); - m_map->setPaintProperty("navLayer", "line-width", 5); - m_map->setLayoutProperty("navLayer", "line-cap", "round"); - } -} - -MapRenderer::~MapRenderer() { -} - -extern "C" { - MapRenderer* map_renderer_init(char *maps_host = nullptr, char *token = nullptr) { - char *argv[] = { - (char*)"navd", - nullptr - }; - int argc = 0; - QApplication *app = new QApplication(argc, argv); - assert(app); - - QMapLibre::Settings settings; - settings.setProviderTemplate(QMapLibre::Settings::ProviderTemplate::MapboxProvider); - settings.setApiBaseUrl(maps_host == nullptr ? MAPS_HOST : maps_host); - settings.setApiKey(token == nullptr ? get_mapbox_token() : token); - - return new MapRenderer(settings, false); - } - - void map_renderer_update_position(MapRenderer *inst, float lat, float lon, float bearing) { - inst->updatePosition({lat, lon}, bearing); - QApplication::processEvents(); - } - - void map_renderer_update_route(MapRenderer *inst, char* polyline) { - inst->updateRoute(polyline_to_coordinate_list(QString::fromUtf8(polyline))); - } - - void map_renderer_update(MapRenderer *inst) { - inst->update(); - } - - void map_renderer_process(MapRenderer *inst) { - QApplication::processEvents(); - } - - bool map_renderer_loaded(MapRenderer *inst) { - return inst->loaded(); - } - - uint8_t * map_renderer_get_image(MapRenderer *inst) { - return inst->getImage(); - } - - void map_renderer_free_image(MapRenderer *inst, uint8_t * buf) { - delete[] buf; - } -} diff --git a/selfdrive/navd/map_renderer.h b/selfdrive/navd/map_renderer.h deleted file mode 100644 index 956c1d54bc..0000000000 --- a/selfdrive/navd/map_renderer.h +++ /dev/null @@ -1,61 +0,0 @@ -#pragma once - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msgq/visionipc/visionipc_server.h" -#include "cereal/messaging/messaging.h" - - -class MapRenderer : public QObject { - Q_OBJECT - -public: - MapRenderer(const QMapLibre::Settings &, bool online=true); - uint8_t* getImage(); - void update(); - bool loaded(); - ~MapRenderer(); - -private: - std::unique_ptr ctx; - std::unique_ptr surface; - std::unique_ptr gl_functions; - std::unique_ptr fbo; - - std::unique_ptr vipc_server; - std::unique_ptr pm; - std::unique_ptr sm; - void publish(const double render_time, const bool loaded); - void sendThumbnail(const uint64_t ts, const kj::Array &buf); - - QMapLibre::Settings m_settings; - QScopedPointer m_map; - - 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(); - } - - QTimer* timer; - bool ever_loaded = false; - -public slots: - void updatePosition(QMapLibre::Coordinate position, float bearing); - void updateRoute(QList coordinates); - void msgUpdate(); -}; diff --git a/selfdrive/navd/map_renderer.py b/selfdrive/navd/map_renderer.py deleted file mode 100755 index e44b883436..0000000000 --- a/selfdrive/navd/map_renderer.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/usr/bin/env python3 -# You might need to uninstall the PyQt5 pip package to avoid conflicts - -import os -import time -import numpy as np -import polyline -from cffi import FFI - -from openpilot.common.ffi_wrapper import suffix -from openpilot.common.basedir import BASEDIR - -HEIGHT = WIDTH = SIZE = 256 -METERS_PER_PIXEL = 2 - - -def get_ffi(): - lib = os.path.join(BASEDIR, "selfdrive", "navd", "libmaprender" + suffix()) - - ffi = FFI() - ffi.cdef(""" -void* map_renderer_init(char *maps_host, char *token); -void map_renderer_update_position(void *inst, float lat, float lon, float bearing); -void map_renderer_update_route(void *inst, char *polyline); -void map_renderer_update(void *inst); -void map_renderer_process(void *inst); -bool map_renderer_loaded(void *inst); -uint8_t* map_renderer_get_image(void *inst); -void map_renderer_free_image(void *inst, uint8_t *buf); -""") - return ffi, ffi.dlopen(lib) - - -def wait_ready(lib, renderer, timeout=None): - st = time.time() - while not lib.map_renderer_loaded(renderer): - lib.map_renderer_update(renderer) - - # The main qt app is not execed, so we need to periodically process events for e.g. network requests - lib.map_renderer_process(renderer) - - time.sleep(0.01) - - if timeout is not None and time.time() - st > timeout: - raise TimeoutError("Timeout waiting for map renderer to be ready") - - -def get_image(lib, renderer): - buf = lib.map_renderer_get_image(renderer) - r = list(buf[0:WIDTH * HEIGHT]) - lib.map_renderer_free_image(renderer, buf) - - # Convert to numpy - r = np.asarray(r) - return r.reshape((WIDTH, HEIGHT)) - - -def navRoute_to_polyline(nr): - coords = [(m.latitude, m.longitude) for m in nr.navRoute.coordinates] - return coords_to_polyline(coords) - - -def coords_to_polyline(coords): - # TODO: where does this factor of 10 come from? - return polyline.encode([(lat * 10., lon * 10.) for lat, lon in coords]) - - -def polyline_to_coords(p): - coords = polyline.decode(p) - return [(lat / 10., lon / 10.) for lat, lon in coords] - - - -if __name__ == "__main__": - import matplotlib.pyplot as plt - - ffi, lib = get_ffi() - renderer = lib.map_renderer_init(ffi.NULL, ffi.NULL) - wait_ready(lib, renderer) - - geometry = r"{yxk}@|obn~Eg@@eCFqc@J{RFw@?kA@gA?q|@Riu@NuJBgi@ZqVNcRBaPBkG@iSD{I@_H@cH?gG@mG@gG?aD@{LDgDDkVVyQLiGDgX@q_@@qI@qKhS{R~[}NtYaDbGoIvLwNfP_b@|f@oFnF_JxHel@bf@{JlIuxAlpAkNnLmZrWqFhFoh@jd@kX|TkJxH_RnPy^|[uKtHoZ~Um`DlkCorC``CuShQogCtwB_ThQcr@fk@sVrWgRhVmSb\\oj@jxA{Qvg@u]tbAyHzSos@xjBeKbWszAbgEc~@~jCuTrl@cYfo@mRn\\_m@v}@ij@jp@om@lk@y|A`pAiXbVmWzUod@xj@wNlTw}@|uAwSn\\kRfYqOdS_IdJuK`KmKvJoOhLuLbHaMzGwO~GoOzFiSrEsOhD}PhCqw@vJmnAxSczA`Vyb@bHk[fFgl@pJeoDdl@}}@zIyr@hG}X`BmUdBcM^aRR}Oe@iZc@mR_@{FScHxAn_@vz@zCzH~GjPxAhDlB~DhEdJlIbMhFfG|F~GlHrGjNjItLnGvQ~EhLnBfOn@p`@AzAAvn@CfC?fc@`@lUrArStCfSxEtSzGxM|ElFlBrOzJlEbDnC~BfDtCnHjHlLvMdTnZzHpObOf^pKla@~G|a@dErg@rCbj@zArYlj@ttJ~AfZh@r]LzYg@`TkDbj@gIdv@oE|i@kKzhA{CdNsEfOiGlPsEvMiDpLgBpHyB`MkB|MmArPg@|N?|P^rUvFz~AWpOCdAkB|PuB`KeFfHkCfGy@tAqC~AsBPkDs@uAiAcJwMe@s@eKkPMoXQux@EuuCoH?eI?Kas@}Dy@wAUkMOgDL" # noqa: E501 - lib.map_renderer_update_route(renderer, geometry.encode()) - - POSITIONS = [ - (32.71569271952601, -117.16384270868463, 0), (32.71569271952601, -117.16384270868463, 45), # San Diego - (52.378641991483136, 4.902623379456488, 0), (52.378641991483136, 4.902623379456488, 45), # Amsterdam - ] - plt.figure() - - for i, pos in enumerate(POSITIONS): - t = time.time() - lib.map_renderer_update_position(renderer, *pos) - wait_ready(lib, renderer) - - print(f"{pos} took {time.time() - t:.2f} s") - - plt.subplot(2, 2, i + 1) - plt.imshow(get_image(lib, renderer), cmap='gray') - - plt.show() diff --git a/selfdrive/navd/navd.py b/selfdrive/navd/navd.py deleted file mode 100755 index 8cfc495f27..0000000000 --- a/selfdrive/navd/navd.py +++ /dev/null @@ -1,368 +0,0 @@ -#!/usr/bin/env python3 -import json -import math -import os -import threading - -import requests - -import cereal.messaging as messaging -from cereal import log -from openpilot.common.api import Api -from openpilot.common.params import Params -from openpilot.common.realtime import Ratekeeper -from openpilot.selfdrive.navd.helpers import (Coordinate, coordinate_from_param, - distance_along_geometry, maxspeed_to_ms, - minimum_distance, - parse_banner_instructions) -from openpilot.common.swaglog import cloudlog - -REROUTE_DISTANCE = 25 -MANEUVER_TRANSITION_THRESHOLD = 10 -REROUTE_COUNTER_MIN = 3 - - -class RouteEngine: - def __init__(self, sm, pm): - self.sm = sm - self.pm = pm - - self.params = Params() - - # Get last gps position from params - self.last_position = coordinate_from_param("LastGPSPosition", self.params) - self.last_bearing = None - - self.gps_ok = False - self.localizer_valid = False - - self.nav_destination = None - self.step_idx = None - self.route = None - self.route_geometry = None - - self.recompute_backoff = 0 - self.recompute_countdown = 0 - - self.ui_pid = None - - 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: - self.api = Api(self.params.get("DongleId", encoding='utf8')) - self.mapbox_host = "https://maps.comma.ai" - - def update(self): - self.sm.update(0) - - if self.sm.updated["managerState"]: - ui_pid = [p.pid for p in self.sm["managerState"].processes if p.name == "ui" and p.running] - if ui_pid: - if self.ui_pid and self.ui_pid != ui_pid[0]: - cloudlog.warning("UI restarting, sending route") - threading.Timer(5.0, self.send_route).start() - self.ui_pid = ui_pid[0] - - self.update_location() - try: - self.recompute_route() - self.send_instruction() - except Exception: - cloudlog.exception("navd.failed_to_compute") - - def update_location(self): - location = self.sm['liveLocationKalman'] - self.gps_ok = location.gpsOK - - self.localizer_valid = (location.status == log.LiveLocationKalman.Status.valid) and location.positionGeodetic.valid - - if self.localizer_valid: - self.last_bearing = math.degrees(location.calibratedOrientationNED.value[2]) - self.last_position = Coordinate(location.positionGeodetic.value[0], location.positionGeodetic.value[1]) - - def recompute_route(self): - if self.last_position is None: - return - - new_destination = coordinate_from_param("NavDestination", self.params) - if new_destination is None: - self.clear_route() - self.reset_recompute_limits() - return - - should_recompute = self.should_recompute() - if new_destination != self.nav_destination: - cloudlog.warning(f"Got new destination from NavDestination param {new_destination}") - should_recompute = True - - # Don't recompute when GPS drifts in tunnels - if not self.gps_ok and self.step_idx is not None: - return - - if self.recompute_countdown == 0 and should_recompute: - self.recompute_countdown = 2**self.recompute_backoff - self.recompute_backoff = min(6, self.recompute_backoff + 1) - self.calculate_route(new_destination) - self.reroute_counter = 0 - else: - self.recompute_countdown = max(0, self.recompute_countdown - 1) - - def calculate_route(self, destination): - cloudlog.warning(f"Calculating route {self.last_position} -> {destination}") - self.nav_destination = destination - - lang = self.params.get('LanguageSetting', encoding='utf8') - 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': token, - 'annotations': 'maxspeed', - 'geometries': 'geojson', - 'overview': 'full', - 'steps': 'true', - 'banner_instructions': 'true', - 'alternatives': 'false', - 'language': lang, - } - - # TODO: move waypoints into NavDestination param? - waypoints = self.params.get('NavDestinationWaypoints', encoding='utf8') - waypoint_coords = [] - if waypoints is not None and len(waypoints) > 0: - waypoint_coords = json.loads(waypoints) - - coords = [ - (self.last_position.longitude, self.last_position.latitude), - *waypoint_coords, - (destination.longitude, destination.latitude) - ] - params['waypoints'] = f'0;{len(coords)-1}' - if self.last_bearing is not None: - params['bearings'] = f"{(self.last_bearing + 360) % 360:.0f},90" + (';'*(len(coords)-1)) - - coords_str = ';'.join([f'{lon},{lat}' for lon, lat in coords]) - url = self.mapbox_host + '/directions/v5/mapbox/driving-traffic/' + coords_str - try: - resp = requests.get(url, params=params, timeout=10) - if resp.status_code != 200: - cloudlog.event("API request failed", status_code=resp.status_code, text=resp.text, error=True) - resp.raise_for_status() - - r = resp.json() - if len(r['routes']): - self.route = r['routes'][0]['legs'][0]['steps'] - self.route_geometry = [] - - maxspeed_idx = 0 - maxspeeds = r['routes'][0]['legs'][0]['annotation']['maxspeed'] - - # Convert coordinates - for step in self.route: - coords = [] - - for c in step['geometry']['coordinates']: - coord = Coordinate.from_mapbox_tuple(c) - - # Last step does not have maxspeed - if (maxspeed_idx < len(maxspeeds)): - maxspeed = maxspeeds[maxspeed_idx] - if ('unknown' not in maxspeed) and ('none' not in maxspeed): - coord.annotations['maxspeed'] = maxspeed_to_ms(maxspeed) - - coords.append(coord) - maxspeed_idx += 1 - - self.route_geometry.append(coords) - maxspeed_idx -= 1 # Every segment ends with the same coordinate as the start of the next - - self.step_idx = 0 - else: - cloudlog.warning("Got empty route response") - self.clear_route() - - # clear waypoints to avoid a re-route including past waypoints - # TODO: only clear once we're past a waypoint - self.params.remove('NavDestinationWaypoints') - - except requests.exceptions.RequestException: - cloudlog.exception("failed to get route") - self.clear_route() - - self.send_route() - - def send_instruction(self): - msg = messaging.new_message('navInstruction', valid=True) - - if self.step_idx is None: - msg.valid = False - self.pm.send('navInstruction', msg) - return - - step = self.route[self.step_idx] - geometry = self.route_geometry[self.step_idx] - along_geometry = distance_along_geometry(geometry, self.last_position) - distance_to_maneuver_along_geometry = step['distance'] - along_geometry - - # Banner instructions are for the following maneuver step, don't use empty last step - banner_step = step - if not len(banner_step['bannerInstructions']) and self.step_idx == len(self.route) - 1: - banner_step = self.route[max(self.step_idx - 1, 0)] - - # Current instruction - msg.navInstruction.maneuverDistance = distance_to_maneuver_along_geometry - instruction = parse_banner_instructions(banner_step['bannerInstructions'], distance_to_maneuver_along_geometry) - if instruction is not None: - for k,v in instruction.items(): - setattr(msg.navInstruction, k, v) - - # All instructions - maneuvers = [] - for i, step_i in enumerate(self.route): - if i < self.step_idx: - distance_to_maneuver = -sum(self.route[j]['distance'] for j in range(i+1, self.step_idx)) - along_geometry - elif i == self.step_idx: - distance_to_maneuver = distance_to_maneuver_along_geometry - else: - distance_to_maneuver = distance_to_maneuver_along_geometry + sum(self.route[j]['distance'] for j in range(self.step_idx+1, i+1)) - - instruction = parse_banner_instructions(step_i['bannerInstructions'], distance_to_maneuver) - if instruction is None: - continue - maneuver = {'distance': distance_to_maneuver} - if 'maneuverType' in instruction: - maneuver['type'] = instruction['maneuverType'] - if 'maneuverModifier' in instruction: - maneuver['modifier'] = instruction['maneuverModifier'] - maneuvers.append(maneuver) - - msg.navInstruction.allManeuvers = maneuvers - - # Compute total remaining time and distance - remaining = 1.0 - along_geometry / max(step['distance'], 1) - total_distance = step['distance'] * remaining - total_time = step['duration'] * remaining - - if step['duration_typical'] is None: - total_time_typical = total_time - else: - total_time_typical = step['duration_typical'] * remaining - - # Add up totals for future steps - for i in range(self.step_idx + 1, len(self.route)): - total_distance += self.route[i]['distance'] - total_time += self.route[i]['duration'] - if self.route[i]['duration_typical'] is None: - total_time_typical += self.route[i]['duration'] - else: - total_time_typical += self.route[i]['duration_typical'] - - msg.navInstruction.distanceRemaining = total_distance - msg.navInstruction.timeRemaining = total_time - msg.navInstruction.timeRemainingTypical = total_time_typical - - # Speed limit - closest_idx, closest = min(enumerate(geometry), key=lambda p: p[1].distance_to(self.last_position)) - if closest_idx > 0: - # If we are not past the closest point, show previous - if along_geometry < distance_along_geometry(geometry, geometry[closest_idx]): - closest = geometry[closest_idx - 1] - - if ('maxspeed' in closest.annotations) and self.localizer_valid: - msg.navInstruction.speedLimit = closest.annotations['maxspeed'] - - # Speed limit sign type - if 'speedLimitSign' in step: - if step['speedLimitSign'] == 'mutcd': - msg.navInstruction.speedLimitSign = log.NavInstruction.SpeedLimitSign.mutcd - elif step['speedLimitSign'] == 'vienna': - msg.navInstruction.speedLimitSign = log.NavInstruction.SpeedLimitSign.vienna - - self.pm.send('navInstruction', msg) - - # Transition to next route segment - if distance_to_maneuver_along_geometry < -MANEUVER_TRANSITION_THRESHOLD: - if self.step_idx + 1 < len(self.route): - self.step_idx += 1 - self.reset_recompute_limits() - else: - cloudlog.warning("Destination reached") - - # Clear route if driving away from destination - dist = self.nav_destination.distance_to(self.last_position) - if dist > REROUTE_DISTANCE: - self.params.remove("NavDestination") - self.clear_route() - - def send_route(self): - coords = [] - - if self.route is not None: - for path in self.route_geometry: - coords += [c.as_dict() for c in path] - - msg = messaging.new_message('navRoute', valid=True) - msg.navRoute.coordinates = coords - self.pm.send('navRoute', msg) - - def clear_route(self): - self.route = None - self.route_geometry = None - self.step_idx = None - self.nav_destination = None - - def reset_recompute_limits(self): - self.recompute_backoff = 0 - self.recompute_countdown = 0 - - def should_recompute(self): - if self.step_idx is None or self.route is None: - return True - - # Don't recompute in last segment, assume destination is reached - if self.step_idx == len(self.route) - 1: - return False - - # Compute closest distance to all line segments in the current path - min_d = REROUTE_DISTANCE + 1 - path = self.route_geometry[self.step_idx] - for i in range(len(path) - 1): - a = path[i] - b = path[i + 1] - - if a.distance_to(b) < 1.0: - continue - - min_d = min(min_d, minimum_distance(a, b, self.last_position)) - - if min_d > REROUTE_DISTANCE: - self.reroute_counter += 1 - else: - self.reroute_counter = 0 - return self.reroute_counter > REROUTE_COUNTER_MIN - # TODO: Check for going wrong way in segment - - -def main(): - pm = messaging.PubMaster(['navInstruction', 'navRoute']) - sm = messaging.SubMaster(['liveLocationKalman', 'managerState']) - - rk = Ratekeeper(1.0) - route_engine = RouteEngine(sm, pm) - while True: - route_engine.update() - rk.keep_time() - - -if __name__ == "__main__": - main() diff --git a/selfdrive/navd/set_destination.py b/selfdrive/navd/set_destination.py deleted file mode 100755 index 811aa576d1..0000000000 --- a/selfdrive/navd/set_destination.py +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env python3 -import json -import sys - -from openpilot.common.params import Params - -if __name__ == "__main__": - params = Params() - - # set from google maps url - if len(sys.argv) > 1: - coords = sys.argv[1].split("/@")[-1].split("/")[0].split(",") - dest = { - "latitude": float(coords[0]), - "longitude": float(coords[1]) - } - params.put("NavDestination", json.dumps(dest)) - params.remove("NavDestinationWaypoints") - else: - print("Setting to Taco Bell") - dest = { - "latitude": 32.71160109904473, - "longitude": -117.12556569985693, - } - params.put("NavDestination", json.dumps(dest)) - - waypoints = [ - (-117.16020713111648, 32.71997612490662), - ] - params.put("NavDestinationWaypoints", json.dumps(waypoints)) - - print(dest) - print(waypoints) diff --git a/selfdrive/navd/style.json b/selfdrive/navd/style.json deleted file mode 100644 index 06bb750d1f..0000000000 --- a/selfdrive/navd/style.json +++ /dev/null @@ -1 +0,0 @@ -{"version": 8, "name": "Navigation Model", "metadata": {"mapbox:type": "default", "mapbox:origin": "monochrome-dark-v1", "mapbox:sdk-support": {"android": "10.0.0", "ios": "10.0.0", "js": "2.3.0"}, "mapbox:autocomposite": true, "mapbox:groups": {"Transit, transit-labels": {"name": "Transit, transit-labels", "collapsed": true}, "Administrative boundaries, admin": {"name": "Administrative boundaries, admin", "collapsed": true}, "Transit, bridges": {"name": "Transit, bridges", "collapsed": true}, "Transit, surface": {"name": "Transit, surface", "collapsed": true}, "Road network, bridges": {"name": "Road network, bridges", "collapsed": false}, "Land, water, & sky, water": {"name": "Land, water, & sky, water", "collapsed": true}, "Road network, tunnels": {"name": "Road network, tunnels", "collapsed": false}, "Road network, road-labels": {"name": "Road network, road-labels", "collapsed": true}, "Buildings, built": {"name": "Buildings, built", "collapsed": true}, "Natural features, natural-labels": {"name": "Natural features, natural-labels", "collapsed": true}, "Road network, surface": {"name": "Road network, surface", "collapsed": false}, "Land, water, & sky, built": {"name": "Land, water, & sky, built", "collapsed": true}, "Place labels, place-labels": {"name": "Place labels, place-labels", "collapsed": true}, "Point of interest labels, poi-labels": {"name": "Point of interest labels, poi-labels", "collapsed": true}, "Road network, tunnels-case": {"name": "Road network, tunnels-case", "collapsed": true}, "Transit, built": {"name": "Transit, built", "collapsed": true}, "Road network, surface-icons": {"name": "Road network, surface-icons", "collapsed": false}, "Land, water, & sky, land": {"name": "Land, water, & sky, land", "collapsed": true}}}, "center": [-117.19189443261149, 32.756553679559985], "zoom": 12.932776547838778, "bearing": 0, "pitch": 0.5017568344510897, "sources": {"composite": {"url": "mapbox://mapbox.mapbox-streets-v8", "type": "vector", "maxzoom": 13}}, "sprite": "mapbox://sprites/commaai/ckvmksrpd4n0a14pfdo5heqzr/bkx9h9tjdf3xedbnjvfo5xnbv", "glyphs": "mapbox://fonts/mapbox/{fontstack}/{range}.pbf", "layers": [{"id": "land", "type": "background", "layout": {"visibility": "none"}, "paint": {"background-color": "rgb(252, 252, 252)"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, land"}}, {"minzoom": 5, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, land"}, "filter": ["==", ["get", "class"], "national_park"], "type": "fill", "source": "composite", "id": "national-park", "paint": {"fill-color": "rgb(240, 240, 240)", "fill-opacity": ["interpolate", ["linear"], ["zoom"], 5, 0, 6, 0.5, 10, 0.5]}, "source-layer": "landuse_overlay"}, {"minzoom": 5, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, land"}, "filter": ["match", ["get", "class"], ["park", "airport", "glacier", "pitch", "sand", "facility"], true, false], "type": "fill", "source": "composite", "id": "landuse", "paint": {"fill-color": "rgb(240, 240, 240)", "fill-opacity": ["interpolate", ["linear"], ["zoom"], 5, 0, 6, ["match", ["get", "class"], "glacier", 0.5, 1]]}, "source-layer": "landuse"}, {"id": "waterway-shadow", "type": "line", "source": "composite", "source-layer": "waterway", "minzoom": 8, "layout": {"line-cap": ["step", ["zoom"], "butt", 11, "round"], "line-join": "round", "visibility": "none"}, "paint": {"line-color": "rgb(204, 204, 204)", "line-width": ["interpolate", ["exponential", 1.3], ["zoom"], 9, ["match", ["get", "class"], ["canal", "river"], 0.1, 0], 20, ["match", ["get", "class"], ["canal", "river"], 8, 3]], "line-translate": ["interpolate", ["exponential", 1.2], ["zoom"], 7, ["literal", [0, 0]], 16, ["literal", [-1, -1]]], "line-translate-anchor": "viewport", "line-opacity": ["interpolate", ["linear"], ["zoom"], 8, 0, 8.5, 1]}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, water"}}, {"id": "water-shadow", "type": "fill", "source": "composite", "source-layer": "water", "layout": {"visibility": "none"}, "paint": {"fill-color": "rgb(204, 204, 204)", "fill-translate": ["interpolate", ["exponential", 1.2], ["zoom"], 7, ["literal", [0, 0]], 16, ["literal", [-1, -1]]], "fill-translate-anchor": "viewport"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, water"}}, {"id": "waterway", "type": "line", "source": "composite", "source-layer": "waterway", "minzoom": 8, "layout": {"line-cap": ["step", ["zoom"], "butt", 11, "round"], "line-join": "round", "visibility": "none"}, "paint": {"line-color": "rgb(224, 224, 224)", "line-width": ["interpolate", ["exponential", 1.3], ["zoom"], 9, ["match", ["get", "class"], ["canal", "river"], 0.1, 0], 20, ["match", ["get", "class"], ["canal", "river"], 8, 3]], "line-opacity": ["interpolate", ["linear"], ["zoom"], 8, 0, 8.5, 1]}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, water"}}, {"id": "water", "type": "fill", "source": "composite", "source-layer": "water", "layout": {"visibility": "none"}, "paint": {"fill-color": "rgb(224, 224, 224)"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, water"}}, {"minzoom": 13, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, built"}, "filter": ["all", ["==", ["geometry-type"], "Polygon"], ["==", ["get", "class"], "land"]], "type": "fill", "source": "composite", "id": "land-structure-polygon", "paint": {"fill-color": "rgb(252, 252, 252)"}, "source-layer": "structure"}, {"minzoom": 13, "layout": {"line-cap": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "land-and-water", "mapbox:group": "Land, water, & sky, built"}, "filter": ["all", ["==", ["geometry-type"], "LineString"], ["==", ["get", "class"], "land"]], "type": "line", "source": "composite", "id": "land-structure-line", "paint": {"line-width": ["interpolate", ["exponential", 1.99], ["zoom"], 14, 0.75, 20, 40], "line-color": "rgb(252, 252, 252)"}, "source-layer": "structure"}, {"minzoom": 11, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "transit", "mapbox:group": "Transit, built"}, "filter": ["all", ["==", ["geometry-type"], "Polygon"], ["match", ["get", "type"], ["runway", "taxiway", "helipad"], true, false]], "type": "fill", "source": "composite", "id": "aeroway-polygon", "paint": {"fill-color": "rgb(255, 255, 255)", "fill-opacity": ["interpolate", ["linear"], ["zoom"], 11, 0, 11.5, 1]}, "source-layer": "aeroway"}, {"minzoom": 9, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "transit", "mapbox:group": "Transit, built"}, "filter": ["==", ["geometry-type"], "LineString"], "type": "line", "source": "composite", "id": "aeroway-line", "paint": {"line-color": "rgb(255, 255, 255)", "line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 9, ["match", ["get", "type"], "runway", 1, 0.5], 18, ["match", ["get", "type"], "runway", 80, 20]]}, "source-layer": "aeroway"}, {"minzoom": 13, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "buildings", "mapbox:group": "Buildings, built"}, "filter": ["all", ["!=", ["get", "type"], "building:part"], ["==", ["get", "underground"], "false"]], "type": "line", "source": "composite", "id": "building-outline", "paint": {"line-color": "rgb(227, 227, 227)", "line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 15, 0.75, 20, 3], "line-opacity": ["interpolate", ["linear"], ["zoom"], 15, 0, 16, 1]}, "source-layer": "building"}, {"minzoom": 13, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "buildings", "mapbox:group": "Buildings, built"}, "filter": ["all", ["!=", ["get", "type"], "building:part"], ["==", ["get", "underground"], "false"]], "type": "fill", "source": "composite", "id": "building", "paint": {"fill-color": ["interpolate", ["linear"], ["zoom"], 15, "rgb(242, 242, 242)", 16, "rgb(242, 242, 242)"], "fill-opacity": ["interpolate", ["linear"], ["zoom"], 15, 0, 16, 1], "fill-outline-color": "rgb(227, 227, 227)"}, "source-layer": "building"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-street-minor-low", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-color": "rgb(235, 235, 235)", "line-opacity": ["step", ["zoom"], 1, 14, 0]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-street-minor-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(255, 255, 255)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-opacity": ["step", ["zoom"], 0, 14, 1], "line-dasharray": [3, 3]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["primary", "secondary", "tertiary"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-primary-secondary-tertiary-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, ["match", ["get", "class"], "primary", 1, 0.75], 18, 2], "line-color": "rgb(255, 255, 255)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, ["match", ["get", "class"], "primary", 0.75, 0.1], 18, ["match", ["get", "class"], "primary", 32, 26]], "line-dasharray": [3, 3]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-major-link-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(255, 255, 255)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-dasharray": [3, 3]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-motorway-trunk-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 1, 18, 2], "line-color": "rgb(255, 255, 255)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-dasharray": [3, 3]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels-case"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["==", ["get", "class"], "construction"], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-construction", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 2, 18, 18], "line-color": "rgb(235, 235, 235)", "line-dasharray": ["step", ["zoom"], ["literal", [0.4, 0.8]], 15, ["literal", [0.3, 0.6]], 16, ["literal", [0.2, 0.3]], 17, ["literal", [0.2, 0.25]], 18, ["literal", [0.15, 0.15]]]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-major-link", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(235, 235, 235)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-street-minor", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-color": "rgb(235, 235, 235)", "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["primary", "secondary", "tertiary"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-primary-secondary-tertiary", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, ["match", ["get", "class"], "primary", 0.75, 0.1], 18, ["match", ["get", "class"], "primary", 32, 26]], "line-color": "rgb(235, 235, 235)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, tunnels"}, "filter": ["all", ["==", ["get", "structure"], "tunnel"], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "tunnel-motorway-trunk", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-color": "rgb(235, 235, 235)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"icon-image": "turning-circle-outline", "icon-size": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 0.122, 18, 0.969, 20, 1], "icon-allow-overlap": true, "icon-ignore-placement": true, "icon-padding": 0, "icon-rotation-alignment": "map", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["==", ["geometry-type"], "Point"], ["match", ["get", "class"], ["turning_circle", "turning_loop"], true, false]], "type": "symbol", "source": "composite", "id": "turning-feature-outline", "paint": {}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["step", ["zoom"], ["==", ["get", "class"], "track"], 1, ["match", ["get", "class"], ["track", "secondary_link", "tertiary_link", "service"], true, false]], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-minor-low", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, ["match", ["get", "class"], "track", 1, 0.5], 18, 12], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 1, 14, 0]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["step", ["zoom"], ["==", ["get", "class"], "track"], 1, ["match", ["get", "class"], ["track", "secondary_link", "tertiary_link", "service"], true, false]], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-minor-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, ["match", ["get", "class"], "track", 1, 0.5], 18, 12], "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 11, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["street", "street_limited", "primary_link"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-street-low", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 1, 14, 0]}, "source-layer": "road"}, {"minzoom": 11, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["street", "street_limited", "primary_link"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-street-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 8, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["secondary", "tertiary"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-secondary-tertiary-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 0.75, 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.1, 18, 26], "line-opacity": ["step", ["zoom"], 0, 10, 1]}, "source-layer": "road"}, {"minzoom": 7, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["==", ["get", "class"], "primary"], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-primary-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 1, 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-opacity": ["step", ["zoom"], 0, 10, 1]}, "source-layer": "road"}, {"minzoom": 10, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-major-link-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-opacity": ["step", ["zoom"], 0, 11, 1]}, "source-layer": "road"}, {"minzoom": 5, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-motorway-trunk-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 1, 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-opacity": ["step", ["zoom"], ["match", ["get", "class"], "motorway", 1, 0], 6, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["==", ["get", "class"], "construction"], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-construction", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)", "line-dasharray": ["step", ["zoom"], ["literal", [0.4, 0.8]], 15, ["literal", [0.3, 0.6]], 16, ["literal", [0.2, 0.3]], 17, ["literal", [0.2, 0.25]], 18, ["literal", [0.15, 0.15]]]}, "source-layer": "road"}, {"minzoom": 10, "layout": {"line-cap": ["step", ["zoom"], "butt", 13, "round"], "line-join": ["step", ["zoom"], "miter", 13, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-major-link", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["step", ["zoom"], ["==", ["get", "class"], "track"], 1, ["match", ["get", "class"], ["track", "secondary_link", "tertiary_link", "service"], true, false]], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-minor", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, ["match", ["get", "class"], "track", 1, 0.5], 18, 12], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 11, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["street", "street_limited", "primary_link"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-street", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 8, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["match", ["get", "class"], ["secondary", "tertiary"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-secondary-tertiary", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.1, 18, 26], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 6, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}, "filter": ["all", ["==", ["get", "class"], "primary"], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "road-primary", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"id": "road-motorway-trunk", "type": "line", "source": "composite", "source-layer": "road", "filter": ["all", ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false], ["==", ["geometry-type"], "LineString"]], "layout": {"line-cap": ["step", ["zoom"], "butt", 13, "round"], "line-join": ["step", ["zoom"], "miter", 13, "round"]}, "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-color": "rgb(255, 255, 255)"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface"}}, {"minzoom": 13, "layout": {"line-join": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "transit", "mapbox:group": "Transit, surface"}, "filter": ["all", ["match", ["get", "class"], ["major_rail", "minor_rail"], true, false], ["match", ["get", "structure"], ["none", "ford"], true, false]], "type": "line", "source": "composite", "id": "road-rail", "paint": {"line-color": ["interpolate", ["linear"], ["zoom"], 13, "rgb(242, 242, 242)", 17, "rgb(227, 227, 227)"], "line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 0.5, 20, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"icon-image": "turning-circle", "icon-size": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 0.095, 18, 1], "icon-allow-overlap": true, "icon-ignore-placement": true, "icon-padding": 0, "icon-rotation-alignment": "map", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, surface-icons"}, "filter": ["all", ["==", ["geometry-type"], "Point"], ["match", ["get", "class"], ["turning_circle", "turning_loop"], true, false]], "type": "symbol", "source": "composite", "id": "turning-feature", "paint": {}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-street-minor-low", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 1, 14, 0]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-street-minor-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["primary", "secondary", "tertiary"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-primary-secondary-tertiary-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, ["match", ["get", "class"], "primary", 1, 0.75], 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, ["match", ["get", "class"], "primary", 0.75, 0.1], 18, ["match", ["get", "class"], "primary", 32, 26]], "line-opacity": ["step", ["zoom"], 0, 10, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["<=", ["get", "layer"], 1], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-major-link-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["<=", ["get", "layer"], 1], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-motorway-trunk-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 1, 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32]}, "source-layer": "road"}, {"minzoom": 13, "layout": {}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["==", ["get", "class"], "construction"], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-construction", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)", "line-dasharray": ["step", ["zoom"], ["literal", [0.4, 0.8]], 15, ["literal", [0.3, 0.6]], 16, ["literal", [0.2, 0.3]], 17, ["literal", [0.2, 0.25]], 18, ["literal", [0.15, 0.15]]]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": "round", "line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["<=", ["get", "layer"], 1], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-major-link", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["step", ["zoom"], ["match", ["get", "class"], ["street", "street_limited", "primary_link", "track"], true, false], 1, ["match", ["get", "class"], ["street", "street_limited", "track", "primary_link", "secondary_link", "tertiary_link", "service"], true, false]], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-street-minor", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 2, "track", 1, 0.5], 18, ["match", ["get", "class"], ["street", "street_limited", "primary_link"], 18, 12]], "line-color": "rgb(255, 255, 255)", "line-opacity": ["step", ["zoom"], 0, 14, 1]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["primary", "secondary", "tertiary"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-primary-secondary-tertiary", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, ["match", ["get", "class"], "primary", 0.75, 0.1], 18, ["match", ["get", "class"], "primary", 32, 26]], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": "round", "line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["<=", ["get", "layer"], 1], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-motorway-trunk", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], [">=", ["get", "layer"], 2], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-major-link-2-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.75, 20, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], [">=", ["get", "layer"], 2], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-motorway-trunk-2-case", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 10, 1, 18, 2], "line-color": "rgb(242, 242, 242)", "line-gap-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32]}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": "round", "line-join": "round"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], [">=", ["get", "layer"], 2], ["match", ["get", "class"], ["motorway_link", "trunk_link"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-major-link-2", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 12, 0.5, 14, 2, 18, 18], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-cap": ["step", ["zoom"], "butt", 14, "round"], "line-join": ["step", ["zoom"], "miter", 14, "round"]}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], [">=", ["get", "layer"], 2], ["match", ["get", "class"], ["motorway", "trunk"], true, false], ["==", ["geometry-type"], "LineString"]], "type": "line", "source": "composite", "id": "bridge-motorway-trunk-2", "paint": {"line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 5, 0.75, 18, 32], "line-color": "rgb(255, 255, 255)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"line-join": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "transit", "mapbox:group": "Transit, bridges"}, "filter": ["all", ["==", ["get", "structure"], "bridge"], ["match", ["get", "class"], ["major_rail", "minor_rail"], true, false]], "type": "line", "source": "composite", "id": "bridge-rail", "paint": {"line-color": "rgb(227, 227, 227)", "line-width": ["interpolate", ["exponential", 1.5], ["zoom"], 14, 0.5, 20, 1]}, "source-layer": "road"}, {"minzoom": 7, "layout": {"line-join": "bevel", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "admin-boundaries", "mapbox:group": "Administrative boundaries, admin"}, "filter": ["all", ["==", ["get", "admin_level"], 1], ["==", ["get", "maritime"], "false"], ["match", ["get", "worldview"], ["all", "US"], true, false]], "type": "line", "source": "composite", "id": "admin-1-boundary-bg", "paint": {"line-color": ["interpolate", ["linear"], ["zoom"], 8, "rgb(227, 227, 227)", 16, "rgb(227, 227, 227)"], "line-width": ["interpolate", ["linear"], ["zoom"], 7, 3.75, 12, 5.5], "line-opacity": ["interpolate", ["linear"], ["zoom"], 7, 0, 8, 0.75], "line-dasharray": [1, 0], "line-blur": ["interpolate", ["linear"], ["zoom"], 3, 0, 8, 3]}, "source-layer": "admin"}, {"minzoom": 1, "layout": {"visibility": "none"}, "metadata": {"mapbox:featureComponent": "admin-boundaries", "mapbox:group": "Administrative boundaries, admin"}, "filter": ["all", ["==", ["get", "admin_level"], 0], ["==", ["get", "maritime"], "false"], ["match", ["get", "worldview"], ["all", "US"], true, false]], "type": "line", "source": "composite", "id": "admin-0-boundary-bg", "paint": {"line-width": ["interpolate", ["linear"], ["zoom"], 3, 3.5, 10, 8], "line-color": "rgb(227, 227, 227)", "line-opacity": ["interpolate", ["linear"], ["zoom"], 3, 0, 4, 0.5], "line-blur": ["interpolate", ["linear"], ["zoom"], 3, 0, 10, 2]}, "source-layer": "admin"}, {"minzoom": 2, "layout": {"line-join": "round", "line-cap": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "admin-boundaries", "mapbox:group": "Administrative boundaries, admin"}, "filter": ["all", ["==", ["get", "admin_level"], 1], ["==", ["get", "maritime"], "false"], ["match", ["get", "worldview"], ["all", "US"], true, false]], "type": "line", "source": "composite", "id": "admin-1-boundary", "paint": {"line-dasharray": ["step", ["zoom"], ["literal", [2, 0]], 7, ["literal", [2, 2, 6, 2]]], "line-width": ["interpolate", ["linear"], ["zoom"], 7, 0.75, 12, 1.5], "line-opacity": ["interpolate", ["linear"], ["zoom"], 2, 0, 3, 1], "line-color": ["interpolate", ["linear"], ["zoom"], 3, "rgb(224, 224, 224)", 7, "rgb(184, 184, 184)"]}, "source-layer": "admin"}, {"minzoom": 1, "layout": {"line-join": "round", "line-cap": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "admin-boundaries", "mapbox:group": "Administrative boundaries, admin"}, "filter": ["all", ["==", ["get", "admin_level"], 0], ["==", ["get", "disputed"], "false"], ["==", ["get", "maritime"], "false"], ["match", ["get", "worldview"], ["all", "US"], true, false]], "type": "line", "source": "composite", "id": "admin-0-boundary", "paint": {"line-color": "rgb(184, 184, 184)", "line-width": ["interpolate", ["linear"], ["zoom"], 3, 0.5, 10, 2], "line-dasharray": [10, 0]}, "source-layer": "admin"}, {"minzoom": 1, "layout": {"line-join": "round", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "admin-boundaries", "mapbox:group": "Administrative boundaries, admin"}, "filter": ["all", ["==", ["get", "disputed"], "true"], ["==", ["get", "admin_level"], 0], ["==", ["get", "maritime"], "false"], ["match", ["get", "worldview"], ["all", "US"], true, false]], "type": "line", "source": "composite", "id": "admin-0-boundary-disputed", "paint": {"line-color": "rgb(184, 184, 184)", "line-width": ["interpolate", ["linear"], ["zoom"], 3, 0.5, 10, 2], "line-dasharray": ["step", ["zoom"], ["literal", [3.25, 3.25]], 6, ["literal", [2.5, 2.5]], 7, ["literal", [2, 2.25]], 8, ["literal", [1.75, 2]]]}, "source-layer": "admin"}, {"minzoom": 10, "layout": {"text-size": ["interpolate", ["linear"], ["zoom"], 10, ["match", ["get", "class"], ["motorway", "trunk", "primary", "secondary", "tertiary"], 10, ["motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link", "street", "street_limited"], 9, 6.5], 18, ["match", ["get", "class"], ["motorway", "trunk", "primary", "secondary", "tertiary"], 16, ["motorway_link", "trunk_link", "primary_link", "secondary_link", "tertiary_link", "street", "street_limited"], 14, 13]], "text-max-angle": 30, "text-font": ["DIN Pro Regular", "Arial Unicode MS Regular"], "symbol-placement": "line", "text-padding": 1, "visibility": "none", "text-rotation-alignment": "map", "text-pitch-alignment": "viewport", "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-letter-spacing": 0.01}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, road-labels"}, "filter": ["step", ["zoom"], ["match", ["get", "class"], ["motorway", "trunk", "primary", "secondary", "tertiary"], true, false], 1, ["match", ["get", "class"], ["motorway", "trunk", "primary", "secondary", "tertiary", "street", "street_limited"], true, false], 2, ["match", ["get", "class"], ["path", "pedestrian", "golf", "ferry", "aerialway"], false, true]], "type": "symbol", "source": "composite", "id": "road-label", "paint": {"text-color": "rgb(128, 128, 128)", "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1, "text-halo-blur": 1}, "source-layer": "road"}, {"minzoom": 13, "layout": {"text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "icon-image": "intersection", "icon-text-fit": "both", "icon-text-fit-padding": [1, 2, 1, 2], "text-size": ["interpolate", ["exponential", 1.2], ["zoom"], 15, 9, 18, 12], "text-font": ["DIN Pro Bold", "Arial Unicode MS Bold"], "visibility": "none"}, "metadata": {"mapbox:featureComponent": "road-network", "mapbox:group": "Road network, road-labels"}, "filter": ["all", ["==", ["get", "class"], "intersection"], ["has", "name"]], "type": "symbol", "source": "composite", "id": "road-intersection", "paint": {"text-color": "rgb(153, 153, 153)"}, "source-layer": "road"}, {"minzoom": 13, "layout": {"text-font": ["DIN Pro Italic", "Arial Unicode MS Regular"], "text-max-angle": 30, "symbol-spacing": ["interpolate", ["linear", 1], ["zoom"], 15, 250, 17, 400], "text-size": ["interpolate", ["linear"], ["zoom"], 13, 12, 18, 16], "symbol-placement": "line", "text-pitch-alignment": "viewport", "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "visibility": "none"}, "metadata": {"mapbox:featureComponent": "natural-features", "mapbox:group": "Natural features, natural-labels"}, "filter": ["all", ["match", ["get", "class"], ["canal", "river", "stream"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_canal", "disputed_river", "disputed_stream"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["==", ["geometry-type"], "LineString"]], "type": "symbol", "source": "composite", "id": "waterway-label", "paint": {"text-color": "rgb(150, 150, 150)"}, "source-layer": "natural_label"}, {"minzoom": 4, "layout": {"text-size": ["step", ["zoom"], ["step", ["get", "sizerank"], 18, 5, 12], 17, ["step", ["get", "sizerank"], 18, 13, 12]], "text-max-angle": 30, "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "symbol-placement": "line-center", "text-pitch-alignment": "viewport", "visibility": "none"}, "metadata": {"mapbox:featureComponent": "natural-features", "mapbox:group": "Natural features, natural-labels"}, "filter": ["all", ["match", ["get", "class"], ["glacier", "landform"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_glacier", "disputed_landform"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["==", ["geometry-type"], "LineString"], ["<=", ["get", "filterrank"], 1]], "type": "symbol", "source": "composite", "id": "natural-line-label", "paint": {"text-halo-width": 0.5, "text-halo-color": "rgb(255, 255, 255)", "text-halo-blur": 0.5, "text-color": "rgb(128, 128, 128)"}, "source-layer": "natural_label"}, {"minzoom": 4, "layout": {"text-size": ["step", ["zoom"], ["step", ["get", "sizerank"], 18, 5, 12], 17, ["step", ["get", "sizerank"], 18, 13, 12]], "icon-image": "", "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "text-offset": ["literal", [0, 0]], "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "visibility": "none"}, "metadata": {"mapbox:featureComponent": "natural-features", "mapbox:group": "Natural features, natural-labels"}, "filter": ["all", ["match", ["get", "class"], ["dock", "glacier", "landform", "water_feature", "wetland"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_dock", "disputed_glacier", "disputed_landform", "disputed_water_feature", "disputed_wetland"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["==", ["geometry-type"], "Point"], ["<=", ["get", "filterrank"], 1]], "type": "symbol", "source": "composite", "id": "natural-point-label", "paint": {"icon-opacity": ["step", ["zoom"], ["step", ["get", "sizerank"], 0, 5, 1], 17, ["step", ["get", "sizerank"], 0, 13, 1]], "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 0.5, "text-halo-blur": 0.5, "text-color": "rgb(128, 128, 128)"}, "source-layer": "natural_label"}, {"id": "water-line-label", "type": "symbol", "metadata": {"mapbox:featureComponent": "natural-features", "mapbox:group": "Natural features, natural-labels"}, "source": "composite", "source-layer": "natural_label", "filter": ["all", ["match", ["get", "class"], ["bay", "ocean", "reservoir", "sea", "water"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_bay", "disputed_ocean", "disputed_reservoir", "disputed_sea", "disputed_water"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["==", ["geometry-type"], "LineString"]], "layout": {"text-size": ["interpolate", ["linear"], ["zoom"], 7, ["step", ["get", "sizerank"], 20, 6, 18, 12, 12], 10, ["step", ["get", "sizerank"], 15, 9, 12], 18, ["step", ["get", "sizerank"], 15, 9, 14]], "text-max-angle": 30, "text-letter-spacing": ["match", ["get", "class"], "ocean", 0.25, ["sea", "bay"], 0.15, 0], "text-font": ["DIN Pro Italic", "Arial Unicode MS Regular"], "symbol-placement": "line-center", "text-pitch-alignment": "viewport", "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "visibility": "none"}, "paint": {"text-color": "rgb(150, 150, 150)"}}, {"id": "water-point-label", "type": "symbol", "source": "composite", "source-layer": "natural_label", "filter": ["all", ["match", ["get", "class"], ["bay", "ocean", "reservoir", "sea", "water"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_bay", "disputed_ocean", "disputed_reservoir", "disputed_sea", "disputed_water"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["==", ["geometry-type"], "Point"]], "layout": {"text-line-height": 1.3, "text-size": ["interpolate", ["linear"], ["zoom"], 7, ["step", ["get", "sizerank"], 20, 6, 15, 12, 12], 10, ["step", ["get", "sizerank"], 15, 9, 12]], "text-font": ["DIN Pro Italic", "Arial Unicode MS Regular"], "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-letter-spacing": ["match", ["get", "class"], "ocean", 0.25, ["bay", "sea"], 0.15, 0.01], "text-max-width": ["match", ["get", "class"], "ocean", 4, "sea", 5, ["bay", "water"], 7, 10], "visibility": "none"}, "paint": {"text-color": "rgb(150, 150, 150)"}, "metadata": {"mapbox:featureComponent": "natural-features", "mapbox:group": "Natural features, natural-labels"}}, {"minzoom": 6, "layout": {"text-size": ["step", ["zoom"], ["step", ["get", "sizerank"], 18, 5, 12], 17, ["step", ["get", "sizerank"], 18, 13, 12]], "icon-image": "", "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "text-offset": [0, 0], "text-anchor": ["step", ["zoom"], ["step", ["get", "sizerank"], "center", 5, "top"], 17, ["step", ["get", "sizerank"], "center", 13, "top"]], "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "visibility": "none"}, "metadata": {"mapbox:featureComponent": "point-of-interest-labels", "mapbox:group": "Point of interest labels, poi-labels"}, "filter": ["<=", ["get", "filterrank"], ["+", ["step", ["zoom"], 1, 2, 3, 4, 5], 1]], "type": "symbol", "source": "composite", "id": "poi-label", "paint": {"text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 0.5, "text-halo-blur": 0.5, "text-color": ["step", ["zoom"], ["step", ["get", "sizerank"], "rgb(184, 184, 184)", 5, "rgb(161, 161, 161)"], 17, ["step", ["get", "sizerank"], "rgb(184, 184, 184)", 13, "rgb(161, 161, 161)"]]}, "source-layer": "poi_label"}, {"minzoom": 8, "layout": {"text-line-height": 1.1, "text-size": ["step", ["get", "sizerank"], 18, 9, 12], "icon-image": ["get", "maki"], "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "visibility": "none", "text-offset": [0, 0.75], "text-rotation-alignment": "viewport", "text-anchor": "top", "text-field": ["step", ["get", "sizerank"], ["coalesce", ["get", "name_en"], ["get", "name"]], 15, ["get", "ref"]], "text-letter-spacing": 0.01, "text-max-width": 9}, "metadata": {"mapbox:featureComponent": "transit", "mapbox:group": "Transit, transit-labels"}, "filter": ["match", ["get", "class"], ["military", "civil"], ["match", ["get", "worldview"], ["all", "US"], true, false], ["disputed_military", "disputed_civil"], ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], "type": "symbol", "source": "composite", "id": "airport-label", "paint": {"text-color": "rgb(128, 128, 128)", "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1}, "source-layer": "airport_label"}, {"minzoom": 10, "layout": {"text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-transform": "uppercase", "text-font": ["DIN Pro Regular", "Arial Unicode MS Regular"], "text-letter-spacing": ["match", ["get", "type"], "suburb", 0.15, 0.1], "text-max-width": 7, "text-padding": 3, "text-size": ["interpolate", ["cubic-bezier", 0.5, 0, 1, 1], ["zoom"], 11, ["match", ["get", "type"], "suburb", 11, 10.5], 15, ["match", ["get", "type"], "suburb", 15, 14]], "visibility": "none"}, "metadata": {"mapbox:featureComponent": "place-labels", "mapbox:group": "Place labels, place-labels"}, "maxzoom": 15, "filter": ["all", ["match", ["get", "class"], "settlement_subdivision", ["match", ["get", "worldview"], ["all", "US"], true, false], "disputed_settlement_subdivision", ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["<=", ["get", "filterrank"], 4]], "type": "symbol", "source": "composite", "id": "settlement-subdivision-label", "paint": {"text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1, "text-color": "rgb(179, 179, 179)", "text-halo-blur": 0.5}, "source-layer": "place_label"}, {"minzoom": 3, "layout": {"text-line-height": 1.1, "text-size": ["interpolate", ["cubic-bezier", 0.2, 0, 0.9, 1], ["zoom"], 3, ["step", ["get", "symbolrank"], 12, 9, 11, 10, 10.5, 12, 9.5, 14, 8.5, 16, 6.5, 17, 4], 13, ["step", ["get", "symbolrank"], 23, 9, 21, 10, 19, 11, 17, 12, 16, 13, 15, 15, 13]], "text-radial-offset": ["step", ["zoom"], ["match", ["get", "capital"], 2, 0.6, 0.55], 8, 0], "icon-image": ["step", ["zoom"], ["case", ["==", ["get", "capital"], 2], "border-dot-13", ["step", ["get", "symbolrank"], "dot-11", 9, "dot-10", 11, "dot-9"]], 8, ""], "text-font": ["DIN Pro Regular", "Arial Unicode MS Regular"], "text-justify": "auto", "visibility": "none", "text-anchor": ["step", ["zoom"], ["get", "text_anchor"], 8, "center"], "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-max-width": 7}, "metadata": {"mapbox:featureComponent": "place-labels", "mapbox:group": "Place labels, place-labels"}, "maxzoom": 13, "filter": ["all", ["<=", ["get", "filterrank"], 3], ["match", ["get", "class"], "settlement", ["match", ["get", "worldview"], ["all", "US"], true, false], "disputed_settlement", ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["step", ["zoom"], [">", ["get", "symbolrank"], 6], 1, [">=", ["get", "symbolrank"], 7], 2, [">=", ["get", "symbolrank"], 8], 3, [">=", ["get", "symbolrank"], 10], 4, [">=", ["get", "symbolrank"], 11], 5, [">=", ["get", "symbolrank"], 13], 6, [">=", ["get", "symbolrank"], 15]]], "type": "symbol", "source": "composite", "id": "settlement-minor-label", "paint": {"text-color": ["step", ["get", "symbolrank"], "rgb(128, 128, 128)", 11, "rgb(161, 161, 161)", 16, "rgb(184, 184, 184)"], "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1, "text-halo-blur": 1}, "source-layer": "place_label"}, {"minzoom": 3, "layout": {"text-line-height": 1.1, "text-size": ["interpolate", ["cubic-bezier", 0.2, 0, 0.9, 1], ["zoom"], 3, ["step", ["get", "symbolrank"], 13, 6, 12], 6, ["step", ["get", "symbolrank"], 16, 6, 15, 7, 14], 8, ["step", ["get", "symbolrank"], 18, 9, 17, 10, 15], 15, ["step", ["get", "symbolrank"], 23, 9, 22, 10, 20, 11, 18, 12, 16, 13, 15, 15, 13]], "text-radial-offset": ["step", ["zoom"], ["match", ["get", "capital"], 2, 0.6, 0.55], 8, 0], "icon-image": ["step", ["zoom"], ["case", ["==", ["get", "capital"], 2], "border-dot-13", ["step", ["get", "symbolrank"], "dot-11", 9, "dot-10", 11, "dot-9"]], 8, ""], "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "text-justify": ["step", ["zoom"], ["match", ["get", "text_anchor"], ["left", "bottom-left", "top-left"], "left", ["right", "bottom-right", "top-right"], "right", "center"], 8, "center"], "visibility": "none", "text-anchor": ["step", ["zoom"], ["get", "text_anchor"], 8, "center"], "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-max-width": 7}, "metadata": {"mapbox:featureComponent": "place-labels", "mapbox:group": "Place labels, place-labels"}, "maxzoom": 15, "filter": ["all", ["<=", ["get", "filterrank"], 3], ["match", ["get", "class"], "settlement", ["match", ["get", "worldview"], ["all", "US"], true, false], "disputed_settlement", ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], ["step", ["zoom"], false, 1, ["<=", ["get", "symbolrank"], 6], 2, ["<", ["get", "symbolrank"], 7], 3, ["<", ["get", "symbolrank"], 8], 4, ["<", ["get", "symbolrank"], 10], 5, ["<", ["get", "symbolrank"], 11], 6, ["<", ["get", "symbolrank"], 13], 7, ["<", ["get", "symbolrank"], 15], 8, [">=", ["get", "symbolrank"], 11], 9, [">=", ["get", "symbolrank"], 15]]], "type": "symbol", "source": "composite", "id": "settlement-major-label", "paint": {"text-color": ["step", ["get", "symbolrank"], "rgb(128, 128, 128)", 11, "rgb(161, 161, 161)", 16, "rgb(184, 184, 184)"], "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1, "text-halo-blur": 1}, "source-layer": "place_label"}, {"minzoom": 3, "layout": {"text-size": ["interpolate", ["cubic-bezier", 0.85, 0.7, 0.65, 1], ["zoom"], 4, ["step", ["get", "symbolrank"], 10, 6, 9.5, 7, 9], 9, ["step", ["get", "symbolrank"], 21, 6, 16, 7, 13]], "text-transform": "uppercase", "text-font": ["DIN Pro Bold", "Arial Unicode MS Bold"], "text-field": ["step", ["zoom"], ["step", ["get", "symbolrank"], ["coalesce", ["get", "name_en"], ["get", "name"]], 5, ["coalesce", ["get", "abbr"], ["get", "name_en"], ["get", "name"]]], 5, ["coalesce", ["get", "name_en"], ["get", "name"]]], "text-letter-spacing": 0.15, "text-max-width": 6, "visibility": "none"}, "metadata": {"mapbox:featureComponent": "place-labels", "mapbox:group": "Place labels, place-labels"}, "maxzoom": 9, "filter": ["match", ["get", "class"], "state", ["match", ["get", "worldview"], ["all", "US"], true, false], "disputed_state", ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], "type": "symbol", "source": "composite", "id": "state-label", "paint": {"text-color": "rgb(184, 184, 184)", "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1}, "source-layer": "place_label"}, {"minzoom": 1, "layout": {"text-line-height": 1.1, "text-size": ["interpolate", ["cubic-bezier", 0.2, 0, 0.7, 1], ["zoom"], 1, ["step", ["get", "symbolrank"], 11, 4, 9, 5, 8], 9, ["step", ["get", "symbolrank"], 22, 4, 19, 5, 17]], "text-radial-offset": ["step", ["zoom"], 0.6, 8, 0], "icon-image": "", "text-font": ["DIN Pro Medium", "Arial Unicode MS Regular"], "text-justify": ["step", ["zoom"], ["match", ["get", "text_anchor"], ["left", "bottom-left", "top-left"], "left", ["right", "bottom-right", "top-right"], "right", "center"], 7, "auto"], "visibility": "none", "text-field": ["coalesce", ["get", "name_en"], ["get", "name"]], "text-max-width": 6}, "metadata": {"mapbox:featureComponent": "place-labels", "mapbox:group": "Place labels, place-labels"}, "maxzoom": 10, "filter": ["match", ["get", "class"], "country", ["match", ["get", "worldview"], ["all", "US"], true, false], "disputed_country", ["all", ["==", ["get", "disputed"], "true"], ["match", ["get", "worldview"], ["all", "US"], true, false]], false], "type": "symbol", "source": "composite", "id": "country-label", "paint": {"icon-opacity": ["step", ["zoom"], ["case", ["has", "text_anchor"], 1, 0], 7, 0], "text-color": "rgb(128, 128, 128)", "text-halo-color": "rgb(255, 255, 255)", "text-halo-width": 1.25}, "source-layer": "place_label"}], "created": "2021-11-05T16:12:04.822Z", "modified": "2021-11-25T13:58:04.167Z", "id": "ckvmksrpd4n0a14pfdo5heqzr", "owner": "commaai", "visibility": "private", "protected": false, "draft": false} \ No newline at end of file diff --git a/selfdrive/navd/tests/test_map_renderer.py b/selfdrive/navd/tests/test_map_renderer.py deleted file mode 100644 index 04363883b2..0000000000 --- a/selfdrive/navd/tests/test_map_renderer.py +++ /dev/null @@ -1,212 +0,0 @@ -import time -import numpy as np -import os -import pytest -import requests -import threading -import http.server -import cereal.messaging as messaging - -from typing import Any -from msgq.visionipc import VisionIpcClient, VisionStreamType -from openpilot.common.mock.generators import LLK_DECIMATION, LOCATION1, LOCATION2, generate_liveLocationKalman -from openpilot.selfdrive.test.helpers import with_processes - -CACHE_PATH = "/data/mbgl-cache-navd.db" - -RENDER_FRAMES = 15 -DEFAULT_ITERATIONS = RENDER_FRAMES * LLK_DECIMATION -LOCATION1_REPEATED = [LOCATION1] * DEFAULT_ITERATIONS -LOCATION2_REPEATED = [LOCATION2] * DEFAULT_ITERATIONS - - -class MapBoxInternetDisabledRequestHandler(http.server.BaseHTTPRequestHandler): - INTERNET_ACTIVE = True - - def do_GET(self): - if not self.INTERNET_ACTIVE: - self.send_response(500) - self.end_headers() - return - - url = f'https://api.mapbox.com{self.path}' - - headers = dict(self.headers) - headers["Host"] = "api.mapbox.com" - - r = requests.get(url, headers=headers, timeout=5) - - self.send_response(r.status_code) - self.end_headers() - self.wfile.write(r.content) - - def log_message(self, *args: Any) -> None: - return - - def log_error(self, *args: Any) -> None: - return - - -class MapBoxInternetDisabledServer(threading.Thread): - def run(self): - self.server = http.server.HTTPServer(("127.0.0.1", 0), MapBoxInternetDisabledRequestHandler) - self.port = self.server.server_port - self.server.serve_forever() - - def stop(self): - self.server.shutdown() - - def disable_internet(self): - MapBoxInternetDisabledRequestHandler.INTERNET_ACTIVE = False - - def enable_internet(self): - MapBoxInternetDisabledRequestHandler.INTERNET_ACTIVE = True - - -@pytest.mark.skip(reason="not used") -class TestMapRenderer: - server: MapBoxInternetDisabledServer - - @classmethod - def setup_class(cls): - assert "MAPBOX_TOKEN" in os.environ - cls.original_token = os.environ["MAPBOX_TOKEN"] - cls.server = MapBoxInternetDisabledServer() - cls.server.start() - time.sleep(0.5) # wait for server to startup - - @classmethod - def teardown_class(cls) -> None: - cls.server.stop() - - def setup_method(self): - self.server.enable_internet() - os.environ['MAPS_HOST'] = f'http://localhost:{self.server.port}' - - self.sm = messaging.SubMaster(['mapRenderState']) - self.pm = messaging.PubMaster(['liveLocationKalman']) - self.vipc = VisionIpcClient("navd", VisionStreamType.VISION_STREAM_MAP, True) - - if os.path.exists(CACHE_PATH): - os.remove(CACHE_PATH) - - def _setup_test(self): - assert self.pm.wait_for_readers_to_update("liveLocationKalman", 10) - - time.sleep(0.5) - - assert VisionIpcClient.available_streams("navd", False) == {VisionStreamType.VISION_STREAM_MAP, } - assert self.vipc.connect(False) - self.vipc.recv() - - def _run_test(self, expect_valid, locations=LOCATION1_REPEATED): - starting_frame_id = None - - render_times = [] - - # run test - prev_frame_id = -1 - for i, location in enumerate(locations): - frame_expected = (i+1) % LLK_DECIMATION == 0 - - if self.sm.logMonoTime['mapRenderState'] == 0: - prev_valid = False - prev_frame_id = -1 - else: - prev_valid = self.sm.valid['mapRenderState'] - prev_frame_id = self.sm['mapRenderState'].frameId - - if starting_frame_id is None: - starting_frame_id = prev_frame_id - - llk = generate_liveLocationKalman(location) - self.pm.send("liveLocationKalman", llk) - self.pm.wait_for_readers_to_update("liveLocationKalman", 10) - self.sm.update(1000 if frame_expected else 0) - assert self.sm.updated['mapRenderState'] == frame_expected, "renderer running at wrong frequency" - - if not frame_expected: - continue - - frames_since_test_start = self.sm['mapRenderState'].frameId - starting_frame_id - - # give a few frames to switch from valid to invalid, or vice versa - 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: - continue - - # check output - assert self.sm.valid['mapRenderState'] == expect_valid - assert self.sm['mapRenderState'].frameId == (prev_frame_id + 1) - assert self.sm['mapRenderState'].locationMonoTime == llk.logMonoTime - if not expect_valid: - assert self.sm['mapRenderState'].renderTime == 0. - else: - assert 0. < self.sm['mapRenderState'].renderTime < 0.1 - render_times.append(self.sm['mapRenderState'].renderTime) - - # check vision ipc output - assert self.vipc.recv() is not None - assert self.vipc.valid == expect_valid - assert self.vipc.timestamp_sof == llk.logMonoTime - assert self.vipc.frame_id == self.sm['mapRenderState'].frameId - - assert frames_since_test_start >= RENDER_FRAMES - - return render_times - - @with_processes(["mapsd"]) - def test_with_internet(self): - self._setup_test() - self._run_test(True) - - @with_processes(["mapsd"]) - def test_with_no_internet(self): - self.server.disable_internet() - self._setup_test() - self._run_test(False) - - @with_processes(["mapsd"]) - @pytest.mark.skip(reason="slow, flaky, and unlikely to break") - def test_recover_from_no_internet(self): - self._setup_test() - self._run_test(True) - - self.server.disable_internet() - - # change locations to force mapsd to refetch - self._run_test(False, LOCATION2_REPEATED) - - self.server.enable_internet() - self._run_test(True, LOCATION2_REPEATED) - - @with_processes(["mapsd"]) - @pytest.mark.tici - def test_render_time_distribution(self): - self._setup_test() - # from location1 -> location2 and back - locations = np.array([*np.linspace(LOCATION1, LOCATION2, 2000), *np.linspace(LOCATION2, LOCATION1, 2000)]).tolist() - - render_times = self._run_test(True, locations) - - _min = np.min(render_times) - _max = np.max(render_times) - _mean = np.mean(render_times) - _median = np.median(render_times) - _stddev = np.std(render_times) - - print(f"Stats: min: {_min}, max: {_max}, mean: {_mean}, median: {_median}, stddev: {_stddev}, count: {len(render_times)}") - - def assert_stat(stat, nominal, tol=0.3): - tol = (nominal / (1+tol)), (nominal * (1+tol)) - assert tol[0] < stat < tol[1], f"{stat} not in tolerance {tol}" - - assert_stat(_mean, 0.030) - assert_stat(_median, 0.027) - assert_stat(_stddev, 0.0078) - - assert _max < 0.065 - assert _min > 0.015 - diff --git a/selfdrive/navd/tests/test_navd.py b/selfdrive/navd/tests/test_navd.py deleted file mode 100644 index b6580acff1..0000000000 --- a/selfdrive/navd/tests/test_navd.py +++ /dev/null @@ -1,57 +0,0 @@ -import json -import random -import numpy as np - -from parameterized import parameterized - -import cereal.messaging as messaging -from openpilot.common.params import Params -from openpilot.system.manager.process_config import managed_processes - - -class TestNavd: - def setup_method(self): - self.params = Params() - self.sm = messaging.SubMaster(['navRoute', 'navInstruction']) - - def teardown_method(self): - managed_processes['navd'].stop() - - def _check_route(self, start, end, check_coords=True): - self.params.put("NavDestination", json.dumps(end)) - self.params.put("LastGPSPosition", json.dumps(start)) - - managed_processes['navd'].start() - for _ in range(30): - self.sm.update(1000) - if all(f > 0 for f in self.sm.recv_frame.values()): - break - else: - raise Exception("didn't get a route") - - assert managed_processes['navd'].proc.is_alive() - managed_processes['navd'].stop() - - # ensure start and end match up - if check_coords: - coords = self.sm['navRoute'].coordinates - assert np.allclose([start['latitude'], start['longitude'], end['latitude'], end['longitude']], - [coords[0].latitude, coords[0].longitude, coords[-1].latitude, coords[-1].longitude], - rtol=1e-3) - - def test_simple(self): - start = { - "latitude": 32.7427228, - "longitude": -117.2321177, - } - end = { - "latitude": 32.7557004, - "longitude": -117.268002, - } - self._check_route(start, end) - - @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) diff --git a/selfdrive/test/test_onroad.py b/selfdrive/test/test_onroad.py index 7b44a3b80e..7574a5e4ab 100644 --- a/selfdrive/test/test_onroad.py +++ b/selfdrive/test/test_onroad.py @@ -60,7 +60,6 @@ PROCS = { "system.timed": 0, "selfdrive.pandad.pandad": 0, "system.statsd": 0.4, - "selfdrive.navd.navd": 0.4, "system.loggerd.uploader": (0.5, 15.0), "system.loggerd.deleter": 0.1, } diff --git a/selfdrive/ui/SConscript b/selfdrive/ui/SConscript index e4fb32586d..8b268b9e84 100644 --- a/selfdrive/ui/SConscript +++ b/selfdrive/ui/SConscript @@ -1,6 +1,6 @@ import os import json -Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations', 'UBUNTU_FOCAL') +Import('qt_env', 'arch', 'common', 'messaging', 'visionipc', 'transformations') base_libs = [common, messaging, visionipc, transformations, 'm', 'OpenCL', 'ssl', 'crypto', 'pthread'] + qt_env["LIBS"] @@ -8,8 +8,6 @@ base_libs = [common, messaging, visionipc, transformations, if arch == 'larch64': base_libs.append('EGL') -maps = arch in ['larch64', 'aarch64', 'x86_64'] and not UBUNTU_FOCAL - if arch == "Darwin": del base_libs[base_libs.index('OpenCL')] qt_env['FRAMEWORKS'] += ['OpenCL'] @@ -24,13 +22,6 @@ widgets_src = ["ui.cc", "qt/widgets/input.cc", "qt/widgets/wifi.cc", "qt/widgets/scrollview.cc", "qt/widgets/cameraview.cc", "#third_party/qrcode/QrCode.cc", "qt/request_repeater.cc", "qt/qt_window.cc", "qt/network/networking.cc", "qt/network/wifi_manager.cc"] -qt_env['CPPDEFINES'] = [] -if maps: - base_libs += ['QMapLibre'] - widgets_src += ["qt/maps/map_helpers.cc", "qt/maps/map_settings.cc", "qt/maps/map.cc", "qt/maps/map_panel.cc", - "qt/maps/map_eta.cc", "qt/maps/map_instructions.cc"] - qt_env['CPPDEFINES'] += ["ENABLE_MAPS"] - widgets = qt_env.Library("qt_widgets", widgets_src, LIBS=base_libs) Export('widgets') qt_libs = [widgets, qt_util] + base_libs diff --git a/selfdrive/ui/qt/home.cc b/selfdrive/ui/qt/home.cc index 9dbe7cbae3..c510087e8e 100644 --- a/selfdrive/ui/qt/home.cc +++ b/selfdrive/ui/qt/home.cc @@ -9,10 +9,6 @@ #include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/widgets/prime.h" -#ifdef ENABLE_MAPS -#include "selfdrive/ui/qt/maps/map_settings.h" -#endif - // HomeWindow: the container for the offroad and onroad UIs HomeWindow::HomeWindow(QWidget* parent) : QWidget(parent) { @@ -145,13 +141,17 @@ OffroadHome::OffroadHome(QWidget* parent) : QFrame(parent) { home_layout->setContentsMargins(0, 0, 0, 0); home_layout->setSpacing(30); - // left: MapSettings/PrimeAdWidget + // left: PrimeAdWidget QStackedWidget *left_widget = new QStackedWidget(this); -#ifdef ENABLE_MAPS - left_widget->addWidget(new MapSettings); -#else - left_widget->addWidget(new QWidget); -#endif + QVBoxLayout *left_prime_layout = new QVBoxLayout(); + QWidget *prime_user = new PrimeUserWidget(); + prime_user->setStyleSheet(R"( + border-radius: 10px; + background-color: #333333; + )"); + left_prime_layout->addWidget(prime_user); + left_prime_layout->addStretch(); + left_widget->addWidget(new LayoutWidget(left_prime_layout)); left_widget->addWidget(new PrimeAdWidget); left_widget->setStyleSheet("border-radius: 10px;"); diff --git a/selfdrive/ui/qt/maps/map.cc b/selfdrive/ui/qt/maps/map.cc deleted file mode 100644 index 490eb118ca..0000000000 --- a/selfdrive/ui/qt/maps/map.cc +++ /dev/null @@ -1,390 +0,0 @@ -#include "selfdrive/ui/qt/maps/map.h" - -#include -#include - -#include - -#include "common/swaglog.h" -#include "selfdrive/ui/qt/maps/map_helpers.h" -#include "selfdrive/ui/qt/util.h" -#include "selfdrive/ui/ui.h" - - -const int INTERACTION_TIMEOUT = 100; - -const float MAX_ZOOM = 17; -const float MIN_ZOOM = 14; -const float MAX_PITCH = 50; -const float MIN_PITCH = 0; -const float MAP_SCALE = 2; - -MapWindow::MapWindow(const QMapLibre::Settings &settings) : m_settings(settings), velocity_filter(0, 10, 0.05, false) { - QObject::connect(uiState(), &UIState::uiUpdate, this, &MapWindow::updateState); - - map_overlay = new QWidget (this); - map_overlay->setAttribute(Qt::WA_TranslucentBackground, true); - QVBoxLayout *overlay_layout = new QVBoxLayout(map_overlay); - overlay_layout->setContentsMargins(0, 0, 0, 0); - - // Instructions - map_instructions = new MapInstructions(this); - map_instructions->setVisible(false); - - map_eta = new MapETA(this); - map_eta->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - map_eta->setFixedHeight(120); - - error = new QLabel(this); - error->setStyleSheet(R"(color:white;padding:50px 11px;font-size: 90px; background-color:rgba(0, 0, 0, 150);)"); - error->setAlignment(Qt::AlignCenter); - - overlay_layout->addWidget(error); - overlay_layout->addWidget(map_instructions); - overlay_layout->addStretch(1); - overlay_layout->addWidget(map_eta); - - last_position = coordinate_from_param("LastGPSPosition"); - grabGesture(Qt::GestureType::PinchGesture); - qDebug() << "MapWindow initialized"; -} - -MapWindow::~MapWindow() { - makeCurrent(); -} - -void MapWindow::initLayers() { - // This doesn't work from initializeGL - if (!m_map->layerExists("modelPathLayer")) { - qDebug() << "Initializing modelPathLayer"; - QVariantMap modelPath; - //modelPath["id"] = "modelPathLayer"; - modelPath["type"] = "line"; - modelPath["source"] = "modelPathSource"; - m_map->addLayer("modelPathLayer", modelPath); - m_map->setPaintProperty("modelPathLayer", "line-color", QColor("red")); - m_map->setPaintProperty("modelPathLayer", "line-width", 5.0); - m_map->setLayoutProperty("modelPathLayer", "line-cap", "round"); - } - if (!m_map->layerExists("navLayer")) { - qDebug() << "Initializing navLayer"; - QVariantMap nav; - nav["type"] = "line"; - nav["source"] = "navSource"; - m_map->addLayer("navLayer", nav, "road-intersection"); - - QVariantMap transition; - transition["duration"] = 400; // ms - m_map->setPaintProperty("navLayer", "line-color", QColor("#31a1ee")); - m_map->setPaintProperty("navLayer", "line-color-transition", transition); - m_map->setPaintProperty("navLayer", "line-width", 7.5); - m_map->setLayoutProperty("navLayer", "line-cap", "round"); - } - if (!m_map->layerExists("pinLayer")) { - qDebug() << "Initializing pinLayer"; - m_map->addImage("default_marker", QImage("../assets/navigation/default_marker.svg")); - QVariantMap pin; - pin["type"] = "symbol"; - pin["source"] = "pinSource"; - m_map->addLayer("pinLayer", pin); - m_map->setLayoutProperty("pinLayer", "icon-pitch-alignment", "viewport"); - m_map->setLayoutProperty("pinLayer", "icon-image", "default_marker"); - m_map->setLayoutProperty("pinLayer", "icon-ignore-placement", true); - m_map->setLayoutProperty("pinLayer", "icon-allow-overlap", true); - m_map->setLayoutProperty("pinLayer", "symbol-sort-key", 0); - m_map->setLayoutProperty("pinLayer", "icon-anchor", "bottom"); - } - if (!m_map->layerExists("carPosLayer")) { - qDebug() << "Initializing carPosLayer"; - m_map->addImage("label-arrow", QImage("../assets/images/triangle.svg")); - - QVariantMap carPos; - carPos["type"] = "symbol"; - carPos["source"] = "carPosSource"; - m_map->addLayer("carPosLayer", carPos); - m_map->setLayoutProperty("carPosLayer", "icon-pitch-alignment", "map"); - m_map->setLayoutProperty("carPosLayer", "icon-image", "label-arrow"); - m_map->setLayoutProperty("carPosLayer", "icon-size", 0.5); - m_map->setLayoutProperty("carPosLayer", "icon-ignore-placement", true); - m_map->setLayoutProperty("carPosLayer", "icon-allow-overlap", true); - // TODO: remove, symbol-sort-key does not seem to matter outside of each layer - m_map->setLayoutProperty("carPosLayer", "symbol-sort-key", 0); - } -} - -void MapWindow::updateState(const UIState &s) { - if (!uiState()->scene.started) { - return; - } - const SubMaster &sm = *(s.sm); - update(); - - // on rising edge of a valid system time, reinitialize the map to set a new token - if (sm.valid("clocks") && !prev_time_valid) { - LOGW("Time is now valid, reinitializing map"); - m_settings.setApiKey(get_mapbox_token()); - initializeGL(); - } - prev_time_valid = sm.valid("clocks"); - - if (sm.updated("liveLocationKalman")) { - auto locationd_location = sm["liveLocationKalman"].getLiveLocationKalman(); - auto locationd_pos = locationd_location.getPositionGeodetic(); - auto locationd_orientation = locationd_location.getCalibratedOrientationNED(); - auto locationd_velocity = locationd_location.getVelocityCalibrated(); - auto locationd_ecef = locationd_location.getPositionECEF(); - - 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]); - last_bearing = RAD2DEG(locationd_orientation.getValue()[2]); - velocity_filter.update(std::max(10.0, locationd_velocity.getValue()[0])); - } - } - - if (sm.updated("navRoute") && sm["navRoute"].getNavRoute().getCoordinates().size()) { - auto nav_dest = coordinate_from_param("NavDestination"); - bool allow_open = std::exchange(last_valid_nav_dest, nav_dest) != nav_dest && - nav_dest && !isVisible(); - qWarning() << "Got new navRoute from navd. Opening map:" << allow_open; - - // Show map on destination set/change - if (allow_open) { - emit requestSettings(false); - emit requestVisible(true); - } - } - - loaded_once = loaded_once || (m_map && m_map->isFullyLoaded()); - if (!loaded_once) { - setError(tr("Map Loading")); - return; - } - initLayers(); - - if (!locationd_valid) { - setError(tr("Waiting for GPS")); - } else if (routing_problem) { - setError(tr("Waiting for route")); - } else { - setError(""); - } - - if (locationd_valid) { - // Update current location marker - auto point = coordinate_to_collection(*last_position); - QMapLibre::Feature feature1(QMapLibre::Feature::PointType, point, {}, {}); - QVariantMap carPosSource; - carPosSource["type"] = "geojson"; - carPosSource["data"] = QVariant::fromValue(feature1); - m_map->updateSource("carPosSource", carPosSource); - - // Map bearing isn't updated when interacting, keep location marker up to date - if (last_bearing) { - m_map->setLayoutProperty("carPosLayer", "icon-rotate", *last_bearing - m_map->bearing()); - } - } - - if (interaction_counter == 0) { - if (last_position) m_map->setCoordinate(*last_position); - if (last_bearing) m_map->setBearing(*last_bearing); - m_map->setZoom(util::map_val(velocity_filter.x(), 0, 30, MAX_ZOOM, MIN_ZOOM)); - } else { - interaction_counter--; - } - - if (sm.updated("navInstruction")) { - // an invalid navInstruction packet with a nav destination is only possible if: - // - API exception/no internet - // - route response is empty - // - any time navd is waiting for recompute_countdown - routing_problem = !sm.valid("navInstruction") && coordinate_from_param("NavDestination").has_value(); - - if (sm.valid("navInstruction")) { - auto i = sm["navInstruction"].getNavInstruction(); - map_eta->updateETA(i.getTimeRemaining(), i.getTimeRemainingTypical(), i.getDistanceRemaining()); - - if (locationd_valid) { - m_map->setPitch(MAX_PITCH); // TODO: smooth pitching based on maneuver distance - map_instructions->updateInstructions(i); - } - } else { - clearRoute(); - } - } - - if (sm.rcv_frame("navRoute") != route_rcv_frame) { - qWarning() << "Updating navLayer with new route"; - auto route = sm["navRoute"].getNavRoute(); - auto route_points = capnp_coordinate_list_to_collection(route.getCoordinates()); - QMapLibre::Feature feature(QMapLibre::Feature::LineStringType, route_points, {}, {}); - QVariantMap navSource; - navSource["type"] = "geojson"; - navSource["data"] = QVariant::fromValue(feature); - m_map->updateSource("navSource", navSource); - m_map->setLayoutProperty("navLayer", "visibility", "visible"); - - route_rcv_frame = sm.rcv_frame("navRoute"); - updateDestinationMarker(); - } -} - -void MapWindow::setError(const QString &err_str) { - if (err_str != error->text()) { - error->setText(err_str); - error->setVisible(!err_str.isEmpty()); - if (!err_str.isEmpty()) map_instructions->setVisible(false); - } -} - -void MapWindow::resizeGL(int w, int h) { - m_map->resize(size() / MAP_SCALE); - map_overlay->setFixedSize(width(), height()); -} - -void MapWindow::initializeGL() { - m_map.reset(new QMapLibre::Map(this, m_settings, size(), 1)); - - if (last_position) { - m_map->setCoordinateZoom(*last_position, MAX_ZOOM); - } else { - m_map->setCoordinateZoom(QMapLibre::Coordinate(64.31990695292795, -149.79038934046247), MIN_ZOOM); - } - - m_map->setMargins({0, 350, 0, 50}); - m_map->setPitch(MIN_PITCH); - m_map->setStyleUrl("mapbox://styles/commaai/clkqztk0f00ou01qyhsa5bzpj"); - - QObject::connect(m_map.data(), &QMapLibre::Map::mapChanged, [=](QMapLibre::Map::MapChange change) { - // set global animation duration to 0 ms so visibility changes are instant - if (change == QMapLibre::Map::MapChange::MapChangeDidFinishLoadingStyle) { - m_map->setTransitionOptions(0, 0); - } - if (change == QMapLibre::Map::MapChange::MapChangeDidFinishLoadingMap) { - loaded_once = true; - } - }); - - QObject::connect(m_map.data(), &QMapLibre::Map::mapLoadingFailed, [=](QMapLibre::Map::MapLoadingFailure err_code, const QString &reason) { - LOGE("Map loading failed with %d: '%s'\n", err_code, reason.toStdString().c_str()); - }); -} - -void MapWindow::paintGL() { - if (!isVisible() || m_map.isNull()) return; - m_map->render(); -} - -void MapWindow::clearRoute() { - if (!m_map.isNull()) { - m_map->setLayoutProperty("navLayer", "visibility", "none"); - m_map->setPitch(MIN_PITCH); - updateDestinationMarker(); - } - - map_instructions->setVisible(false); - map_eta->setVisible(false); - last_valid_nav_dest = std::nullopt; -} - -void MapWindow::mousePressEvent(QMouseEvent *ev) { - m_lastPos = ev->localPos(); - ev->accept(); -} - -void MapWindow::mouseDoubleClickEvent(QMouseEvent *ev) { - if (last_position) m_map->setCoordinate(*last_position); - if (last_bearing) m_map->setBearing(*last_bearing); - m_map->setZoom(util::map_val(velocity_filter.x(), 0, 30, MAX_ZOOM, MIN_ZOOM)); - update(); - - interaction_counter = 0; -} - -void MapWindow::mouseMoveEvent(QMouseEvent *ev) { - QPointF delta = ev->localPos() - m_lastPos; - - if (!delta.isNull()) { - interaction_counter = INTERACTION_TIMEOUT; - m_map->moveBy(delta / MAP_SCALE); - update(); - } - - m_lastPos = ev->localPos(); - ev->accept(); -} - -void MapWindow::wheelEvent(QWheelEvent *ev) { - if (ev->orientation() == Qt::Horizontal) { - return; - } - - float factor = ev->delta() / 1200.; - if (ev->delta() < 0) { - factor = factor > -1 ? factor : 1 / factor; - } - - m_map->scaleBy(1 + factor, ev->pos() / MAP_SCALE); - update(); - - interaction_counter = INTERACTION_TIMEOUT; - ev->accept(); -} - -bool MapWindow::event(QEvent *event) { - if (event->type() == QEvent::Gesture) { - return gestureEvent(static_cast(event)); - } - - return QWidget::event(event); -} - -bool MapWindow::gestureEvent(QGestureEvent *event) { - if (QGesture *pinch = event->gesture(Qt::PinchGesture)) { - pinchTriggered(static_cast(pinch)); - } - return true; -} - -void MapWindow::pinchTriggered(QPinchGesture *gesture) { - QPinchGesture::ChangeFlags changeFlags = gesture->changeFlags(); - if (changeFlags & QPinchGesture::ScaleFactorChanged) { - // TODO: figure out why gesture centerPoint doesn't work - m_map->scaleBy(gesture->scaleFactor(), {width() / 2.0 / MAP_SCALE, height() / 2.0 / MAP_SCALE}); - update(); - interaction_counter = INTERACTION_TIMEOUT; - } -} - -void MapWindow::offroadTransition(bool offroad) { - if (offroad) { - clearRoute(); - routing_problem = false; - } else { - auto dest = coordinate_from_param("NavDestination"); - emit requestVisible(dest.has_value()); - } - last_bearing = {}; -} - -void MapWindow::updateDestinationMarker() { - auto nav_dest = coordinate_from_param("NavDestination"); - if (nav_dest.has_value()) { - auto point = coordinate_to_collection(*nav_dest); - QMapLibre::Feature feature(QMapLibre::Feature::PointType, point, {}, {}); - QVariantMap pinSource; - pinSource["type"] = "geojson"; - pinSource["data"] = QVariant::fromValue(feature); - m_map->updateSource("pinSource", pinSource); - m_map->setPaintProperty("pinLayer", "visibility", "visible"); - } else { - m_map->setPaintProperty("pinLayer", "visibility", "none"); - } -} diff --git a/selfdrive/ui/qt/maps/map.h b/selfdrive/ui/qt/maps/map.h deleted file mode 100644 index 31a44f27b1..0000000000 --- a/selfdrive/ui/qt/maps/map.h +++ /dev/null @@ -1,86 +0,0 @@ -#pragma once - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "cereal/messaging/messaging.h" -#include "common/params.h" -#include "common/util.h" -#include "selfdrive/ui/ui.h" -#include "selfdrive/ui/qt/maps/map_eta.h" -#include "selfdrive/ui/qt/maps/map_instructions.h" - -class MapWindow : public QOpenGLWidget { - Q_OBJECT - -public: - MapWindow(const QMapLibre::Settings &); - ~MapWindow(); - -private: - void initializeGL() final; - void paintGL() final; - void resizeGL(int w, int h) override; - - QMapLibre::Settings m_settings; - QScopedPointer m_map; - - void initLayers(); - - void mousePressEvent(QMouseEvent *ev) final; - void mouseDoubleClickEvent(QMouseEvent *ev) final; - void mouseMoveEvent(QMouseEvent *ev) final; - void wheelEvent(QWheelEvent *ev) final; - bool event(QEvent *event) final; - bool gestureEvent(QGestureEvent *event); - void pinchTriggered(QPinchGesture *gesture); - void setError(const QString &err_str); - - bool loaded_once = false; - bool prev_time_valid = true; - - // Panning - QPointF m_lastPos; - int interaction_counter = 0; - - // Position - std::optional last_valid_nav_dest; - std::optional last_position; - std::optional last_bearing; - FirstOrderFilter velocity_filter; - bool locationd_valid = false; - bool routing_problem = false; - - QWidget *map_overlay; - QLabel *error; - MapInstructions* map_instructions; - MapETA* map_eta; - - void clearRoute(); - void updateDestinationMarker(); - uint64_t route_rcv_frame = 0; - -private slots: - void updateState(const UIState &s); - -public slots: - void offroadTransition(bool offroad); - -signals: - void requestVisible(bool visible); - void requestSettings(bool settings); -}; diff --git a/selfdrive/ui/qt/maps/map_eta.cc b/selfdrive/ui/qt/maps/map_eta.cc deleted file mode 100644 index 0eb77e36ce..0000000000 --- a/selfdrive/ui/qt/maps/map_eta.cc +++ /dev/null @@ -1,59 +0,0 @@ -#include "selfdrive/ui/qt/maps/map_eta.h" - -#include -#include - -#include "selfdrive/ui/qt/maps/map_helpers.h" -#include "selfdrive/ui/ui.h" - -const float MANEUVER_TRANSITION_THRESHOLD = 10; - -MapETA::MapETA(QWidget *parent) : QWidget(parent) { - setVisible(false); - setAttribute(Qt::WA_TranslucentBackground); - eta_doc.setUndoRedoEnabled(false); - eta_doc.setDefaultStyleSheet("body {font-family:Inter;font-size:70px;color:white;} b{font-weight:600;} td{padding:0 3px;}"); -} - -void MapETA::paintEvent(QPaintEvent *event) { - if (!eta_doc.isEmpty()) { - QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - p.setPen(Qt::NoPen); - p.setBrush(QColor(0, 0, 0, 255)); - QSizeF txt_size = eta_doc.size(); - p.drawRoundedRect((width() - txt_size.width()) / 2 - UI_BORDER_SIZE, 0, txt_size.width() + UI_BORDER_SIZE * 2, height() + 25, 25, 25); - p.translate((width() - txt_size.width()) / 2, (height() - txt_size.height()) / 2); - eta_doc.drawContents(&p); - } -} - -void MapETA::updateETA(float s, float s_typical, float d) { - // ETA - auto eta_t = QDateTime::currentDateTime().addSecs(s).time(); - auto eta = format_24h ? std::pair{eta_t.toString("HH:mm"), tr("eta")} - : std::pair{eta_t.toString("h:mm a").split(' ')[0], eta_t.toString("a")}; - - // Remaining time - 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 (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); - - eta_doc.setHtml(QString(R"( - - )") - .arg(eta.first, eta.second, color, remaining.first, remaining.second, distance.first, distance.second)); - - setVisible(d >= MANEUVER_TRANSITION_THRESHOLD); - update(); -} diff --git a/selfdrive/ui/qt/maps/map_eta.h b/selfdrive/ui/qt/maps/map_eta.h deleted file mode 100644 index 6e59837de3..0000000000 --- a/selfdrive/ui/qt/maps/map_eta.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "common/params.h" - -class MapETA : public QWidget { - Q_OBJECT - -public: - MapETA(QWidget * parent=nullptr); - void updateETA(float seconds, float seconds_typical, float distance); - -private: - void paintEvent(QPaintEvent *event) override; - void showEvent(QShowEvent *event) override { format_24h = param.getBool("NavSettingTime24h"); } - - bool format_24h = false; - QTextDocument eta_doc; - Params param; -}; diff --git a/selfdrive/ui/qt/maps/map_helpers.cc b/selfdrive/ui/qt/maps/map_helpers.cc deleted file mode 100644 index 50e1401164..0000000000 --- a/selfdrive/ui/qt/maps/map_helpers.cc +++ /dev/null @@ -1,153 +0,0 @@ -#include "selfdrive/ui/qt/maps/map_helpers.h" - -#include -#include -#include - -#include -#include - -#include "common/params.h" -#include "system/hardware/hw.h" -#include "selfdrive/ui/qt/api.h" - -QString get_mapbox_token() { - // Valid for 4 weeks since we can't swap tokens on the fly - return MAPBOX_TOKEN.isEmpty() ? CommaApi::create_jwt({}, 4 * 7 * 24 * 3600) : MAPBOX_TOKEN; -} - -QMapLibre::Settings get_mapbox_settings() { - QMapLibre::Settings settings; - settings.setProviderTemplate(QMapLibre::Settings::ProviderTemplate::MapboxProvider); - - if (!Hardware::PC()) { - settings.setCacheDatabasePath(MAPS_CACHE_PATH); - settings.setCacheDatabaseMaximumSize(100 * 1024 * 1024); - } - settings.setApiBaseUrl(MAPS_HOST); - settings.setApiKey(get_mapbox_token()); - - return settings; -} - -QGeoCoordinate to_QGeoCoordinate(const QMapLibre::Coordinate &in) { - return QGeoCoordinate(in.first, in.second); -} - -QMapLibre::CoordinatesCollections model_to_collection( - const cereal::LiveLocationKalman::Measurement::Reader &calibratedOrientationECEF, - const cereal::LiveLocationKalman::Measurement::Reader &positionECEF, - const cereal::XYZTData::Reader &line){ - - Eigen::Vector3d ecef(positionECEF.getValue()[0], positionECEF.getValue()[1], positionECEF.getValue()[2]); - Eigen::Vector3d orient(calibratedOrientationECEF.getValue()[0], calibratedOrientationECEF.getValue()[1], calibratedOrientationECEF.getValue()[2]); - Eigen::Matrix3d ecef_from_local = euler2rot(orient); - - QMapLibre::Coordinates coordinates; - auto x = line.getX(); - auto y = line.getY(); - auto z = line.getZ(); - for (int i = 0; i < x.size(); i++) { - Eigen::Vector3d point_ecef = ecef_from_local * Eigen::Vector3d(x[i], y[i], z[i]) + ecef; - Geodetic point_geodetic = ecef2geodetic((ECEF){.x = point_ecef[0], .y = point_ecef[1], .z = point_ecef[2]}); - coordinates.push_back({point_geodetic.lat, point_geodetic.lon}); - } - - return {QMapLibre::CoordinatesCollection{coordinates}}; -} - -QMapLibre::CoordinatesCollections coordinate_to_collection(const QMapLibre::Coordinate &c) { - QMapLibre::Coordinates coordinates{c}; - return {QMapLibre::CoordinatesCollection{coordinates}}; -} - -QMapLibre::CoordinatesCollections capnp_coordinate_list_to_collection(const capnp::List::Reader& coordinate_list) { - QMapLibre::Coordinates coordinates; - for (auto const &c : coordinate_list) { - coordinates.push_back({c.getLatitude(), c.getLongitude()}); - } - return {QMapLibre::CoordinatesCollection{coordinates}}; -} - -QMapLibre::CoordinatesCollections coordinate_list_to_collection(const QList &coordinate_list) { - QMapLibre::Coordinates coordinates; - for (auto &c : coordinate_list) { - coordinates.push_back({c.latitude(), c.longitude()}); - } - return {QMapLibre::CoordinatesCollection{coordinates}}; -} - -QList polyline_to_coordinate_list(const QString &polylineString) { - QList path; - if (polylineString.isEmpty()) - return path; - - QByteArray data = polylineString.toLatin1(); - - bool parsingLatitude = true; - - int shift = 0; - int value = 0; - - QGeoCoordinate coord(0, 0); - - for (int i = 0; i < data.length(); ++i) { - unsigned char c = data.at(i) - 63; - - value |= (c & 0x1f) << shift; - shift += 5; - - // another chunk - if (c & 0x20) - continue; - - int diff = (value & 1) ? ~(value >> 1) : (value >> 1); - - if (parsingLatitude) { - coord.setLatitude(coord.latitude() + (double)diff/1e6); - } else { - coord.setLongitude(coord.longitude() + (double)diff/1e6); - path.append(coord); - } - - parsingLatitude = !parsingLatitude; - - value = 0; - shift = 0; - } - - return path; -} - -std::optional coordinate_from_param(const std::string ¶m) { - QString json_str = QString::fromStdString(Params().get(param)); - if (json_str.isEmpty()) return {}; - - QJsonDocument doc = QJsonDocument::fromJson(json_str.toUtf8()); - if (doc.isNull()) return {}; - - QJsonObject json = doc.object(); - if (json["latitude"].isDouble() && json["longitude"].isDouble()) { - QMapLibre::Coordinate coord(json["latitude"].toDouble(), json["longitude"].toDouble()); - return coord; - } else { - return {}; - } -} - -// return {distance, unit} -std::pair map_format_distance(float d, bool is_metric) { - 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(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(round_distance(d * METER_TO_MILE), QObject::tr("mi")) - : std::pair(QString::number(50 * std::nearbyint(d / 50)), QObject::tr("ft")); - } -} diff --git a/selfdrive/ui/qt/maps/map_helpers.h b/selfdrive/ui/qt/maps/map_helpers.h deleted file mode 100644 index 0f4be674f0..0000000000 --- a/selfdrive/ui/qt/maps/map_helpers.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include "common/util.h" -#include "common/transformations/coordinates.hpp" -#include "common/transformations/orientation.hpp" -#include "cereal/messaging/messaging.h" - -const QString MAPBOX_TOKEN = util::getenv("MAPBOX_TOKEN").c_str(); -const QString MAPS_HOST = util::getenv("MAPS_HOST", MAPBOX_TOKEN.isEmpty() ? "https://maps.comma.ai" : "https://api.mapbox.com").c_str(); -const QString MAPS_CACHE_PATH = "/data/mbgl-cache-navd.db"; - -QString get_mapbox_token(); -QMapLibre::Settings get_mapbox_settings(); -QGeoCoordinate to_QGeoCoordinate(const QMapLibre::Coordinate &in); -QMapLibre::CoordinatesCollections model_to_collection( - const cereal::LiveLocationKalman::Measurement::Reader &calibratedOrientationECEF, - const cereal::LiveLocationKalman::Measurement::Reader &positionECEF, - const cereal::XYZTData::Reader &line); -QMapLibre::CoordinatesCollections coordinate_to_collection(const QMapLibre::Coordinate &c); -QMapLibre::CoordinatesCollections capnp_coordinate_list_to_collection(const capnp::List::Reader &coordinate_list); -QMapLibre::CoordinatesCollections coordinate_list_to_collection(const QList &coordinate_list); -QList polyline_to_coordinate_list(const QString &polylineString); -std::optional coordinate_from_param(const std::string ¶m); -std::pair map_format_distance(float d, bool is_metric); diff --git a/selfdrive/ui/qt/maps/map_instructions.cc b/selfdrive/ui/qt/maps/map_instructions.cc deleted file mode 100644 index ba8cb356bd..0000000000 --- a/selfdrive/ui/qt/maps/map_instructions.cc +++ /dev/null @@ -1,144 +0,0 @@ -#include "selfdrive/ui/qt/maps/map_instructions.h" - -#include -#include - -#include "selfdrive/ui/qt/maps/map_helpers.h" -#include "selfdrive/ui/ui.h" - -const QString ICON_SUFFIX = ".png"; - -MapInstructions::MapInstructions(QWidget *parent) : QWidget(parent) { - is_rhd = Params().getBool("IsRhdDetected"); - QVBoxLayout *main_layout = new QVBoxLayout(this); - main_layout->setContentsMargins(11, UI_BORDER_SIZE, 11, 20); - - QHBoxLayout *top_layout = new QHBoxLayout; - top_layout->addWidget(icon_01 = new QLabel, 0, Qt::AlignTop); - - QVBoxLayout *right_layout = new QVBoxLayout; - right_layout->setContentsMargins(9, 9, 9, 0); - right_layout->addWidget(distance = new QLabel); - distance->setStyleSheet(R"(font-size: 90px;)"); - - right_layout->addWidget(primary = new QLabel); - primary->setStyleSheet(R"(font-size: 60px;)"); - primary->setWordWrap(true); - - right_layout->addWidget(secondary = new QLabel); - secondary->setStyleSheet(R"(font-size: 50px;)"); - secondary->setWordWrap(true); - - top_layout->addLayout(right_layout); - - main_layout->addLayout(top_layout); - main_layout->addLayout(lane_layout = new QHBoxLayout); - lane_layout->setAlignment(Qt::AlignHCenter); - lane_layout->setSpacing(10); - - setStyleSheet("color:white"); - QPalette pal = palette(); - pal.setColor(QPalette::Background, QColor(0, 0, 0, 150)); - setAutoFillBackground(true); - setPalette(pal); - - buildPixmapCache(); -} - -void MapInstructions::buildPixmapCache() { - QDir dir("../assets/navigation"); - for (QString fn : dir.entryList({"*" + ICON_SUFFIX}, QDir::Files)) { - QPixmap pm(dir.filePath(fn)); - QString key = fn.left(fn.size() - ICON_SUFFIX.length()); - pm = pm.scaledToWidth(200, Qt::SmoothTransformation); - - // Maneuver icons - pixmap_cache[key] = pm; - // lane direction icons - if (key.contains("turn_")) { - pixmap_cache["lane_" + key] = pm.scaled({125, 125}, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - } - - // for rhd, reflect direction and then flip - if (key.contains("_left")) { - pixmap_cache["rhd_" + key.replace("_left", "_right")] = pm.transformed(QTransform().scale(-1, 1)); - } else if (key.contains("_right")) { - pixmap_cache["rhd_" + key.replace("_right", "_left")] = pm.transformed(QTransform().scale(-1, 1)); - } - } -} - -void MapInstructions::updateInstructions(cereal::NavInstruction::Reader instruction) { - setUpdatesEnabled(false); - - // Show instruction text - QString primary_str = QString::fromStdString(instruction.getManeuverPrimaryText()); - QString secondary_str = QString::fromStdString(instruction.getManeuverSecondaryText()); - - primary->setText(primary_str); - secondary->setVisible(secondary_str.length() > 0); - secondary->setText(secondary_str); - - auto distance_str_pair = map_format_distance(instruction.getManeuverDistance(), uiState()->scene.is_metric); - distance->setText(QString("%1 %2").arg(distance_str_pair.first, distance_str_pair.second)); - - // Show arrow with direction - QString type = QString::fromStdString(instruction.getManeuverType()); - QString modifier = QString::fromStdString(instruction.getManeuverModifier()); - if (!type.isEmpty()) { - QString fn = "direction_" + type; - if (!modifier.isEmpty()) { - fn += "_" + modifier; - } - fn = fn.replace(' ', '_'); - bool rhd = is_rhd && (fn.contains("_left") || fn.contains("_right")); - icon_01->setPixmap(pixmap_cache[!rhd ? fn : "rhd_" + fn]); - icon_01->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); - icon_01->setVisible(true); - } else { - icon_01->setVisible(false); - } - - // Hide distance after arrival - distance->setVisible(type != "arrive" || instruction.getManeuverDistance() > 0); - - // Show lanes - auto lanes = instruction.getLanes(); - for (int i = 0; i < lanes.size(); ++i) { - bool active = lanes[i].getActive(); - const auto active_direction = lanes[i].getActiveDirection(); - - // TODO: Make more images based on active direction and combined directions - QString fn = "lane_direction_"; - - // active direction has precedence - if (active && active_direction != cereal::NavInstruction::Direction::NONE) { - fn += "turn_" + DIRECTIONS[active_direction]; - } else { - for (auto const &direction : lanes[i].getDirections()) { - if (direction != cereal::NavInstruction::Direction::NONE) { - fn += "turn_" + DIRECTIONS[direction]; - break; - } - } - } - - if (!active) { - fn += "_inactive"; - } - - QLabel *label = (i < lane_labels.size()) ? lane_labels[i] : lane_labels.emplace_back(new QLabel); - if (!label->parentWidget()) { - lane_layout->addWidget(label); - } - label->setPixmap(pixmap_cache[fn]); - label->setVisible(true); - } - - for (int i = lanes.size(); i < lane_labels.size(); ++i) { - lane_labels[i]->setVisible(false); - } - - setUpdatesEnabled(true); - setVisible(true); -} diff --git a/selfdrive/ui/qt/maps/map_instructions.h b/selfdrive/ui/qt/maps/map_instructions.h deleted file mode 100644 index 06a943d27f..0000000000 --- a/selfdrive/ui/qt/maps/map_instructions.h +++ /dev/null @@ -1,38 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include - -#include "cereal/gen/cpp/log.capnp.h" - -static std::map DIRECTIONS = { - {cereal::NavInstruction::Direction::NONE, "none"}, - {cereal::NavInstruction::Direction::LEFT, "left"}, - {cereal::NavInstruction::Direction::RIGHT, "right"}, - {cereal::NavInstruction::Direction::STRAIGHT, "straight"}, - {cereal::NavInstruction::Direction::SLIGHT_LEFT, "slight_left"}, - {cereal::NavInstruction::Direction::SLIGHT_RIGHT, "slight_right"}, -}; - -class MapInstructions : public QWidget { - Q_OBJECT - -private: - QLabel *distance; - QLabel *primary; - QLabel *secondary; - QLabel *icon_01; - QHBoxLayout *lane_layout; - bool is_rhd = false; - std::vector lane_labels; - QHash pixmap_cache; - -public: - MapInstructions(QWidget * parent=nullptr); - void buildPixmapCache(); - void updateInstructions(cereal::NavInstruction::Reader instruction); -}; diff --git a/selfdrive/ui/qt/maps/map_panel.cc b/selfdrive/ui/qt/maps/map_panel.cc deleted file mode 100644 index c4cc20e21d..0000000000 --- a/selfdrive/ui/qt/maps/map_panel.cc +++ /dev/null @@ -1,43 +0,0 @@ -#include "selfdrive/ui/qt/maps/map_panel.h" - -#include -#include - -#include "selfdrive/ui/qt/maps/map.h" -#include "selfdrive/ui/qt/maps/map_settings.h" -#include "selfdrive/ui/qt/util.h" -#include "selfdrive/ui/ui.h" - -MapPanel::MapPanel(const QMapLibre::Settings &mapboxSettings, QWidget *parent) : QFrame(parent) { - content_stack = new QStackedLayout(this); - content_stack->setContentsMargins(0, 0, 0, 0); - - auto map = new MapWindow(mapboxSettings); - QObject::connect(uiState(), &UIState::offroadTransition, map, &MapWindow::offroadTransition); - QObject::connect(device(), &Device::interactiveTimeout, this, [=]() { - content_stack->setCurrentIndex(0); - }); - QObject::connect(map, &MapWindow::requestVisible, this, [=](bool visible) { - // when we show the map for a new route, signal HomeWindow to hide the sidebar - if (visible) { emit mapPanelRequested(); } - setVisible(visible); - }); - QObject::connect(map, &MapWindow::requestSettings, this, [=](bool settings) { - content_stack->setCurrentIndex(settings ? 1 : 0); - }); - content_stack->addWidget(map); - - auto settings = new MapSettings(true, parent); - QObject::connect(settings, &MapSettings::closeSettings, this, [=]() { - content_stack->setCurrentIndex(0); - }); - content_stack->addWidget(settings); -} - -void MapPanel::toggleMapSettings() { - // show settings if not visible, then toggle between map and settings - int new_index = isVisible() ? (1 - content_stack->currentIndex()) : 1; - content_stack->setCurrentIndex(new_index); - emit mapPanelRequested(); - show(); -} diff --git a/selfdrive/ui/qt/maps/map_panel.h b/selfdrive/ui/qt/maps/map_panel.h deleted file mode 100644 index 190bb63446..0000000000 --- a/selfdrive/ui/qt/maps/map_panel.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include -#include - -class MapPanel : public QFrame { - Q_OBJECT - -public: - explicit MapPanel(const QMapLibre::Settings &settings, QWidget *parent = nullptr); - -signals: - void mapPanelRequested(); - -public slots: - void toggleMapSettings(); - -private: - QStackedLayout *content_stack; -}; diff --git a/selfdrive/ui/qt/maps/map_settings.cc b/selfdrive/ui/qt/maps/map_settings.cc deleted file mode 100644 index 4d655be36c..0000000000 --- a/selfdrive/ui/qt/maps/map_settings.cc +++ /dev/null @@ -1,385 +0,0 @@ -#include "selfdrive/ui/qt/maps/map_settings.h" - -#include - -#include -#include - -#include "common/util.h" -#include "selfdrive/ui/qt/request_repeater.h" -#include "selfdrive/ui/qt/widgets/scrollview.h" - -static void swap(QJsonValueRef v1, QJsonValueRef v2) { std::swap(v1, v2); } - -static bool locationEqual(const QJsonValue &v1, const QJsonValue &v2) { - return v1["latitude"] == v2["latitude"] && v1["longitude"] == v2["longitude"]; -} - -static qint64 convertTimestampToEpoch(const QString ×tamp) { - QDateTime dt = QDateTime::fromString(timestamp, Qt::ISODate); - return dt.isValid() ? dt.toSecsSinceEpoch() : 0; -} - -MapSettings::MapSettings(bool closeable, QWidget *parent) : QFrame(parent) { - setContentsMargins(0, 0, 0, 0); - setAttribute(Qt::WA_NoMousePropagation); - - auto *frame = new QVBoxLayout(this); - frame->setContentsMargins(40, 40, 40, 0); - frame->setSpacing(0); - - auto *heading_frame = new QHBoxLayout; - heading_frame->setContentsMargins(0, 0, 0, 0); - heading_frame->setSpacing(32); - { - if (closeable) { - auto *close_btn = new QPushButton("←"); - close_btn->setStyleSheet(R"( - QPushButton { - color: #FFFFFF; - font-size: 100px; - padding-bottom: 8px; - border 1px grey solid; - border-radius: 70px; - background-color: #292929; - font-weight: 500; - } - QPushButton:pressed { - background-color: #3B3B3B; - } - )"); - close_btn->setFixedSize(140, 140); - QObject::connect(close_btn, &QPushButton::clicked, [=]() { emit closeSettings(); }); - // TODO: read map_on_left from ui state - heading_frame->addWidget(close_btn); - } - - auto *heading = new QVBoxLayout; - heading->setContentsMargins(0, 0, 0, 0); - heading->setSpacing(16); - { - auto *title = new QLabel(tr("NAVIGATION"), this); - title->setStyleSheet("color: #FFFFFF; font-size: 54px; font-weight: 600;"); - heading->addWidget(title); - - auto *subtitle = new QLabel(tr("Manage at connect.comma.ai"), this); - subtitle->setStyleSheet("color: #A0A0A0; font-size: 40px; font-weight: 300;"); - heading->addWidget(subtitle); - } - heading_frame->addLayout(heading, 1); - } - frame->addLayout(heading_frame); - frame->addSpacing(32); - - current_widget = new DestinationWidget(this); - QObject::connect(current_widget, &DestinationWidget::actionClicked, - []() { NavManager::instance()->setCurrentDestination({}); }); - frame->addWidget(current_widget); - frame->addSpacing(32); - - QWidget *destinations_container = new QWidget(this); - destinations_layout = new QVBoxLayout(destinations_container); - destinations_layout->setContentsMargins(0, 32, 0, 32); - destinations_layout->setSpacing(20); - destinations_layout->addWidget(home_widget = new DestinationWidget(this)); - destinations_layout->addWidget(work_widget = new DestinationWidget(this)); - QObject::connect(home_widget, &DestinationWidget::navigateTo, this, &MapSettings::navigateTo); - QObject::connect(work_widget, &DestinationWidget::navigateTo, this, &MapSettings::navigateTo); - destinations_layout->addStretch(); - - ScrollView *destinations_scroller = new ScrollView(destinations_container, this); - destinations_scroller->setFrameShape(QFrame::NoFrame); - frame->addWidget(destinations_scroller); - - setStyleSheet("MapSettings { background-color: #333333; }"); - QObject::connect(NavManager::instance(), &NavManager::updated, this, &MapSettings::refresh); -} - -void MapSettings::showEvent(QShowEvent *event) { - refresh(); -} - -void MapSettings::refresh() { - if (!isVisible()) return; - - setUpdatesEnabled(false); - - auto get_w = [this](int i) { - auto w = i < widgets.size() ? widgets[i] : widgets.emplace_back(new DestinationWidget); - if (!w->parentWidget()) { - destinations_layout->insertWidget(destinations_layout->count() - 1, w); - QObject::connect(w, &DestinationWidget::navigateTo, this, &MapSettings::navigateTo); - } - return w; - }; - - const auto current_dest = NavManager::instance()->currentDestination(); - if (!current_dest.isEmpty()) { - current_widget->set(current_dest, true); - } else { - current_widget->unset("", true); - } - home_widget->unset(NAV_FAVORITE_LABEL_HOME); - work_widget->unset(NAV_FAVORITE_LABEL_WORK); - - int n = 0; - for (auto location : NavManager::instance()->currentLocations()) { - DestinationWidget *w = nullptr; - auto dest = location.toObject(); - if (dest["save_type"].toString() == NAV_TYPE_FAVORITE) { - auto label = dest["label"].toString(); - if (label == NAV_FAVORITE_LABEL_HOME) w = home_widget; - if (label == NAV_FAVORITE_LABEL_WORK) w = work_widget; - } - w = w ? w : get_w(n++); - w->set(dest, false); - w->setVisible(!locationEqual(dest, current_dest)); - } - for (; n < widgets.size(); ++n) widgets[n]->setVisible(false); - - setUpdatesEnabled(true); -} - -void MapSettings::navigateTo(const QJsonObject &place) { - NavManager::instance()->setCurrentDestination(place); - emit closeSettings(); -} - -DestinationWidget::DestinationWidget(QWidget *parent) : QPushButton(parent) { - setContentsMargins(0, 0, 0, 0); - - auto *frame = new QHBoxLayout(this); - frame->setContentsMargins(32, 24, 32, 24); - frame->setSpacing(32); - - icon = new QLabel(this); - icon->setAlignment(Qt::AlignCenter); - icon->setFixedSize(96, 96); - icon->setObjectName("icon"); - frame->addWidget(icon); - - auto *inner_frame = new QVBoxLayout; - inner_frame->setContentsMargins(0, 0, 0, 0); - inner_frame->setSpacing(0); - { - title = new ElidedLabel(this); - title->setAttribute(Qt::WA_TransparentForMouseEvents); - inner_frame->addWidget(title); - - subtitle = new ElidedLabel(this); - subtitle->setAttribute(Qt::WA_TransparentForMouseEvents); - subtitle->setObjectName("subtitle"); - inner_frame->addWidget(subtitle); - } - frame->addLayout(inner_frame, 1); - - action = new QPushButton(this); - action->setFixedSize(96, 96); - action->setObjectName("action"); - action->setStyleSheet("font-size: 65px; font-weight: 600;"); - QObject::connect(action, &QPushButton::clicked, this, &QPushButton::clicked); - QObject::connect(action, &QPushButton::clicked, this, &DestinationWidget::actionClicked); - frame->addWidget(action); - - setFixedHeight(164); - setStyleSheet(R"( - DestinationWidget { background-color: #202123; border-radius: 10px; } - QLabel { color: #FFFFFF; font-size: 48px; font-weight: 400; } - #icon { background-color: #3B4356; border-radius: 48px; } - #subtitle { color: #9BA0A5; } - #action { border: none; border-radius: 48px; color: #FFFFFF; padding-bottom: 4px; } - - /* current destination */ - [current="true"] { background-color: #E8E8E8; } - [current="true"] QLabel { color: #000000; } - [current="true"] #icon { background-color: #42906B; } - [current="true"] #subtitle { color: #333333; } - [current="true"] #action { color: #202123; } - - /* no saved destination */ - [set="false"] QLabel { color: #9BA0A5; } - [current="true"][set="false"] QLabel { color: #A0000000; } - - /* pressed */ - [current="false"]:pressed { background-color: #18191B; } - [current="true"] #action:pressed { background-color: #D6D6D6; } - )"); - QObject::connect(this, &QPushButton::clicked, [this]() { if (!dest.isEmpty()) emit navigateTo(dest); }); -} - -void DestinationWidget::set(const QJsonObject &destination, bool current) { - if (dest == destination) return; - - dest = destination; - setProperty("current", current); - setProperty("set", true); - - auto icon_pixmap = current ? icons().directions : icons().recent; - auto title_text = destination["place_name"].toString(); - auto subtitle_text = destination["place_details"].toString(); - - if (destination["save_type"] == NAV_TYPE_FAVORITE) { - if (destination["label"] == NAV_FAVORITE_LABEL_HOME) { - icon_pixmap = icons().home; - subtitle_text = title_text + ", " + subtitle_text; - title_text = tr("Home"); - } else if (destination["label"] == NAV_FAVORITE_LABEL_WORK) { - icon_pixmap = icons().work; - subtitle_text = title_text + ", " + subtitle_text; - title_text = tr("Work"); - } else { - icon_pixmap = icons().favorite; - } - } - - icon->setPixmap(icon_pixmap); - - title->setText(title_text); - subtitle->setText(subtitle_text); - subtitle->setVisible(true); - - // TODO: use pixmap - action->setAttribute(Qt::WA_TransparentForMouseEvents, !current); - action->setText(current ? "×" : "→"); - action->setVisible(true); - - setStyleSheet(styleSheet()); -} - -void DestinationWidget::unset(const QString &label, bool current) { - dest = {}; - setProperty("current", current); - setProperty("set", false); - - if (label.isEmpty()) { - icon->setPixmap(icons().directions); - title->setText(tr("No destination set")); - } else { - QString title_text = label == NAV_FAVORITE_LABEL_HOME ? tr("home") : tr("work"); - icon->setPixmap(label == NAV_FAVORITE_LABEL_HOME ? icons().home : icons().work); - title->setText(tr("No %1 location set").arg(title_text)); - } - - subtitle->setVisible(false); - action->setVisible(false); - - setStyleSheet(styleSheet()); - setVisible(true); -} - -// singleton NavManager - -NavManager *NavManager::instance() { - static NavManager *request = new NavManager(qApp); - return request; -} - -NavManager::NavManager(QObject *parent) : QObject(parent) { - locations = QJsonDocument::fromJson(params.get("NavPastDestinations").c_str()).array(); - current_dest = QJsonDocument::fromJson(params.get("NavDestination").c_str()).object(); - if (auto dongle_id = getDongleId()) { - { - // Fetch favorite and recent locations - QString url = CommaApi::BASE_URL + "/v1/navigation/" + *dongle_id + "/locations"; - RequestRepeater *repeater = new RequestRepeater(this, url, "ApiCache_NavDestinations", 30, true); - QObject::connect(repeater, &RequestRepeater::requestDone, this, &NavManager::parseLocationsResponse); - } - { - auto param_watcher = new ParamWatcher(this); - QObject::connect(param_watcher, &ParamWatcher::paramChanged, this, &NavManager::updated); - - // Destination set while offline - QString url = CommaApi::BASE_URL + "/v1/navigation/" + *dongle_id + "/next"; - HttpRequest *deleter = new HttpRequest(this); - RequestRepeater *repeater = new RequestRepeater(this, url, "", 10, true); - QObject::connect(repeater, &RequestRepeater::requestDone, [=](const QString &resp, bool success) { - if (success && resp != "null") { - if (params.get("NavDestination").empty()) { - qWarning() << "Setting NavDestination from /next" << resp; - params.put("NavDestination", resp.toStdString()); - } else { - qWarning() << "Got location from /next, but NavDestination already set"; - } - // Send DELETE to clear destination server side - deleter->sendRequest(url, HttpRequest::Method::DELETE); - } - - // athena can set destination at any time - param_watcher->addParam("NavDestination"); - current_dest = QJsonDocument::fromJson(params.get("NavDestination").c_str()).object(); - emit updated(); - }); - } - } -} - -void NavManager::parseLocationsResponse(const QString &response, bool success) { - if (!success || response == prev_response) return; - - prev_response = response; - QJsonDocument doc = QJsonDocument::fromJson(response.trimmed().toUtf8()); - if (doc.isNull()) { - qWarning() << "JSON Parse failed on navigation locations" << response; - return; - } - - // set last activity time. - auto remote_locations = doc.array(); - for (QJsonValueRef loc : remote_locations) { - auto obj = loc.toObject(); - auto serverTime = convertTimestampToEpoch(obj["modified"].toString()); - obj.insert("time", qMax(serverTime, getLastActivity(obj))); - loc = obj; - } - - locations = remote_locations; - sortLocations(); - emit updated(); -} - -void NavManager::sortLocations() { - // Sort: alphabetical FAVORITES, and then most recent. - // We don't need to care about the ordering of HOME and WORK. DestinationWidget always displays them at the top. - std::stable_sort(locations.begin(), locations.end(), [](const QJsonValue &a, const QJsonValue &b) { - if (a["save_type"] == NAV_TYPE_FAVORITE || b["save_type"] == NAV_TYPE_FAVORITE) { - return (std::tuple(a["save_type"].toString(), a["place_name"].toString()) < - std::tuple(b["save_type"].toString(), b["place_name"].toString())); - } else { - return a["time"].toVariant().toLongLong() > b["time"].toVariant().toLongLong(); - } - }); - - write_param_future = std::async(std::launch::async, [destinations = QJsonArray(locations)]() { - Params().put("NavPastDestinations", QJsonDocument(destinations).toJson().toStdString()); - }); -} - -qint64 NavManager::getLastActivity(const QJsonObject &loc) const { - qint64 last_activity = 0; - auto it = std::find_if(locations.begin(), locations.end(), - [&loc](const QJsonValue &l) { return locationEqual(loc, l); }); - if (it != locations.end()) { - auto tm = it->toObject().value("time"); - if (!tm.isUndefined() && !tm.isNull()) { - last_activity = tm.toVariant().toLongLong(); - } - } - return last_activity; -} - -void NavManager::setCurrentDestination(const QJsonObject &loc) { - current_dest = loc; - if (!current_dest.isEmpty()) { - current_dest["time"] = QDateTime::currentSecsSinceEpoch(); - auto it = std::find_if(locations.begin(), locations.end(), - [&loc](const QJsonValue &l) { return locationEqual(loc, l); }); - if (it != locations.end()) { - *it = current_dest; - sortLocations(); - } - params.put("NavDestination", QJsonDocument(current_dest).toJson().toStdString()); - } else { - params.remove("NavDestination"); - } - emit updated(); -} diff --git a/selfdrive/ui/qt/maps/map_settings.h b/selfdrive/ui/qt/maps/map_settings.h deleted file mode 100644 index 0e151df4ad..0000000000 --- a/selfdrive/ui/qt/maps/map_settings.h +++ /dev/null @@ -1,102 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "common/params.h" -#include "selfdrive/ui/qt/util.h" -#include "selfdrive/ui/qt/widgets/controls.h" - -const QString NAV_TYPE_FAVORITE = "favorite"; -const QString NAV_TYPE_RECENT = "recent"; - -const QString NAV_FAVORITE_LABEL_HOME = "home"; -const QString NAV_FAVORITE_LABEL_WORK = "work"; - -class DestinationWidget; - -class NavManager : public QObject { - Q_OBJECT - -public: - static NavManager *instance(); - QJsonArray currentLocations() const { return locations; } - QJsonObject currentDestination() const { return current_dest; } - void setCurrentDestination(const QJsonObject &loc); - qint64 getLastActivity(const QJsonObject &loc) const; - -signals: - void updated(); - -private: - NavManager(QObject *parent); - void parseLocationsResponse(const QString &response, bool success); - void sortLocations(); - - Params params; - QString prev_response; - QJsonArray locations; - QJsonObject current_dest; - std::future write_param_future; -}; - -class MapSettings : public QFrame { - Q_OBJECT -public: - explicit MapSettings(bool closeable = false, QWidget *parent = nullptr); - void navigateTo(const QJsonObject &place); - -private: - void showEvent(QShowEvent *event) override; - void refresh(); - - QVBoxLayout *destinations_layout; - DestinationWidget *current_widget; - DestinationWidget *home_widget; - DestinationWidget *work_widget; - std::vector widgets; - -signals: - void closeSettings(); -}; - -class DestinationWidget : public QPushButton { - Q_OBJECT -public: - explicit DestinationWidget(QWidget *parent = nullptr); - void set(const QJsonObject &location, bool current = false); - void unset(const QString &label, bool current = false); - -signals: - void actionClicked(); - void navigateTo(const QJsonObject &destination); - -private: - struct NavIcons { - QPixmap home, work, favorite, recent, directions; - }; - - static NavIcons icons() { - static NavIcons nav_icons { - loadPixmap("../assets/navigation/icon_home.svg", {48, 48}), - loadPixmap("../assets/navigation/icon_work.svg", {48, 48}), - loadPixmap("../assets/navigation/icon_favorite.svg", {48, 48}), - loadPixmap("../assets/navigation/icon_recent.svg", {48, 48}), - loadPixmap("../assets/navigation/icon_directions.svg", {48, 48}), - }; - return nav_icons; - } - -private: - QLabel *icon, *title, *subtitle; - QPushButton *action; - QJsonObject dest; -}; diff --git a/selfdrive/ui/qt/offroad/settings.cc b/selfdrive/ui/qt/offroad/settings.cc index 96fe6585cc..dc60d40e48 100644 --- a/selfdrive/ui/qt/offroad/settings.cc +++ b/selfdrive/ui/qt/offroad/settings.cc @@ -69,20 +69,6 @@ TogglesPanel::TogglesPanel(SettingsWindow *parent) : ListWidget(parent) { tr("Display speed in km/h instead of mph."), "../assets/offroad/icon_metric.png", }, -#ifdef ENABLE_MAPS - { - "NavSettingTime24h", - tr("Show ETA in 24h Format"), - tr("Use 24h format instead of am/pm"), - "../assets/offroad/icon_metric.png", - }, - { - "NavSettingLeftSide", - tr("Show Map on Left Side of UI"), - tr("Show map on left side when in split screen view."), - "../assets/offroad/icon_road.png", - }, -#endif }; diff --git a/selfdrive/ui/qt/onroad/annotated_camera.cc b/selfdrive/ui/qt/onroad/annotated_camera.cc index 241bb6ed34..07016ef94a 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.cc +++ b/selfdrive/ui/qt/onroad/annotated_camera.cc @@ -20,9 +20,6 @@ AnnotatedCameraWidget::AnnotatedCameraWidget(VisionStreamType type, QWidget* par experimental_btn = new ExperimentalButton(this); main_layout->addWidget(experimental_btn, 0, Qt::AlignTop | Qt::AlignRight); - map_settings_btn = new MapSettingsButton(this); - main_layout->addWidget(map_settings_btn, 0, Qt::AlignBottom | Qt::AlignRight); - dm_img = loadPixmap("../assets/img_driver_face.png", {img_size + 5, img_size + 5}); } @@ -70,12 +67,6 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { rightHandDM = dm_state.getIsRHD(); // DM icon transition dm_fade_state = std::clamp(dm_fade_state+0.2*(0.5-dmActive), 0.0, 1.0); - - // hide map settings button for alerts and flip for right hand DM - if (map_settings_btn->isEnabled()) { - map_settings_btn->setVisible(!hideBottomIcons); - main_layout->setAlignment(map_settings_btn, (rightHandDM ? Qt::AlignLeft : Qt::AlignRight) | Qt::AlignBottom); - } } void AnnotatedCameraWidget::drawHud(QPainter &p) { diff --git a/selfdrive/ui/qt/onroad/annotated_camera.h b/selfdrive/ui/qt/onroad/annotated_camera.h index 0be4adfffa..1470b85f78 100644 --- a/selfdrive/ui/qt/onroad/annotated_camera.h +++ b/selfdrive/ui/qt/onroad/annotated_camera.h @@ -13,8 +13,6 @@ 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); diff --git a/selfdrive/ui/qt/onroad/buttons.cc b/selfdrive/ui/qt/onroad/buttons.cc index 75ec316174..92bcea11b5 100644 --- a/selfdrive/ui/qt/onroad/buttons.cc +++ b/selfdrive/ui/qt/onroad/buttons.cc @@ -47,18 +47,3 @@ void ExperimentalButton::paintEvent(QPaintEvent *event) { 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 index b0757795fb..9c91bc3c7b 100644 --- a/selfdrive/ui/qt/onroad/buttons.h +++ b/selfdrive/ui/qt/onroad/buttons.h @@ -25,17 +25,4 @@ private: 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 index 66eb1812e6..f8c7d80350 100644 --- a/selfdrive/ui/qt/onroad/onroad_home.cc +++ b/selfdrive/ui/qt/onroad/onroad_home.cc @@ -3,11 +3,6 @@ #include #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) { @@ -30,11 +25,6 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { 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); @@ -47,7 +37,6 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { 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) { @@ -73,56 +62,14 @@ void OnroadWindow::updateState(const UIState &s) { } 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 index 4976f56a67..e8fa19b046 100644 --- a/selfdrive/ui/qt/onroad/onroad_home.h +++ b/selfdrive/ui/qt/onroad/onroad_home.h @@ -26,6 +26,5 @@ private: private slots: void offroadTransition(bool offroad); - void primeChanged(bool prime); void updateState(const UIState &s); }; diff --git a/selfdrive/ui/qt/widgets/prime.cc b/selfdrive/ui/qt/widgets/prime.cc index 2621612f67..25712c26c7 100644 --- a/selfdrive/ui/qt/widgets/prime.cc +++ b/selfdrive/ui/qt/widgets/prime.cc @@ -155,7 +155,7 @@ PrimeAdWidget::PrimeAdWidget(QWidget* parent) : QFrame(parent) { main_layout->addWidget(features, 0, Qt::AlignBottom); main_layout->addSpacing(30); - QVector bullets = {tr("Remote access"), tr("24/7 LTE connectivity"), tr("1 year of drive storage"), tr("Turn-by-turn navigation")}; + QVector bullets = {tr("Remote access"), tr("24/7 LTE connectivity"), tr("1 year of drive storage"), tr("Remote snapshots")}; for (auto &b : bullets) { const QString check = " "; QLabel *l = new QLabel(check + b); @@ -225,9 +225,6 @@ SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { content_layout->setContentsMargins(0, 0, 0, 0); content_layout->setSpacing(30); - primeUser = new PrimeUserWidget; - content_layout->addWidget(primeUser); - WiFiPromptWidget *wifi_prompt = new WiFiPromptWidget; QObject::connect(wifi_prompt, &WiFiPromptWidget::openSettings, this, &SetupWidget::openSettings); content_layout->addWidget(wifi_prompt); @@ -235,7 +232,6 @@ SetupWidget::SetupWidget(QWidget* parent) : QFrame(parent) { mainLayout->addWidget(content); - primeUser->setVisible(uiState()->hasPrime()); mainLayout->setCurrentIndex(1); setStyleSheet(R"( @@ -277,8 +273,6 @@ void SetupWidget::replyFinished(const QString &response, bool success) { mainLayout->setCurrentIndex(0); } else { popup->reject(); - - primeUser->setVisible(uiState()->hasPrime()); mainLayout->setCurrentIndex(1); } } diff --git a/selfdrive/ui/qt/widgets/prime.h b/selfdrive/ui/qt/widgets/prime.h index 63341c4cea..eac71bcddb 100644 --- a/selfdrive/ui/qt/widgets/prime.h +++ b/selfdrive/ui/qt/widgets/prime.h @@ -66,7 +66,6 @@ signals: private: PairingPopup *popup; QStackedWidget *mainLayout; - PrimeUserWidget *primeUser; private slots: void replyFinished(const QString &response, bool success); diff --git a/selfdrive/ui/translations/main_ar.ts b/selfdrive/ui/translations/main_ar.ts index d8146723a4..9925a2c7a9 100644 --- a/selfdrive/ui/translations/main_ar.ts +++ b/selfdrive/ui/translations/main_ar.ts @@ -136,33 +136,6 @@ رفض، إلغاء التثبيت %1 - - DestinationWidget - - Home - المنزل - - - Work - العمل - - - No destination set - لم يتم ضبط الوجهة - - - home - المنزل - - - work - العمل - - - No %1 location set - لم يتم ضبط %1 موقع - - DevicePanel @@ -349,47 +322,6 @@ جارٍ التثبيت... - - MapETA - - eta - الوصول - - - min - د - - - hr - س - - - - MapSettings - - NAVIGATION - التنقل - - - Manage at connect.comma.ai - الإدارة في connect.comma.ai - - - - MapWindow - - Map Loading - تحميل الخريطة - - - Waiting for GPS - بانتظار GPS - - - Waiting for route - بانتظار الطريق - - MultiOptionDialog @@ -568,8 +500,8 @@ سنة واحدة من تخزين القرص - Turn-by-turn navigation - التنقل خطوة بخطوة + Remote snapshots + @@ -630,22 +562,6 @@ منذ %n يوم - - km - كم - - - m - م - - - mi - ميل - - - ft - قدم - now الآن @@ -1090,22 +1006,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. عند تمكين هذه الميزة، فإن الضغط على دواسة الوقود سيؤدي إلى فك ارتباط openpilot. - - Show ETA in 24h Format - إظهار الوقت المقدر للوصول بصيغة 24 ساعة - - - Use 24h format instead of am/pm - استخدام صيغة 24 ساعة بدلاً من صباحاً/مساء - - - Show Map on Left Side of UI - عرض الخريطة على الجانب الأيسر من واجهة المستخدم - - - Show map on left side when in split screen view. - عرض الخريطة عل الجانب الأيسر عندما تكون وضعية العرض بطريقة الشاشة المنقسمة. - openpilot Longitudinal Control (Alpha) التحكم الطولي openpilot (ألفا) diff --git a/selfdrive/ui/translations/main_de.ts b/selfdrive/ui/translations/main_de.ts index 010aa4d304..a4f9963d67 100644 --- a/selfdrive/ui/translations/main_de.ts +++ b/selfdrive/ui/translations/main_de.ts @@ -136,33 +136,6 @@ Ablehnen, deinstallieren %1 - - DestinationWidget - - Home - - - - Work - - - - No destination set - - - - No %1 location set - - - - home - - - - work - - - DevicePanel @@ -345,47 +318,6 @@ Installiere... - - MapETA - - eta - Ankunft - - - min - min - - - hr - std - - - - MapSettings - - NAVIGATION - - - - Manage at connect.comma.ai - - - - - MapWindow - - Map Loading - Karte wird geladen - - - Waiting for GPS - Warten auf GPS - - - Waiting for route - - - MultiOptionDialog @@ -559,11 +491,11 @@ - Turn-by-turn navigation + 1 year of drive storage - 1 year of drive storage + Remote snapshots @@ -613,22 +545,6 @@ vor %n Tagen - - km - km - - - m - m - - - mi - mi - - - ft - fuß - now @@ -1070,24 +986,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. Wenn aktiviert, deaktiviert sich Openpilot sobald das Gaspedal betätigt wird. - - Use 24h format instead of am/pm - Benutze das 24Stunden Format anstatt am/pm - - - Show Map on Left Side of UI - Too long for UI - Zeige die Karte auf der linken Seite - - - Show map on left side when in split screen view. - Zeige die Karte auf der linken Seite der Benutzeroberfläche bei geteilten Bildschirm. - - - Show ETA in 24h Format - Too long for UI - Zeige die Ankunftszeit im 24 Stunden Format - Experimental Mode Experimenteller Modus diff --git a/selfdrive/ui/translations/main_fr.ts b/selfdrive/ui/translations/main_fr.ts index dde6adadd3..7f7c07d1bb 100644 --- a/selfdrive/ui/translations/main_fr.ts +++ b/selfdrive/ui/translations/main_fr.ts @@ -136,33 +136,6 @@ Refuser, désinstaller %1 - - DestinationWidget - - Home - Domicile - - - Work - Travail - - - No destination set - Aucune destination définie - - - home - domicile - - - work - travail - - - No %1 location set - Aucun lieu %1 défini - - DevicePanel @@ -345,47 +318,6 @@ Installation... - - MapETA - - eta - eta - - - min - min - - - hr - h - - - - MapSettings - - NAVIGATION - NAVIGATION - - - Manage at connect.comma.ai - Gérer sur connect.comma.ai - - - - MapWindow - - Map Loading - Chargement de la carte - - - Waiting for GPS - En attente du GPS - - - Waiting for route - En attente d'un trajet - - MultiOptionDialog @@ -564,8 +496,8 @@ 1 an de stockage de trajets - Turn-by-turn navigation - Navigation étape par étape + Remote snapshots + @@ -614,22 +546,6 @@ il y a %n jours - - km - km - - - m - m - - - mi - mi - - - ft - ft - now @@ -1090,22 +1006,6 @@ Cela peut prendre jusqu'à une minute. Display speed in km/h instead of mph. Afficher la vitesse en km/h au lieu de mph. - - Show ETA in 24h Format - Afficher l'heure d'arrivée en format 24h - - - Use 24h format instead of am/pm - Utiliser le format 24h plutôt que am/pm - - - Show Map on Left Side of UI - Afficher la carte à gauche de l'interface - - - Show map on left side when in split screen view. - Afficher la carte à gauche en mode écran scindé. - Aggressive Aggressif diff --git a/selfdrive/ui/translations/main_ja.ts b/selfdrive/ui/translations/main_ja.ts index e0fb60620b..39b018cfba 100644 --- a/selfdrive/ui/translations/main_ja.ts +++ b/selfdrive/ui/translations/main_ja.ts @@ -136,33 +136,6 @@ 拒否して %1 をアンインストール - - DestinationWidget - - Home - - - - Work - - - - No destination set - - - - No %1 location set - - - - home - - - - work - - - DevicePanel @@ -344,47 +317,6 @@ インストールしています... - - MapETA - - eta - 到着予定時間 - - - min - - - - hr - 時間 - - - - MapSettings - - NAVIGATION - - - - Manage at connect.comma.ai - - - - - MapWindow - - Map Loading - マップを読み込んでいます - - - Waiting for GPS - GPS信号を探しています - - - Waiting for route - - - MultiOptionDialog @@ -558,11 +490,11 @@ - Turn-by-turn navigation + 1 year of drive storage - 1 year of drive storage + Remote snapshots @@ -609,22 +541,6 @@ %n 日前 - - km - キロメートル - - - m - メートル - - - mi - マイル - - - ft - フィート - now @@ -1068,22 +984,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. この機能を有効化すると、openpilotを利用中にアクセルを踏むとopenpilotによる運転サポートを中断します。 - - Show ETA in 24h Format - 24時間表示 - - - Use 24h format instead of am/pm - AM/PM の代わりに24時間形式を使用します - - - Show Map on Left Side of UI - ディスプレイの左側にマップを表示 - - - Show map on left side when in split screen view. - 分割画面表示の場合、ディスプレイの左側にマップを表示します。 - Experimental Mode 実験モード diff --git a/selfdrive/ui/translations/main_ko.ts b/selfdrive/ui/translations/main_ko.ts index 56fc5014ee..36247a6197 100644 --- a/selfdrive/ui/translations/main_ko.ts +++ b/selfdrive/ui/translations/main_ko.ts @@ -136,33 +136,6 @@ 거절, %1 제거 - - DestinationWidget - - Home - - - - Work - 회사 - - - No destination set - 목적지가 설정되지 않았습니다 - - - No %1 location set - %1 위치가 설정되지 않았습니다 - - - home - - - - work - 회사 - - DevicePanel @@ -344,47 +317,6 @@ 설치 중... - - MapETA - - eta - 도착 - - - min - - - - hr - 시간 - - - - MapSettings - - NAVIGATION - 내비게이션 - - - Manage at connect.comma.ai - connect.comma.ai에서 관리하세요 - - - - MapWindow - - Map Loading - 지도 로딩 중 - - - Waiting for GPS - GPS 수신 중 - - - Waiting for route - 경로를 기다리는 중 - - MultiOptionDialog @@ -558,14 +490,14 @@ 24/7 LTE connectivity 항상 LTE 연결 - - Turn-by-turn navigation - 내비게이션 경로안내 - 1 year of drive storage 1년간 드라이브 로그 저장 + + Remote snapshots + + PrimeUserWidget @@ -610,22 +542,6 @@ %n 일 전 - - km - km - - - m - m - - - mi - mi - - - ft - ft - now now @@ -1070,22 +986,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. 활성화된 경우 가속 페달을 밟으면 openpilot이 해제됩니다. - - Show ETA in 24h Format - 24시간 형식으로 도착 예정 시간 표시 - - - Use 24h format instead of am/pm - 오전/오후 대신 24시간 형식 사용 - - - Show Map on Left Side of UI - UI 왼쪽에 지도 표시 - - - Show map on left side when in split screen view. - 분할 화면 보기에서 지도를 왼쪽에 표시합니다. - Experimental Mode 실험 모드 diff --git a/selfdrive/ui/translations/main_pt-BR.ts b/selfdrive/ui/translations/main_pt-BR.ts index feaa6e86a1..8a71612e3a 100644 --- a/selfdrive/ui/translations/main_pt-BR.ts +++ b/selfdrive/ui/translations/main_pt-BR.ts @@ -136,33 +136,6 @@ Rejeitar, desintalar %1 - - DestinationWidget - - Home - Casa - - - Work - Trabalho - - - No destination set - Nenhum destino definido - - - No %1 location set - Endereço de %1 não definido - - - home - casa - - - work - trabalho - - DevicePanel @@ -345,47 +318,6 @@ Instalando... - - MapETA - - eta - eta - - - min - min - - - hr - hr - - - - MapSettings - - NAVIGATION - NAVEGAÇÃO - - - Manage at connect.comma.ai - Gerencie em connect.comma.ai - - - - MapWindow - - Map Loading - Carregando Mapa - - - Waiting for GPS - Aguardando GPS - - - Waiting for route - Aguardando rota - - MultiOptionDialog @@ -559,14 +491,14 @@ 24/7 LTE connectivity Conectividade LTE (só nos EUA) - - Turn-by-turn navigation - Navegação passo a passo - 1 year of drive storage 1 ano de dados em nuvem + + Remote snapshots + + PrimeUserWidget @@ -614,22 +546,6 @@ há %n dias - - km - km - - - m - m - - - mi - milha - - - ft - pés - now agora @@ -1074,22 +990,6 @@ Isso pode levar até um minuto. When enabled, pressing the accelerator pedal will disengage openpilot. Quando ativado, pressionar o pedal do acelerador desacionará o openpilot. - - Show ETA in 24h Format - Mostrar ETA em Formato 24h - - - Use 24h format instead of am/pm - Use o formato 24h em vez de am/pm - - - Show Map on Left Side of UI - Exibir Mapa no Lado Esquerdo - - - Show map on left side when in split screen view. - Exibir mapa do lado esquerdo quando a tela for dividida. - Experimental Mode Modo Experimental diff --git a/selfdrive/ui/translations/main_th.ts b/selfdrive/ui/translations/main_th.ts index e594a6975f..d4a33398be 100644 --- a/selfdrive/ui/translations/main_th.ts +++ b/selfdrive/ui/translations/main_th.ts @@ -136,33 +136,6 @@ ปฏิเสธ และถอนการติดตั้ง %1 - - DestinationWidget - - Home - บ้าน - - - Work - ที่ทำงาน - - - No destination set - ยังไม่ได้เลือกจุดหมาย - - - home - บ้าน - - - work - ที่ทำงาน - - - No %1 location set - ยังไม่ได้เลือกตำแหน่ง%1 - - DevicePanel @@ -344,47 +317,6 @@ กำลังติดตั้ง... - - MapETA - - eta - eta - - - min - นาที - - - hr - ชม. - - - - MapSettings - - NAVIGATION - การนำทาง - - - Manage at connect.comma.ai - จัดการได้ที่ connect.comma.ai - - - - MapWindow - - Map Loading - กำลังโหลดแผนที่ - - - Waiting for GPS - กำลังรอสัญญาณ GPS - - - Waiting for route - กำลังรอเส้นทาง - - MultiOptionDialog @@ -563,8 +495,8 @@ จัดเก็บข้อมูลการขับขี่นาน 1 ปี - Turn-by-turn navigation - การนำทางแบบเลี้ยวต่อเลี้ยว + Remote snapshots + @@ -610,22 +542,6 @@ %n วันที่แล้ว - - km - กม. - - - m - ม. - - - mi - ไมล์ - - - ft - ฟุต - now ตอนนี้ @@ -1070,22 +986,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. เมื่อเปิดใช้งาน การกดแป้นคันเร่งจะเป็นการยกเลิกระบบช่วยขับโดย openpilot - - Show ETA in 24h Format - แสดงเวลา ETA ในรูปแบบ 24 ชั่วโมง - - - Use 24h format instead of am/pm - ใช้รูปแบบเวลา 24 ชั่วโมง แทน am/pm - - - Show Map on Left Side of UI - แสดงแผนที่ที่ด้านซ้ายของหน้าจอ - - - Show map on left side when in split screen view. - แสดงแผนที่ด้านซ้ายของหน้าจอเมื่ออยู่ในโหมดแบ่งหน้าจอ - Experimental Mode โหมดทดลอง diff --git a/selfdrive/ui/translations/main_tr.ts b/selfdrive/ui/translations/main_tr.ts index 48615f1699..36d11dbe61 100644 --- a/selfdrive/ui/translations/main_tr.ts +++ b/selfdrive/ui/translations/main_tr.ts @@ -136,33 +136,6 @@ Reddet, Kurulumu kaldır. %1 - - DestinationWidget - - Home - - - - Work - - - - No destination set - - - - home - - - - work - - - - No %1 location set - - - DevicePanel @@ -344,47 +317,6 @@ Yükleniyor... - - MapETA - - eta - tahmini varış süresi - - - min - dk - - - hr - saat - - - - MapSettings - - NAVIGATION - - - - Manage at connect.comma.ai - - - - - MapWindow - - Map Loading - Harita yükleniyor - - - Waiting for GPS - GPS verisi bekleniyor... - - - Waiting for route - - - MultiOptionDialog @@ -562,7 +494,7 @@ - Turn-by-turn navigation + Remote snapshots @@ -609,22 +541,6 @@ %n gün önce - - km - km - - - m - m - - - mi - mil - - - ft - ft - now @@ -1064,22 +980,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. Aktifleştirilirse eğer gaz pedalına basınca openpilot devre dışı kalır. - - Show ETA in 24h Format - Tahmini varış süresini 24 saat formatı şeklinde göster - - - Use 24h format instead of am/pm - 24 saat formatını kullan - - - Show Map on Left Side of UI - Haritayı arayüzün sol tarafında göster - - - Show map on left side when in split screen view. - Bölünmüş ekran görünümündeyken haritayı sol tarafta göster. - openpilot Longitudinal Control (Alpha) diff --git a/selfdrive/ui/translations/main_zh-CHS.ts b/selfdrive/ui/translations/main_zh-CHS.ts index 32119ee10f..79a6e95501 100644 --- a/selfdrive/ui/translations/main_zh-CHS.ts +++ b/selfdrive/ui/translations/main_zh-CHS.ts @@ -136,33 +136,6 @@ 拒绝并卸载%1 - - DestinationWidget - - Home - 住家 - - - Work - 工作 - - - No destination set - 尚未设置目的地 - - - No %1 location set - 尚未设置 %1 的位置 - - - home - 住家 - - - work - 工作 - - DevicePanel @@ -344,47 +317,6 @@ 正在安装…… - - MapETA - - eta - 抵达 - - - min - 分钟 - - - hr - 小时 - - - - MapSettings - - NAVIGATION - 导航 - - - Manage at connect.comma.ai - 请在 connect.comma.ai 上管理 - - - - MapWindow - - Map Loading - 地图加载中 - - - Waiting for GPS - 等待 GPS - - - Waiting for route - 等待路线 - - MultiOptionDialog @@ -558,14 +490,14 @@ 24/7 LTE connectivity 全天候 LTE 連線 - - Turn-by-turn navigation - 领航功能 - 1 year of drive storage 一年的行驶记录储存空间 + + Remote snapshots + + PrimeUserWidget @@ -610,22 +542,6 @@ %n 天前 - - km - km - - - m - m - - - mi - mi - - - ft - ft - now 现在 @@ -1070,22 +986,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. 启用后,踩下油门踏板将取消openpilot。 - - Show ETA in 24h Format - 以24小时格式显示预计到达时间 - - - Use 24h format instead of am/pm - 使用24小时制代替am/pm - - - Show Map on Left Side of UI - 在介面左侧显示地图 - - - Show map on left side when in split screen view. - 在分屏模式中,将地图置于屏幕左侧。 - Experimental Mode 测试模式 diff --git a/selfdrive/ui/translations/main_zh-CHT.ts b/selfdrive/ui/translations/main_zh-CHT.ts index 9d1c16db9f..ec6131892e 100644 --- a/selfdrive/ui/translations/main_zh-CHT.ts +++ b/selfdrive/ui/translations/main_zh-CHT.ts @@ -136,33 +136,6 @@ 拒絕並解除安裝 %1 - - DestinationWidget - - Home - 住家 - - - Work - 工作 - - - No destination set - 尚未設定目的地 - - - No %1 location set - 尚未設定 %1 的位置 - - - home - 住家 - - - work - 工作 - - DevicePanel @@ -344,47 +317,6 @@ 安裝中… - - MapETA - - eta - 抵達 - - - min - 分鐘 - - - hr - 小時 - - - - MapSettings - - NAVIGATION - 導航 - - - Manage at connect.comma.ai - 請在 connect.comma.ai 上管理 - - - - MapWindow - - Map Loading - 地圖載入中 - - - Waiting for GPS - 等待 GPS - - - Waiting for route - 等待路線 - - MultiOptionDialog @@ -558,14 +490,14 @@ 24/7 LTE connectivity 24/7 LTE 連線 - - Turn-by-turn navigation - 導航功能 - 1 year of drive storage 一年的行駛記錄儲存空間 + + Remote snapshots + + PrimeUserWidget @@ -610,22 +542,6 @@ %n 天前 - - km - km - - - m - m - - - mi - mi - - - ft - ft - now 現在 @@ -1070,22 +986,6 @@ This may take up to a minute. When enabled, pressing the accelerator pedal will disengage openpilot. 啟用後,踩踏油門將會取消 openpilot 控制。 - - Show ETA in 24h Format - 預計到達時間單位改用 24 小時制 - - - Use 24h format instead of am/pm - 使用 24 小時制。(預設值為 12 小時制) - - - Show Map on Left Side of UI - 將地圖顯示在畫面的左側 - - - Show map on left side when in split screen view. - 進入分割畫面後,地圖將會顯示在畫面的左側。 - Experimental Mode 實驗模式 diff --git a/selfdrive/ui/ui.cc b/selfdrive/ui/ui.cc index 06b8b13bc1..2b415b1197 100644 --- a/selfdrive/ui/ui.cc +++ b/selfdrive/ui/ui.cc @@ -265,6 +265,10 @@ void UIState::update() { update_state(this); updateStatus(); + if (std::getenv("PRIME_TYPE")) { + setPrimeType((PrimeType)atoi(std::getenv("PRIME_TYPE"))); + } + if (sm->frame % UI_FREQ == 0) { watchdog_kick(nanos_since_boot()); } diff --git a/selfdrive/ui/watch3.cc b/selfdrive/ui/watch3.cc index ec35c29b6b..c14e03aa6e 100644 --- a/selfdrive/ui/watch3.cc +++ b/selfdrive/ui/watch3.cc @@ -19,7 +19,6 @@ int main(int argc, char *argv[]) { { QHBoxLayout *hlayout = new QHBoxLayout(); layout->addLayout(hlayout); - hlayout->addWidget(new CameraWidget("navd", VISION_STREAM_MAP, false)); hlayout->addWidget(new CameraWidget("camerad", VISION_STREAM_ROAD, false)); } diff --git a/system/athena/athenad.py b/system/athena/athenad.py index 9eec7a931b..9769f065f6 100755 --- a/system/athena/athenad.py +++ b/system/athena/athenad.py @@ -328,19 +328,6 @@ def getVersion() -> dict[str, str]: } -@dispatcher.add_method -def setNavDestination(latitude: int = 0, longitude: int = 0, place_name: str = None, place_details: str = None) -> dict[str, int]: - destination = { - "latitude": latitude, - "longitude": longitude, - "place_name": place_name, - "place_details": place_details, - } - Params().put("NavDestination", json.dumps(destination)) - - return {"success": 1} - - def scan_dir(path: str, prefix: str) -> list[str]: files = [] # only walk directories that match the prefix diff --git a/system/manager/process_config.py b/system/manager/process_config.py index ced31077c9..791d26a8f4 100644 --- a/system/manager/process_config.py +++ b/system/manager/process_config.py @@ -69,7 +69,6 @@ procs = [ 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.pandad.pandad", always_run), PythonProcess("paramsd", "selfdrive.locationd.paramsd", only_onroad), NativeProcess("ubloxd", "system/ubloxd", ["./ubloxd"], ublox, enabled=TICI), diff --git a/third_party/maplibre-native-qt/.gitignore b/third_party/maplibre-native-qt/.gitignore deleted file mode 100644 index 9adc6681c0..0000000000 --- a/third_party/maplibre-native-qt/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/maplibre/ diff --git a/third_party/maplibre-native-qt/aarch64 b/third_party/maplibre-native-qt/aarch64 deleted file mode 120000 index 062c65e8d9..0000000000 --- a/third_party/maplibre-native-qt/aarch64 +++ /dev/null @@ -1 +0,0 @@ -larch64/ \ No newline at end of file diff --git a/third_party/maplibre-native-qt/build.sh b/third_party/maplibre-native-qt/build.sh deleted file mode 100755 index a368026f0f..0000000000 --- a/third_party/maplibre-native-qt/build.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env bash -set -e - -DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null && pwd)" - -ARCHNAME=$(uname -m) -MAPLIBRE_FLAGS="-DMLN_QT_WITH_LOCATION=OFF" -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 --single-branch https://github.com/maplibre/maplibre-native-qt.git $DIR/maplibre -fi - -cd maplibre -git checkout 3726266e127c1f94ad64837c9dbe03d238255816 -git submodule update --depth=1 --recursive --init - -# build -mkdir -p build -cd build -cmake $MAPLIBRE_FLAGS $DIR/maplibre -make -j$(nproc) - -INSTALL_DIR="$DIR/$ARCHNAME" -rm -rf $INSTALL_DIR -mkdir -p $INSTALL_DIR - -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 -cp -r $DIR/maplibre/src/**/*.hpp $DIR/include diff --git a/third_party/maplibre-native-qt/include/conversion_p.hpp b/third_party/maplibre-native-qt/include/conversion_p.hpp deleted file mode 100644 index 38b03d498e..0000000000 --- a/third_party/maplibre-native-qt/include/conversion_p.hpp +++ /dev/null @@ -1,241 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2018 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "geojson_p.hpp" -#include "types.hpp" - -#include -#include - -#include -#include - -#include - -namespace mbgl::style::conversion { - -std::string convertColor(const QColor &color); - -template <> -class ConversionTraits { -public: - static bool isUndefined(const QVariant &value) { return value.isNull() || !value.isValid(); } - - static bool isArray(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - return QMetaType::canConvert(value.metaType(), QMetaType(QMetaType::QVariantList)); -#else - return value.canConvert(QVariant::List); -#endif - } - - static std::size_t arrayLength(const QVariant &value) { return value.toList().size(); } - - static QVariant arrayMember(const QVariant &value, std::size_t i) { return value.toList()[static_cast(i)]; } - - static bool isObject(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - return QMetaType::canConvert(value.metaType(), QMetaType(QMetaType::QVariantMap)) || - value.typeId() == QMetaType::QByteArray -#else - return value.canConvert(QVariant::Map) || value.type() == QVariant::ByteArray -#endif - || QString(value.typeName()) == QStringLiteral("QMapLibre::Feature") || - value.userType() == qMetaTypeId>() || - value.userType() == qMetaTypeId>() || - value.userType() == qMetaTypeId>(); - } - - static std::optional objectMember(const QVariant &value, const char *key) { - auto map = value.toMap(); - auto iter = map.constFind(key); - - if (iter != map.constEnd()) { - return iter.value(); - } - - return {}; - } - - template - static std::optional eachMember(const QVariant &value, Fn &&fn) { - auto map = value.toMap(); - auto iter = map.constBegin(); - - while (iter != map.constEnd()) { - std::optional result = fn(iter.key().toStdString(), QVariant(iter.value())); - if (result) { - return result; - } - - ++iter; - } - - return {}; - } - - static std::optional toBool(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() == QMetaType::Bool) { -#else - if (value.type() == QVariant::Bool) { -#endif - return value.toBool(); - } - - return {}; - } - - static std::optional toNumber(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() == QMetaType::Int || value.typeId() == QMetaType::Double || - value.typeId() == QMetaType::Long || value.typeId() == QMetaType::LongLong || - value.typeId() == QMetaType::ULong || value.typeId() == QMetaType::ULongLong) { -#else - if (value.type() == QVariant::Int || value.type() == QVariant::Double || value.type() == QVariant::LongLong || - value.type() == QVariant::ULongLong) { -#endif - return value.toFloat(); - } - - return {}; - } - - static std::optional toDouble(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() == QMetaType::Int || value.typeId() == QMetaType::Double || - value.typeId() == QMetaType::Long || value.typeId() == QMetaType::LongLong || - value.typeId() == QMetaType::ULong || value.typeId() == QMetaType::ULongLong) { -#else - if (value.type() == QVariant::Int || value.type() == QVariant::Double || value.type() == QVariant::LongLong || - value.type() == QVariant::ULongLong) { -#endif - return value.toDouble(); - } - - return {}; - } - - static std::optional toString(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() == QMetaType::QString) { - return value.toString().toStdString(); - } - - if (value.typeId() == QMetaType::QColor) { - return convertColor(value.value()); - } -#else - if (value.type() == QVariant::String) { - return value.toString().toStdString(); - } - - if (value.type() == QVariant::Color) { - return convertColor(value.value()); - } -#endif - return {}; - } - - static std::optional toValue(const QVariant &value) { -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() == QMetaType::Bool) { - return {value.toBool()}; - } - - if (value.typeId() == QMetaType::QString) { - return {value.toString().toStdString()}; - } - - if (value.typeId() == QMetaType::QColor) { - return {convertColor(value.value())}; - } - - if (value.typeId() == QMetaType::Int) { - return {static_cast(value.toInt())}; - } - - if (QMetaType::canConvert(value.metaType(), QMetaType(QMetaType::Double))) { - return {value.toDouble()}; - } -#else - if (value.type() == QVariant::Bool) { - return {value.toBool()}; - } - - if (value.type() == QVariant::String) { - return {value.toString().toStdString()}; - } - - if (value.type() == QVariant::Color) { - return {convertColor(value.value())}; - } - - if (value.type() == QVariant::Int) { - return {static_cast(value.toInt())}; - } - - if (value.canConvert(QVariant::Double)) { - return {value.toDouble()}; - } -#endif - return {}; - } - - static std::optional toGeoJSON(const QVariant &value, Error &error) { - if (value.typeName() == QStringLiteral("QMapLibre::Feature")) { - return GeoJSON{QMapLibre::GeoJSON::asFeature(value.value())}; - } - - if (value.userType() == qMetaTypeId>()) { - return featureCollectionToGeoJSON(value.value>()); - } - - if (value.userType() == qMetaTypeId>()) { - return featureCollectionToGeoJSON(value.value>()); - } - - if (value.userType() == qMetaTypeId>()) { - return featureCollectionToGeoJSON(value.value>()); - } - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - if (value.typeId() != QMetaType::QByteArray) { -#else - if (value.type() != QVariant::ByteArray) { -#endif - error = {"JSON data must be in QByteArray"}; - return {}; - } - - const QByteArray data = value.toByteArray(); - return parseGeoJSON(std::string(data.constData(), data.size()), error); - } - -private: - template - static GeoJSON featureCollectionToGeoJSON(const T &features) { - mapbox::feature::feature_collection collection; - collection.reserve(static_cast(features.size())); - for (const auto &feature : features) { - collection.push_back(QMapLibre::GeoJSON::asFeature(feature)); - } - return GeoJSON{std::move(collection)}; - } -}; - -template -std::optional convert(const QVariant &value, Error &error, Args &&...args) { - return convert(Convertible(value), error, std::forward(args)...); -} - -inline std::string convertColor(const QColor &color) { - return QString::asprintf("rgba(%d,%d,%d,%lf)", color.red(), color.green(), color.blue(), color.alphaF()) - .toStdString(); -} - -} // namespace mbgl::style::conversion diff --git a/third_party/maplibre-native-qt/include/export_core.hpp b/third_party/maplibre-native-qt/include/export_core.hpp deleted file mode 100644 index bd5ad495db..0000000000 --- a/third_party/maplibre-native-qt/include/export_core.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_CORE_EXPORT_H -#define QMAPLIBRE_CORE_EXPORT_H - -#include - -#if !defined(QT_MAPLIBRE_STATIC) -#if defined(QT_BUILD_MAPLIBRE_CORE_LIB) -#define Q_MAPLIBRE_CORE_EXPORT Q_DECL_EXPORT -#else -#define Q_MAPLIBRE_CORE_EXPORT Q_DECL_IMPORT -#endif -#else -#define Q_MAPLIBRE_CORE_EXPORT -#endif - -#endif // QMAPLIBRE_CORE_EXPORT_H diff --git a/third_party/maplibre-native-qt/include/export_location.hpp b/third_party/maplibre-native-qt/include/export_location.hpp deleted file mode 100644 index a986346884..0000000000 --- a/third_party/maplibre-native-qt/include/export_location.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_LOCATION_EXPORT_H -#define QMAPLIBRE_LOCATION_EXPORT_H - -#include - -#if !defined(QT_MAPLIBRE_STATIC) -#if defined(QT_BUILD_MAPLIBRE_LOCATION_LIB) -#define Q_MAPLIBRE_LOCATION_EXPORT Q_DECL_EXPORT -#else -#define Q_MAPLIBRE_LOCATION_EXPORT Q_DECL_IMPORT -#endif -#else -#define Q_MAPLIBRE_LOCATION_EXPORT -#endif - -#endif // QMAPLIBRE_LOCATION_EXPORT_H diff --git a/third_party/maplibre-native-qt/include/export_widgets.hpp b/third_party/maplibre-native-qt/include/export_widgets.hpp deleted file mode 100644 index 11bc288190..0000000000 --- a/third_party/maplibre-native-qt/include/export_widgets.hpp +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_WIDGETS_EXPORT_H -#define QMAPLIBRE_WIDGETS_EXPORT_H - -#include - -#if !defined(QT_MAPLIBRE_STATIC) -#if defined(QT_BUILD_MAPLIBRE_WIDGETS_LIB) -#define Q_MAPLIBRE_WIDGETS_EXPORT Q_DECL_EXPORT -#else -#define Q_MAPLIBRE_WIDGETS_EXPORT Q_DECL_IMPORT -#endif -#else -#define Q_MAPLIBRE_WIDGETS_EXPORT -#endif - -#endif // QMAPLIBRE_WIDGETS_EXPORT_H diff --git a/third_party/maplibre-native-qt/include/geojson_p.hpp b/third_party/maplibre-native-qt/include/geojson_p.hpp deleted file mode 100644 index 8387f70c4b..0000000000 --- a/third_party/maplibre-native-qt/include/geojson_p.hpp +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "types.hpp" - -#include -#include -#include - -#include - -#include - -namespace QMapLibre::GeoJSON { - -mbgl::Point asPoint(const Coordinate &coordinate); -mbgl::MultiPoint asMultiPoint(const Coordinates &multiPoint); -mbgl::LineString asLineString(const Coordinates &lineString); -mbgl::MultiLineString asMultiLineString(const CoordinatesCollection &multiLineString); -mbgl::Polygon asPolygon(const CoordinatesCollection &polygon); -mbgl::MultiPolygon asMultiPolygon(const CoordinatesCollections &multiPolygon); -mbgl::Value asPropertyValue(const QVariant &value); -mbgl::FeatureIdentifier asFeatureIdentifier(const QVariant &id); -mbgl::GeoJSONFeature asFeature(const Feature &feature); - -} // namespace QMapLibre::GeoJSON diff --git a/third_party/maplibre-native-qt/include/gl_widget.hpp b/third_party/maplibre-native-qt/include/gl_widget.hpp deleted file mode 100644 index b2630daea7..0000000000 --- a/third_party/maplibre-native-qt/include/gl_widget.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_GL_WIDGET_H -#define QMAPLIBRE_GL_WIDGET_H - -#include - -#include -#include - -#include - -#include - -QT_BEGIN_NAMESPACE - -class QKeyEvent; -class QMouseEvent; -class QWheelEvent; - -QT_END_NAMESPACE - -namespace QMapLibre { - -class GLWidgetPrivate; - -class Q_MAPLIBRE_WIDGETS_EXPORT GLWidget : public QOpenGLWidget { - Q_OBJECT - -public: - explicit GLWidget(const Settings &); - ~GLWidget() override; - - Map *map(); - -protected: - // QWidget implementation. - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void wheelEvent(QWheelEvent *event) override; - - // Q{,Open}GLWidget implementation. - void initializeGL() override; - void paintGL() override; - -private: - Q_DISABLE_COPY(GLWidget) - - std::unique_ptr d_ptr; -}; - -} // namespace QMapLibre - -#endif // QMAPLIBRE_GL_WIDGET_H diff --git a/third_party/maplibre-native-qt/include/gl_widget_p.hpp b/third_party/maplibre-native-qt/include/gl_widget_p.hpp deleted file mode 100644 index c97781fd29..0000000000 --- a/third_party/maplibre-native-qt/include/gl_widget_p.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include -#include - -#include - -QT_BEGIN_NAMESPACE - -class QKeyEvent; -class QMouseEvent; -class QWheelEvent; - -QT_END_NAMESPACE - -namespace QMapLibre { - -class GLWidgetPrivate : public QObject { - Q_OBJECT - -public: - explicit GLWidgetPrivate(QObject *parent, Settings settings); - ~GLWidgetPrivate() override; - - void handleMousePressEvent(QMouseEvent *event); - void handleMouseMoveEvent(QMouseEvent *event); - void handleWheelEvent(QWheelEvent *event) const; - - std::unique_ptr m_map{}; - Settings m_settings; - -private: - Q_DISABLE_COPY(GLWidgetPrivate); - - QPointF m_lastPos; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/map.hpp b/third_party/maplibre-native-qt/include/map.hpp deleted file mode 100644 index cd56996185..0000000000 --- a/third_party/maplibre-native-qt/include/map.hpp +++ /dev/null @@ -1,205 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_MAP_H -#define QMAPLIBRE_MAP_H - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace QMapLibre { - -class MapPrivate; - -class Q_MAPLIBRE_CORE_EXPORT Map : public QObject { - Q_OBJECT - Q_PROPERTY(double latitude READ latitude WRITE setLatitude) - Q_PROPERTY(double longitude READ longitude WRITE setLongitude) - Q_PROPERTY(double zoom READ zoom WRITE setZoom) - Q_PROPERTY(double bearing READ bearing WRITE setBearing) - Q_PROPERTY(double pitch READ pitch WRITE setPitch) - Q_PROPERTY(QString styleJson READ styleJson WRITE setStyleJson) - Q_PROPERTY(QString styleUrl READ styleUrl WRITE setStyleUrl) - Q_PROPERTY(double scale READ scale WRITE setScale) - Q_PROPERTY(QMapLibre::Coordinate coordinate READ coordinate WRITE setCoordinate) - Q_PROPERTY(QMargins margins READ margins WRITE setMargins) - -public: - enum MapChange { - MapChangeRegionWillChange = 0, - MapChangeRegionWillChangeAnimated, - MapChangeRegionIsChanging, - MapChangeRegionDidChange, - MapChangeRegionDidChangeAnimated, - MapChangeWillStartLoadingMap, - MapChangeDidFinishLoadingMap, - MapChangeDidFailLoadingMap, - MapChangeWillStartRenderingFrame, - MapChangeDidFinishRenderingFrame, - MapChangeDidFinishRenderingFrameFullyRendered, - MapChangeWillStartRenderingMap, - MapChangeDidFinishRenderingMap, - MapChangeDidFinishRenderingMapFullyRendered, - MapChangeDidFinishLoadingStyle, - MapChangeSourceDidChange - }; - - enum MapLoadingFailure { - StyleParseFailure, - StyleLoadFailure, - NotFoundFailure, - UnknownFailure - }; - - // Determines the orientation of the map. - enum NorthOrientation { - NorthUpwards, // Default - NorthRightwards, - NorthDownwards, - NorthLeftwards, - }; - - explicit Map(QObject *parent = nullptr, - const Settings &settings = Settings(), - const QSize &size = QSize(), - qreal pixelRatio = 1); - ~Map() override; - - [[nodiscard]] QString styleJson() const; - [[nodiscard]] QString styleUrl() const; - - void setStyleJson(const QString &); - void setStyleUrl(const QString &); - - [[nodiscard]] double latitude() const; - void setLatitude(double latitude); - - [[nodiscard]] double longitude() const; - void setLongitude(double longitude); - - [[nodiscard]] double scale() const; - void setScale(double scale, const QPointF ¢er = QPointF()); - - [[nodiscard]] double zoom() const; - void setZoom(double zoom); - - [[nodiscard]] double minimumZoom() const; - [[nodiscard]] double maximumZoom() const; - - [[nodiscard]] double bearing() const; - void setBearing(double degrees); - void setBearing(double degrees, const QPointF ¢er); - - [[nodiscard]] double pitch() const; - void setPitch(double pitch); - void pitchBy(double pitch); - - [[nodiscard]] NorthOrientation northOrientation() const; - void setNorthOrientation(NorthOrientation); - - [[nodiscard]] Coordinate coordinate() const; - void setCoordinate(const Coordinate &coordinate); - void setCoordinateZoom(const Coordinate &coordinate, double zoom); - - void jumpTo(const CameraOptions &); - - void setGestureInProgress(bool inProgress); - - void setTransitionOptions(qint64 duration, qint64 delay = 0); - - void addAnnotationIcon(const QString &name, const QImage &sprite); - - AnnotationID addAnnotation(const Annotation &annotation); - void updateAnnotation(AnnotationID id, const Annotation &annotation); - void removeAnnotation(AnnotationID id); - - bool setLayoutProperty(const QString &layerId, const QString &propertyName, const QVariant &value); - bool setPaintProperty(const QString &layerId, const QString &propertyName, const QVariant &value); - - [[nodiscard]] bool isFullyLoaded() const; - - void moveBy(const QPointF &offset); - void scaleBy(double scale, const QPointF ¢er = QPointF()); - void rotateBy(const QPointF &first, const QPointF &second); - - void resize(const QSize &size); - - [[nodiscard]] QPointF pixelForCoordinate(const Coordinate &coordinate) const; - [[nodiscard]] Coordinate coordinateForPixel(const QPointF &pixel) const; - - [[nodiscard]] CoordinateZoom coordinateZoomForBounds(const Coordinate &sw, const Coordinate &ne) const; - [[nodiscard]] CoordinateZoom coordinateZoomForBounds(const Coordinate &sw, - const Coordinate &ne, - double bearing, - double pitch); - - void setMargins(const QMargins &margins); - [[nodiscard]] QMargins margins() const; - - void addSource(const QString &id, const QVariantMap ¶ms); - bool sourceExists(const QString &id); - void updateSource(const QString &id, const QVariantMap ¶ms); - void removeSource(const QString &id); - - void addImage(const QString &id, const QImage &sprite); - void removeImage(const QString &id); - - void addCustomLayer(const QString &id, - std::unique_ptr host, - const QString &before = QString()); - void addLayer(const QString &id, const QVariantMap ¶ms, const QString &before = QString()); - bool layerExists(const QString &id); - void removeLayer(const QString &id); - - [[nodiscard]] QVector layerIds() const; - - void setFilter(const QString &layerId, const QVariant &filter); - [[nodiscard]] QVariant getFilter(const QString &layerId) const; - // When rendering on a different thread, - // should be called on the render thread. - void createRenderer(); - void destroyRenderer(); - void setFramebufferObject(quint32 fbo, const QSize &size); - -public slots: - void render(); - void setConnectionEstablished(); - - // Commit changes, load all the resources - // and renders the map when completed. - void startStaticRender(); - -signals: - void needsRendering(); - void mapChanged(Map::MapChange); - void mapLoadingFailed(Map::MapLoadingFailure, const QString &reason); - void copyrightsChanged(const QString ©rightsHtml); - - void staticRenderFinished(const QString &error); - -private: - Q_DISABLE_COPY(Map) - - std::unique_ptr d_ptr; -}; - -} // namespace QMapLibre - -Q_DECLARE_METATYPE(QMapLibre::Map::MapChange); -Q_DECLARE_METATYPE(QMapLibre::Map::MapLoadingFailure); - -#endif // QMAPLIBRE_MAP_H diff --git a/third_party/maplibre-native-qt/include/map_observer_p.hpp b/third_party/maplibre-native-qt/include/map_observer_p.hpp deleted file mode 100644 index e68c72b17b..0000000000 --- a/third_party/maplibre-native-qt/include/map_observer_p.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "map.hpp" - -#include -#include - -#include - -#include -#include - -namespace QMapLibre { - -class MapPrivate; - -class MapObserver : public QObject, public mbgl::MapObserver { - Q_OBJECT - -public: - explicit MapObserver(MapPrivate *ptr); - ~MapObserver() override; - - // mbgl::MapObserver implementation. - void onCameraWillChange(mbgl::MapObserver::CameraChangeMode mode) final; - void onCameraIsChanging() final; - void onCameraDidChange(mbgl::MapObserver::CameraChangeMode mode) final; - void onWillStartLoadingMap() final; - void onDidFinishLoadingMap() final; - void onDidFailLoadingMap(mbgl::MapLoadError error, const std::string &what) final; - void onWillStartRenderingFrame() final; - void onDidFinishRenderingFrame(mbgl::MapObserver::RenderFrameStatus status) final; - void onWillStartRenderingMap() final; - void onDidFinishRenderingMap(mbgl::MapObserver::RenderMode mode) final; - void onDidFinishLoadingStyle() final; - void onSourceChanged(mbgl::style::Source &source) final; - -signals: - void mapChanged(Map::MapChange); - void mapLoadingFailed(Map::MapLoadingFailure, const QString &reason); - void copyrightsChanged(const QString ©rightsHtml); - -private: - Q_DISABLE_COPY(MapObserver) - - MapPrivate *d_ptrRef; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/map_p.hpp b/third_party/maplibre-native-qt/include/map_p.hpp deleted file mode 100644 index 9ca0c7e6f5..0000000000 --- a/third_party/maplibre-native-qt/include/map_p.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "map.hpp" -#include "map_observer_p.hpp" -#include "map_renderer_p.hpp" - -#include -#include -#include -#include -#include - -#include -#include - -#include -#include - -namespace QMapLibre { - -class MapPrivate : public QObject, public mbgl::RendererFrontend { - Q_OBJECT - -public: - explicit MapPrivate(Map *map, const Settings &settings, const QSize &size, qreal pixelRatio); - ~MapPrivate() override; - - // mbgl::RendererFrontend implementation. - void reset() final {} - void setObserver(mbgl::RendererObserver &observer) final; - void update(std::shared_ptr parameters) final; - - // These need to be called on the same thread. - void createRenderer(); - void destroyRenderer(); - void render(); - void setFramebufferObject(quint32 fbo, const QSize &size); - - using PropertySetter = std::optional (mbgl::style::Layer::*)( - const std::string &, const mbgl::style::conversion::Convertible &); - [[nodiscard]] bool setProperty(const PropertySetter &setter, - const QString &layerId, - const QString &name, - const QVariant &value) const; - - mbgl::EdgeInsets margins; - std::unique_ptr mapObj{}; - -public slots: - void requestRendering(); - -signals: - void needsRendering(); - -private: - Q_DISABLE_COPY(MapPrivate) - - std::recursive_mutex m_mapRendererMutex; - std::shared_ptr m_rendererObserver{}; - std::shared_ptr m_updateParameters{}; - - std::unique_ptr m_mapObserver{}; - std::unique_ptr m_mapRenderer{}; - std::unique_ptr> m_resourceTransform{}; - - Settings::GLContextMode m_mode; - qreal m_pixelRatio; - - QString m_localFontFamily; - - std::atomic_flag m_renderQueued = ATOMIC_FLAG_INIT; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/map_renderer_p.hpp b/third_party/maplibre-native-qt/include/map_renderer_p.hpp deleted file mode 100644 index b9a087c392..0000000000 --- a/third_party/maplibre-native-qt/include/map_renderer_p.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "settings.hpp" - -#include "utils/renderer_backend.hpp" - -#include -#include -#include - -#include - -#include - -#include -#include - -namespace mbgl { -class Renderer; -class UpdateParameters; -} // namespace mbgl - -namespace QMapLibre { - -class RendererBackend; - -class MapRenderer : public QObject { - Q_OBJECT - -public: - MapRenderer(qreal pixelRatio, Settings::GLContextMode, const QString &localFontFamily); - ~MapRenderer() override; - - void render(); - void updateFramebuffer(quint32 fbo, const mbgl::Size &size); - void setObserver(mbgl::RendererObserver *observer); - - // Thread-safe, called by the Frontend - void updateParameters(std::shared_ptr parameters); - -signals: - void needsRendering(); - -private: - MBGL_STORE_THREAD(tid) - - Q_DISABLE_COPY(MapRenderer) - - std::mutex m_updateMutex; - std::shared_ptr m_updateParameters; - - RendererBackend m_backend; - std::unique_ptr m_renderer{}; - - bool m_forceScheduler{}; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/qgeomap.hpp b/third_party/maplibre-native-qt/include/qgeomap.hpp deleted file mode 100644 index 5eb0180503..0000000000 --- a/third_party/maplibre-native-qt/include/qgeomap.hpp +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2017 The Qt Company Ltd. -// Copyright (C) 2017 Mapbox, Inc. - -// SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#pragma once - -#include "export_location.hpp" - -#include -#include - -#include - -namespace QMapLibre { - -class QGeoMapMapLibrePrivate; - -class Q_MAPLIBRE_LOCATION_EXPORT QGeoMapMapLibre : public QGeoMap { - Q_OBJECT - Q_DECLARE_PRIVATE(QGeoMapMapLibre) - -public: - explicit QGeoMapMapLibre(QGeoMappingManagerEngine *engine, QObject *parent = nullptr); - ~QGeoMapMapLibre() override; - - [[nodiscard]] Capabilities capabilities() const override; - - void setSettings(const Settings &settings); - void setMapItemsBefore(const QString &mapItemsBefore); - - void addStyleParameter(StyleParameter *parameter); - void removeStyleParameter(StyleParameter *parameter); - void clearStyleParameters(); - -private Q_SLOTS: - // QMapLibre - void onMapChanged(Map::MapChange); - - // QDeclarativeGeoMapItemBase - void onMapItemPropertyChanged(); - void onMapItemSubPropertyChanged(); - void onMapItemUnsupportedPropertyChanged(); - void onMapItemGeometryChanged(); - - // StyleParameter - void onStyleParameterUpdated(StyleParameter *parameter); - -private: - QSGNode *updateSceneGraph(QSGNode *oldNode, QQuickWindow *window) override; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/qgeomap_p.hpp b/third_party/maplibre-native-qt/include/qgeomap_p.hpp deleted file mode 100644 index ce415d9bcf..0000000000 --- a/third_party/maplibre-native-qt/include/qgeomap_p.hpp +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2017 The Qt Company Ltd. -// Copyright (C) 2017 Mapbox, Inc. - -// SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#pragma once - -#include "qgeomap.hpp" - -#include -#include - -#include - -#include -#include -#include -#include -#include -#include - -namespace QMapLibre { - -class Map; -class StyleChange; - -class QGeoMapMapLibrePrivate : public QGeoMapPrivate { - Q_DECLARE_PUBLIC(QGeoMapMapLibre) - -public: - explicit QGeoMapMapLibrePrivate(QGeoMappingManagerEngine *engine); - ~QGeoMapMapLibrePrivate() override; - - QSGNode *updateSceneGraph(QSGNode *oldNode, QQuickWindow *window); - - QGeoMap::ItemTypes supportedMapItemTypes() const override; - void addMapItem(QDeclarativeGeoMapItemBase *item) override; - void removeMapItem(QDeclarativeGeoMapItemBase *item) override; - - void addStyleParameter(StyleParameter *parameter); - void removeStyleParameter(StyleParameter *parameter); - void clearStyleParameters(); - - /* Data members */ - enum SyncState : int { - NoSync = 0, - ViewportSync = 1 << 0, - CameraDataSync = 1 << 1, - MapTypeSync = 1 << 2, - VisibleAreaSync = 1 << 3 - }; - Q_DECLARE_FLAGS(SyncStates, SyncState); - - Settings m_settings; - QString m_mapItemsBefore; - - QList m_mapParameters; - - QTimer m_refresh; - bool m_shouldRefresh = true; - bool m_warned = false; - bool m_threadedRendering = false; - bool m_styleLoaded = false; - - SyncStates m_syncState = NoSync; - - std::vector> m_styleChanges; - -protected: - void changeViewportSize(const QSize &size) override; - void changeCameraData(const QGeoCameraData &data) override; -#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) - void changeActiveMapType(const QGeoMapType &mapType) override; -#else - void changeActiveMapType(const QGeoMapType mapType) override; -#endif - - void setVisibleArea(const QRectF &visibleArea) override; - QRectF visibleArea() const override; - -private: - Q_DISABLE_COPY(QGeoMapMapLibrePrivate); - - void syncStyleChanges(Map *map); - void threadedRenderingHack(QQuickWindow *window, Map *map); - - QRectF m_visibleArea; -}; - -Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoMapMapLibrePrivate::SyncStates) - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/qmaplibre.hpp b/third_party/maplibre-native-qt/include/qmaplibre.hpp deleted file mode 100644 index a8dc445e2b..0000000000 --- a/third_party/maplibre-native-qt/include/qmaplibre.hpp +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#include "export_core.hpp" -#include "map.hpp" -#include "settings.hpp" -#include "types.hpp" -#include "utils.hpp" diff --git a/third_party/maplibre-native-qt/include/qmaplibrewidgets.hpp b/third_party/maplibre-native-qt/include/qmaplibrewidgets.hpp deleted file mode 100644 index ebe9a8eea4..0000000000 --- a/third_party/maplibre-native-qt/include/qmaplibrewidgets.hpp +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors - -// SPDX-License-Identifier: BSD-2-Clause - -#include "export_widgets.hpp" -#include "gl_widget.hpp" diff --git a/third_party/maplibre-native-qt/include/qt_mapping_engine.hpp b/third_party/maplibre-native-qt/include/qt_mapping_engine.hpp deleted file mode 100644 index 67cb4b56ce..0000000000 --- a/third_party/maplibre-native-qt/include/qt_mapping_engine.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2017 The Qt Company Ltd. -// Copyright (C) 2017 Mapbox, Inc. - -// SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#pragma once - -#include "export_location.hpp" - -#include - -#include -#include - -namespace QMapLibre { - -class Q_MAPLIBRE_LOCATION_EXPORT QtMappingEngine : public QGeoMappingManagerEngine { - Q_OBJECT - -public: - QtMappingEngine(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString); - - QGeoMap *createMap() override; - -private: - Settings m_settings; - QString m_mapItemsBefore; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/settings.hpp b/third_party/maplibre-native-qt/include/settings.hpp deleted file mode 100644 index d6f88b871b..0000000000 --- a/third_party/maplibre-native-qt/include/settings.hpp +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_SETTINGS_H -#define QMAPLIBRE_SETTINGS_H - -#include -#include - -#include -#include - -#include -#include - -// TODO: this will be wrapped at some point -namespace mbgl { -class TileServerOptions; -} // namespace mbgl - -namespace QMapLibre { - -class SettingsPrivate; - -class Q_MAPLIBRE_CORE_EXPORT Settings { -public: - enum GLContextMode : bool { - UniqueGLContext, - SharedGLContext - }; - - enum MapMode { - Continuous = 0, - Static - }; - - enum ConstrainMode { - NoConstrain = 0, - ConstrainHeightOnly, - ConstrainWidthAndHeight - }; - - enum ViewportMode { - DefaultViewport = 0, - FlippedYViewport - }; - - enum ProviderTemplate { - NoProvider = 0, - MapLibreProvider, - MapTilerProvider, - MapboxProvider - }; - - using ResourceTransformFunction = std::function; - - explicit Settings(ProviderTemplate provider = NoProvider); - ~Settings(); - Settings(const Settings &s); - Settings(Settings &&s) noexcept; - Settings &operator=(const Settings &s); - Settings &operator=(Settings &&s) noexcept; - - [[nodiscard]] GLContextMode contextMode() const; - void setContextMode(GLContextMode); - - [[nodiscard]] MapMode mapMode() const; - void setMapMode(MapMode); - - [[nodiscard]] ConstrainMode constrainMode() const; - void setConstrainMode(ConstrainMode); - - [[nodiscard]] ViewportMode viewportMode() const; - void setViewportMode(ViewportMode); - - [[nodiscard]] unsigned cacheDatabaseMaximumSize() const; - void setCacheDatabaseMaximumSize(unsigned); - - [[nodiscard]] QString cacheDatabasePath() const; - void setCacheDatabasePath(const QString &path); - - [[nodiscard]] QString assetPath() const; - void setAssetPath(const QString &path); - - [[nodiscard]] QString apiKey() const; - void setApiKey(const QString &key); - - [[nodiscard]] QString apiBaseUrl() const; - void setApiBaseUrl(const QString &url); - - [[nodiscard]] QString localFontFamily() const; - void setLocalFontFamily(const QString &family); - - [[nodiscard]] QString clientName() const; - void setClientName(const QString &name); - - [[nodiscard]] QString clientVersion() const; - void setClientVersion(const QString &version); - - [[nodiscard]] ResourceTransformFunction resourceTransform() const; - void setResourceTransform(const ResourceTransformFunction &transform); - - void setProviderTemplate(ProviderTemplate providerTemplate); - void setStyles(const Styles &styles); - - [[nodiscard]] const Styles &styles() const; - [[nodiscard]] Styles providerStyles() const; - - [[nodiscard]] Coordinate defaultCoordinate() const; - void setDefaultCoordinate(const Coordinate &coordinate); - [[nodiscard]] double defaultZoom() const; - void setDefaultZoom(double zoom); - - [[nodiscard]] bool customTileServerOptions() const; - [[nodiscard]] const mbgl::TileServerOptions &tileServerOptions() const; - -private: - std::unique_ptr d_ptr; -}; - -} // namespace QMapLibre - -#endif // QMAPLIBRE_SETTINGS_H diff --git a/third_party/maplibre-native-qt/include/settings_p.hpp b/third_party/maplibre-native-qt/include/settings_p.hpp deleted file mode 100644 index 257bdfd5a9..0000000000 --- a/third_party/maplibre-native-qt/include/settings_p.hpp +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#pragma once - -#include "settings.hpp" -#include "types.hpp" - -#include - -#include -#include - -#include -#include - -namespace mbgl { -class TileServerOptions; -} // namespace mbgl - -namespace QMapLibre { - -class SettingsPrivate { -public: - SettingsPrivate(); - - void setProviderTemplate(Settings::ProviderTemplate providerTemplate); - void setProviderApiBaseUrl(const QString &url); - - Settings::GLContextMode m_contextMode{Settings::SharedGLContext}; - Settings::MapMode m_mapMode{Settings::Continuous}; - Settings::ConstrainMode m_constrainMode{Settings::ConstrainHeightOnly}; - Settings::ViewportMode m_viewportMode{Settings::DefaultViewport}; - Settings::ProviderTemplate m_providerTemplate{Settings::NoProvider}; - - unsigned m_cacheMaximumSize; - QString m_cacheDatabasePath; - QString m_assetPath; - QString m_apiKey; - QString m_localFontFamily; - QString m_clientName; - QString m_clientVersion; - - Coordinate m_defaultCoordinate{}; - double m_defaultZoom{}; - - Styles m_styles; - - std::function m_resourceTransform; - - bool m_customTileServerOptions{}; - mbgl::TileServerOptions m_tileServerOptions{}; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/style_change_utils_p.hpp b/third_party/maplibre-native-qt/include/style_change_utils_p.hpp deleted file mode 100644 index 991bb4077e..0000000000 --- a/third_party/maplibre-native-qt/include/style_change_utils_p.hpp +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2017 Mapbox, Inc. - -// SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#pragma once - -#include - -#include -#include -#include -#include -#include - -namespace QMapLibre::StyleChangeUtils { - -Feature featureFromMapRectangle(QDeclarativeRectangleMapItem *item); -Feature featureFromMapCircle(QDeclarativeCircleMapItem *item); -Feature featureFromMapPolygon(QDeclarativePolygonMapItem *item); -Feature featureFromMapPolyline(QDeclarativePolylineMapItem *item); -Feature featureFromMapItem(QDeclarativeGeoMapItemBase *item); - -QString featureId(QDeclarativeGeoMapItemBase *item); -std::vector featureLayoutPropertiesFromMapPolyline(QDeclarativePolylineMapItem *item); -std::vector featureLayoutPropertiesFromMapItem(QDeclarativeGeoMapItemBase *item); -std::vector featurePaintPropertiesFromMapRectangle(QDeclarativeRectangleMapItem *item); -std::vector featurePaingPropertiesFromMapCircle(QDeclarativeCircleMapItem *item); -std::vector featurePaintPropertiesFromMapPolygon(QDeclarativePolygonMapItem *item); -std::vector featurePaintPropertiesFromMapPolyline(QDeclarativePolylineMapItem *item); -std::vector featurePaintPropertiesFromMapItem(QDeclarativeGeoMapItemBase *item); -std::vector featurePropertiesFromMapItem(QDeclarativeGeoMapItemBase *item); - -} // namespace QMapLibre::StyleChangeUtils diff --git a/third_party/maplibre-native-qt/include/texture_node.hpp b/third_party/maplibre-native-qt/include/texture_node.hpp deleted file mode 100644 index 96f63b3534..0000000000 --- a/third_party/maplibre-native-qt/include/texture_node.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2017 The Qt Company Ltd. -// Copyright (C) 2017 Mapbox, Inc. - -// SPDX-License-Identifier: LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only - -#pragma once - -#include -#include -#include -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) -#include -#else -#include -#endif - -#include - -namespace QMapLibre { - -class QGeoMapMapLibre; - -class TextureNode : public QSGSimpleTextureNode { -public: - TextureNode(const Settings &setting, const QSize &size, qreal pixelRatio, QGeoMapMapLibre *geoMap); - - [[nodiscard]] Map *map() const; - -#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) - void resize(const QSize &size, qreal pixelRatio, QQuickWindow *window); -#else - void resize(const QSize &size, qreal pixelRatio); -#endif - void render(QQuickWindow *); - -private: - std::unique_ptr m_map{}; - std::unique_ptr m_fbo{}; -}; - -} // namespace QMapLibre diff --git a/third_party/maplibre-native-qt/include/types.hpp b/third_party/maplibre-native-qt/include/types.hpp deleted file mode 100644 index 696fab1a88..0000000000 --- a/third_party/maplibre-native-qt/include/types.hpp +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright (C) 2023 MapLibre contributors -// Copyright (C) 2019 Mapbox, Inc. - -// SPDX-License-Identifier: BSD-2-Clause - -#ifndef QMAPLIBRE_TYPES_H -#define QMAPLIBRE_TYPES_H - -#include - -#include -#include -#include -#include -#include -#include - -namespace QMapLibre { - -using Coordinate = QPair; -using CoordinateZoom = QPair; -using ProjectedMeters = QPair; - -using Coordinates = QVector; -using CoordinatesCollection = QVector; - -using CoordinatesCollections = QVector; - -struct Q_MAPLIBRE_CORE_EXPORT Style { - enum Type { // Taken from Qt to be in sync with QtLocation - NoMap = 0, - StreetMap, - SatelliteMapDay, - SatelliteMapNight, - TerrainMap, - HybridMap, - TransitMap, - GrayStreetMap, - PedestrianMap, - CarNavigationMap, - CycleMap, - CustomMap = 100 - }; - -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - explicit Style(QString url_, QString name_ = QString()) - : url(std::move(url_)), - name(std::move(name_)) {} -#else - explicit Style(QString url_ = QString(), QString name_ = QString()) - : url(std::move(url_)), - name(std::move(name_)) {} -#endif - - QString url; - QString name; - QString description; - bool night{}; - Type type{CustomMap}; -}; - -using Styles = QVector
%1%2%4%5%6%7