diff --git a/.gitattributes b/.gitattributes index d00208ba84..8781a7371f 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,18 +1,24 @@ * text=auto +# to move existing files into LFS: +# git add --renormalize . *.dlc filter=lfs diff=lfs merge=lfs -text *.onnx filter=lfs diff=lfs merge=lfs -text +*.svg filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.gif filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.wav filter=lfs diff=lfs merge=lfs -text + selfdrive/car/tests/test_models_segs.txt filter=lfs diff=lfs merge=lfs -text -selfdrive/assets/fonts/*.ttf filter=lfs diff=lfs merge=lfs -text -selfdrive/assets/training/*.png filter=lfs diff=lfs merge=lfs -text system/hardware/tici/updater filter=lfs diff=lfs merge=lfs -text selfdrive/ui/qt/spinner_larch64 filter=lfs diff=lfs merge=lfs -text selfdrive/ui/qt/text_larch64 filter=lfs diff=lfs merge=lfs -text third_party/**/*.a filter=lfs diff=lfs merge=lfs -text third_party/**/*.so filter=lfs diff=lfs merge=lfs -text +third_party/**/*.so.* filter=lfs diff=lfs merge=lfs -text third_party/**/*.dylib filter=lfs diff=lfs merge=lfs -text third_party/acados/*/t_renderer filter=lfs diff=lfs merge=lfs -text -third_party/bootstrap/bootstrap-icons.svg filter=lfs diff=lfs merge=lfs -text third_party/qt5/larch64/bin/lrelease filter=lfs diff=lfs merge=lfs -text third_party/qt5/larch64/bin/lupdate filter=lfs diff=lfs merge=lfs -text third_party/catch2/include/catch2/catch.hpp filter=lfs diff=lfs merge=lfs -text diff --git a/.github/labeler.yaml b/.github/labeler.yaml index cf7a70a3f5..47d0d480a9 100644 --- a/.github/labeler.yaml +++ b/.github/labeler.yaml @@ -1,69 +1,79 @@ CI / testing: - - all: - - changed-files: ['.github/**', '**/test_*', 'Jenkinsfile'] + - changed-files: + - any-glob-to-all-files: "{.github/**,**/test_*,Jenkinsfile}" -car: - - all: - - changed-files: ['selfdrive/car/**'] +car: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/**' body: - - all: - - changed-files: ['selfdrive/car/body/*'] + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/body/*' + chrysler: - - all: - - changed-files: ['selfdrive/car/chrysler/*'] -ford: - - all: - - changed-files: ['selfdrive/car/ford/*'] -gm: - - all: - - changed-files: ['selfdrive/car/gm/*'] -honda: - - all: - - changed-files: ['selfdrive/car/honda/*'] -hyundai: - - all: - - changed-files: ['selfdrive/car/hyundai/*'] -mazda: - - all: - - changed-files: ['selfdrive/car/mazda/*'] -nissan: - - all: - - changed-files: ['selfdrive/car/nissan/*'] -subaru: - - all: - - changed-files: ['selfdrive/car/subaru/*'] -tesla: - - all: - - changed-files: ['selfdrive/car/tesla/*'] -toyota: - - all: - - changed-files: ['selfdrive/car/toyota/*'] -volkswagen: - - all: - - changed-files: ['selfdrive/car/volkswagen/*'] + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/chrysler/*' + +ford: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/ford/*' + +gm: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/gm/*' + +honda: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/honda/*' + +hyundai: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/hyundai/*' + +mazda: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/mazda/*' + +nissan: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/nissan/*' + +subaru: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/subaru/*' + +tesla: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/telsa/*' + +toyota: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/toyota/*' + +volkswagen: + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/volkswagen/*' fingerprint: - - all: - - changed-files: ['selfdrive/car/*/fingerprints.py'] + - changed-files: + - any-glob-to-all-files: 'selfdrive/car/*/fingerprints.py' simulation: - - all: - - changed-files: ['tools/sim/**'] + - changed-files: + - any-glob-to-all-files: 'tools/sim/**' + ui: - - all: - - changed-files: ['selfdrive/ui/**'] -tools: - - all: - - changed-files: ['tools/**'] + - changed-files: + - any-glob-to-all-files: 'selfdrive/ui/**' + +tools: + - changed-files: + - any-glob-to-all-files: 'tools/**' multilanguage: - - all: - - changed-files: ['selfdrive/ui/translations/**'] + - changed-files: + - any-glob-to-all-files: 'selfdrive/ui/translations/**' research: - - all: - - changed-files: [ - 'selfdrive/modeld/models/**', - 'selfdrive/test/process_replay/model_replay_ref_commit', - ] + - changed-files: + - any-glob-to-all-files: "{selfdrive/modeld/models/**,selfdrive/test/process_replay/model_replay_ref_commit}" diff --git a/.github/workflows/auto_pr_review.yaml b/.github/workflows/auto_pr_review.yaml index fd95592e91..0b748063bc 100644 --- a/.github/workflows/auto_pr_review.yaml +++ b/.github/workflows/auto_pr_review.yaml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 with: submodules: false - - uses: actions/labeler@v5.0.0-alpha.1 + - uses: actions/labeler@v5.0.0 with: dot: true configuration-path: .github/labeler.yaml diff --git a/.github/workflows/prebuilt.yaml b/.github/workflows/prebuilt.yaml index f5b0b8c558..58095cf19c 100644 --- a/.github/workflows/prebuilt.yaml +++ b/.github/workflows/prebuilt.yaml @@ -18,7 +18,7 @@ jobs: steps: - name: Wait for green check mark if: ${{ github.event_name != 'workflow_dispatch' }} - uses: lewagon/wait-on-check-action@e2558238c09778af25867eb5de5a3ce4bbae3dcd + uses: lewagon/wait-on-check-action@595dabb3acf442d47e29c9ec9ba44db0c6bdd18f with: ref: master wait-interval: 30 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 7c36410b32..cd2ebd9f82 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,7 +21,7 @@ jobs: sudo apt-get install -y libyaml-dev - name: Wait for green check mark if: ${{ github.event_name != 'workflow_dispatch' }} - uses: lewagon/wait-on-check-action@e2558238c09778af25867eb5de5a3ce4bbae3dcd + uses: lewagon/wait-on-check-action@595dabb3acf442d47e29c9ec9ba44db0c6bdd18f with: ref: master wait-interval: 30 diff --git a/.github/workflows/selfdrive_tests.yaml b/.github/workflows/selfdrive_tests.yaml index d037011701..3c95d8055b 100644 --- a/.github/workflows/selfdrive_tests.yaml +++ b/.github/workflows/selfdrive_tests.yaml @@ -20,11 +20,11 @@ env: DOCKER_LOGIN: docker login ghcr.io -u ${{ github.actor }} -p ${{ secrets.GITHUB_TOKEN }} BUILD: selfdrive/test/docker_build.sh base - RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONWARNINGS=error -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c + RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PYTHONWARNINGS=error -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c BUILD_CL: selfdrive/test/docker_build.sh cl - RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONWARNINGS=error -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c + RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PYTHONWARNINGS=error -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c PYTEST: pytest --continue-on-collection-errors --cov --cov-report=xml --cov-append --durations=0 --durations-min=5 --hypothesis-seed 0 @@ -51,7 +51,7 @@ jobs: timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 10 || 30) }} # allow more time when we missed the scons cache run: | cd $STRIPPED_DIR - ${{ env.RUN }} "CI=1 python selfdrive/manager/build.py" + ${{ env.RUN }} "python selfdrive/manager/build.py" - name: Run tests timeout-minutes: 3 run: | @@ -213,7 +213,7 @@ jobs: - name: Run replay timeout-minutes: 30 run: | - ${{ env.RUN }} "CI=1 coverage run selfdrive/test/process_replay/test_processes.py -j$(nproc) && \ + ${{ env.RUN }} "coverage run selfdrive/test/process_replay/test_processes.py -j$(nproc) && \ chmod -R 777 /tmp/comma_download_cache && \ coverage combine && \ coverage xml" @@ -230,7 +230,7 @@ jobs: - name: Upload reference logs if: ${{ failure() && steps.print-diff.outcome == 'success' && github.repository == 'commaai/openpilot' && env.AZURE_TOKEN != '' }} run: | - ${{ env.RUN }} "unset PYTHONWARNINGS && CI=1 AZURE_TOKEN='$AZURE_TOKEN' python selfdrive/test/process_replay/test_processes.py -j$(nproc) --upload-only" + ${{ env.RUN }} "unset PYTHONWARNINGS && AZURE_TOKEN='$AZURE_TOKEN' python selfdrive/test/process_replay/test_processes.py -j$(nproc) --upload-only" - name: "Upload coverage to Codecov" uses: codecov/codecov-action@v3 with: @@ -286,7 +286,7 @@ jobs: timeout-minutes: 4 run: | ${{ env.RUN_CL }} "unset PYTHONWARNINGS && \ - ONNXCPU=1 CI=1 NO_NAV=1 coverage run selfdrive/test/process_replay/model_replay.py && \ + ONNXCPU=1 NO_NAV=1 coverage run selfdrive/test/process_replay/model_replay.py && \ coverage combine && \ coverage xml" - name: Run unit tests diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 342b05bfc0..9f1ba1ab97 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -19,8 +19,9 @@ repos: - id: check-executables-have-shebangs - id: check-shebang-scripts-are-executable - id: check-added-large-files + exclude: '(docs/CARS.md)|(poetry.lock)|(third_party/acados/include/blasfeo/include/blasfeo_d_kernel.h)' args: - - --maxkb=500 + - --maxkb=120 - --enforce-all - repo: https://github.com/codespell-project/codespell rev: v2.2.6 @@ -95,4 +96,4 @@ repos: # name: format-fingerprints # entry: selfdrive/debug/format_fingerprints.py # language: system -# types: [python] \ No newline at end of file +# types: [python] diff --git a/Jenkinsfile b/Jenkinsfile index 9868777dfb..0ae5f5076d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -110,18 +110,20 @@ def pcStage(String stageName, Closure body) { return docker.build("openpilot-base:build-${env.GIT_COMMIT}", "-f Dockerfile.openpilot_base .") } - openpilot_base.inside(dockerArgs) { - timeout(time: 20, unit: 'MINUTES') { - try { - retryWithDelay (3, 15) { - sh "git config --global --add safe.directory '*'" - sh "git submodule update --init --recursive" - sh "git lfs pull" - } - body() - } finally { - sh "rm -rf ${env.WORKSPACE}/* || true" - sh "rm -rf .* || true" + lock(resource: "", label: 'pc', inversePrecedence: true, quantity: 1) { + openpilot_base.inside(dockerArgs) { + timeout(time: 20, unit: 'MINUTES') { + try { + retryWithDelay (3, 15) { + sh "git config --global --add safe.directory '*'" + sh "git submodule update --init --recursive" + sh "git lfs pull" + } + body() + } finally { + sh "rm -rf ${env.WORKSPACE}/* || true" + sh "rm -rf .* || true" + } } } } @@ -241,7 +243,7 @@ node { 'replay': { deviceStage("tici", "tici-replay", ["UNSAFE=1"], [ ["build", "cd selfdrive/manager && ./build.py"], - ["model replay", "selfdrive/test/process_replay/model_replay.py", ["tinygrad/", "selfdrive/modeld/"]], + ["model replay", "selfdrive/test/process_replay/model_replay.py"], ]) }, 'tizi': { diff --git a/RELEASES.md b/RELEASES.md index 226a272824..b12f22d280 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -8,7 +8,7 @@ Version 0.9.6 (20XX-XX-XX) * Hyundai Staria 2023 support thanks to sunnyhaibin! * Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin! * Toyota RAV4 2023 support -* Toyota RAV4 Hybrid 2023 support +* Toyota RAV4 Hybrid 2023-24 support Version 0.9.5 (2023-11-17) ======================== diff --git a/SConstruct b/SConstruct index 8790221315..e1a9b82c7f 100644 --- a/SConstruct +++ b/SConstruct @@ -14,6 +14,8 @@ AGNOS = TICI Decider('MD5-timestamp') +SetOption('num_jobs', int(os.cpu_count()/2)) + AddOption('--kaitai', action='store_true', help='Regenerate kaitai struct parsers') @@ -37,7 +39,7 @@ AddOption('--clazy', AddOption('--compile_db', action='store_true', help='build clang compilation database') - + AddOption('--ccflags', action='store', type='string', diff --git a/body b/body index cad7ef43ad..3aa61382b7 160000 --- a/body +++ b/body @@ -1 +1 @@ -Subproject commit cad7ef43ad5daf40b44d4792d47671c397cca376 +Subproject commit 3aa61382b7ea9328cab7f1a2fe1ec701dffd018f diff --git a/cereal b/cereal index 8ae5c51a65..e29625c30b 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 8ae5c51a6515c171f3a82c9511a18d79a9e55c07 +Subproject commit e29625c30bb2a4a34ce21134d0e5a91b2d4fa1b1 diff --git a/common/realtime.py b/common/realtime.py index 05e19e770f..a398146166 100644 --- a/common/realtime.py +++ b/common/realtime.py @@ -78,7 +78,7 @@ class Ratekeeper: time.sleep(self._remaining) return lagged - # this only monitor the cumulative lag, but does not enforce a rate + # Monitors the cumulative lag, but does not enforce a rate def monitor_time(self) -> bool: prev = self._last_monitor_time self._last_monitor_time = time.monotonic() diff --git a/docs/BOUNTIES.md b/docs/BOUNTIES.md index 9d6f8bc97b..a927a33b89 100644 --- a/docs/BOUNTIES.md +++ b/docs/BOUNTIES.md @@ -10,11 +10,11 @@ Get paid to improve openpilot! * open a ticket at [comma.ai/support](https://comma.ai/support/shop-order) with links to your PRs to claim * get an extra 20% if you redeem your bounty in [comma shop](https://comma.ai/shop) credit -New bounties can be proposed in the **#contributing** channel in Discord. +New bounties can be proposed in the [**#contributing**](https://discord.com/channels/469524606043160576/1183173332531687454) channel in Discord. ## Issue bounties -We've tagged bounty eligible issues across openpilot and the rest of our repos; check out all the open ones [here](https://github.com/orgs/commaai/projects/26/views/1). These bounties roughly work out like this: +We've tagged bounty-eligible issues across openpilot and the rest of our repos; check out all the open ones [here](https://github.com/orgs/commaai/projects/26/views/1). These bounties roughly work out like this: * **$100** - a few hours of work for an experienced openpilot developer; a good intro for someone new to openpilot * **$300** - a day of work for an experienced openpilot developer * **$500** - a few days of work for an experienced openpilot developer diff --git a/docs/CARS.md b/docs/CARS.md index e48f4765bb..bb2484e816 100644 --- a/docs/CARS.md +++ b/docs/CARS.md @@ -4,7 +4,7 @@ A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified. -# 273 Supported Cars +# 274 Supported Cars |Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|Hardware Needed
 |Video| |---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:| @@ -132,7 +132,8 @@ A supported vehicle is one that just works when you install a comma device. All |Kia|Niro EV 2021|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2022|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai H connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro EV 2023[6](#footnotes)|All|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Kia|Niro Hybrid 2021-22|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Hybrid 2021|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Kia|Niro Hybrid 2022|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai F connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Hybrid 2023[6](#footnotes)|Smart Cruise Control (SCC)|openpilot available[1](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai A connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2018-19|All|Stock|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai C connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Kia|Niro Plug-in Hybrid 2020|All|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 Hyundai D connector
- 1 RJ45 cable (7 ft)
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| @@ -244,7 +245,7 @@ A supported vehicle is one that just works when you install a comma device. All |Toyota|RAV4 Hybrid 2017-18|All|openpilot available[2](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|RAV4 Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| -|Toyota|RAV4 Hybrid 2023|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| +|Toyota|RAV4 Hybrid 2023-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Toyota|Sienna 2018-20|All|openpilot available[2](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 RJ45 cable (7 ft)
- 1 Toyota A connector
- 1 comma 3X
- 1 comma power v2
- 1 harness box
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| |Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[1,13](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|
Parts- 1 J533 connector
- 1 USB-C coupler
- 1 comma 3X
- 1 harness box
- 1 long OBD-C cable
- 1 mount
- 1 right angle OBD-C cable (1.5 ft)
Buy Here
|| diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index fa80e760de..30f4e0dfd3 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -11,7 +11,7 @@ Our software is open source so you can solve your own problems without needing h ## What contributions are we looking for? -**openpilot's priorities are [safety](SAFETY.md), stability, quality, and features, in that order.** openpilot is part of comma's mission to *solve self-driving cars while delivering shippable intermediaries*, and **all** developoment is towards that goal. +**openpilot's priorities are [safety](SAFETY.md), stability, quality, and features, in that order.** openpilot is part of comma's mission to *solve self-driving cars while delivering shippable intermediaries*, and **all** development is towards that goal. ### What gets merged? diff --git a/docs/_static/logo.png b/docs/_static/logo.png index 2699565085..0e7577dae1 100644 Binary files a/docs/_static/logo.png and b/docs/_static/logo.png differ diff --git a/docs/assets/icon-star-empty.svg b/docs/assets/icon-star-empty.svg index 5d3c32d671..448b20b937 100644 --- a/docs/assets/icon-star-empty.svg +++ b/docs/assets/icon-star-empty.svg @@ -1,56 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:3142658fa2782d266028dcab491e02ab329a2cadcf9efb1846a5f9631d64cac1 +size 1947 diff --git a/docs/assets/icon-star-full.svg b/docs/assets/icon-star-full.svg index 294db2b7f2..0e0bf52cd8 100644 --- a/docs/assets/icon-star-full.svg +++ b/docs/assets/icon-star-full.svg @@ -1,56 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:5fdcc85f3d8c9d0c2fb76b98ddd9f118c0e4a12c859a4281a04a0870d5de12c8 +size 1950 diff --git a/docs/assets/icon-star-half.svg b/docs/assets/icon-star-half.svg index ab905fddcb..11398fa6f1 100644 --- a/docs/assets/icon-star-half.svg +++ b/docs/assets/icon-star-half.svg @@ -1,66 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:cdf5e7ae57626f4cda35973873a4696252babbbe473913fe0aafdd8ba39d7fc3 +size 2508 diff --git a/docs/assets/icon-youtube.svg b/docs/assets/icon-youtube.svg index 4e2c9fdfa9..f738dca10a 100644 --- a/docs/assets/icon-youtube.svg +++ b/docs/assets/icon-youtube.svg @@ -1,12 +1,3 @@ - - - - - - - - - - - - \ No newline at end of file +version https://git-lfs.github.com/spec/v1 +oid sha256:6cb64f9da10b818c56763a7c48347f6043da20a2a77fb14f6d60d9457c575b6b +size 1278 diff --git a/opendbc b/opendbc index 93b983d49a..40d9c723d4 160000 --- a/opendbc +++ b/opendbc @@ -1 +1 @@ -Subproject commit 93b983d49a2d6d5c67e15ce7650f55e4f121485d +Subproject commit 40d9c723d48496229fecc436046538a53af19c11 diff --git a/panda b/panda index 6e645d2d33..20722a5946 160000 --- a/panda +++ b/panda @@ -1 +1 @@ -Subproject commit 6e645d2d337f0c6b245ebae9bd8a54467634f13b +Subproject commit 20722a59467fc7d697bfe1edd233a38bafbc89d2 diff --git a/rednose_repo b/rednose_repo index 44e8a891a2..18b91458fd 160000 --- a/rednose_repo +++ b/rednose_repo @@ -1 +1 @@ -Subproject commit 44e8a891a2810f274a1fa980775155d9463e87b9 +Subproject commit 18b91458fd396530d43e1a2fe9a3ac9055fa9109 diff --git a/scripts/checkout-pr.sh b/scripts/checkout-pr.sh new file mode 100755 index 0000000000..43f658beff --- /dev/null +++ b/scripts/checkout-pr.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -e + +if [ $# -eq 0 ]; then + echo "usage: $0 " + exit 1 +fi + +BASE="https://github.com/commaai/openpilot/pull/" +PR_NUM="$(echo $1 | grep -o -E '[0-9]+')" +BRANCH=tmp-pr${PR_NUM} + +git branch -D -f $BRANCH || true +git fetch -u -f origin pull/$PR_NUM/head:$BRANCH +git switch $BRANCH +git reset --hard FETCH_HEAD diff --git a/selfdrive/assets/body/awake.gif b/selfdrive/assets/body/awake.gif index 7ec67055dd..cc22fd9b12 100644 Binary files a/selfdrive/assets/body/awake.gif and b/selfdrive/assets/body/awake.gif differ diff --git a/selfdrive/assets/body/sleep.gif b/selfdrive/assets/body/sleep.gif index 469cc80338..fcc0b4ed50 100644 Binary files a/selfdrive/assets/body/sleep.gif and b/selfdrive/assets/body/sleep.gif differ diff --git a/selfdrive/assets/icons/close.svg b/selfdrive/assets/icons/close.svg index b1e6d3b867..33f68f02bc 100644 --- a/selfdrive/assets/icons/close.svg +++ b/selfdrive/assets/icons/close.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:84c6b23bd3245954b86f80278511186fca4ddfa70d87c8b25e8f9fb76f9af758 +size 379 diff --git a/selfdrive/assets/images/button_flag.png b/selfdrive/assets/images/button_flag.png index cac4db6d4c..745c8d576b 100644 Binary files a/selfdrive/assets/images/button_flag.png and b/selfdrive/assets/images/button_flag.png differ diff --git a/selfdrive/assets/images/button_home.png b/selfdrive/assets/images/button_home.png index 9f52faf9e2..dd3f97f44b 100644 Binary files a/selfdrive/assets/images/button_home.png and b/selfdrive/assets/images/button_home.png differ diff --git a/selfdrive/assets/images/button_settings.png b/selfdrive/assets/images/button_settings.png index e04262b887..4bbfe581e6 100644 Binary files a/selfdrive/assets/images/button_settings.png and b/selfdrive/assets/images/button_settings.png differ diff --git a/selfdrive/assets/images/triangle.svg b/selfdrive/assets/images/triangle.svg index 9320269bde..f3a8db44b7 100644 --- a/selfdrive/assets/images/triangle.svg +++ b/selfdrive/assets/images/triangle.svg @@ -1,56 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:aaf9a1967365f2c641bf7b54a409e32842cee0bfded7ebb01b1a95c4ac9f0154 +size 2163 diff --git a/selfdrive/assets/img_chffr_wheel.png b/selfdrive/assets/img_chffr_wheel.png index 3f09a35a79..570ba4ee82 100644 Binary files a/selfdrive/assets/img_chffr_wheel.png and b/selfdrive/assets/img_chffr_wheel.png differ diff --git a/selfdrive/assets/img_circled_check.svg b/selfdrive/assets/img_circled_check.svg index 27c37395b2..1852ba947a 100644 --- a/selfdrive/assets/img_circled_check.svg +++ b/selfdrive/assets/img_circled_check.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:c5687faf4cb22bece0405893671651eb13e8eda393987610f493ee5e05eac61d +size 439 diff --git a/selfdrive/assets/img_circled_slash.svg b/selfdrive/assets/img_circled_slash.svg index b10a3938d5..6c77030d15 100644 --- a/selfdrive/assets/img_circled_slash.svg +++ b/selfdrive/assets/img_circled_slash.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:fbec38447732a443c304042c3c3d362c94e11e794e7cc7dc86aa1c7bba16c6b6 +size 328 diff --git a/selfdrive/assets/img_continue_triangle.svg b/selfdrive/assets/img_continue_triangle.svg index 20f9e45dcf..ee9db369a4 100644 --- a/selfdrive/assets/img_continue_triangle.svg +++ b/selfdrive/assets/img_continue_triangle.svg @@ -1,3 +1,3 @@ - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:1764c0c93703481b2ced63bc35c5a23a6c12388ca690ce4cf577b3b478a08b69 +size 197 diff --git a/selfdrive/assets/img_couch.svg b/selfdrive/assets/img_couch.svg index 2e86012809..7c58515200 100644 --- a/selfdrive/assets/img_couch.svg +++ b/selfdrive/assets/img_couch.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:a428d2561198ebdc853ba6fb25a8b9c5a58064d000413694e1535adc06633c0a +size 2649 diff --git a/selfdrive/assets/img_driver_face.png b/selfdrive/assets/img_driver_face.png index e2d943e537..8b6f515b1f 100644 Binary files a/selfdrive/assets/img_driver_face.png and b/selfdrive/assets/img_driver_face.png differ diff --git a/selfdrive/assets/img_driver_face_static.png b/selfdrive/assets/img_driver_face_static.png index d8bc5f1371..5d5ebf6795 100644 Binary files a/selfdrive/assets/img_driver_face_static.png and b/selfdrive/assets/img_driver_face_static.png differ diff --git a/selfdrive/assets/img_experimental.svg b/selfdrive/assets/img_experimental.svg index 0eaec3b3cd..3c31caa07e 100644 --- a/selfdrive/assets/img_experimental.svg +++ b/selfdrive/assets/img_experimental.svg @@ -1,10 +1,3 @@ - - - - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:c26afadff128244567a7cf98f1c998f97056b19209301ff7fc8851eb807fb748 +size 2193 diff --git a/selfdrive/assets/img_experimental_grey.svg b/selfdrive/assets/img_experimental_grey.svg index dc87105ac5..8ba6c87bd5 100644 --- a/selfdrive/assets/img_experimental_grey.svg +++ b/selfdrive/assets/img_experimental_grey.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:5ae28a53171567c8a0d52eec75cc49004cb8dd19dcab9a360784718ab8ec7c02 +size 1931 diff --git a/selfdrive/assets/img_experimental_white.svg b/selfdrive/assets/img_experimental_white.svg index ae4f18fde2..9714fe0c01 100644 --- a/selfdrive/assets/img_experimental_white.svg +++ b/selfdrive/assets/img_experimental_white.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:99be696be983700d7eb1768bd1c840198a4eb9525b71e28efea49f13c358e519 +size 1891 diff --git a/selfdrive/assets/img_eye_closed.svg b/selfdrive/assets/img_eye_closed.svg index 91b229e911..fcef6e8a3c 100644 --- a/selfdrive/assets/img_eye_closed.svg +++ b/selfdrive/assets/img_eye_closed.svg @@ -1,5 +1,3 @@ - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:8e0e5b451ed2e426fea99da24a9df6552be7048205b9aa7b89e46eeb89f6d08e +size 1490 diff --git a/selfdrive/assets/img_eye_open.svg b/selfdrive/assets/img_eye_open.svg index ea6e41ac54..7289c4a571 100644 --- a/selfdrive/assets/img_eye_open.svg +++ b/selfdrive/assets/img_eye_open.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:23935f9e2ddba8dafd4a5d0217f29783260a0832c9b0d3e6a2ef66d4529b91d2 +size 775 diff --git a/selfdrive/assets/img_map.png b/selfdrive/assets/img_map.png index 8bdae4d7d8..a8646491d7 100644 Binary files a/selfdrive/assets/img_map.png and b/selfdrive/assets/img_map.png differ diff --git a/selfdrive/assets/img_spinner_comma.png b/selfdrive/assets/img_spinner_comma.png index 16109557f8..81f2fb38c4 100644 Binary files a/selfdrive/assets/img_spinner_comma.png and b/selfdrive/assets/img_spinner_comma.png differ diff --git a/selfdrive/assets/img_spinner_track.png b/selfdrive/assets/img_spinner_track.png index 931c17e836..989a6cefd1 100644 Binary files a/selfdrive/assets/img_spinner_track.png and b/selfdrive/assets/img_spinner_track.png differ diff --git a/selfdrive/assets/navigation/default_marker.svg b/selfdrive/assets/navigation/default_marker.svg index 43d5290a96..4b11ee7623 100644 --- a/selfdrive/assets/navigation/default_marker.svg +++ b/selfdrive/assets/navigation/default_marker.svg @@ -1,5 +1,3 @@ - - - - - +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 index 733c129091..f8c5bdc2d8 100644 Binary files a/selfdrive/assets/navigation/direction_arrive.png and b/selfdrive/assets/navigation/direction_arrive.png differ diff --git a/selfdrive/assets/navigation/direction_arrive_left.png b/selfdrive/assets/navigation/direction_arrive_left.png index 92ff8e0341..6f59ab3711 100644 Binary files a/selfdrive/assets/navigation/direction_arrive_left.png and b/selfdrive/assets/navigation/direction_arrive_left.png differ diff --git a/selfdrive/assets/navigation/direction_arrive_right.png b/selfdrive/assets/navigation/direction_arrive_right.png index f5983bfe61..318e041339 100644 Binary files a/selfdrive/assets/navigation/direction_arrive_right.png and b/selfdrive/assets/navigation/direction_arrive_right.png differ diff --git a/selfdrive/assets/navigation/direction_arrive_straight.png b/selfdrive/assets/navigation/direction_arrive_straight.png index 733c129091..f8c5bdc2d8 100644 Binary files a/selfdrive/assets/navigation/direction_arrive_straight.png and b/selfdrive/assets/navigation/direction_arrive_straight.png differ diff --git a/selfdrive/assets/navigation/direction_close.png b/selfdrive/assets/navigation/direction_close.png index 4fdb5d195d..0e9e478d45 100644 Binary files a/selfdrive/assets/navigation/direction_close.png and b/selfdrive/assets/navigation/direction_close.png differ diff --git a/selfdrive/assets/navigation/direction_continue.png b/selfdrive/assets/navigation/direction_continue.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_continue.png and b/selfdrive/assets/navigation/direction_continue.png differ diff --git a/selfdrive/assets/navigation/direction_continue_left.png b/selfdrive/assets/navigation/direction_continue_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_continue_left.png and b/selfdrive/assets/navigation/direction_continue_left.png differ diff --git a/selfdrive/assets/navigation/direction_continue_right.png b/selfdrive/assets/navigation/direction_continue_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_continue_right.png and b/selfdrive/assets/navigation/direction_continue_right.png differ diff --git a/selfdrive/assets/navigation/direction_continue_slight_left.png b/selfdrive/assets/navigation/direction_continue_slight_left.png index 08e964dbd6..29f4440460 100644 Binary files a/selfdrive/assets/navigation/direction_continue_slight_left.png and b/selfdrive/assets/navigation/direction_continue_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_continue_slight_right.png b/selfdrive/assets/navigation/direction_continue_slight_right.png index 3e21cae11e..755935b84c 100644 Binary files a/selfdrive/assets/navigation/direction_continue_slight_right.png and b/selfdrive/assets/navigation/direction_continue_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_continue_straight.png b/selfdrive/assets/navigation/direction_continue_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_continue_straight.png and b/selfdrive/assets/navigation/direction_continue_straight.png differ diff --git a/selfdrive/assets/navigation/direction_continue_uturn.png b/selfdrive/assets/navigation/direction_continue_uturn.png index 0bd1b91777..ff9d97893f 100644 Binary files a/selfdrive/assets/navigation/direction_continue_uturn.png and b/selfdrive/assets/navigation/direction_continue_uturn.png differ diff --git a/selfdrive/assets/navigation/direction_depart.png b/selfdrive/assets/navigation/direction_depart.png index 4bf32c870d..aa4e4f7115 100644 Binary files a/selfdrive/assets/navigation/direction_depart.png and b/selfdrive/assets/navigation/direction_depart.png differ diff --git a/selfdrive/assets/navigation/direction_depart_left.png b/selfdrive/assets/navigation/direction_depart_left.png index 1f8d726911..76937eb5d3 100644 Binary files a/selfdrive/assets/navigation/direction_depart_left.png and b/selfdrive/assets/navigation/direction_depart_left.png differ diff --git a/selfdrive/assets/navigation/direction_depart_right.png b/selfdrive/assets/navigation/direction_depart_right.png index f359a685ff..149626b171 100644 Binary files a/selfdrive/assets/navigation/direction_depart_right.png and b/selfdrive/assets/navigation/direction_depart_right.png differ diff --git a/selfdrive/assets/navigation/direction_depart_straight.png b/selfdrive/assets/navigation/direction_depart_straight.png index 4bf32c870d..aa4e4f7115 100644 Binary files a/selfdrive/assets/navigation/direction_depart_straight.png and b/selfdrive/assets/navigation/direction_depart_straight.png differ diff --git a/selfdrive/assets/navigation/direction_end_of_road_left.png b/selfdrive/assets/navigation/direction_end_of_road_left.png index 5c0a24e7cb..32a602bdef 100644 Binary files a/selfdrive/assets/navigation/direction_end_of_road_left.png and b/selfdrive/assets/navigation/direction_end_of_road_left.png differ diff --git a/selfdrive/assets/navigation/direction_end_of_road_right.png b/selfdrive/assets/navigation/direction_end_of_road_right.png index 8d9b89d36c..68915cee25 100644 Binary files a/selfdrive/assets/navigation/direction_end_of_road_right.png and b/selfdrive/assets/navigation/direction_end_of_road_right.png differ diff --git a/selfdrive/assets/navigation/direction_flag.png b/selfdrive/assets/navigation/direction_flag.png index bad12ec666..26e8a220f2 100644 Binary files a/selfdrive/assets/navigation/direction_flag.png and b/selfdrive/assets/navigation/direction_flag.png differ diff --git a/selfdrive/assets/navigation/direction_fork.png b/selfdrive/assets/navigation/direction_fork.png index 3e0c262e2a..c3019a5991 100644 Binary files a/selfdrive/assets/navigation/direction_fork.png and b/selfdrive/assets/navigation/direction_fork.png differ diff --git a/selfdrive/assets/navigation/direction_fork_left.png b/selfdrive/assets/navigation/direction_fork_left.png index b244b42b51..a847257e9b 100644 Binary files a/selfdrive/assets/navigation/direction_fork_left.png and b/selfdrive/assets/navigation/direction_fork_left.png differ diff --git a/selfdrive/assets/navigation/direction_fork_right.png b/selfdrive/assets/navigation/direction_fork_right.png index aa3efaabca..102ddf753c 100644 Binary files a/selfdrive/assets/navigation/direction_fork_right.png and b/selfdrive/assets/navigation/direction_fork_right.png differ diff --git a/selfdrive/assets/navigation/direction_fork_slight_left.png b/selfdrive/assets/navigation/direction_fork_slight_left.png index 82fa59859b..945ef744e0 100644 Binary files a/selfdrive/assets/navigation/direction_fork_slight_left.png and b/selfdrive/assets/navigation/direction_fork_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_fork_slight_right.png b/selfdrive/assets/navigation/direction_fork_slight_right.png index 3596a2fbf2..65db839df9 100644 Binary files a/selfdrive/assets/navigation/direction_fork_slight_right.png and b/selfdrive/assets/navigation/direction_fork_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_fork_straight.png b/selfdrive/assets/navigation/direction_fork_straight.png index 86f30ab9b6..74528d230c 100644 Binary files a/selfdrive/assets/navigation/direction_fork_straight.png and b/selfdrive/assets/navigation/direction_fork_straight.png differ diff --git a/selfdrive/assets/navigation/direction_invalid.png b/selfdrive/assets/navigation/direction_invalid.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_invalid.png and b/selfdrive/assets/navigation/direction_invalid.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_left.png b/selfdrive/assets/navigation/direction_invalid_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_left.png and b/selfdrive/assets/navigation/direction_invalid_left.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_right.png b/selfdrive/assets/navigation/direction_invalid_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_right.png and b/selfdrive/assets/navigation/direction_invalid_right.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_slight_left.png b/selfdrive/assets/navigation/direction_invalid_slight_left.png index 08e964dbd6..29f4440460 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_slight_left.png and b/selfdrive/assets/navigation/direction_invalid_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_slight_right.png b/selfdrive/assets/navigation/direction_invalid_slight_right.png index 3e21cae11e..755935b84c 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_slight_right.png and b/selfdrive/assets/navigation/direction_invalid_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_straight.png b/selfdrive/assets/navigation/direction_invalid_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_straight.png and b/selfdrive/assets/navigation/direction_invalid_straight.png differ diff --git a/selfdrive/assets/navigation/direction_invalid_uturn.png b/selfdrive/assets/navigation/direction_invalid_uturn.png index 0bd1b91777..ff9d97893f 100644 Binary files a/selfdrive/assets/navigation/direction_invalid_uturn.png and b/selfdrive/assets/navigation/direction_invalid_uturn.png differ diff --git a/selfdrive/assets/navigation/direction_merge_left.png b/selfdrive/assets/navigation/direction_merge_left.png index a713f52c56..7812f9eb94 100644 Binary files a/selfdrive/assets/navigation/direction_merge_left.png and b/selfdrive/assets/navigation/direction_merge_left.png differ diff --git a/selfdrive/assets/navigation/direction_merge_right.png b/selfdrive/assets/navigation/direction_merge_right.png index 3390b31a05..3c44c8fc75 100644 Binary files a/selfdrive/assets/navigation/direction_merge_right.png and b/selfdrive/assets/navigation/direction_merge_right.png differ diff --git a/selfdrive/assets/navigation/direction_merge_slight_left.png b/selfdrive/assets/navigation/direction_merge_slight_left.png index 308f97b5a5..756fb01853 100644 Binary files a/selfdrive/assets/navigation/direction_merge_slight_left.png and b/selfdrive/assets/navigation/direction_merge_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_merge_slight_right.png b/selfdrive/assets/navigation/direction_merge_slight_right.png index 8f5289011d..b8d42b741f 100644 Binary files a/selfdrive/assets/navigation/direction_merge_slight_right.png and b/selfdrive/assets/navigation/direction_merge_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_merge_straight.png b/selfdrive/assets/navigation/direction_merge_straight.png index 49c464389d..60035c1f01 100644 Binary files a/selfdrive/assets/navigation/direction_merge_straight.png and b/selfdrive/assets/navigation/direction_merge_straight.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_left.png b/selfdrive/assets/navigation/direction_new_name_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_left.png and b/selfdrive/assets/navigation/direction_new_name_left.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_right.png b/selfdrive/assets/navigation/direction_new_name_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_right.png and b/selfdrive/assets/navigation/direction_new_name_right.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_left.png b/selfdrive/assets/navigation/direction_new_name_sharp_left.png index 77106b493f..ae1f3741ef 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_sharp_left.png and b/selfdrive/assets/navigation/direction_new_name_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_sharp_right.png b/selfdrive/assets/navigation/direction_new_name_sharp_right.png index eb3a02f8b3..0d8cd3ed53 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_sharp_right.png and b/selfdrive/assets/navigation/direction_new_name_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_slight_left.png b/selfdrive/assets/navigation/direction_new_name_slight_left.png index 08e964dbd6..29f4440460 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_slight_left.png and b/selfdrive/assets/navigation/direction_new_name_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_slight_right.png b/selfdrive/assets/navigation/direction_new_name_slight_right.png index 3e21cae11e..755935b84c 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_slight_right.png and b/selfdrive/assets/navigation/direction_new_name_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_new_name_straight.png b/selfdrive/assets/navigation/direction_new_name_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_new_name_straight.png and b/selfdrive/assets/navigation/direction_new_name_straight.png differ diff --git a/selfdrive/assets/navigation/direction_notification_left.png b/selfdrive/assets/navigation/direction_notification_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_notification_left.png and b/selfdrive/assets/navigation/direction_notification_left.png differ diff --git a/selfdrive/assets/navigation/direction_notification_right.png b/selfdrive/assets/navigation/direction_notification_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_notification_right.png and b/selfdrive/assets/navigation/direction_notification_right.png differ diff --git a/selfdrive/assets/navigation/direction_notification_sharp_left.png b/selfdrive/assets/navigation/direction_notification_sharp_left.png index dd8a4301db..d2f1d491a0 100644 Binary files a/selfdrive/assets/navigation/direction_notification_sharp_left.png and b/selfdrive/assets/navigation/direction_notification_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_notification_sharp_right.png b/selfdrive/assets/navigation/direction_notification_sharp_right.png index a7e3c4cee5..f338742e58 100644 Binary files a/selfdrive/assets/navigation/direction_notification_sharp_right.png and b/selfdrive/assets/navigation/direction_notification_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_notification_slight_left.png b/selfdrive/assets/navigation/direction_notification_slight_left.png index 08e964dbd6..29f4440460 100644 Binary files a/selfdrive/assets/navigation/direction_notification_slight_left.png and b/selfdrive/assets/navigation/direction_notification_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_notification_slight_right.png b/selfdrive/assets/navigation/direction_notification_slight_right.png index 3e21cae11e..755935b84c 100644 Binary files a/selfdrive/assets/navigation/direction_notification_slight_right.png and b/selfdrive/assets/navigation/direction_notification_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_notification_straight.png b/selfdrive/assets/navigation/direction_notification_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_notification_straight.png and b/selfdrive/assets/navigation/direction_notification_straight.png differ diff --git a/selfdrive/assets/navigation/direction_off_ramp_left.png b/selfdrive/assets/navigation/direction_off_ramp_left.png index d3fd182893..d01bb4fce3 100644 Binary files a/selfdrive/assets/navigation/direction_off_ramp_left.png and b/selfdrive/assets/navigation/direction_off_ramp_left.png differ diff --git a/selfdrive/assets/navigation/direction_off_ramp_right.png b/selfdrive/assets/navigation/direction_off_ramp_right.png index 722e3f808f..013ec5a4c9 100644 Binary files a/selfdrive/assets/navigation/direction_off_ramp_right.png and b/selfdrive/assets/navigation/direction_off_ramp_right.png differ diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_left.png b/selfdrive/assets/navigation/direction_off_ramp_slight_left.png index ddac4aad66..39497c8d41 100644 Binary files a/selfdrive/assets/navigation/direction_off_ramp_slight_left.png and b/selfdrive/assets/navigation/direction_off_ramp_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_off_ramp_slight_right.png b/selfdrive/assets/navigation/direction_off_ramp_slight_right.png index ed57608864..a68d28d674 100644 Binary files a/selfdrive/assets/navigation/direction_off_ramp_slight_right.png and b/selfdrive/assets/navigation/direction_off_ramp_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_left.png b/selfdrive/assets/navigation/direction_on_ramp_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_left.png and b/selfdrive/assets/navigation/direction_on_ramp_left.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_right.png b/selfdrive/assets/navigation/direction_on_ramp_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_right.png and b/selfdrive/assets/navigation/direction_on_ramp_right.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png index 77106b493f..ae1f3741ef 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png and b/selfdrive/assets/navigation/direction_on_ramp_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png b/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png index a7e3c4cee5..f338742e58 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png and b/selfdrive/assets/navigation/direction_on_ramp_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_left.png b/selfdrive/assets/navigation/direction_on_ramp_slight_left.png index a5ea8a881e..e640fe3404 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_slight_left.png and b/selfdrive/assets/navigation/direction_on_ramp_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_slight_right.png b/selfdrive/assets/navigation/direction_on_ramp_slight_right.png index f8ea3800e8..d309f2d14e 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_slight_right.png and b/selfdrive/assets/navigation/direction_on_ramp_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_on_ramp_straight.png b/selfdrive/assets/navigation/direction_on_ramp_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_on_ramp_straight.png and b/selfdrive/assets/navigation/direction_on_ramp_straight.png differ diff --git a/selfdrive/assets/navigation/direction_rotary.png b/selfdrive/assets/navigation/direction_rotary.png index 2a5d264bd2..20b4052015 100644 Binary files a/selfdrive/assets/navigation/direction_rotary.png and b/selfdrive/assets/navigation/direction_rotary.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_left.png b/selfdrive/assets/navigation/direction_rotary_left.png index 0c4e4ab5e6..f610501286 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_left.png and b/selfdrive/assets/navigation/direction_rotary_left.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_right.png b/selfdrive/assets/navigation/direction_rotary_right.png index 32a6b2504b..9b8ea37ddf 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_right.png and b/selfdrive/assets/navigation/direction_rotary_right.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_left.png b/selfdrive/assets/navigation/direction_rotary_sharp_left.png index c84a6d96c0..cbc0882791 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_sharp_left.png and b/selfdrive/assets/navigation/direction_rotary_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_sharp_right.png b/selfdrive/assets/navigation/direction_rotary_sharp_right.png index d15cbee002..c7d4ba3175 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_sharp_right.png and b/selfdrive/assets/navigation/direction_rotary_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_slight_left.png b/selfdrive/assets/navigation/direction_rotary_slight_left.png index 3838e720a3..9b5912030b 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_slight_left.png and b/selfdrive/assets/navigation/direction_rotary_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_slight_right.png b/selfdrive/assets/navigation/direction_rotary_slight_right.png index 8cd45fe612..bc5e6b0d2e 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_slight_right.png and b/selfdrive/assets/navigation/direction_rotary_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_rotary_straight.png b/selfdrive/assets/navigation/direction_rotary_straight.png index b6b0a7311b..ac4eec685e 100644 Binary files a/selfdrive/assets/navigation/direction_rotary_straight.png and b/selfdrive/assets/navigation/direction_rotary_straight.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout.png b/selfdrive/assets/navigation/direction_roundabout.png index 2a5d264bd2..20b4052015 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout.png and b/selfdrive/assets/navigation/direction_roundabout.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_left.png b/selfdrive/assets/navigation/direction_roundabout_left.png index 0c4e4ab5e6..f610501286 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_left.png and b/selfdrive/assets/navigation/direction_roundabout_left.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_right.png b/selfdrive/assets/navigation/direction_roundabout_right.png index 32a6b2504b..9b8ea37ddf 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_right.png and b/selfdrive/assets/navigation/direction_roundabout_right.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_left.png b/selfdrive/assets/navigation/direction_roundabout_sharp_left.png index 1e8cce8c8e..204586589d 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_sharp_left.png and b/selfdrive/assets/navigation/direction_roundabout_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_sharp_right.png b/selfdrive/assets/navigation/direction_roundabout_sharp_right.png index d15cbee002..c7d4ba3175 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_sharp_right.png and b/selfdrive/assets/navigation/direction_roundabout_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_left.png b/selfdrive/assets/navigation/direction_roundabout_slight_left.png index da1b112705..d8b806137c 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_slight_left.png and b/selfdrive/assets/navigation/direction_roundabout_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_slight_right.png b/selfdrive/assets/navigation/direction_roundabout_slight_right.png index 8cd45fe612..bc5e6b0d2e 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_slight_right.png and b/selfdrive/assets/navigation/direction_roundabout_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_roundabout_straight.png b/selfdrive/assets/navigation/direction_roundabout_straight.png index b6b0a7311b..ac4eec685e 100644 Binary files a/selfdrive/assets/navigation/direction_roundabout_straight.png and b/selfdrive/assets/navigation/direction_roundabout_straight.png differ diff --git a/selfdrive/assets/navigation/direction_turn_left.png b/selfdrive/assets/navigation/direction_turn_left.png index 9a618026f0..438532ee29 100644 Binary files a/selfdrive/assets/navigation/direction_turn_left.png and b/selfdrive/assets/navigation/direction_turn_left.png differ diff --git a/selfdrive/assets/navigation/direction_turn_left_inactive.png b/selfdrive/assets/navigation/direction_turn_left_inactive.png index 2946984acd..7f461a1967 100644 Binary files a/selfdrive/assets/navigation/direction_turn_left_inactive.png and b/selfdrive/assets/navigation/direction_turn_left_inactive.png differ diff --git a/selfdrive/assets/navigation/direction_turn_right.png b/selfdrive/assets/navigation/direction_turn_right.png index 0fbaa3f253..4ee7ebc3b4 100644 Binary files a/selfdrive/assets/navigation/direction_turn_right.png and b/selfdrive/assets/navigation/direction_turn_right.png differ diff --git a/selfdrive/assets/navigation/direction_turn_right_inactive.png b/selfdrive/assets/navigation/direction_turn_right_inactive.png index 7d327766af..bc0a98dccf 100644 Binary files a/selfdrive/assets/navigation/direction_turn_right_inactive.png and b/selfdrive/assets/navigation/direction_turn_right_inactive.png differ diff --git a/selfdrive/assets/navigation/direction_turn_sharp_left.png b/selfdrive/assets/navigation/direction_turn_sharp_left.png index dd8a4301db..d2f1d491a0 100644 Binary files a/selfdrive/assets/navigation/direction_turn_sharp_left.png and b/selfdrive/assets/navigation/direction_turn_sharp_left.png differ diff --git a/selfdrive/assets/navigation/direction_turn_sharp_right.png b/selfdrive/assets/navigation/direction_turn_sharp_right.png index a7e3c4cee5..f338742e58 100644 Binary files a/selfdrive/assets/navigation/direction_turn_sharp_right.png and b/selfdrive/assets/navigation/direction_turn_sharp_right.png differ diff --git a/selfdrive/assets/navigation/direction_turn_slight_left.png b/selfdrive/assets/navigation/direction_turn_slight_left.png index 08e964dbd6..29f4440460 100644 Binary files a/selfdrive/assets/navigation/direction_turn_slight_left.png and b/selfdrive/assets/navigation/direction_turn_slight_left.png differ diff --git a/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png b/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png index 37f1f83627..7c970ebb81 100644 Binary files a/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png and b/selfdrive/assets/navigation/direction_turn_slight_left_inactive.png differ diff --git a/selfdrive/assets/navigation/direction_turn_slight_right.png b/selfdrive/assets/navigation/direction_turn_slight_right.png index 3e21cae11e..755935b84c 100644 Binary files a/selfdrive/assets/navigation/direction_turn_slight_right.png and b/selfdrive/assets/navigation/direction_turn_slight_right.png differ diff --git a/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png b/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png index 8be2245811..15611decaa 100644 Binary files a/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png and b/selfdrive/assets/navigation/direction_turn_slight_right_inactive.png differ diff --git a/selfdrive/assets/navigation/direction_turn_straight.png b/selfdrive/assets/navigation/direction_turn_straight.png index a01045ae6a..ce2c42c43d 100644 Binary files a/selfdrive/assets/navigation/direction_turn_straight.png and b/selfdrive/assets/navigation/direction_turn_straight.png differ diff --git a/selfdrive/assets/navigation/direction_turn_straight_inactive.png b/selfdrive/assets/navigation/direction_turn_straight_inactive.png index 4c567966ee..d864e58bd9 100644 Binary files a/selfdrive/assets/navigation/direction_turn_straight_inactive.png and b/selfdrive/assets/navigation/direction_turn_straight_inactive.png differ diff --git a/selfdrive/assets/navigation/direction_turn_uturn.png b/selfdrive/assets/navigation/direction_turn_uturn.png index 0bd1b91777..ff9d97893f 100644 Binary files a/selfdrive/assets/navigation/direction_turn_uturn.png and b/selfdrive/assets/navigation/direction_turn_uturn.png differ diff --git a/selfdrive/assets/navigation/direction_updown.png b/selfdrive/assets/navigation/direction_updown.png index 16d0979f3e..3c9e3fe22e 100644 Binary files a/selfdrive/assets/navigation/direction_updown.png and b/selfdrive/assets/navigation/direction_updown.png differ diff --git a/selfdrive/assets/navigation/home.png b/selfdrive/assets/navigation/home.png index 8a4f65c7d7..321cef4163 100644 Binary files a/selfdrive/assets/navigation/home.png and b/selfdrive/assets/navigation/home.png differ diff --git a/selfdrive/assets/navigation/home.svg b/selfdrive/assets/navigation/home.svg index f5d89514c3..9d9c60da39 100644 --- a/selfdrive/assets/navigation/home.svg +++ b/selfdrive/assets/navigation/home.svg @@ -1,65 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - - - +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 index a58fd3864f..9ffaf2b87b 100644 Binary files a/selfdrive/assets/navigation/home_inactive.png and b/selfdrive/assets/navigation/home_inactive.png differ diff --git a/selfdrive/assets/navigation/icon_directions.svg b/selfdrive/assets/navigation/icon_directions.svg index 66009ac43b..c36e27316e 100644 --- a/selfdrive/assets/navigation/icon_directions.svg +++ b/selfdrive/assets/navigation/icon_directions.svg @@ -1 +1,3 @@ - +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 index 5c0c2fa3be..356a1e7456 100644 --- a/selfdrive/assets/navigation/icon_directions_outlined.svg +++ b/selfdrive/assets/navigation/icon_directions_outlined.svg @@ -1 +1,3 @@ - +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 index ba64df4ab9..0eb0e43688 100644 --- a/selfdrive/assets/navigation/icon_favorite.svg +++ b/selfdrive/assets/navigation/icon_favorite.svg @@ -1 +1,3 @@ - \ No newline at end of file +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 index cb87011090..ca90cc7bf6 100644 --- a/selfdrive/assets/navigation/icon_home.svg +++ b/selfdrive/assets/navigation/icon_home.svg @@ -1 +1,3 @@ - \ No newline at end of file +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 index 668aa38209..76b5a620b1 100644 --- a/selfdrive/assets/navigation/icon_recent.svg +++ b/selfdrive/assets/navigation/icon_recent.svg @@ -1 +1,3 @@ - \ No newline at end of file +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 index 134cc0f31f..3fd31459c3 100644 --- a/selfdrive/assets/navigation/icon_settings.svg +++ b/selfdrive/assets/navigation/icon_settings.svg @@ -1 +1,3 @@ - +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 index c1ea6c5e3b..dc18914a39 100644 --- a/selfdrive/assets/navigation/icon_work.svg +++ b/selfdrive/assets/navigation/icon_work.svg @@ -1 +1,3 @@ - \ No newline at end of file +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 index 611f9b038d..589087a8aa 100644 Binary files a/selfdrive/assets/navigation/work.png and b/selfdrive/assets/navigation/work.png differ diff --git a/selfdrive/assets/navigation/work.svg b/selfdrive/assets/navigation/work.svg index 2da7bb7d39..0f6a9ba65b 100644 --- a/selfdrive/assets/navigation/work.svg +++ b/selfdrive/assets/navigation/work.svg @@ -1,66 +1,3 @@ - - - - - - image/svg+xml - - - - - - - - - - +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 index 679e6a54b2..c1ce69b004 100644 Binary files a/selfdrive/assets/navigation/work_inactive.png and b/selfdrive/assets/navigation/work_inactive.png differ diff --git a/selfdrive/assets/offroad/icon_calibration.png b/selfdrive/assets/offroad/icon_calibration.png index c4ee0d63d4..d2a098ba5a 100644 Binary files a/selfdrive/assets/offroad/icon_calibration.png and b/selfdrive/assets/offroad/icon_calibration.png differ diff --git a/selfdrive/assets/offroad/icon_checkmark.svg b/selfdrive/assets/offroad/icon_checkmark.svg index b024eccd9e..7a1db13497 100644 --- a/selfdrive/assets/offroad/icon_checkmark.svg +++ b/selfdrive/assets/offroad/icon_checkmark.svg @@ -1,3 +1,3 @@ - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:da1540859c4c42878a32a0a81a38ca38b04be4cb0fe46709df3e024b7f3b4036 +size 243 diff --git a/selfdrive/assets/offroad/icon_chevron_right.png b/selfdrive/assets/offroad/icon_chevron_right.png index a3aaa76486..46baa13240 100644 Binary files a/selfdrive/assets/offroad/icon_chevron_right.png and b/selfdrive/assets/offroad/icon_chevron_right.png differ diff --git a/selfdrive/assets/offroad/icon_close.svg b/selfdrive/assets/offroad/icon_close.svg index 4c063371af..54a44146d7 100644 --- a/selfdrive/assets/offroad/icon_close.svg +++ b/selfdrive/assets/offroad/icon_close.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:4eff44a05132ed9f99ad821993be4bab9b1a1c880e07441f3b887214bee62afe +size 825 diff --git a/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg b/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg index 0175e672c6..d5a8c87e21 100644 --- a/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg +++ b/selfdrive/assets/offroad/icon_disengage_on_accelerator.svg @@ -1,7 +1,3 @@ - - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:5252412f2225c89ea7e78ad0fbd6544170aea157693ce0f9778f26a64f582ec2 +size 6821 diff --git a/selfdrive/assets/offroad/icon_lock_closed.svg b/selfdrive/assets/offroad/icon_lock_closed.svg index 7dc9283c81..501d978a8a 100644 --- a/selfdrive/assets/offroad/icon_lock_closed.svg +++ b/selfdrive/assets/offroad/icon_lock_closed.svg @@ -1,4 +1,3 @@ - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:ef09792cc1893f81c64abd6b72091d3762c07b849863ce90508afdd29b392c02 +size 732 diff --git a/selfdrive/assets/offroad/icon_map.png b/selfdrive/assets/offroad/icon_map.png index 21dd0bacc6..82c0236a48 100644 Binary files a/selfdrive/assets/offroad/icon_map.png and b/selfdrive/assets/offroad/icon_map.png differ diff --git a/selfdrive/assets/offroad/icon_map_speed.png b/selfdrive/assets/offroad/icon_map_speed.png index 1eeab84600..4ed1de314b 100644 Binary files a/selfdrive/assets/offroad/icon_map_speed.png and b/selfdrive/assets/offroad/icon_map_speed.png differ diff --git a/selfdrive/assets/offroad/icon_menu.png b/selfdrive/assets/offroad/icon_menu.png index 837cf5831c..d43db96cd8 100644 Binary files a/selfdrive/assets/offroad/icon_menu.png and b/selfdrive/assets/offroad/icon_menu.png differ diff --git a/selfdrive/assets/offroad/icon_metric.png b/selfdrive/assets/offroad/icon_metric.png index eaa2438fa3..0d38b0478f 100644 Binary files a/selfdrive/assets/offroad/icon_metric.png and b/selfdrive/assets/offroad/icon_metric.png differ diff --git a/selfdrive/assets/offroad/icon_minus.png b/selfdrive/assets/offroad/icon_minus.png index e5327c0d3b..c2abe3ae90 100644 Binary files a/selfdrive/assets/offroad/icon_minus.png and b/selfdrive/assets/offroad/icon_minus.png differ diff --git a/selfdrive/assets/offroad/icon_monitoring.png b/selfdrive/assets/offroad/icon_monitoring.png index 05f78811e2..39d52de13d 100644 Binary files a/selfdrive/assets/offroad/icon_monitoring.png and b/selfdrive/assets/offroad/icon_monitoring.png differ diff --git a/selfdrive/assets/offroad/icon_network.png b/selfdrive/assets/offroad/icon_network.png index 3236924f4d..71ccc89aac 100644 Binary files a/selfdrive/assets/offroad/icon_network.png and b/selfdrive/assets/offroad/icon_network.png differ diff --git a/selfdrive/assets/offroad/icon_openpilot.png b/selfdrive/assets/offroad/icon_openpilot.png index 0a90a87910..ae6faa45ea 100644 Binary files a/selfdrive/assets/offroad/icon_openpilot.png and b/selfdrive/assets/offroad/icon_openpilot.png differ diff --git a/selfdrive/assets/offroad/icon_plus.png b/selfdrive/assets/offroad/icon_plus.png index 92b448b0bd..6418a37a65 100644 Binary files a/selfdrive/assets/offroad/icon_plus.png and b/selfdrive/assets/offroad/icon_plus.png differ diff --git a/selfdrive/assets/offroad/icon_road.png b/selfdrive/assets/offroad/icon_road.png index 5868ed1ccc..7e460dc0d0 100644 Binary files a/selfdrive/assets/offroad/icon_road.png and b/selfdrive/assets/offroad/icon_road.png differ diff --git a/selfdrive/assets/offroad/icon_settings.png b/selfdrive/assets/offroad/icon_settings.png index d0c90a620d..3d8159acc6 100644 Binary files a/selfdrive/assets/offroad/icon_settings.png and b/selfdrive/assets/offroad/icon_settings.png differ diff --git a/selfdrive/assets/offroad/icon_shell.png b/selfdrive/assets/offroad/icon_shell.png index f1d655416a..ea4faf89b9 100644 Binary files a/selfdrive/assets/offroad/icon_shell.png and b/selfdrive/assets/offroad/icon_shell.png differ diff --git a/selfdrive/assets/offroad/icon_speed_limit.png b/selfdrive/assets/offroad/icon_speed_limit.png index 0aa7038f90..d4c662cfc0 100644 Binary files a/selfdrive/assets/offroad/icon_speed_limit.png and b/selfdrive/assets/offroad/icon_speed_limit.png differ diff --git a/selfdrive/assets/offroad/icon_warning.png b/selfdrive/assets/offroad/icon_warning.png index 50fe821127..583f9c2443 100644 Binary files a/selfdrive/assets/offroad/icon_warning.png and b/selfdrive/assets/offroad/icon_warning.png differ diff --git a/selfdrive/assets/offroad/icon_wifi_strength_full.svg b/selfdrive/assets/offroad/icon_wifi_strength_full.svg index 758198e97f..c9d22d8961 100644 --- a/selfdrive/assets/offroad/icon_wifi_strength_full.svg +++ b/selfdrive/assets/offroad/icon_wifi_strength_full.svg @@ -1,6 +1,3 @@ - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:485dd0d4eb8968726003ae460bab4ff498127def52b8b1ed6d968f4629ab233a +size 1655 diff --git a/selfdrive/assets/offroad/icon_wifi_strength_high.svg b/selfdrive/assets/offroad/icon_wifi_strength_high.svg index a8db07f91e..ff001bd14a 100644 --- a/selfdrive/assets/offroad/icon_wifi_strength_high.svg +++ b/selfdrive/assets/offroad/icon_wifi_strength_high.svg @@ -1,6 +1,3 @@ - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:c92fd8bebbe630f991fe3f61f61407f8002d29881698634239be3a6fae2fb4bc +size 1657 diff --git a/selfdrive/assets/offroad/icon_wifi_strength_low.svg b/selfdrive/assets/offroad/icon_wifi_strength_low.svg index 8963c3dbc1..bcc6e83c63 100644 --- a/selfdrive/assets/offroad/icon_wifi_strength_low.svg +++ b/selfdrive/assets/offroad/icon_wifi_strength_low.svg @@ -1,6 +1,3 @@ - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:e629e3a84dc288278e455be4a8deff95730e24d9a0b894f8c417ac1c409670ab +size 1661 diff --git a/selfdrive/assets/offroad/icon_wifi_strength_medium.svg b/selfdrive/assets/offroad/icon_wifi_strength_medium.svg index 8f8d503260..e14ebd238f 100644 --- a/selfdrive/assets/offroad/icon_wifi_strength_medium.svg +++ b/selfdrive/assets/offroad/icon_wifi_strength_medium.svg @@ -1,6 +1,3 @@ - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:52113c14656483854a814c50c93770f5e6ab7d63b2b5048ddd6fd47fdfd4a7de +size 1659 diff --git a/selfdrive/assets/offroad/icon_wifi_uploading.svg b/selfdrive/assets/offroad/icon_wifi_uploading.svg index 95cb0e283e..b9392dfe7c 100644 --- a/selfdrive/assets/offroad/icon_wifi_uploading.svg +++ b/selfdrive/assets/offroad/icon_wifi_uploading.svg @@ -1,6 +1,3 @@ - - - - - - +version https://git-lfs.github.com/spec/v1 +oid sha256:bedd579f56c65fffe2ad571f92843b6d103826fe173f8f5b58fc2200d2ad8850 +size 1663 diff --git a/selfdrive/assets/sounds/disengage.wav b/selfdrive/assets/sounds/disengage.wav index ba583c41f3..f3b5f21a27 100644 Binary files a/selfdrive/assets/sounds/disengage.wav and b/selfdrive/assets/sounds/disengage.wav differ diff --git a/selfdrive/assets/sounds/engage.wav b/selfdrive/assets/sounds/engage.wav index 41e9b2d588..fc24a23c2f 100644 Binary files a/selfdrive/assets/sounds/engage.wav and b/selfdrive/assets/sounds/engage.wav differ diff --git a/selfdrive/assets/sounds/prompt.wav b/selfdrive/assets/sounds/prompt.wav index 1ae77051eb..e482c85a62 100644 Binary files a/selfdrive/assets/sounds/prompt.wav and b/selfdrive/assets/sounds/prompt.wav differ diff --git a/selfdrive/assets/sounds/prompt_distracted.wav b/selfdrive/assets/sounds/prompt_distracted.wav index c3d4475caa..750d580f04 100644 Binary files a/selfdrive/assets/sounds/prompt_distracted.wav and b/selfdrive/assets/sounds/prompt_distracted.wav differ diff --git a/selfdrive/assets/sounds/refuse.wav b/selfdrive/assets/sounds/refuse.wav index 0e80f7d127..1e0c47697d 100644 Binary files a/selfdrive/assets/sounds/refuse.wav and b/selfdrive/assets/sounds/refuse.wav differ diff --git a/selfdrive/assets/sounds/warning_immediate.wav b/selfdrive/assets/sounds/warning_immediate.wav index b1815a9586..fcbfed79ed 100644 Binary files a/selfdrive/assets/sounds/warning_immediate.wav and b/selfdrive/assets/sounds/warning_immediate.wav differ diff --git a/selfdrive/assets/sounds/warning_soft.wav b/selfdrive/assets/sounds/warning_soft.wav index 261c7e1376..7db30303d6 100644 Binary files a/selfdrive/assets/sounds/warning_soft.wav and b/selfdrive/assets/sounds/warning_soft.wav differ diff --git a/selfdrive/car/hyundai/carstate.py b/selfdrive/car/hyundai/carstate.py index edc9e4855f..2f1fb10804 100644 --- a/selfdrive/car/hyundai/carstate.py +++ b/selfdrive/car/hyundai/carstate.py @@ -147,8 +147,9 @@ class CarState(CarStateBase): aeb_src = "FCA11" if self.CP.flags & HyundaiFlags.USE_FCA.value else "SCC12" aeb_sig = "FCA_CmdAct" if self.CP.flags & HyundaiFlags.USE_FCA.value else "AEB_CmdAct" aeb_warning = cp_cruise.vl[aeb_src]["CF_VSM_Warn"] != 0 + scc_warning = cp_cruise.vl["SCC12"]["TakeOverReq"] == 1 # sometimes only SCC system shows an FCW aeb_braking = cp_cruise.vl[aeb_src]["CF_VSM_DecCmdAct"] != 0 or cp_cruise.vl[aeb_src][aeb_sig] != 0 - ret.stockFcw = aeb_warning and not aeb_braking + ret.stockFcw = (aeb_warning or scc_warning) and not aeb_braking ret.stockAeb = aeb_warning and aeb_braking if self.CP.enableBsm: diff --git a/selfdrive/car/hyundai/values.py b/selfdrive/car/hyundai/values.py index 371478f429..4b92bc5a49 100644 --- a/selfdrive/car/hyundai/values.py +++ b/selfdrive/car/hyundai/values.py @@ -251,7 +251,8 @@ CAR_INFO: Dict[str, Optional[Union[HyundaiCarInfo, List[HyundaiCarInfo]]]] = { ], CAR.KIA_NIRO_PHEV_2022: HyundaiCarInfo("Kia Niro Plug-in Hybrid 2022", "All", car_parts=CarParts.common([CarHarness.hyundai_f])), CAR.KIA_NIRO_HEV_2021: [ - HyundaiCarInfo("Kia Niro Hybrid 2021-22", car_parts=CarParts.common([CarHarness.hyundai_f])), # TODO: 2021 could be hyundai_d, verify + HyundaiCarInfo("Kia Niro Hybrid 2021", car_parts=CarParts.common([CarHarness.hyundai_d])), + HyundaiCarInfo("Kia Niro Hybrid 2022", car_parts=CarParts.common([CarHarness.hyundai_f])), ], CAR.KIA_NIRO_HEV_2ND_GEN: HyundaiCarInfo("Kia Niro Hybrid 2023", car_parts=CarParts.common([CarHarness.hyundai_a])), CAR.KIA_OPTIMA_G4: HyundaiCarInfo("Kia Optima 2017", "Advanced Smart Cruise Control", diff --git a/selfdrive/car/subaru/subarucan.py b/selfdrive/car/subaru/subarucan.py index b851bcc088..290737c3e6 100644 --- a/selfdrive/car/subaru/subarucan.py +++ b/selfdrive/car/subaru/subarucan.py @@ -48,8 +48,7 @@ def create_es_distance(packer, frame, es_distance_msg, bus, pcm_cancel_cmd, long values["Cruise_Soft_Disable"] = 0 values["Cruise_Fault"] = 0 - if brake_cmd: - values["Cruise_Brake_Active"] = 1 + values["Cruise_Brake_Active"] = brake_cmd if pcm_cancel_cmd: values["Cruise_Cancel"] = 1 @@ -153,14 +152,14 @@ def create_es_dashstatus(packer, frame, dashstatus_msg, enabled, long_enabled, l values["COUNTER"] = frame % 0x10 - if enabled and long_active: + if long_enabled: values["Cruise_State"] = 0 - values["Cruise_Activated"] = 1 + values["Cruise_Activated"] = enabled values["Cruise_Disengaged"] = 0 values["Car_Follow"] = int(lead_visible) - if long_enabled: values["PCB_Off"] = 1 # AEB is not presevered, so show the PCB_Off on dash + values["LDW_Off"] = 0 values["Cruise_Fault"] = 0 # Filter stock LKAS disabled and Keep hands on steering wheel OFF alerts @@ -186,15 +185,12 @@ def create_es_brake(packer, frame, es_brake_msg, long_enabled, long_active, brak if long_enabled: values["Cruise_Brake_Fault"] = 0 + values["Cruise_Activated"] = long_active - if long_active: - values["Cruise_Activated"] = 1 + values["Brake_Pressure"] = brake_value - values["Brake_Pressure"] = brake_value - - if brake_value > 0: - values["Cruise_Brake_Active"] = 1 - values["Cruise_Brake_Lights"] = 1 if brake_value >= 70 else 0 + values["Cruise_Brake_Active"] = brake_value > 0 + values["Cruise_Brake_Lights"] = brake_value >= 70 return packer.make_can_msg("ES_Brake", CanBus.main, values) @@ -204,7 +200,6 @@ def create_es_status(packer, frame, es_status_msg, long_enabled, long_active, cr "Signal1", "Cruise_Fault", "Cruise_RPM", - "Signal2", "Cruise_Activated", "Brake_Lights", "Cruise_Hold", @@ -217,8 +212,7 @@ def create_es_status(packer, frame, es_status_msg, long_enabled, long_active, cr values["Cruise_RPM"] = cruise_rpm values["Cruise_Fault"] = 0 - if long_active: - values["Cruise_Activated"] = 1 + values["Cruise_Activated"] = long_active return packer.make_can_msg("ES_Status", CanBus.main, values) diff --git a/selfdrive/car/tests/test_models.py b/selfdrive/car/tests/test_models.py index 7306962fa6..cc52995a33 100755 --- a/selfdrive/car/tests/test_models.py +++ b/selfdrive/car/tests/test_models.py @@ -36,9 +36,9 @@ JOB_ID = int(os.environ.get("JOB_ID", "0")) INTERNAL_SEG_LIST = os.environ.get("INTERNAL_SEG_LIST", "") INTERNAL_SEG_CNT = int(os.environ.get("INTERNAL_SEG_CNT", "0")) MAX_EXAMPLES = int(os.environ.get("MAX_EXAMPLES", "50")) - CI = os.environ.get("CI", None) is not None + def get_test_cases() -> List[Tuple[str, Optional[CarTestRoute]]]: # build list of test cases test_cases = [] @@ -68,7 +68,7 @@ def get_test_cases() -> List[Tuple[str, Optional[CarTestRoute]]]: class TestCarModelBase(unittest.TestCase): car_model: Optional[str] = None test_route: Optional[CarTestRoute] = None - test_route_on_bucket: bool = True # whether the route is on the preserved CI bucket + test_route_on_bucket: bool = True # whether the route is on the preserved CI bucket can_msgs: List[capnp.lib.capnp._DynamicStructReader] fingerprint: dict[int, dict[int, int]] @@ -81,19 +81,80 @@ class TestCarModelBase(unittest.TestCase): route_name = RouteName(cls.test_route.route) return LogReader(f"cd:/{route_name.dongle_id}/{route_name.time_str}/{seg}/rlog.bz2") else: - # Attempt to use CI bucket first - try: - return LogReader(get_url(cls.test_route.route, seg)) - except Exception: - cls.test_route_on_bucket = False + return LogReader(get_url(cls.test_route.route, seg)) + + @classmethod + def get_testing_data_from_logreader(cls, lr): + car_fw = [] + can_msgs = [] + cls.elm_frame = None + cls.car_safety_mode_frame = None + cls.fingerprint = gen_empty_fingerprint() + experimental_long = False + for msg in lr: + if msg.which() == "can": + can_msgs.append(msg) + if len(can_msgs) <= FRAME_FINGERPRINT: + for m in msg.can: + if m.src < 64: + cls.fingerprint[m.src][m.address] = len(m.dat) + + elif msg.which() == "carParams": + car_fw = msg.carParams.carFw + if msg.carParams.openpilotLongitudinalControl: + experimental_long = True + if cls.car_model is None and not cls.ci: + cls.car_model = msg.carParams.carFingerprint + + # Log which can frame the panda safety mode left ELM327, for CAN validity checks + elif msg.which() == 'pandaStates': + for ps in msg.pandaStates: + if cls.elm_frame is None and ps.safetyModel != SafetyModel.elm327: + cls.elm_frame = len(can_msgs) + if cls.car_safety_mode_frame is None and ps.safetyModel not in \ + (SafetyModel.elm327, SafetyModel.noOutput): + cls.car_safety_mode_frame = len(can_msgs) + + elif msg.which() == 'pandaStateDEPRECATED': + if cls.elm_frame is None and msg.pandaStateDEPRECATED.safetyModel != SafetyModel.elm327: + cls.elm_frame = len(can_msgs) + if cls.car_safety_mode_frame is None and msg.pandaStateDEPRECATED.safetyModel not in \ + (SafetyModel.elm327, SafetyModel.noOutput): + cls.car_safety_mode_frame = len(can_msgs) - # Fallback to public route, which will fail the test_route_on_ci_bucket when running in CI + if len(can_msgs) > int(50 / DT_CTRL): + return car_fw, can_msgs, experimental_long + + raise Exception("no can data found") + + @classmethod + def get_testing_data(cls): + test_segs = (2, 1, 0) + if cls.test_route.segment is not None: + test_segs = (cls.test_route.segment,) + + # Try the primary method first (CI or internal) + for seg in test_segs: try: - return LogReader(Route(cls.test_route.route).log_paths()[seg]) + lr = cls.get_logreader(seg) + return cls.get_testing_data_from_logreader(lr) except Exception: pass - raise Exception("Unable to get route. Check that the route is valid, and either public or uploaded to the CI bucket.") + # Route is not in CI bucket, assume either user has access (private), or it is public + # test_route_on_ci_bucket will fail when running in CI + if not len(INTERNAL_SEG_LIST): + cls.test_route_on_bucket = False + + for seg in test_segs: + try: + lr = LogReader(Route(cls.test_route.route).log_paths()[seg]) + return cls.get_testing_data_from_logreader(lr) + except Exception: + pass + + raise Exception(f"Route: {repr(cls.test_route.route)} with segments: {test_segs} not found or no CAN msgs found. Is it uploaded and public?") + @classmethod def setUpClass(cls): @@ -110,57 +171,7 @@ class TestCarModelBase(unittest.TestCase): raise unittest.SkipTest raise Exception(f"missing test route for {cls.car_model}") - test_segs = (2, 1, 0) - if cls.test_route.segment is not None: - test_segs = (cls.test_route.segment,) - - for seg in test_segs: - try: - lr = cls.get_logreader(seg) - except Exception: - continue - - car_fw = [] - can_msgs = [] - cls.elm_frame = None - cls.car_safety_mode_frame = None - cls.fingerprint = gen_empty_fingerprint() - experimental_long = False - for msg in lr: - if msg.which() == "can": - can_msgs.append(msg) - if len(can_msgs) <= FRAME_FINGERPRINT: - for m in msg.can: - if m.src < 64: - cls.fingerprint[m.src][m.address] = len(m.dat) - - elif msg.which() == "carParams": - car_fw = msg.carParams.carFw - if msg.carParams.openpilotLongitudinalControl: - experimental_long = True - if cls.car_model is None and not cls.ci: - cls.car_model = msg.carParams.carFingerprint - - # Log which can frame the panda safety mode left ELM327, for CAN validity checks - elif msg.which() == 'pandaStates': - for ps in msg.pandaStates: - if cls.elm_frame is None and ps.safetyModel != SafetyModel.elm327: - cls.elm_frame = len(can_msgs) - if cls.car_safety_mode_frame is None and ps.safetyModel not in \ - (SafetyModel.elm327, SafetyModel.noOutput): - cls.car_safety_mode_frame = len(can_msgs) - - elif msg.which() == 'pandaStateDEPRECATED': - if cls.elm_frame is None and msg.pandaStateDEPRECATED.safetyModel != SafetyModel.elm327: - cls.elm_frame = len(can_msgs) - if cls.car_safety_mode_frame is None and msg.pandaStateDEPRECATED.safetyModel not in \ - (SafetyModel.elm327, SafetyModel.noOutput): - cls.car_safety_mode_frame = len(can_msgs) - - if len(can_msgs) > int(50 / DT_CTRL): - break - else: - raise Exception(f"Route: {repr(cls.test_route.route)} with segments: {test_segs} not found or no CAN msgs found. Is it uploaded and public?") + car_fw, can_msgs, experimental_long = cls.get_testing_data() # if relay is expected to be open in the route cls.openpilot_enabled = cls.car_safety_mode_frame is not None @@ -466,10 +477,10 @@ class TestCarModelBase(unittest.TestCase): failed_checks = {k: v for k, v in checks.items() if v > 0} self.assertFalse(len(failed_checks), f"panda safety doesn't agree with openpilot: {failed_checks}") - @pytest.mark.skipif(not CI, reason="When running in CI we want to make sure all the routes are uploaded to the preserved CI bucket.") + @unittest.skipIf(not CI, "Accessing non CI-bucket routes is allowed only when not in CI") def test_route_on_ci_bucket(self): - assert self.test_route_on_bucket, "Route not on CI bucket. \ - This is fine to fail for WIP car ports, just let us know and we can upload your routes to the CI bucket." + self.assertTrue(self.test_route_on_bucket, "Route not on CI bucket. " + + "This is fine to fail for WIP car ports, just let us know and we can upload your routes to the CI bucket.") @parameterized_class(('car_model', 'test_route'), get_test_cases()) diff --git a/selfdrive/car/toyota/fingerprints.py b/selfdrive/car/toyota/fingerprints.py index e7f3fe27ad..62c4ddf3ce 100644 --- a/selfdrive/car/toyota/fingerprints.py +++ b/selfdrive/car/toyota/fingerprints.py @@ -23,6 +23,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x750, 0xf): [ b'8821F4702000\x00\x00\x00\x00', b'8821F4702100\x00\x00\x00\x00', + b'8821F4702300\x00\x00\x00\x00', ], (Ecu.fwdCamera, 0x750, 0x6d): [ b'8646F0701100\x00\x00\x00\x00', @@ -51,6 +52,7 @@ FW_VERSIONS = { b'8965B41090\x00\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x700, None): [ + b'\x01896630725100\x00\x00\x00\x00', b'\x01896630725200\x00\x00\x00\x00', b'\x01896630725300\x00\x00\x00\x00', b'\x01896630735100\x00\x00\x00\x00', @@ -142,6 +144,7 @@ FW_VERSIONS = { (Ecu.dsu, 0x791, None): [ b'8821F0601200 ', b'8821F0601300 ', + b'8821F0601400 ', b'8821F0602000 ', b'8821F0603300 ', b'8821F0603400 ', @@ -185,6 +188,7 @@ FW_VERSIONS = { (Ecu.fwdRadar, 0x750, 0xf): [ b'8821F0601200 ', b'8821F0601300 ', + b'8821F0601400 ', b'8821F0602000 ', b'8821F0603300 ', b'8821F0603400 ', @@ -497,6 +501,7 @@ FW_VERSIONS = { b'\x018965B12510\x00\x00\x00\x00\x00\x00', b'\x018965B12520\x00\x00\x00\x00\x00\x00', b'\x018965B12530\x00\x00\x00\x00\x00\x00', + b'\x018965B1254000\x00\x00\x00\x00', b'\x018965B1255000\x00\x00\x00\x00', b'\x018965B1256000\x00\x00\x00\x00', b'8965B12361\x00\x00\x00\x00\x00\x00', @@ -571,6 +576,7 @@ FW_VERSIONS = { b'\x028646F1202000\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', b'\x028646F1202100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F1202200\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', + b'\x028646F1206000\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', b'\x028646F1601100\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F1601200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F1601300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', @@ -578,6 +584,7 @@ FW_VERSIONS = { b'\x028646F76020C0\x00\x00\x00\x008646G26011A0\x00\x00\x00\x00', b'\x028646F7603100\x00\x00\x00\x008646G2601200\x00\x00\x00\x00', b'\x028646F7603200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', + b'\x028646F7603300\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F7605100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', ], }, @@ -588,6 +595,7 @@ FW_VERSIONS = { b'\x01896630E43100\x00\x00\x00\x00', b'\x01896630E43200\x00\x00\x00\x00', b'\x01896630E44200\x00\x00\x00\x00', + b'\x01896630E44400\x00\x00\x00\x00', b'\x01896630E45000\x00\x00\x00\x00', b'\x01896630E45100\x00\x00\x00\x00', b'\x01896630E45200\x00\x00\x00\x00', @@ -792,6 +800,7 @@ FW_VERSIONS = { b'\x02896634761100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634761200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634762000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634762100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634763000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634763100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634765000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', @@ -800,6 +809,7 @@ FW_VERSIONS = { b'\x02896634769100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634769200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634770000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', + b'\x02896634770100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634774000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634774100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', b'\x02896634774200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00', @@ -812,6 +822,7 @@ FW_VERSIONS = { b'\x03896634759100\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', b'\x03896634759200\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', + b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', b'\x03896634759300\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701004\x00\x00\x00\x00', b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701002\x00\x00\x00\x00', b'\x03896634760000\x00\x00\x00\x008966A4703000\x00\x00\x00\x00897CF4701003\x00\x00\x00\x00', @@ -1126,6 +1137,7 @@ FW_VERSIONS = { b'\x01F15264283200\x00\x00\x00\x00', b'\x01F15264283300\x00\x00\x00\x00', b'\x01F152642F1000\x00\x00\x00\x00', + b'\x01F152642F8000\x00\x00\x00\x00', ], (Ecu.eps, 0x7a1, None): [ b'\x028965B0R11000\x00\x00\x00\x008965B0R12000\x00\x00\x00\x00', @@ -1144,6 +1156,7 @@ FW_VERSIONS = { (Ecu.fwdCamera, 0x750, 0x6d): [ b'\x028646F0R05100\x00\x00\x00\x008646G0R02100\x00\x00\x00\x00', b'\x028646F0R05200\x00\x00\x00\x008646G0R02200\x00\x00\x00\x00', + b'\x028646F0R11000\x00\x00\x00\x008646G0R04000\x00\x00\x00\x00', ], }, CAR.SIENNA: { @@ -1237,6 +1250,7 @@ FW_VERSIONS = { b'\x018821F3301200\x00\x00\x00\x00', b'\x018821F3301300\x00\x00\x00\x00', b'\x018821F3301400\x00\x00\x00\x00', + b'\x018821F6201200\x00\x00\x00\x00', b'\x018821F6201300\x00\x00\x00\x00', b'\x018821F6201400\x00\x00\x00\x00', ], @@ -1249,6 +1263,7 @@ FW_VERSIONS = { b'\x028646F3304200\x00\x00\x00\x008646G2601400\x00\x00\x00\x00', b'\x028646F3304300\x00\x00\x00\x008646G2601500\x00\x00\x00\x00', b'\x028646F3309100\x00\x00\x00\x008646G3304000\x00\x00\x00\x00', + b'\x028646F3309100\x00\x00\x00\x008646G5301200\x00\x00\x00\x00', ], }, CAR.LEXUS_ES: { @@ -1319,6 +1334,7 @@ FW_VERSIONS = { b'\x01896637851000\x00\x00\x00\x00', b'\x01896637852000\x00\x00\x00\x00', b'\x01896637854000\x00\x00\x00\x00', + b'\x01896637873000\x00\x00\x00\x00', b'\x01896637878000\x00\x00\x00\x00', ], (Ecu.engine, 0x7e0, None): [ @@ -1439,6 +1455,7 @@ FW_VERSIONS = { b'\x018966348R1300\x00\x00\x00\x00', b'\x018966348R8500\x00\x00\x00\x00', b'\x018966348W1300\x00\x00\x00\x00', + b'\x018966348W2300\x00\x00\x00\x00', ], (Ecu.abs, 0x7b0, None): [ b'F152648472\x00\x00\x00\x00\x00\x00', @@ -1483,6 +1500,7 @@ FW_VERSIONS = { b'\x02348Q4000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02348Q4100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02348T1100\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', + b'\x02348T1200\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02348T3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02348V6000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', b'\x02348Z3000\x00\x00\x00\x00\x00\x00\x00\x00A4802000\x00\x00\x00\x00\x00\x00\x00\x00', @@ -1503,6 +1521,7 @@ FW_VERSIONS = { (Ecu.eps, 0x7a1, None): [ b'8965B0E011\x00\x00\x00\x00\x00\x00', b'8965B0E012\x00\x00\x00\x00\x00\x00', + b'8965B48102\x00\x00\x00\x00\x00\x00', b'8965B48111\x00\x00\x00\x00\x00\x00', b'8965B48112\x00\x00\x00\x00\x00\x00', ], @@ -1638,6 +1657,7 @@ FW_VERSIONS = { b'8965B58052\x00\x00\x00\x00\x00\x00', ], (Ecu.abs, 0x7b0, None): [ + b'F152658320\x00\x00\x00\x00\x00\x00', b'F152658341\x00\x00\x00\x00\x00\x00', ], (Ecu.fwdRadar, 0x750, 0xf): [ diff --git a/selfdrive/car/toyota/values.py b/selfdrive/car/toyota/values.py index a087e25934..fca7c50dc7 100644 --- a/selfdrive/car/toyota/values.py +++ b/selfdrive/car/toyota/values.py @@ -181,7 +181,7 @@ CAR_INFO: Dict[str, Union[ToyotaCarInfo, List[ToyotaCarInfo]]] = { ], CAR.RAV4_TSS2_2023: [ ToyotaCarInfo("Toyota RAV4 2023"), - ToyotaCarInfo("Toyota RAV4 Hybrid 2023"), + ToyotaCarInfo("Toyota RAV4 Hybrid 2023-24"), ], CAR.MIRAI: ToyotaCarInfo("Toyota Mirai 2021"), CAR.SIENNA: ToyotaCarInfo("Toyota Sienna 2018-20", video_link="https://www.youtube.com/watch?v=q1UPOo4Sh68", min_enable_speed=MIN_ACC_SPEED), diff --git a/selfdrive/debug/print_docs_diff.py b/selfdrive/debug/print_docs_diff.py index 8fb6277d3b..3d35532496 100755 --- a/selfdrive/debug/print_docs_diff.py +++ b/selfdrive/debug/print_docs_diff.py @@ -8,9 +8,10 @@ from openpilot.selfdrive.car.docs import get_all_car_info from openpilot.selfdrive.car.docs_definitions import Column FOOTNOTE_TAG = "{}" -STAR_ICON = '' -VIDEO_ICON = '\ - ' +STAR_ICON = '' +VIDEO_ICON = '' + \ + '' COLUMNS = "|" + "|".join([column.value for column in Column]) + "|" COLUMN_HEADER = "|---|---|---|{}|".format("|".join([":---:"] * (len(Column) - 3))) ARROW_SYMBOL = "➡️" diff --git a/selfdrive/debug/profiling/clpeak/clpeak3 b/selfdrive/debug/profiling/clpeak/clpeak3 deleted file mode 100755 index 4b3c4c130e..0000000000 Binary files a/selfdrive/debug/profiling/clpeak/clpeak3 and /dev/null differ diff --git a/selfdrive/modeld/models/navmodel.onnx b/selfdrive/modeld/models/navmodel.onnx index 3b0961537e..93edb593cc 100644 --- a/selfdrive/modeld/models/navmodel.onnx +++ b/selfdrive/modeld/models/navmodel.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:adc5aca6753b6ae0a1469f3e5bcb943d00cc9de75218489f2e4c3d960e7af048 -size 14138061 +oid sha256:4971931accb5ba2e534bb3e0c591826ee507e2988df2eccf1fe862c303ddf9c5 +size 14221074 diff --git a/selfdrive/modeld/models/navmodel_q.dlc b/selfdrive/modeld/models/navmodel_q.dlc index e878ec25af..cb6e55b75f 100644 --- a/selfdrive/modeld/models/navmodel_q.dlc +++ b/selfdrive/modeld/models/navmodel_q.dlc @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c808717d073a0bb347f9ba929953c0b2b792ce9997f343f7e44a0b2b0e139132 +oid sha256:fa346ada6f8c6326a5ee5fcd27e45e3e710049358079413c6a4624b20c6e1e47 size 3630942 diff --git a/selfdrive/modeld/models/supercombo.onnx b/selfdrive/modeld/models/supercombo.onnx index 9697c01793..ca8642093d 100644 --- a/selfdrive/modeld/models/supercombo.onnx +++ b/selfdrive/modeld/models/supercombo.onnx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cf6133c5bff295a3ee69eeb01297ba77adb6b83dbc1d774442a48117dbaf4626 -size 48457192 +oid sha256:ae44fe832fe48b89998f09cebb1bcd129864a8f51497b636cd38e66e46d69a89 +size 48457850 diff --git a/selfdrive/test/process_replay/model_replay_ref_commit b/selfdrive/test/process_replay/model_replay_ref_commit index bb111e22e2..1be0aaf8c3 100644 --- a/selfdrive/test/process_replay/model_replay_ref_commit +++ b/selfdrive/test/process_replay/model_replay_ref_commit @@ -1 +1 @@ -91cd2bf71771c2770c0effc26c0bb23d27208138 +ad64b6f38c1362e9d184f3fc95299284eacb56d4 diff --git a/selfdrive/ui/qt/offroad/driverview.cc b/selfdrive/ui/qt/offroad/driverview.cc index df9bb24651..08f6f10642 100644 --- a/selfdrive/ui/qt/offroad/driverview.cc +++ b/selfdrive/ui/qt/offroad/driverview.cc @@ -7,7 +7,7 @@ const int FACE_IMG_SIZE = 130; -DriverViewWindow::DriverViewWindow(QWidget* parent) : CameraWidget("camerad", VISION_STREAM_DRIVER, true, parent) { +DriverViewWindow::DriverViewWindow(QWidget* parent) : CameraView("camerad", VISION_STREAM_DRIVER, true, parent) { face_img = loadPixmap("../assets/img_driver_face_static.png", {FACE_IMG_SIZE, FACE_IMG_SIZE}); QObject::connect(this, &CameraWidget::clicked, this, &DriverViewWindow::done); QObject::connect(device(), &Device::interactiveTimeout, this, [this]() { @@ -20,22 +20,20 @@ DriverViewWindow::DriverViewWindow(QWidget* parent) : CameraWidget("camerad", VI void DriverViewWindow::showEvent(QShowEvent* event) { params.putBool("IsDriverViewEnabled", true); device()->resetInteractiveTimeout(60); - CameraWidget::showEvent(event); + CameraView::showEvent(event); } void DriverViewWindow::hideEvent(QHideEvent* event) { params.putBool("IsDriverViewEnabled", false); - stopVipcThread(); - CameraWidget::hideEvent(event); + CameraView::hideEvent(event); } void DriverViewWindow::paintGL() { - CameraWidget::paintGL(); + CameraView::paintGL(); - std::lock_guard lk(frame_lock); QPainter p(this); // startup msg - if (frames.empty()) { + if (!frame) { p.setPen(Qt::white); p.setRenderHint(QPainter::TextAntialiasing); p.setFont(InterFont(100, QFont::Bold)); @@ -47,7 +45,6 @@ void DriverViewWindow::paintGL() { cereal::DriverStateV2::Reader driver_state = sm["driverStateV2"].getDriverStateV2(); bool is_rhd = driver_state.getWheelOnRightProb() > 0.5; auto driver_data = is_rhd ? driver_state.getRightDriverData() : driver_state.getLeftDriverData(); - bool face_detected = driver_data.getFaceProb() > 0.7; if (face_detected) { auto fxy_list = driver_data.getFacePosition(); diff --git a/selfdrive/ui/qt/offroad/driverview.h b/selfdrive/ui/qt/offroad/driverview.h index 155e4ede32..97dd2faa78 100644 --- a/selfdrive/ui/qt/offroad/driverview.h +++ b/selfdrive/ui/qt/offroad/driverview.h @@ -2,7 +2,7 @@ #include "selfdrive/ui/qt/widgets/cameraview.h" -class DriverViewWindow : public CameraWidget { +class DriverViewWindow : public CameraView { Q_OBJECT public: diff --git a/selfdrive/ui/qt/onroad.cc b/selfdrive/ui/qt/onroad.cc index 4df0ed81cb..ed4bdc15fb 100644 --- a/selfdrive/ui/qt/onroad.cc +++ b/selfdrive/ui/qt/onroad.cc @@ -44,12 +44,12 @@ OnroadWindow::OnroadWindow(QWidget *parent) : QWidget(parent) { split->addWidget(nvg); if (getenv("DUAL_CAMERA_VIEW")) { - CameraWidget *arCam = new CameraWidget("camerad", VISION_STREAM_ROAD, true, this); + CameraWidget *arCam = new CameraView("camerad", VISION_STREAM_ROAD, true, this); split->insertWidget(0, arCam); } if (getenv("MAP_RENDER_VIEW")) { - CameraWidget *map_render = new CameraWidget("navd", VISION_STREAM_MAP, false, this); + CameraWidget *map_render = new CameraView("navd", VISION_STREAM_MAP, false, this); split->insertWidget(0, map_render); } @@ -126,6 +126,7 @@ void OnroadWindow::offroadTransition(bool offroad) { #endif alerts->updateAlert({}); + nvg->disconnectVipc(); } void OnroadWindow::primeChanged(bool prime) { @@ -328,6 +329,8 @@ void AnnotatedCameraWidget::updateState(const UIState &s) { map_settings_btn->setVisible(!hideBottomIcons); main_layout->setAlignment(map_settings_btn, (rightHandDM ? Qt::AlignLeft : Qt::AlignRight) | Qt::AlignBottom); } + + update(); } void AnnotatedCameraWidget::drawHud(QPainter &p) { @@ -609,21 +612,6 @@ void AnnotatedCameraWidget::paintGL() { // draw camera frame { - std::lock_guard lk(frame_lock); - - if (frames.empty()) { - if (skip_frame_count > 0) { - skip_frame_count--; - qDebug() << "skipping frame, not ready"; - return; - } - } else { - // skip drawing up to this many frames if we're - // missing camera frames. this smooths out the - // transitions from the narrow and wide cameras - skip_frame_count = 5; - } - // Wide or narrow cam dependent on speed bool has_wide_cam = available_streams.count(VISION_STREAM_WIDE_ROAD); if (has_wide_cam) { @@ -639,14 +627,18 @@ void AnnotatedCameraWidget::paintGL() { } CameraWidget::setStreamType(wide_cam_requested ? VISION_STREAM_WIDE_ROAD : VISION_STREAM_ROAD); - s->scene.wide_cam = CameraWidget::getStreamType() == VISION_STREAM_WIDE_ROAD; + s->scene.wide_cam = CameraWidget::streamType() == VISION_STREAM_WIDE_ROAD; if (s->scene.calibration_valid) { auto calib = s->scene.wide_cam ? s->scene.view_from_wide_calib : s->scene.view_from_calib; CameraWidget::updateCalibration(calib); } else { CameraWidget::updateCalibration(DEFAULT_CALIBRATION); } - CameraWidget::setFrameId(model.getFrameId()); + + if (!CameraWidget::receiveFrame(sm["uiPlan"].getUiPlan().getFrameId())) { + qDebug() << "skipping frame, not ready"; + return; + } CameraWidget::paintGL(); } diff --git a/selfdrive/ui/qt/onroad.h b/selfdrive/ui/qt/onroad.h index b3ba411453..f6b80a75de 100644 --- a/selfdrive/ui/qt/onroad.h +++ b/selfdrive/ui/qt/onroad.h @@ -93,8 +93,6 @@ private: bool v_ego_cluster_seen = false; int status = STATUS_DISENGAGED; std::unique_ptr pm; - - int skip_frame_count = 0; bool wide_cam_requested = false; protected: diff --git a/selfdrive/ui/qt/setup/setup.cc b/selfdrive/ui/qt/setup/setup.cc index 3b3666b19a..67f1c136d2 100644 --- a/selfdrive/ui/qt/setup/setup.cc +++ b/selfdrive/ui/qt/setup/setup.cc @@ -34,6 +34,11 @@ bool is_elf(char *fname) { } void Setup::download(QString url) { + // autocomplete incomplete urls + if (QRegularExpression("^([^/.]+)/([^/]+)$").match(url).hasMatch()) { + url.prepend("https://installer.comma.ai/"); + } + CURL *curl = curl_easy_init(); if (!curl) { emit finished(url, tr("Something went wrong. Reboot the device.")); diff --git a/selfdrive/ui/qt/widgets/cameraview.cc b/selfdrive/ui/qt/widgets/cameraview.cc index 7b1f2f1d24..4d370b8cc5 100644 --- a/selfdrive/ui/qt/widgets/cameraview.cc +++ b/selfdrive/ui/qt/widgets/cameraview.cc @@ -6,14 +6,6 @@ #include #endif -#include -#include -#include -#include - -#include -#include - namespace { const char frame_vertex_shader[] = @@ -95,24 +87,25 @@ mat4 get_fit_view_transform(float widget_aspect_ratio, float frame_aspect_ratio) } // namespace -CameraWidget::CameraWidget(std::string stream_name, VisionStreamType type, bool zoom, QWidget* parent) : - stream_name(stream_name), requested_stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { - setAttribute(Qt::WA_OpaquePaintEvent); - qRegisterMetaType>("availableStreams"); - QObject::connect(this, &CameraWidget::vipcThreadConnected, this, &CameraWidget::vipcConnected, Qt::BlockingQueuedConnection); - QObject::connect(this, &CameraWidget::vipcThreadFrameReceived, this, &CameraWidget::vipcFrameReceived, Qt::QueuedConnection); - QObject::connect(this, &CameraWidget::vipcAvailableStreamsUpdated, this, &CameraWidget::availableStreamsUpdated, Qt::QueuedConnection); +CameraWidget::CameraWidget(std::string stream_name, VisionStreamType type, bool zoom, QWidget *parent) + : stream_name(stream_name), requested_stream_type(type), zoomed_view(zoom), QOpenGLWidget(parent) { } CameraWidget::~CameraWidget() { makeCurrent(); - stopVipcThread(); if (isValid()) { glDeleteVertexArrays(1, &frame_vao); glDeleteBuffers(1, &frame_vbo); glDeleteBuffers(1, &frame_ibo); glDeleteBuffers(2, textures); } +#ifdef QCOM2 + EGLDisplay egl_display = eglGetCurrentDisplay(); + for (auto &pair : egl_images) { + eglDestroyImageKHR(egl_display, pair.second); + } + egl_images.clear(); +#endif doneCurrent(); } @@ -176,45 +169,11 @@ void CameraWidget::initializeGL() { #endif } -void CameraWidget::showEvent(QShowEvent *event) { - if (!vipc_thread) { - clearFrames(); - vipc_thread = new QThread(); - connect(vipc_thread, &QThread::started, [=]() { vipcThread(); }); - connect(vipc_thread, &QThread::finished, vipc_thread, &QObject::deleteLater); - vipc_thread->start(); - } -} - -void CameraWidget::stopVipcThread() { - makeCurrent(); - if (vipc_thread) { - vipc_thread->requestInterruption(); - vipc_thread->quit(); - vipc_thread->wait(); - vipc_thread = nullptr; - } - -#ifdef QCOM2 - EGLDisplay egl_display = eglGetCurrentDisplay(); - assert(egl_display != EGL_NO_DISPLAY); - for (auto &pair : egl_images) { - eglDestroyImageKHR(egl_display, pair.second); - assert(eglGetError() == EGL_SUCCESS); - } - egl_images.clear(); -#endif -} - -void CameraWidget::availableStreamsUpdated(std::set streams) { - available_streams = streams; -} - void CameraWidget::updateFrameMat() { int w = glWidth(), h = glHeight(); if (zoomed_view) { - if (active_stream_type == VISION_STREAM_DRIVER) { + if (streamType() == VISION_STREAM_DRIVER) { if (stream_width > 0 && stream_height > 0) { frame_mat = get_driver_view_transform(w, h, stream_width, stream_height); } @@ -223,7 +182,7 @@ void CameraWidget::updateFrameMat() { // to ensure this ends up in the middle of the screen // for narrow come and a little lower for wide cam. // TODO: use proper perspective transform? - if (active_stream_type == VISION_STREAM_WIDE_ROAD) { + if (streamType() == VISION_STREAM_WIDE_ROAD) { intrinsic_matrix = ECAM_INTRINSIC_MATRIX; zoom = 2.0; } else { @@ -269,25 +228,15 @@ void CameraWidget::paintGL() { glClearColor(bg.redF(), bg.greenF(), bg.blueF(), bg.alphaF()); glClear(GL_STENCIL_BUFFER_BIT | GL_COLOR_BUFFER_BIT); - std::lock_guard lk(frame_lock); - if (frames.empty()) return; - - int frame_idx = frames.size() - 1; - - // Always draw latest frame until sync logic is more stable - // for (frame_idx = 0; frame_idx < frames.size() - 1; frame_idx++) { - // if (frames[frame_idx].first == draw_frame_id) break; - // } + if (!frame) return; // Log duplicate/dropped frames - if (frames[frame_idx].first == prev_frame_id) { - qDebug() << "Drawing same frame twice" << frames[frame_idx].first; - } else if (frames[frame_idx].first != prev_frame_id + 1) { - qDebug() << "Skipped frame" << frames[frame_idx].first; + if (frame_id == prev_frame_id) { + qDebug() << "Drawing same frame twice" << frame_id; + } else if (frame_id != prev_frame_id + 1) { + qDebug() << "Skipped frame" << frame_id; } - prev_frame_id = frames[frame_idx].first; - VisionBuf *frame = frames[frame_idx].second; - assert(frame != nullptr); + prev_frame_id = frame_id; updateFrameMat(); @@ -327,7 +276,7 @@ void CameraWidget::paintGL() { glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } -void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { +void CameraWidget::vipcConnected() { makeCurrent(); stream_width = vipc_client->buffers[0].width; stream_height = vipc_client->buffers[0].height; @@ -377,59 +326,69 @@ void CameraWidget::vipcConnected(VisionIpcClient *vipc_client) { #endif } -void CameraWidget::vipcFrameReceived() { - update(); -} +bool CameraWidget::receiveFrame(uint64_t request_frame_id) { + if (!vipc_client || vipc_client->type != requested_stream_type) { + qDebug().nospace() << "connecting to stream" << requested_stream_type + << (vipc_client ? QString(", was connected to %1").arg(vipc_client->type) : ""); + vipc_client.reset(new VisionIpcClient(stream_name, requested_stream_type, false)); + } -void CameraWidget::vipcThread() { - VisionStreamType cur_stream = requested_stream_type; - std::unique_ptr vipc_client; - VisionIpcBufExtra meta_main = {0}; - - while (!QThread::currentThread()->isInterruptionRequested()) { - if (!vipc_client || cur_stream != requested_stream_type) { - clearFrames(); - qDebug().nospace() << "connecting to stream " << requested_stream_type << ", was connected to " << cur_stream; - cur_stream = requested_stream_type; - vipc_client.reset(new VisionIpcClient(stream_name, cur_stream, false)); + if (!vipc_client->connected) { + frame = nullptr; + recent_frames.clear(); + available_streams = VisionIpcClient::getAvailableStreams(stream_name, false); + if (available_streams.empty() || !vipc_client->connect(false)) { + return false; } - active_stream_type = cur_stream; - - if (!vipc_client->connected) { - clearFrames(); - auto streams = VisionIpcClient::getAvailableStreams(stream_name, false); - if (streams.empty()) { - QThread::msleep(100); - continue; - } - emit vipcAvailableStreamsUpdated(streams); + emit vipcAvailableStreamsUpdated(); + vipcConnected(); + } - if (!vipc_client->connect(false)) { - QThread::msleep(100); - continue; - } - emit vipcThreadConnected(vipc_client.get()); + VisionIpcBufExtra meta_main = {}; + while (auto buf = vipc_client->recv(&meta_main, 0)) { + if (recent_frames.size() > FRAME_BUFFER_SIZE) { + recent_frames.pop_front(); } + recent_frames.emplace_back(meta_main.frame_id, buf); + } - if (VisionBuf *buf = vipc_client->recv(&meta_main, 1000)) { - { - std::lock_guard lk(frame_lock); - frames.push_back(std::make_pair(meta_main.frame_id, buf)); - while (frames.size() > FRAME_BUFFER_SIZE) { - frames.pop_front(); - } - } - emit vipcThreadFrameReceived(); - } else { - if (!isVisible()) { - vipc_client->connected = false; - } + frame = nullptr; + if (request_frame_id > 0) { + auto it = std::find_if(recent_frames.begin(), recent_frames.end(), + [request_frame_id](auto &f) { return f.first == request_frame_id; }); + if (it != recent_frames.end()) { + std::tie(frame_id, frame) = *it; } + } else if (!recent_frames.empty()) { + std::tie(frame_id, frame) = recent_frames.back(); + } + return frame != nullptr; +} + +void CameraWidget::disconnectVipc() { + recent_frames.clear(); + frame = nullptr; + frame_id = 0; + prev_frame_id = 0; + if (vipc_client) { + vipc_client->connected = false; } } -void CameraWidget::clearFrames() { - std::lock_guard lk(frame_lock); - frames.clear(); - available_streams.clear(); +// Cameraview + +CameraView::CameraView(const std::string &name, VisionStreamType stream_type, bool zoom, QWidget *parent) + : CameraWidget(name, stream_type, zoom, parent) { + timer = new QTimer(this); + timer->setInterval(1000.0 / UI_FREQ); + timer->callOnTimeout(this, [this]() { if (receiveFrame()) update(); }); +} + +void CameraView::showEvent(QShowEvent *event) { + timer->start(); +} + +void CameraView::hideEvent(QHideEvent *event) { + timer->stop(); + disconnectVipc(); } diff --git a/selfdrive/ui/qt/widgets/cameraview.h b/selfdrive/ui/qt/widgets/cameraview.h index c97038cf43..a862079f1a 100644 --- a/selfdrive/ui/qt/widgets/cameraview.h +++ b/selfdrive/ui/qt/widgets/cameraview.h @@ -3,7 +3,6 @@ #include #include #include -#include #include #include #include @@ -11,7 +10,7 @@ #include #include #include -#include +#include #ifdef QCOM2 #define EGL_EGLEXT_PROTOTYPES @@ -33,31 +32,27 @@ class CameraWidget : public QOpenGLWidget, protected QOpenGLFunctions { Q_OBJECT public: - using QOpenGLWidget::QOpenGLWidget; explicit CameraWidget(std::string stream_name, VisionStreamType stream_type, bool zoom, QWidget* parent = nullptr); ~CameraWidget(); + void disconnectVipc(); void setBackgroundColor(const QColor &color) { bg = color; } - void setFrameId(int frame_id) { draw_frame_id = frame_id; } void setStreamType(VisionStreamType type) { requested_stream_type = type; } - VisionStreamType getStreamType() { return active_stream_type; } - void stopVipcThread(); + inline VisionStreamType streamType() const { return requested_stream_type; } + inline const std::set &availableStreams() const { return available_streams; } + bool receiveFrame(uint64_t request_frame_id = 0); signals: + void vipcAvailableStreamsUpdated(); void clicked(); - void vipcThreadConnected(VisionIpcClient *); - void vipcThreadFrameReceived(); - void vipcAvailableStreamsUpdated(std::set); protected: void paintGL() override; void initializeGL() override; void resizeGL(int w, int h) override { updateFrameMat(); } - void showEvent(QShowEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override { emit clicked(); } virtual void updateFrameMat(); void updateCalibration(const mat3 &calib); - void vipcThread(); - void clearFrames(); + void vipcConnected(); int glWidth(); int glHeight(); @@ -73,14 +68,18 @@ protected: std::map egl_images; #endif + // vipc std::string stream_name; int stream_width = 0; int stream_height = 0; int stream_stride = 0; - std::atomic active_stream_type; - std::atomic requested_stream_type; + VisionStreamType requested_stream_type; std::set available_streams; - QThread *vipc_thread = nullptr; + std::unique_ptr vipc_client; + std::deque> recent_frames; + VisionBuf *frame = nullptr; + uint64_t frame_id = 0; + uint64_t prev_frame_id = 0; // Calibration float x_offset = 0; @@ -88,16 +87,16 @@ protected: float zoom = 1.0; mat3 calibration = DEFAULT_CALIBRATION; mat3 intrinsic_matrix = FCAM_INTRINSIC_MATRIX; +}; - std::recursive_mutex frame_lock; - std::deque> frames; - uint32_t draw_frame_id = 0; - uint32_t prev_frame_id = 0; +// update frames based on timer +class CameraView : public CameraWidget { + Q_OBJECT +public: + CameraView(const std::string &name, VisionStreamType stream_type, bool zoom, QWidget *parent = nullptr); + void showEvent(QShowEvent *event) override; + void hideEvent(QHideEvent *event) override; -protected slots: - void vipcConnected(VisionIpcClient *vipc_client); - void vipcFrameReceived(); - void availableStreamsUpdated(std::set streams); +private: + QTimer *timer; }; - -Q_DECLARE_METATYPE(std::set); diff --git a/selfdrive/ui/tests/test_translations.py b/selfdrive/ui/tests/test_translations.py index 622d198f7d..caba386643 100755 --- a/selfdrive/ui/tests/test_translations.py +++ b/selfdrive/ui/tests/test_translations.py @@ -2,31 +2,26 @@ import json import os import re -import shutil import unittest +import shutil +import tempfile import xml.etree.ElementTree as ET +import string +import requests +from parameterized import parameterized_class from openpilot.selfdrive.ui.update_translations import TRANSLATIONS_DIR, LANGUAGES_FILE, update_translations -TMP_TRANSLATIONS_DIR = os.path.join(TRANSLATIONS_DIR, "tmp") +with open(LANGUAGES_FILE, "r") as f: + translation_files = json.load(f) + UNFINISHED_TRANSLATION_TAG = "" not in cur_translations, - f"{file} ({name}) translation file has obsolete translations. Run selfdrive/ui/update_translations.py --vanish to remove them") + cur_translations = self._read_translation_file(TRANSLATIONS_DIR, self.file) + self.assertTrue("" not in cur_translations, + f"{self.file} ({self.name}) translation file has obsolete translations. Run selfdrive/ui/update_translations.py --vanish to remove them") def test_finished_translations(self): """ @@ -78,48 +63,68 @@ class TestTranslations(unittest.TestCase): - that translation is not empty - that translation format arguments are consistent """ - for name, file in self.translation_files.items(): - with self.subTest(name=name, file=file): - tr_xml = ET.parse(os.path.join(TRANSLATIONS_DIR, f"{file}.ts")) + tr_xml = ET.parse(os.path.join(TRANSLATIONS_DIR, f"{self.file}.ts")) - for context in tr_xml.getroot(): - for message in context.iterfind("message"): - translation = message.find("translation") - source_text = message.find("source").text + for context in tr_xml.getroot(): + for message in context.iterfind("message"): + translation = message.find("translation") + source_text = message.find("source").text - # Do not test unfinished translations - if translation.get("type") == "unfinished": - continue + # Do not test unfinished translations + if translation.get("type") == "unfinished": + continue - if message.get("numerus") == "yes": - numerusform = [t.text for t in translation.findall("numerusform")] + if message.get("numerus") == "yes": + numerusform = [t.text for t in translation.findall("numerusform")] - for nf in numerusform: - self.assertIsNotNone(nf, f"Ensure all plural translation forms are completed: {source_text}") - self.assertIn("%n", nf, "Ensure numerus argument (%n) exists in translation.") - self.assertIsNone(FORMAT_ARG.search(nf), "Plural translations must use %n, not %1, %2, etc.: {}".format(numerusform)) + for nf in numerusform: + self.assertIsNotNone(nf, f"Ensure all plural translation forms are completed: {source_text}") + self.assertIn("%n", nf, "Ensure numerus argument (%n) exists in translation.") + self.assertIsNone(FORMAT_ARG.search(nf), "Plural translations must use %n, not %1, %2, etc.: {}".format(numerusform)) - else: - self.assertIsNotNone(translation.text, f"Ensure translation is completed: {source_text}") + else: + self.assertIsNotNone(translation.text, f"Ensure translation is completed: {source_text}") - source_args = FORMAT_ARG.findall(source_text) - translation_args = FORMAT_ARG.findall(translation.text) - self.assertEqual(sorted(source_args), sorted(translation_args), - f"Ensure format arguments are consistent: `{source_text}` vs. `{translation.text}`") + source_args = FORMAT_ARG.findall(source_text) + translation_args = FORMAT_ARG.findall(translation.text) + self.assertEqual(sorted(source_args), sorted(translation_args), + f"Ensure format arguments are consistent: `{source_text}` vs. `{translation.text}`") def test_no_locations(self): - for name, file in self.translation_files.items(): - with self.subTest(name=name, file=file): - for line in self._read_translation_file(TRANSLATIONS_DIR, file).splitlines(): - self.assertFalse(line.strip().startswith(LOCATION_TAG), - f"Line contains location tag: {line.strip()}, remove all line numbers.") + for line in self._read_translation_file(TRANSLATIONS_DIR, self.file).splitlines(): + self.assertFalse(line.strip().startswith(LOCATION_TAG), + f"Line contains location tag: {line.strip()}, remove all line numbers.") def test_entities_error(self): - for name, file in self.translation_files.items(): - with self.subTest(name=name, file=file): - cur_translations = self._read_translation_file(TRANSLATIONS_DIR, file) - matches = re.findall(r'@(\w+);', cur_translations) - self.assertEqual(len(matches), 0, f"The string(s) {matches} were found with '@' instead of '&'") + cur_translations = self._read_translation_file(TRANSLATIONS_DIR, self.file) + matches = re.findall(r'@(\w+);', cur_translations) + self.assertEqual(len(matches), 0, f"The string(s) {matches} were found with '@' instead of '&'") + + def test_bad_language(self): + IGNORED_WORDS = {'pédale'} + + match = re.search(r'_([a-zA-Z]{2,3})', self.file) + assert match, f"{self.name} - could not parse language" + + response = requests.get(f"https://raw.githubusercontent.com/LDNOOBW/List-of-Dirty-Naughty-Obscene-and-Otherwise-Bad-Words/master/{match.group(1)}") + response.raise_for_status() + + banned_words = {line.strip() for line in response.text.splitlines()} + + for context in ET.parse(os.path.join(TRANSLATIONS_DIR, f"{self.file}.ts")).getroot(): + for message in context.iterfind("message"): + translation = message.find("translation") + if translation.get("type") == "unfinished": + continue + + translation_text = " ".join([t.text for t in translation.findall("numerusform")]) if message.get("numerus") == "yes" else translation.text + + if not translation_text: + continue + + words = set(translation_text.translate(str.maketrans('', '', string.punctuation + '%n')).lower().split()) + bad_words_found = words & (banned_words - IGNORED_WORDS) + assert not bad_words_found, f"Bad language found in {self.name}: '{translation_text}'. Bad word(s): {', '.join(bad_words_found)}" if __name__ == "__main__": diff --git a/selfdrive/ui/watch3.cc b/selfdrive/ui/watch3.cc index ec35c29b6b..cb12f82ea8 100644 --- a/selfdrive/ui/watch3.cc +++ b/selfdrive/ui/watch3.cc @@ -19,15 +19,15 @@ 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)); + hlayout->addWidget(new CameraView("navd", VISION_STREAM_MAP, false)); + hlayout->addWidget(new CameraView("camerad", VISION_STREAM_ROAD, false)); } { QHBoxLayout *hlayout = new QHBoxLayout(); layout->addLayout(hlayout); - hlayout->addWidget(new CameraWidget("camerad", VISION_STREAM_DRIVER, false)); - hlayout->addWidget(new CameraWidget("camerad", VISION_STREAM_WIDE_ROAD, false)); + hlayout->addWidget(new CameraView("camerad", VISION_STREAM_DRIVER, false)); + hlayout->addWidget(new CameraView("camerad", VISION_STREAM_WIDE_ROAD, false)); } return a.exec(); diff --git a/system/loggerd/uploader.py b/system/loggerd/uploader.py index 914c9e8079..8f27d4763d 100755 --- a/system/loggerd/uploader.py +++ b/system/loggerd/uploader.py @@ -50,7 +50,7 @@ def get_directory_sort(d: str) -> List[str]: def listdir_by_creation(d: str) -> List[str]: try: - paths = os.listdir(d) + paths = [f for f in os.listdir(d) if os.path.isdir(os.path.join(d, f))] paths = sorted(paths, key=get_directory_sort) return paths except OSError: diff --git a/system/timezoned.py b/system/timezoned.py index 546405c9a0..2cfc0076e9 100755 --- a/system/timezoned.py +++ b/system/timezoned.py @@ -5,7 +5,6 @@ import time import subprocess from typing import NoReturn -import requests from timezonefinder import TimezoneFinder from openpilot.common.params import Params @@ -41,39 +40,18 @@ def main() -> NoReturn: # Get allowed timezones valid_timezones = subprocess.check_output('timedatectl list-timezones', shell=True, encoding='utf8').strip().split('\n') + timezone = params.get("Timezone", encoding='utf8') + if timezone is not None: + cloudlog.debug("Setting timezone based on param") + set_timezone(valid_timezones, timezone) + while True: time.sleep(60) - is_onroad = not params.get_bool("IsOffroad") - if is_onroad: - continue - - # Set based on param - timezone = params.get("Timezone", encoding='utf8') - if timezone is not None: - cloudlog.debug("Setting timezone based on param") - set_timezone(valid_timezones, timezone) - continue - location = params.get("LastGPSPosition", encoding='utf8') - # Find timezone based on IP geolocation if no gps location is available - if location is None: - cloudlog.debug("Setting timezone based on IP lookup") - try: - r = requests.get("https://ipapi.co/timezone", headers=REQUEST_HEADERS, timeout=10) - if r.status_code == 200: - set_timezone(valid_timezones, r.text) - else: - cloudlog.error(f"Unexpected status code from api {r.status_code}") - - time.sleep(3600) # Don't make too many API requests - except requests.exceptions.RequestException: - cloudlog.exception("Error getting timezone based on IP") - continue - # Find timezone by reverse geocoding the last known gps location - else: + if location is not None: cloudlog.debug("Setting timezone based on GPS location") try: location = json.loads(location) diff --git a/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 b/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 index 19e7a69bd5..d64e40ec60 100644 Binary files a/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 and b/third_party/acados/larch64/lib/libqpOASES_e.so.3.1 differ diff --git a/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 b/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 index c0c8b66650..cf5e550faa 100644 Binary files a/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 and b/third_party/acados/x86_64/lib/libqpOASES_e.so.3.1 differ diff --git a/tools/bodyteleop/static/poster.png b/tools/bodyteleop/static/poster.png index ba0e846b22..2f2b02dd8a 100644 Binary files a/tools/bodyteleop/static/poster.png and b/tools/bodyteleop/static/poster.png differ diff --git a/tools/cabana/assets/cabana-icon.png b/tools/cabana/assets/cabana-icon.png index 86add806fd..2c3cfcd7d1 100644 Binary files a/tools/cabana/assets/cabana-icon.png and b/tools/cabana/assets/cabana-icon.png differ diff --git a/tools/cabana/chart/sparkline.cc b/tools/cabana/chart/sparkline.cc index 42608c030f..34bc76b7c4 100644 --- a/tools/cabana/chart/sparkline.cc +++ b/tools/cabana/chart/sparkline.cc @@ -13,23 +13,30 @@ void Sparkline::update(const MessageId &msg_id, const cabana::Signal *sig, doubl auto first = std::lower_bound(msgs.cbegin(), msgs.cend(), first_ts, CompareCanEvent()); auto last = std::upper_bound(first, msgs.cend(), ts, CompareCanEvent()); - if (first != last && !size.isEmpty()) { - points.clear(); - double value = 0; - for (auto it = first; it != last; ++it) { - if (sig->getValue((*it)->dat, (*it)->size, &value)) { - points.emplace_back(((*it)->mono_time - (*first)->mono_time) / 1e9, value); - } + if (first == last || size.isEmpty()) { + pixmap = QPixmap(); + return; + } + + points.clear(); + double value = 0; + for (auto it = first; it != last; ++it) { + if (sig->getValue((*it)->dat, (*it)->size, &value)) { + points.emplace_back(((*it)->mono_time - (*first)->mono_time) / 1e9, value); } - const auto [min, max] = std::minmax_element(points.begin(), points.end(), - [](auto &l, auto &r) { return l.y() < r.y(); }); - min_val = min->y() == max->y() ? min->y() - 1 : min->y(); - max_val = min->y() == max->y() ? max->y() + 1 : max->y(); - freq_ = points.size() / std::max(points.back().x() - points.front().x(), 1.0); - render(sig->color, range, size); - } else { + } + + if (points.empty()) { pixmap = QPixmap(); + return; } + + const auto [min, max] = std::minmax_element(points.begin(), points.end(), + [](auto &l, auto &r) { return l.y() < r.y(); }); + min_val = min->y() == max->y() ? min->y() - 1 : min->y(); + max_val = min->y() == max->y() ? max->y() + 1 : max->y(); + freq_ = points.size() / std::max(points.back().x() - points.front().x(), 1.0); + render(sig->color, range, size); } void Sparkline::render(const QColor &color, int range, QSize size) { diff --git a/tools/cabana/videowidget.cc b/tools/cabana/videowidget.cc index a6fd0b2b64..654c34ed37 100644 --- a/tools/cabana/videowidget.cc +++ b/tools/cabana/videowidget.cc @@ -139,7 +139,7 @@ QWidget *VideoWidget::createCameraWidget() { QStackedLayout *stacked = new QStackedLayout(); stacked->setStackingMode(QStackedLayout::StackAll); - stacked->addWidget(cam_widget = new CameraWidget("camerad", VISION_STREAM_ROAD, false)); + stacked->addWidget(cam_widget = new CameraView("camerad", VISION_STREAM_ROAD, false)); cam_widget->setMinimumHeight(MIN_VIDEO_HEIGHT); cam_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding); stacked->addWidget(alert_label = new InfoLabel(this)); @@ -160,12 +160,13 @@ QWidget *VideoWidget::createCameraWidget() { return w; } -void VideoWidget::vipcAvailableStreamsUpdated(std::set streams) { +void VideoWidget::vipcAvailableStreamsUpdated() { static const QString stream_names[] = { [VISION_STREAM_ROAD] = "Road camera", [VISION_STREAM_WIDE_ROAD] = "Wide road camera", [VISION_STREAM_DRIVER] = "Driver camera"}; + const auto &streams = cam_widget->availableStreams(); for (int i = 0; i < streams.size(); ++i) { if (camera_tab->count() <= i) { camera_tab->addTab(QString()); diff --git a/tools/cabana/videowidget.h b/tools/cabana/videowidget.h index b2039e09a4..ae095fd559 100644 --- a/tools/cabana/videowidget.h +++ b/tools/cabana/videowidget.h @@ -73,9 +73,9 @@ protected: QWidget *createCameraWidget(); QHBoxLayout *createPlaybackController(); void loopPlaybackClicked(); - void vipcAvailableStreamsUpdated(std::set streams); + void vipcAvailableStreamsUpdated(); - CameraWidget *cam_widget; + CameraView *cam_widget; double maximum_time = 0; QToolButton *time_btn = nullptr; ToolButton *seek_backward_btn = nullptr; diff --git a/tools/joystick/joystickd.py b/tools/joystick/joystickd.py index c6024bf5e4..176ff25be6 100755 --- a/tools/joystick/joystickd.py +++ b/tools/joystick/joystickd.py @@ -47,7 +47,7 @@ class Joystick: else: self.cancel_button = 'BTN_TRIGGER' accel_axis = 'ABS_Y' - steer_axis = 'ABS_RZ' + steer_axis = 'ABS_RX' self.min_axis_value = {accel_axis: 0., steer_axis: 0.} self.max_axis_value = {accel_axis: 255., steer_axis: 255.} self.axes_values = {accel_axis: 0., steer_axis: 0.} diff --git a/tools/lib/tests/test_caching.py b/tools/lib/tests/test_caching.py index 73ed843869..294c5a2233 100755 --- a/tools/lib/tests/test_caching.py +++ b/tools/lib/tests/test_caching.py @@ -1,15 +1,58 @@ #!/usr/bin/env python3 +from functools import wraps +import http.server import os +import threading +import time import unittest -from pathlib import Path from parameterized import parameterized -from unittest import mock -from openpilot.system.hardware.hw import Paths from openpilot.tools.lib.url_file import URLFile +class CachingTestRequestHandler(http.server.BaseHTTPRequestHandler): + FILE_EXISTS = True + + def do_GET(self): + if self.FILE_EXISTS: + self.send_response(200, b'1234') + else: + self.send_response(404) + self.end_headers() + + def do_HEAD(self): + if self.FILE_EXISTS: + self.send_response(200) + self.send_header("Content-Length", "4") + else: + self.send_response(404) + self.end_headers() + + +class CachingTestServer(threading.Thread): + def run(self): + self.server = http.server.HTTPServer(("127.0.0.1", 0), CachingTestRequestHandler) + self.port = self.server.server_port + self.server.serve_forever() + + def stop(self): + self.server.server_close() + self.server.shutdown() + +def with_caching_server(func): + @wraps(func) + def wrapper(*args, **kwargs): + server = CachingTestServer() + server.start() + time.sleep(0.25) # wait for server to get it's port + try: + func(*args, **kwargs, port=server.port) + finally: + server.stop() + return wrapper + + class TestFileDownload(unittest.TestCase): def compare_loads(self, url, start=0, length=None): @@ -66,32 +109,20 @@ class TestFileDownload(unittest.TestCase): self.compare_loads(large_file_url) @parameterized.expand([(True, ), (False, )]) - def test_recover_from_missing_file(self, cache_enabled): + @with_caching_server + def test_recover_from_missing_file(self, cache_enabled, port): os.environ["FILEREADER_CACHE"] = "1" if cache_enabled else "0" - file_url = "http://localhost:5001/test.png" + file_url = f"http://localhost:{port}/test.png" - file_exists = False + CachingTestRequestHandler.FILE_EXISTS = False + length = URLFile(file_url).get_length() + self.assertEqual(length, -1) - def get_length_online_mock(self): - if file_exists: - return 4 - return -1 + CachingTestRequestHandler.FILE_EXISTS = True + length = URLFile(file_url).get_length() + self.assertEqual(length, 4) - patch_length = mock.patch.object(URLFile, "get_length_online", get_length_online_mock) - patch_length.start() - try: - length = URLFile(file_url).get_length() - self.assertEqual(length, -1) - - file_exists = True - length = URLFile(file_url).get_length() - self.assertEqual(length, 4) - finally: - tempfile_length = Path(Paths.download_cache_root()) / "ba2119904385654cb0105a2da174875f8e7648db175f202ecae6d6428b0e838f_length" - if tempfile_length.exists(): - tempfile_length.unlink() - patch_length.stop() if __name__ == "__main__": diff --git a/tools/lib/url_file.py b/tools/lib/url_file.py index d055f86577..97c0a639a7 100644 --- a/tools/lib/url_file.py +++ b/tools/lib/url_file.py @@ -57,6 +57,8 @@ class URLFile: def get_length_online(self): timeout = Timeout(connect=50.0, read=500.0) response = self._http_client.request('HEAD', self._url, timeout=timeout, preload_content=False) + if not (200 <= response.status <= 299): + return -1 length = response.headers.get('content-length', 0) return int(length) diff --git a/tools/replay/ui.py b/tools/replay/ui.py index 05e8bdec1f..e47aa0416e 100755 --- a/tools/replay/ui.py +++ b/tools/replay/ui.py @@ -118,10 +118,10 @@ def ui_thread(addr): imgff = np.frombuffer(yuv_img_raw.data, dtype=np.uint8).reshape((len(yuv_img_raw.data) // vipc_client.stride, vipc_client.stride)) num_px = vipc_client.width * vipc_client.height - bgr = cv2.cvtColor(imgff[:vipc_client.height * 3 // 2, :vipc_client.width], cv2.COLOR_YUV2RGB_NV12) + rgb = cv2.cvtColor(imgff[:vipc_client.height * 3 // 2, :vipc_client.width], cv2.COLOR_YUV2RGB_NV12) zoom_matrix = _BB_TO_FULL_FRAME[num_px] - cv2.warpAffine(bgr, zoom_matrix[:2], (img.shape[1], img.shape[0]), dst=img, flags=cv2.WARP_INVERSE_MAP) + cv2.warpAffine(rgb, zoom_matrix[:2], (img.shape[1], img.shape[0]), dst=img, flags=cv2.WARP_INVERSE_MAP) intrinsic_matrix = _INTRINSICS[num_px] diff --git a/tools/sim/bridge/metadrive/metadrive_bridge.py b/tools/sim/bridge/metadrive/metadrive_bridge.py index c8d59ff5e6..b99596ac62 100644 --- a/tools/sim/bridge/metadrive/metadrive_bridge.py +++ b/tools/sim/bridge/metadrive/metadrive_bridge.py @@ -10,7 +10,7 @@ from openpilot.tools.sim.bridge.metadrive.metadrive_world import MetaDriveWorld from openpilot.tools.sim.lib.camerad import W, H -C3_POSITION = Vec3(0, 0, 1) +C3_POSITION = Vec3(0.0, 1.0, 1.22) class CopyRamRGBCamera(RGBCamera):