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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|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|[](##)|[](##)|Parts
- 1 J533 connector
- 1 USB-C coupler
- 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|[](##)|[](##)|Parts
- 1 J533 connector
- 1 USB-C coupler
- 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 @@
-
-
+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 @@
-
-
+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 @@
-
-
+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 @@
-
-
+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 @@
-
-
+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 @@
-
-
+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