Compare commits

...

564 Commits

Author SHA1 Message Date
DevTekVE
0acc54adc4 Merge branch 'master' into master-sync-op
# Conflicts:
#	cereal
#	launch_chffrplus.sh
#	selfdrive/controls/controlsd.py
#	selfdrive/controls/lib/lateral_planner.py
#	selfdrive/controls/lib/vision_turn_controller.py
#	selfdrive/controls/plannerd.py
#	selfdrive/debug/cycle_alerts.py
#	selfdrive/gpxd/gpxd.py
#	selfdrive/mapd/mapd.py
2024-02-06 18:36:24 +01:00
DevTekVE
d75a149266 more casing fixes from cereal 2024-01-26 15:36:58 +01:00
DevTekVE
a1fc8dd40a fixing import 2024-01-26 13:25:34 +01:00
DevTekVE
9a2c4f505c Correcting casing in cereal 2024-01-26 11:18:50 +01:00
DevTekVE
fdf97f4ac7 Re implementing lateral_planner for sp specific stuff
Deleting lateral_planner.py as done on master

Deprecating lateralPlanSP
2024-01-26 11:07:00 +01:00
DevTekVE
1253cb9819 Flagging with mr number to recap after all the changes
temp disable escc
2024-01-26 11:04:03 +01:00
DevTekVE
79e1fe4d68 Moving fingerprints 2024-01-26 11:02:59 +01:00
DevTekVE
41f1c5d067 Re-implementing cloudlog stuff
update to remove cloud log

fixes

bump cereal
2024-01-26 11:02:59 +01:00
DevTekVE
764b41ec28 Bumping cereal and opendbc 2024-01-25 21:35:22 +01:00
DevTekVE
460107c089 Bumping panda 2024-01-25 21:19:18 +01:00
DevTekVE
7f86fef7c6 Merge remote-tracking branch 'openpilot-comma/master' into master-sync-op
# Conflicts:
#	.gitmodules
#	README.md
#	cereal
#	common/version.h
#	docs/CARS.md
#	launch_chffrplus.sh
#	opendbc
#	panda
#	selfdrive/car/honda/values.py
#	selfdrive/car/hyundai/interface.py
#	selfdrive/car/hyundai/values.py
#	selfdrive/car/torque_data/override.yaml
#	selfdrive/car/torque_data/params.yaml
#	selfdrive/controls/controlsd.py
#	selfdrive/controls/lib/lateral_planner.py
#	selfdrive/controls/lib/longitudinal_planner.py
#	selfdrive/controls/plannerd.py
#	selfdrive/debug/cycle_alerts.py
#	selfdrive/manager/manager.py
#	selfdrive/monitoring/dmonitoringd.py
#	selfdrive/thermald/power_monitoring.py
#	selfdrive/ui/qt/util.cc
#	system/loggerd/uploader.py
2024-01-25 17:01:21 +01:00
Shane Smiskol
be15b31696 Toyota: use radar in place of abs for platform code ECUs (#31043)
* use radar instead of abs

* str the strenum

* Lexus ES: non-TSS2 probably don't have stop and go without DSU-pull and/or pedal

* remove from NO_STOP_TIMER_CAR. this set is so confusing

* Combine ES & ESH (preferring ESH's DSU msgs)

* ES: forgot substitute

* comment

* Highlander: combine, preferring the hybrid for DSU msg mismatches (0x365 and 0x366)

* remove duplicates and sort

* update docs

* toyota non_essential ECU test

* Lexus RX: combine, preferring hybrid's msgs (they all exist on ICE)

* sort and remove dups

* parameterize so we can test with notebook

* this too

* clean up

* clean up

* tuple makes more sense

* update comments

* update

* update

* update
2024-01-25 02:02:00 -08:00
Ruben Medina
8472ae5317 add size to system alt image manifest entry (#31154) 2024-01-24 23:35:39 -08:00
Shane Smiskol
951d7e9cd0 Chrysler: add FW from CAN fingerprinting cars last 90 days on 0.9.5-release (#31142)
* print

* name

* add missing

* -----

* add list so can fingerprint

* transmission doesn't exist on these

* fix abs addr!

* apparantly abs isn't on these cars

* 2018 too

* clean up

* rm abs

* add missing versions!

* Revert "add missing versions!"

This reverts commit 45d36a49363a9c540841e6618c1a73cd3948c754.

* need this to fingerprint!

* Add FW from CAN fingerprinting cars last 90 days on 0.9.5-release

* need this temporarily

* Add rest of dongles

* update docs

* remove FINGERPRINTS

* Apply suggestions from code review

* Update selfdrive/car/fw_versions.py
2024-01-24 21:29:18 -08:00
Justin Newberry
3676ae4da3 test_ui: add onroad state (#31148)
add onroad
2024-01-24 16:51:06 -08:00
kovat74
ae25a13594 Added firmware fingerprint IONIQ 2020 EV (#31049) 2024-01-24 16:15:20 -08:00
Cameron Clough
1a202a55c1 Ford: add missing Mach-E fw (#31145)
From the route 83a4e056c7072678/2023-11-13--16-51-33 (which is already
in selfdrive/car/tests/routes.py, added in #30691).
2024-01-24 15:37:32 -08:00
Harald Schäfer
f55e6a3b81 Los Angeles Model 2 (#31135)
* 7045fb53-6739-4338-8426-20cbd4ad7832/600

* Update constants

* Update parse

* Typos

* Update ref

* 26057144-130f-48e1-8a98-00fae53ae7db/700

* Update ref
2024-01-24 15:26:22 -08:00
Justin Newberry
e2ec5be6ee test_ui: create test ui screenshots and html report (#31147)
* test ui

* report + common

* in ci

* fix

* dont enable in ci yet
2024-01-24 13:54:31 -08:00
Adeeb Shihadeh
7f35d0a909 disable TestManager.test_clean_exit for now 2024-01-24 11:53:03 -08:00
Justin Newberry
1bade14fda car porting examples: subaru fuzzy fingerprinting (#31139)
initial commit
2024-01-24 10:23:59 -08:00
Justin Newberry
dd0c474e6c LogReader: replace get_first_message with LogReader.first (#31146)
* first

* str
2024-01-24 10:21:57 -08:00
Shane Smiskol
e5fe1d2885 Chrysler: add Pacifica 2023 FW versions (#30934) (#31144)
* Revert "Revert "Chrysler: add Pacifica 2023 FW versions (#30934)""

* ICE
2024-01-24 01:56:33 -08:00
Shane Smiskol
ee716a6d9d Revert "Chrysler: add Pacifica 2023 FW versions (#30934)" (#31143)
Revert "Add Pacifica 2023 fingerprint"
2024-01-24 01:29:05 -08:00
Kenny K
1b82e77ed9 Chrysler: add Pacifica 2023 FW versions (#30934)
* Add Pacifica 2023 fingerprint

* add FW

* remove can

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2024-01-24 01:01:15 -08:00
Justin Newberry
88dcaa51c4 LogReader: no redownloading on multiple iterations (#31141)
* no redownload

* sort
2024-01-23 23:54:11 -08:00
Shane Smiskol
b9ad854451 Nissan: log FW responses on bus 0 (#31138)
* nissan: log FW responses on bus 0

* update refs
2024-01-23 23:12:48 -08:00
Justin Newberry
ac71c30ad5 auto_source: add commaCarSegments source (#31137)
add source
2024-01-23 21:40:04 -08:00
Justin Newberry
abf2801122 use get_first_message for auto_fingerprint 2024-01-23 20:59:32 -08:00
Justin Newberry
3d9b483e10 comma_api_source: fix qlogs (#31136)
fix qlogs
2024-01-23 20:51:15 -08:00
Justin Newberry
998eb8cde2 test_fw_query_on_routes: use new LogReader (#31134)
a
2024-01-23 17:41:43 -08:00
Shane Smiskol
780f1222ad fw_versions: add extra_fw_versions param (#31132)
* add param

* fix

* fix
2024-01-23 17:21:48 -08:00
Justin Newberry
f22b6681d6 CI: test the car_porting example notebooks (#31131)
* dont use route

* fix and cleanup

* test the example notebooks
2024-01-23 14:57:31 -08:00
Justin Newberry
d574013d7b LogReader: don't use route for max_segment (#31129)
* dont use route

* fix and cleanup
2024-01-23 14:51:45 -08:00
Shane Smiskol
a2028cbfd5 New MY! 2024-01-23 14:29:31 -08:00
Shane Smiskol
ebc916e25c Export fingerprints 2024-01-23 14:23:11 -08:00
Justin Newberry
0234cadec3 LogReader: remove redirect message for internal data (#31088)
fix logging
2024-01-23 12:55:50 -08:00
Justin Newberry
65490bb3c5 plotjuggler: auto fallback to qlogs with prompt (#31110)
* qlog fallback

* show a warning for that

* qlog fallback

* fix

* wording
2024-01-23 12:53:19 -08:00
Justin Newberry
35e1e8ecd2 SegmentRange: __str__ get preferred format (#31126)
get canonical
2024-01-23 11:40:22 -08:00
Shane Smiskol
ea57336005 Fingerprints: automatically add missing FW versions from users [bot] (#31116)
Export fingerprints
2024-01-23 02:19:32 -08:00
Hoang Bui
403610eed9 CI: enable virtual audio sink for soundd (#31120)
* enable virtual sound

* mv install to dockerfile

* cleaner

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2024-01-22 23:10:17 -08:00
Adeeb Shihadeh
88757c12b3 Revert "Switch from json11 to nlohmann/json (#31093)"
This reverts commit ee036482b8.
2024-01-22 22:41:59 -08:00
mtribiere
ee036482b8 Switch from json11 to nlohmann/json (#31093)
* Initial commit

* fix release/file_common

* Update common/swaglog.cc

* Swtiched serialize cc

* move to lfs

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-22 22:35:47 -08:00
Adeeb Shihadeh
827aa2e4fa timed: always pull time and timezone from GPS (#31112)
* timed

* rm timezoned

* just gps

* ok

* little more

* fix

* datetime

* sleep a little

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-22 18:35:11 -08:00
Justin Newberry
389b8ca30d add example of using the comma car segments database (#31117)
* add vin fingerprinting example

* perhaps!

* remove segment

* easier
2024-01-22 18:23:07 -08:00
Justin Newberry
caa9153974 CommaCarSegments: public database of segments for each platform (#31114)
* comma car segments

* comma car segments for test_models

* oneliner

Co-authored-by: Shane Smiskol <shane@smiskol.com>

* better name

* not used here

* sort

* remove print

* better comment

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2024-01-22 17:33:03 -08:00
Adeeb Shihadeh
694fc378dd loggerd: speedup unit tests (#31115)
* first speed it up

* pytestify

* no sleep
2024-01-22 17:24:42 -08:00
Justin Newberry
3846130d8e pytest: add marker for sharing the download cache (#31082)
* fix cache

* with a marker
2024-01-22 16:30:59 -08:00
Harald Schäfer
7c9530f743 Code for running legacy models (#31111)
* Code for running legacy models

* Optional outputs
2024-01-22 14:44:48 -08:00
Brad Slavin
95d33164fd Hyundai: add missing Ioniq 5 2024 RWD Limited FW (#30864)
Update fingerprints.py

Added 2024 RWD Limited
2024-01-22 12:09:17 -08:00
Adeeb Shihadeh
77d051f5ec Bump submodules (#31107)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-22 09:15:58 -08:00
Adeeb Shihadeh
eb04935b95 Update Python packages and pre-commit hooks (#31108)
Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-22 09:15:22 -08:00
Harald Schäfer
0067cf3eb1 Los Angeles Model (#31037)
* 1c888f5b-c213-4c1c-9eba-c587afd047fc/700

* Move to action

* Updates

* Add steer delay

* Update curvature grep

* clip speed

* No car params for now

* Add delay back

* Update

* fix lint

* fix lint

* update model regf
2024-01-22 00:58:06 -08:00
Justin Newberry
81516216b1 Simulator: fix metadrive (#31104)
fix metadrive
2024-01-21 17:34:26 -08:00
Bruce Wayne
3b01733900 Revert "Refactor modeld (#31099)"
This reverts commit 599325718e.
2024-01-21 17:29:32 -08:00
Harald Schäfer
7ebd841a0b Deprecate lat planner (#31097)
* Deprecate lat planner

* Bump cereal
2024-01-21 17:10:49 -08:00
Harald Schäfer
599325718e Refactor modeld (#31099)
* First commit

* Allow

* Just camerastream helper
2024-01-21 17:10:40 -08:00
Adeeb Shihadeh
139b0ae3b6 fix test_startup (#31103)
* fix test_startup

* real fix
2024-01-21 16:55:47 -08:00
Adeeb Shihadeh
74a2e3178f pre-commit: only check translations on update (#31102) 2024-01-21 16:40:12 -08:00
Adeeb Shihadeh
b1f457bdc8 pytest: cleanup manager procs on teardown (#31101) 2024-01-21 16:39:52 -08:00
Adeeb Shihadeh
78e20cff39 cleanup tests that are now useless (#31098)
* disable that onoe

* e2e tests catch this

* rm more useless checks
2024-01-21 14:49:57 -08:00
Bruce Wayne
ec72cdca00 Bump cereal 2024-01-21 12:10:55 -08:00
Harald Schäfer
e6c97c3846 Delete lat planner (#31089)
* Initial commit

* Fixup

* typo

* ignore lateral plan

* Update cereal

* Remove lateralPlan

* Fix release build

* Fix release build

* give car params

* Add carParams to include_all_types

* Write car param in powerdraw test

* add demo mode

* Update model regf

* proc replay ref commit

* Try

* Move enum definition

* Update cereal

* typo

* Write car param for modeld test

* Update ref

* Update model ref again

---------

Co-authored-by: Kacper Rączy <gfw.kra@gmail.com>
2024-01-21 12:09:48 -08:00
Justin Newberry
2c86c023fe sanitizer: sanitize vin number (#31090) 2024-01-21 12:22:32 -05:00
Adeeb Shihadeh
e0d0896dcf test_power_draw: check msgs expect first for cleaner error 2024-01-20 17:20:21 -08:00
Adeeb Shihadeh
332a21965d jenkins: cleanup /dev/shm (#31095) 2024-01-20 15:24:34 -08:00
Justin Newberry
dc9ffd2f10 car tests on namespace (#31080)
cars
2024-01-19 14:53:52 -08:00
Justin Newberry
5c2b7882bf speedup replay test (#31086)
* speedup replay test

* better name

* comment not required
2024-01-19 14:39:08 -08:00
Adeeb Shihadeh
7cd9568423 remove dashcam branch (#31081)
* remove dashcam branch

* fix

* more cleanup

* remove param

* one more
2024-01-19 14:05:03 -08:00
Justin Newberry
18467c8383 fix cache permissions (#31084)
* fix cache permissions

* chown
2024-01-19 13:57:10 -08:00
Comma Device
574fd03208 fix tici build 2024-01-19 13:45:06 -08:00
Andrei Radulescu
28028aef17 Support for newer versions of Qt (#31072)
* Dynamic QtGui version

* Fixed use of undeclared identifier 'va_start'

* Fix for Qt deprecations

* Fix for dynamic QtGui version

* Update selfdrive/ui/SConscript

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-19 13:28:29 -08:00
Justin Newberry
c907dd9e70 CI: fix post run cache (#31078)
* post cache only

* fix

* newline

* really github???
2024-01-19 13:25:41 -08:00
Adeeb Shihadeh
8a26b4383f bump that up 2024-01-19 13:19:41 -08:00
Hoang Bui
f0f7e86dcc Enable cache for pre-commit (#31071)
* enable cache

* test cache

* commai cache

* remove id

* only save on master

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2024-01-19 13:06:02 -08:00
Justin Newberry
bbbe94bc3e CI: auto-cache add option to save cache (#31076)
* save cache option

* inputs
2024-01-19 12:43:47 -08:00
Adeeb Shihadeh
16cd20f4eb don't block startup on time (#31074)
* don't block startup on time

* cleanup

* unused
2024-01-19 11:51:58 -08:00
Adeeb Shihadeh
f3689ef561 remove old ref to manager_prepare 2024-01-19 10:44:46 -08:00
ugtthis
a6695e4489 UI/close_btn: Removed unused border code (#31073) 2024-01-19 10:38:11 -08:00
Justin Newberry
dfb56abf91 silence xvfb (#31069)
silence
2024-01-18 22:40:28 -08:00
Justin Newberry
35ed8a0886 CI: use namespace.io (#31064)
* namespace

* mkdir

* fix

* restore only

* restore

* v3

* disable provenance
2024-01-18 22:13:19 -08:00
Adeeb Shihadeh
b4ebba384b cleanup startup params (#31068) 2024-01-18 22:09:55 -08:00
Adeeb Shihadeh
7a6463b2b4 remove early RTC time pull (#31066) 2024-01-18 21:05:57 -08:00
Adeeb Shihadeh
e3b17d10f3 speedup prebuilt check (#31065)
* speedup prebuilt check

* one place
2024-01-18 21:02:18 -08:00
Adeeb Shihadeh
ce947ffe9a manager: merge prepare and init 2024-01-18 20:45:41 -08:00
Comma Device
e2df83089f fix param path 2024-01-18 20:12:04 -08:00
Adeeb Shihadeh
c4362bd958 bootlog doesn't block startup (#31061)
* bootlog doesn't block startup

* keep params

* fix

* cleanup
2024-01-18 20:04:08 -08:00
Shane Smiskol
29536324c1 Toyota: combine more hybrid platforms (#31057)
* Combine

* migrate test models segs

* fix highlander engine

* no change
2024-01-18 18:51:24 -08:00
Justin Newberry
23cbfe9eb3 Revert "CI: use namespace.so" (#31060) 2024-01-18 17:35:24 -08:00
Justin Newberry
9ee0a8a2b1 CI: use namespace.so (#31056)
* namespace

* mkdir

* fix

* restore only

* restore

* v3
2024-01-18 17:17:53 -08:00
Adeeb Shihadeh
00b5424407 time to remove this 2024-01-18 16:38:46 -08:00
Justin Newberry
d98b33adc8 replace pytest-timeouts with pytest-timeout (#31053)
* one timeout

* timeout

* higher timeout for now

* bump
2024-01-18 16:19:49 -08:00
Adeeb Shihadeh
1c09ae99eb Bump submodules (#31054)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-18 15:06:02 -08:00
Adeeb Shihadeh
292f2ea288 Update BOUNTIES.md 2024-01-18 11:51:39 -08:00
Adeeb Shihadeh
5791afda15 update bolt bounty 2024-01-18 11:50:17 -08:00
Adeeb Shihadeh
2280ac50b7 uploader: restrict qcam upload on metered connctions (#31047)
* uploader: restrict qcam upload on metered connctions

* route requesting

* rename

* str

* cleanup

* strip dongle

* upload bookmarked segments

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-17 21:41:58 -08:00
Shane Smiskol
f96aa247cc FW query timing test: mock inconsistent, timing-based functions (#31048)
* Revert "Revert "FW query timing test: mock get_data function for timeout" (#30696)"

This reverts commit b1ecfd55ce.

* no thread

* clean up a bit

* no thread!

* combine functions

* re-enable total time check

* back to 5

* minimal diff

* minimal diff
2024-01-17 19:05:31 -08:00
Adeeb Shihadeh
005a6e4f17 thermald: match metered param to packet 2024-01-17 17:45:22 -08:00
Adeeb Shihadeh
19630c5af9 uploader: delay uploading crash and boot logs on metered connections (#31045)
* uploader: delay uploading some files on metered connections

* just crash and boot for now
2024-01-17 17:43:41 -08:00
Adeeb Shihadeh
4c2bb9f380 updated: only fetch on metered connection when necessary (#31041)
* updated: only fetch on metered connection when necessary

* button always fetches
2024-01-17 16:30:08 -08:00
Harald Schäfer
d36103791c No curv rate for lateral control (#31042)
* No more Curvature rate for lat control

* Update cereal

* Update

* Fix lat control test
2024-01-17 16:00:50 -08:00
Justin Newberry
840db1f1b7 prevent typing issue in azure_container (#31044)
prvent that issue
2024-01-17 15:34:24 -08:00
Adeeb Shihadeh
5f1e7649e3 update param in loggerd unit test 2024-01-17 15:08:36 -08:00
Adeeb Shihadeh
7ce29ef08e cleanup old params (#31039)
* cleanup old params

* one more
2024-01-17 14:42:07 -08:00
Shane Smiskol
8c544d9139 Fix f-string in test_fw_query_on_routes.py 2024-01-17 14:39:31 -08:00
Adeeb Shihadeh
0b5fd7287e uploader cleanup (#31035)
* Reapply "uploader cleanup" (#31033)

This reverts commit 5e4df41b2f.

* always sleep

* more cleanup

* little more

* fix linter

* little more
2024-01-17 14:24:09 -08:00
Justin Newberry
3f0b56b364 cleanup azure handling (#31034)
* wip cleanup

* Wip

* fixes

* fix

* cleanup

* keep this for now

* dest
2024-01-17 14:21:47 -08:00
Justin Newberry
5e4df41b2f Revert "uploader cleanup" (#31033) 2024-01-17 11:07:38 -08:00
Justin Newberry
f6cd009c77 Update PR templates + autogenerate (#31032)
* update templates

* same as before

* no tuning

* same as before

* move up
2024-01-17 10:36:47 -08:00
YassineYousfi
86ac700805 update onnxruntime to 1.16.3 (#31024) 2024-01-16 20:22:05 -08:00
Adeeb Shihadeh
c6c6a441eb uploader cleanup (#31029)
* cleanup

* startup cleanup

* step

* Update test_uploader.py
2024-01-16 19:54:07 -08:00
Shane Smiskol
60a4102892 Fingerprints: automatically add missing FW versions from users [bot] (#31027)
Export fingerprints
2024-01-16 19:32:21 -08:00
Adeeb Shihadeh
baa4e801fe athena: remove MockParams from tests 2024-01-16 19:11:59 -08:00
Justin Newberry
49586fc30e CI: auto_pr_review fix error when label doesn't exist (#31030)
* bot template

* catch error
2024-01-16 18:23:33 -08:00
Justin Newberry
1bf8e04f54 CI: only apply bot-review label when it doesn't pass (#31028)
bot template
2024-01-16 18:02:26 -08:00
Justin Newberry
b933825231 fix typo 2024-01-16 17:30:11 -08:00
Justin Newberry
2967cada71 auto_source: optimize api calls and use head to determine if file exists (#31025)
* fast

* catch all

* source

* fix file_exists

* remove duplicate reset

* test multiple loops

* iterations

* cleanup imports
2024-01-16 17:24:37 -08:00
Justin Newberry
5c24527683 test_models: sanitize segment before running test (#31026)
to ensure sanetized routes will work
2024-01-16 15:08:44 -08:00
Moritz Wörmann
8a05d212ec CI: Add GH Actions workflow Bot to check for a PR template (#30999)
* Add GH Actions workflow to check for a PR template

* switch to headings and checkboxes for template detection

* check for bold text in template too

* move template check over to auto_pr_review action and remove label only if check succeeded

* only run template check on external PRs

* wording

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2024-01-16 13:40:38 -08:00
Justin Newberry
61fe705160 LogReader: fix plotjuggler not reading properly (#31023)
* fix plotjuggler

* simpler

* fix juggler

* fix that
2024-01-16 12:40:49 -08:00
Justin Newberry
7d400112df LogReader: move opci to tools/lib (#31021)
move opci
2024-01-16 10:58:51 -08:00
Justin Newberry
0739d5d7b2 LogReader: support lists of identifiers (#31020)
* support lists of logs

* mark as slow instead
2024-01-16 10:40:00 -08:00
Justin Newberry
4da8d16514 LogReader: support only_union_types (#31019)
support only-union-types
2024-01-16 10:03:55 -08:00
Shane Smiskol
8e9be48b7b Revert "docs: include dashcam" (#31017) 2024-01-15 23:49:07 -08:00
Justin Newberry
e1a05deadd test_athena: make test more independent (#31012)
get port auto
2024-01-15 16:57:12 -08:00
Justin Newberry
94cd4c9046 Subaru: ensure consistent firmware version size (#31001)
* fix copying mistakes

* fix SA

* remove print

* ensure size is same

* fix SA

* not in database
2024-01-15 12:52:15 -08:00
Adeeb Shihadeh
a8afaf39d4 Update Python packages and pre-commit hooks (#31003)
* Update Python packages and pre-commit hooks

* fix

---------

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-15 10:34:25 -08:00
Adeeb Shihadeh
a4fac38cf9 Bump submodules (#31002)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-15 10:34:08 -08:00
Shane Smiskol
f256225f29 docs: include dashcam (#31004)
include dashcam
2024-01-15 04:58:43 -08:00
Justin Newberry
4c6f7da404 Subaru: remove incorrect fingerprints from other brands queries (#30984)
s
2024-01-14 19:55:15 -08:00
Adeeb Shihadeh
fe6aff0131 more unit test speedup (#30997)
* that's super slow

* fix startup test

* fix
2024-01-13 22:21:43 -08:00
Adeeb Shihadeh
e17e66180c CI: speedup unit test job (#30995)
* start

* mv to buildjet

* fix
2024-01-13 21:16:35 -08:00
Adeeb Shihadeh
3e601b5e8f camerad: move ae test to pytest/catch2 (#30994)
* mv ae gray test

* cleanup
2024-01-13 15:40:25 -08:00
Adeeb Shihadeh
66ddfece82 speedup devcontainer ci job (#30993) 2024-01-13 15:01:35 -08:00
Korben
2f744f5df4 Update French language (#30992)
Update main_fr.ts

validation of new elements
2024-01-13 13:03:23 -08:00
Justin Newberry
884de6e457 test_proclog: fix conflict with pytest (#30989) 2024-01-13 00:30:55 -05:00
Shane Smiskol
dafde02da3 Fingerprints: automatically add missing FW versions from users [bot] (#30988)
Export fingerprints
2024-01-12 20:58:13 -08:00
Lee Jong Mun
f55d04c172 kor translation update (#30990) 2024-01-12 20:44:03 -08:00
Alexandre Nobuharu Sato
4178f7c1e1 Multilang: Update pt-BR translation (#30987)
* add instructions to my fork

* Revert "add instructions to my fork"

This reverts commit 46fbee3ebe7ecbb211d855e63b2d4c8919c31b63.

* test llm

* Revert "test llm"

This reverts commit fc531f0a1ba81b3444a34a1be8d02a51a060ec7a.

* update pt-BR translation
2024-01-12 18:25:41 -08:00
Justin Newberry
d39b31aed1 remove get_url instances (#30986)
rm
2024-01-12 17:36:38 -08:00
Justin Newberry
28e5d1bb49 Metadrive: fix map config on main (#30983)
* Fix map api too

* dont render
2024-01-12 14:42:40 -08:00
Justin Newberry
3d73512c07 rename segmentrangereader to logreader (#30981)
* Replace multilogiterator

* replace logreader

* update readme

* fix from_Bytes

* new section

* reset before iter

* selector

* fix internal

* whitespace
2024-01-12 12:53:50 -08:00
Justin Newberry
9f1b72ac79 Replace multilogiterator (#30980) 2024-01-12 11:43:32 -08:00
Jason Young
ba792d576a VW MQB: Add FW for 2018 Volkswagen Tiguan (#30951) 2024-01-11 23:16:04 -08:00
Adeeb Shihadeh
5da573ff39 navd: handle errors in parsing api response (#30977) 2024-01-11 23:15:29 -08:00
Adeeb Shihadeh
ef73ee7b37 simple navd test (#30976)
* simple test

* can't check that

* cleanup
2024-01-11 22:55:58 -08:00
royjr
96c91c486e networking: add hidden network option (#30808)
* init

* once

* match

* fix

* maybe

* maybe

* Revert "maybe"

This reverts commit 8386a0a381d5cfe94d7bbf0187d5e311d4b4e9c3.

* Revert "maybe"

This reverts commit 3abf7b19836e5f353fbb94c9bee52b185bd3fc17.

* Revert "fix"

This reverts commit 09e0146f4deeac07b9c26e916a75b70c7dcff1f1.

* Revert "match"

This reverts commit 39a90c6cf88f310623d5e9058152d025ee7213ea.

* fix not at bottom

* padding

* match

* Update networking.cc

* min chars

* translations

* shouldn't need

* need!

* just in case

* Revert "just in case"

This reverts commit a3c1e090682e30400ba9c20b04407b9e5677ad7a.

* finish translations

* not secret

* optional

* allow open networks

* fix

* try

* working

* add divider

* update translations

* fix

* better name

* translate hidden network

* auto

* v2

* remove v1

* fix

* fix translations
2024-01-11 19:42:20 -08:00
Justin Newberry
f2c73039d7 fix metadrive after bump (#30967)
* fix clip

* wip

* oop

* 1.22

* ... ugly

* fix tuning
2024-01-11 18:09:39 -08:00
Justin Newberry
e7657d896f Subaru: fix disable eyesight enum (#30974)
value
2024-01-11 17:15:37 -08:00
Justin Newberry
d7e7659852 move plotjuggler to segment range reader (#30969)
* pj

* limit test to 2 segs

* remove

* fix test
2024-01-11 17:02:47 -08:00
Justin Newberry
eb09294fc2 segmentrangereader: support direct parsing (#30973)
* use correct source

* revert

* cleanup imports

* clean

* direct parsing

* rename

* move up

* fixes

* fix that

* better error message
2024-01-11 16:56:48 -08:00
Shane Smiskol
68bcb6b8da Fingerprints: add missing FW versions from users (#30972)
Export fingerprints
2024-01-11 15:57:04 -08:00
Justin Newberry
8d9e431f43 car porting examples: add example of plotting the response of brake_pressure vs acceleration (#30958)
* another example

* add comment

* fix that

* oop

* fix link
2024-01-11 13:35:50 -08:00
Justin Newberry
042ccb9244 move can replay to segmentrangereader (#30971)
can replay
2024-01-11 13:11:59 -08:00
Justin Newberry
fb994ae782 segmentrangereader: support more sources (#30970)
* support more sources

* remove this
2024-01-11 12:55:19 -08:00
Justin Newberry
7e9843b5e6 replace more tools with SegmentRangeReader (#30968)
* replace lrfros

* and those ones too
2024-01-11 11:46:31 -08:00
Hoang Bui
f820b7cd94 FIx violations and enable --warn=all (#30854)
* --warn=all

* setoption default warn=all

* to old test yaml

* cleanup

* advanced cscanner

* SCons conditional scanner

* not time  yet

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-11 11:16:09 -08:00
Adeeb Shihadeh
ed153141fc rm old debug script 2024-01-11 10:56:46 -08:00
Justin Newberry
0320fb385a fix static analysis 2024-01-11 10:54:53 -08:00
Justin Newberry
be814ed447 SegmentRangeReader: log type selector (#30960)
* log type selector

* test this too

* and this

* invalid selector

* use strenum

* don't hardcode size

* oneline
2024-01-11 10:25:24 -08:00
Justin Newberry
32dfb3f8f2 More migration to segmentrangereader (#30959)
* filter log message

* ffr

* gtfs

* gtfs
2024-01-11 10:14:10 -08:00
Shane Smiskol
3c74a61c97 Honda: remove hud ECU from CR-V Hybrid (#30965)
remove almost absent ECU
2024-01-11 00:39:26 -08:00
Shane Smiskol
bef6d7f0bb pre-commit: speed up translation step (#30966)
* formatting

fix

* fix missing class attr warning

* add translation_files option, remove pluralonly, type hint

* updates

* update
2024-01-11 00:39:15 -08:00
Adeeb Shihadeh
b92e71a2b6 updated: persist more state between runs for UI (#30963)
* persist branches and more

* fix target

* typo

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-10 23:23:13 -08:00
Adeeb Shihadeh
e9e8f4df38 update count_events.py to SegmentRangeReader 2024-01-10 23:19:16 -08:00
Adeeb Shihadeh
3918039e29 manager: clean exit on ctrl-c 2024-01-10 19:37:10 -08:00
Hoang Bui
1da08460cb Enable variable pass between test and metadrive processes (#30961)
pass started between processes
2024-01-10 18:13:21 -08:00
Justin Newberry
af1b7e5c59 Revert "buildjet: pin location to de" (#30956)
Revert "buildjet: pin location to de (#30955)"

This reverts commit 576cba217d.
2024-01-10 15:11:20 -08:00
Justin Newberry
576cba217d buildjet: pin location to de (#30955)
* pin location

* stringify

* Fix

* fromjson

* flip the parens

* and those
2024-01-10 13:48:35 -08:00
Justin Newberry
cfb23eb2d1 segmentrangereader: support sort_by_time (#30954)
support sort-by-time
2024-01-10 13:36:55 -08:00
Justin Newberry
926793b17f migrate can_print_changes to segmentrangereader (#30953)
more tools
2024-01-10 13:02:39 -08:00
Justin Newberry
0d126e1e9e SegmentRangeReader: new format for reading multiple segments (#30940)
* segment range reader

* rename that

* revert that

* cleanup

* revert this for now

* revert this for now

* Fix + test

* rm that

* rm that

* use for auto_fingerprint

* simpler

* for notebook too

* match numpy indexing

* just use numpy directly

* remove that

* spacing

* spacing

* use qlog for auto fingerprint

* add 'read mode'

* pass in read mode

* add test for modes

* numpy indexing

* fix that case

* more examples

* fix the notebook

* cleanup the notebook

* cleaner

* fix those
2024-01-10 11:55:19 -08:00
ugtthis
db3ef3e1d8 UI/MapETA: Increased contrast of widget texts for better readability (#30952) 2024-01-09 20:32:23 -08:00
Jason Young
61ebb5b668 VW MQB: EA driver inactivity workaround (#24711)
* VW MQB: Emergency Assist mitigation

* elide superfluous newline

* update refs

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-09 19:24:46 -08:00
Nelson Chen
4eba5fe68d Add permissions to build_masterci in release workflow so it can push master-ci (#30949) 2024-01-09 16:46:09 -08:00
Adeeb Shihadeh
cd1d7eb4d2 OS04C10 support (#30658)
* getting frames

* ok

* support both output

* cleanup

* fix unused

* undo

* fix release files

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-09 14:19:10 -08:00
Nelson Chen
221f81bbd3 Add more permissions for pushing in prebuilt workflow (#30948)
Continuing on from https://github.com/commaai/openpilot/pull/30947
2024-01-09 11:35:14 -08:00
Nelson Chen
2a074eefac Fix badges workflow blocking release/prebuilt workflows from permission and Git-LFS complications (#30947) 2024-01-09 10:40:45 -08:00
Shane Smiskol
ca57d329e2 Toyota: add 2024 RAV4 (#30909)
* add 2024 RAV4 ICE FP

* docs

* also try vin bus 0 toyota

* it works!
2024-01-09 00:48:48 -08:00
Adeeb Shihadeh
af137bac58 GM: remove GMLAN dash msg (#30547)
* remove GMLAN

* update refs
2024-01-08 19:49:22 -08:00
Shane Smiskol
1d370a0880 Fingerprints: add missing FW versions from users (#30945)
Export FW versions
2024-01-08 19:46:27 -08:00
YassineYousfi
d6cece756c longplanner: expose dt (#30941) 2024-01-08 19:46:13 -08:00
Jason Young
88e445ef15 VW MQB: Improved longitudinal starting and stopping (#30874)
* VW MQB: Improved stopping and starting

* get longcontrol to take off sooner

* oops

* use the carParam instead of the constant

* update refs

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-08 19:40:41 -08:00
Hoang Bui
7fdd5c4a7d Python camerad for webcam (#30930)
* webcamd

* remove destroy windows

* block

* shebang execute

* executaleeeee

* executableeeeeee

* she bang for camerad.py

* listener

* no signal?

* good

* ruff fix

* delete listener

* recover sim

* remove assert

* refactor

* fix shell

* fix namedtuple

* little change

* to tuple

* cleanup

* update readme

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-08 19:22:21 -08:00
Adeeb Shihadeh
90010754d6 unpin metadrive package (#30944)
* unpin metadrive package

* lock
2024-01-08 17:16:15 -08:00
Adeeb Shihadeh
c8df0bd1d0 Bump submodules (#30938)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-08 17:02:40 -08:00
Shane Smiskol
d689a4e653 Fix string indentation (#30943)
* fix bad spacing

* more

* these aren't important
2024-01-08 15:36:43 -08:00
Adeeb Shihadeh
5f191321fd tici: check that peripherals are fully booted (#30942)
* tici: check that peripherals are fully booted

* default

* typo

* fix

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-08 15:09:38 -08:00
Adeeb Shihadeh
6743487d78 Update Python packages and pre-commit hooks (#30939)
Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-08 13:54:09 -08:00
Adeeb Shihadeh
91c5c5eca7 camerad: log request id (#30935)
* camerad: log request id

* bump cereal

* bump cereal
2024-01-08 09:16:50 -08:00
Nelson Chen
2a49f94872 Add necessary permissions/tokens for "lewagon/wait-on-check-action" so it can run nightly (#30923) 2024-01-07 15:02:25 -08:00
Adeeb Shihadeh
073fc89ad4 Revert "UI: single-threaded CameraView (#30397)"
This reverts commit 17ac1d3c7b.
2024-01-07 14:54:39 -08:00
Adeeb Shihadeh
e867aa40db ignore "car port" for stale pr detection 2024-01-07 14:34:04 -08:00
Adeeb Shihadeh
7997fccdfa update mapsd cpu 2024-01-06 17:46:44 -08:00
Adeeb Shihadeh
f0ccb84ae3 remove common.profiler (#30927)
* remove common.profiler

* cleanup
2024-01-06 16:20:28 -08:00
Shane Smiskol
084871ed5b Auto translate: fix prompt & formatting (#30922)
fixes
2024-01-05 23:44:54 -08:00
Meir
2378f311d2 Auto translate with OpenAI (#30899)
* auto translate with OpenAI

* change model

* fix mypy typing errors

* update

* fix lint errors

* check api key after args parser

* fix input args

* use languages.json

* just print

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-05 22:28:56 -08:00
Justin Newberry
03d6233743 move profiling tools to tools/profiling (#30917)
move profiling
2024-01-05 16:22:45 -08:00
Justin Newberry
4cc48b75e8 add sanitizer function (#30919)
* sanetizer function

* spelling

* better

* move to helpers
2024-01-05 16:20:37 -08:00
Adeeb Shihadeh
46f3fdc090 Update Python packages and pre-commit hooks (#30597)
* Update Python packages and pre-commit hooks

* fix

---------

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-05 15:17:49 -08:00
Justin Newberry
239b228ca6 add the notebook example to car port docs (#30920)
* add the notebook example

* fix link

* add image

* no lfs

* no lfs
2024-01-05 13:57:02 -08:00
Justin Newberry
e86d74b347 move car porting tools to tools/car_porting (#30916)
just this for now
2024-01-05 11:53:03 -08:00
Justin Newberry
15e0a906ad tools: add car porting example notebook (#30918)
* add car porting example notebooks

* not required
2024-01-05 11:52:24 -08:00
Shane Smiskol
002ab5637b Car docs: utilize post init (#30912)
move these to earlier post_init
2024-01-04 22:16:39 -08:00
Shane Smiskol
397c1e373c selfdrive/test: fix indentation
no ruff rule for this
2024-01-04 19:53:23 -08:00
Justin Newberry
1148c65d23 add read_seglist helper (#30908)
add helper
2024-01-04 17:52:07 -08:00
Shane Smiskol
63f0d775bc Fingerprints: add missing FW versions from users (#30906)
Export fingerprints from Fingerprint stage
2024-01-04 15:54:50 -08:00
Shane Smiskol
43b0b0f022 Revert "Fingerprints: add missing FW versions from users"
This reverts commit e85e401d07.

Meant for another branch.
2024-01-04 00:51:38 -08:00
Shane Smiskol
e85e401d07 Fingerprints: add missing FW versions from users 2024-01-04 00:50:30 -08:00
Adeeb Shihadeh
3c4150c542 timezoned: set only from gps (#30904)
* timezoned: set only from gps

* unused
2024-01-03 20:18:29 -08:00
Adeeb Shihadeh
fe40905849 Revert "Fingerprint for '21 Explorer ST (#30877)"
This reverts commit ff0fed07ed.
2024-01-03 20:07:58 -08:00
duetschlandftw
ff0fed07ed Fingerprint for '21 Explorer ST (#30877)
* carparams gave me a new firmware entry for "shiftByWire" from 'ford', so i added it here, as well as a new fw value under ecs.engine

* Update selfdrive/car/ford/fingerprints.py

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2024-01-03 19:43:59 -08:00
DevTekVE
28cf3155e2 [HKG-CAN] Consider FCW alerts from SCC (#30885)
* FCW is triggered differently when SCC is active

* Update selfdrive/car/hyundai/carstate.py

* Update selfdrive/car/hyundai/carstate.py

* cmt

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2024-01-03 19:34:13 -08:00
Adeeb Shihadeh
115047d858 timezoned: run while onroad (#30903) 2024-01-03 17:53:40 -08:00
Justin Newberry
4430944b29 jenkins: lock "pc" label to limit concurrent workers (#30902)
* lock pc label

* remove that
2024-01-03 16:55:16 -08:00
Shane Smiskol
318d1204e5 CI: bump other lewagon/wait-on-check-action 2024-01-03 14:11:11 -08:00
Dean Lee
17ac1d3c7b UI: single-threaded CameraView (#30397)
* single-threaded CameraView

* updateFrame

* inherit from CameraWidget

* clear frame on offroadTransition

* check frame_id

* optional

* unique_ptr

* CameraView

* cleanup

* cleanup

* log skipping frame

* fix driverview

* disconnectVipc

* debug inconsistent frame

* skip frame if uiPlan is outdate

* cleanup

* set connected = false

* support camerad reboot&seeking in replay

* cleanup

* qDebug

* use deque

* cleanup

---------

Co-authored-by: Comma Device <device@comma.ai>
2024-01-03 13:14:29 -08:00
Shane Smiskol
7f398e1cf9 test_models: fallback to public route when route isn't uploaded to CI bucket (#30893)
* not sure why this is a test

* Revert "not sure why this is a test"

This reverts commit c13e16311eb882df65d216bbd59acb5702e985e6.

* no ruff for this pattern :(

* this is always caught

* should fail

* simpler

* Revert "should fail"

This reverts commit 21bd15275c46cd42fd19b058245334bae83cce77.

* fix

* cleanup this

* better comment

* better

* this can be more localized

* better names

* better names

* should fail

* Revert "should fail"

This reverts commit c58495e8b3417ce351df8048752ec60177827cb3.

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2024-01-03 11:54:22 -08:00
Adeeb Shihadeh
8fbe382fa7 make scons parallel by default (#30901) 2024-01-03 11:16:54 -08:00
Shane Smiskol
633fef5a96 Fingerprints: add missing FW versions from users (#30837)
Export Toyota fingerprints from last 2 weeks, 0.9.5-release
2024-01-02 21:48:31 -08:00
Shane Smiskol
8c4930d2d3 Revert "test_models: fallback to public route when route isn't uploaded to CI bucket (#30794)" (#30896)
* fails if no skip function

* Revert "fails if no skip function"

This reverts commit ff3d697d38dce56057c83f06033a689f2301a29d.

* Revert "test_models: fallback to public route when route isn't uploaded to CI bucket (#30794)"

This reverts commit 05dc0b51e6.
2024-01-02 17:22:06 -08:00
Shane Smiskol
de4bc31ba6 Toyota: add 2024 RAV4 Hybrid (Canada-built) (#30887)
* add 2024 RAV4

* bump reeleases

* fix star link in PR comments

* ?

* consistent
2024-01-02 17:14:51 -08:00
Shane Smiskol
543cd4460a HKG: fix 2021 Niro Hybrid harness (#30895)
* originally was Hyundai F in the database, but one user on Discord (US) and one in support (SK) both needed hyundai D

* bump
2024-01-02 17:10:23 -08:00
Shane Smiskol
205a78f02d PR comments: fix image links 2024-01-02 14:18:52 -08:00
Justin Newberry
9b25bfc618 CI: set CI=1 in docker image (#30889)
* ci=1

* wrong spot
2024-01-02 13:48:16 -08:00
Adeeb Shihadeh
9cf57cc4e4 CI: bump lewagon/wait-on-check-action 2024-01-02 13:34:35 -08:00
Mitchell Goff
7e71fd7bae new delhi model (#30822)
* 027a1efa-10fb-4291-ad58-90cf0ff150b5/700

* debug

* rm for now

* bump refs

* revert that

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-02 13:27:15 -08:00
Justin Newberry
86bd337952 CI: set CI=1 globally (#30888)
ci=1
2024-01-02 13:17:19 -08:00
Justin Newberry
fba521ecc6 url_file: fix non-200 files being cached (#30886)
* fix + test

* fix unclosed

* easier to read

Co-authored-by: Shane Smiskol <shane@smiskol.com>

* fix that

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2024-01-02 12:42:08 -08:00
royjr
9d7f618bc5 multilang: parameterize unit tests (#30842)
* init

* fix indents

* remove import

* safer

* TemporaryDirectory

* much cleaner

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-01 14:54:16 -08:00
stevenworks
0f72467558 Typo fixes / Grammar corrections (#30860)
* CONTRIBUTING.md: Misspelling

* BOUNTIES.md: Misspelling

* SAFETY.md: Grammar

* realtime.py: Comment consistency

* revert for now

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2024-01-01 14:39:01 -08:00
Kacper Rączy
65ece2081a metadrive: Change camera position to reflect typical height of a vehicle (#30831) 2024-01-01 14:36:37 -08:00
Sliicy
6ccf2cbfde Fixed joystickd.py incorrect steering control (#30879) 2024-01-01 14:29:01 -08:00
Adeeb Shihadeh
d3cdd837fa Bump submodules (#30881)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2024-01-01 14:28:34 -08:00
Robbe Derks
eb805e889e [Cabana] Fix segfault in sparkline (#30870) 2023-12-31 13:02:05 -08:00
Justin Newberry
331ea60422 Add link to contributing channel (#30876) 2023-12-31 14:54:37 -05:00
royjr
fd88990006 multilang: bad language translation check (#30783)
* compare bad against list

* use web

* Update test_translations.py

* uncomment

* override

* wrap

* AssertionError

* better

* detent

* selfish

* check numerusforms

* already checked

* use name

* not again

* combined

* sets

* assume available

* fix assume

* check regardless of other tests

* assert not print

* raise for status

* better

* done

* useless

* happy ruff

* better set

* quiet

* clean

* obvious

* clearer

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>

* IGNORED_WORDS

* assert match

* direct assert

* show bad word

* fix numerous empty string checks

* fix IGNORED_WORDS

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-31 10:58:15 -08:00
Justin Newberry
a58baf48fe Subaru: longitudinal cleanup and dash status fixes (#30868) 2023-12-29 23:47:55 -05:00
Justin Newberry
9520153b6a bump submodules (#30866) 2023-12-29 19:39:17 -05:00
Justin Newberry
d33c5bccc6 CI: update labeler to 5.0.0 release (#30862)
* update labeler

* update labeler

* update labeler

* Update labeler (#63)

* update labeler

* update labeler

* update labeler

* fix that

* Update labeler (#65)

* update labeler

* update labeler

* update labeler

* fix that

* and that

* Update labeler (#66)

* update labeler

* update labeler

* update labeler

* fix that

* and that

* fix that
2023-12-28 10:54:09 -08:00
Adeeb Shihadeh
6810c5b644 script for checking out a pr 2023-12-26 19:22:34 -08:00
royjr
4df85062c5 setup: Enhance URL Handling to Support Partial Inputs (#30681)
* easy urls

* better
2023-12-26 19:08:57 -08:00
Dean Lee
a1f53c70e6 uploader.py/listdir_by_creation: list directories only (#30806)
list only directories

Co-authored-by: Comma Device <device@comma.ai>
2023-12-26 16:05:45 -08:00
pencilpusher
ee3544d283 replay ui: fix typo in variable name (#30851)
fix typo in variable name
2023-12-26 16:03:59 -08:00
Adeeb Shihadeh
1f9970ba3d stricter file size limits (#30839)
* move all pics to lfs

* wav and rest of so

* more to lfs

* ignore a few

* push that up
2023-12-26 15:22:59 -08:00
Adeeb Shihadeh
7638572e38 Bump submodules (#30849)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2023-12-26 01:58:40 -08:00
Shane Smiskol
5e6290c4a2 Fingerprints: add missing FW versions from users (#30833)
Export fingerprints from Fingerprint stage
2023-12-21 03:55:15 -08:00
Shane Smiskol
b38c580c2e format fingerprints: simplify sorting (#30826)
* unique + sort + don't modify FW_VERSIONS

* clean up

* not here

* self expl
2023-12-20 15:51:56 -08:00
Justin Newberry
cfc85f016b Pytest: exclude teleoprtc (#30829)
exclude
2023-12-20 15:22:48 -08:00
Justin Newberry
a6b17fb1f6 Simulator: fix keyboard ctrl messing with pytest (#30827)
fix
2023-12-20 15:10:11 -08:00
Justin Newberry
abe4780fdb Docs: fix old docs still being populated (#30825)
* fix push

* also remove cached files

* fix readme

* add readme

* remove that wip submodule
2023-12-20 13:56:34 -08:00
Justin Newberry
33e7baee40 Docs: fix push and running locally (#30823)
fix push
2023-12-20 13:27:27 -08:00
Justin Newberry
3d8c78d6b3 format_fingerprints: automatically sort fw fingerprints (#30819)
* Auto sort fingerprints

* add comment
2023-12-20 11:54:31 -08:00
Justin Newberry
05dc0b51e6 test_models: fallback to public route when route isn't uploaded to CI bucket (#30794)
* wip

* add public comment

* fix that

* wip

* retrigger
2023-12-20 11:29:19 -08:00
Justin Newberry
3713e4d5ea add script to automatically format fingerprints file (#30792)
* Add script

* fix script

* fix script

* fix for subaddr

* run the script

* old style can fingerprints

* cleanup

* sort imports, make executable, fix path

* newline w/o newline

* match og can formatting

* match og formatting

* generate template once

* standard name

* less nested

* can fingerprints comments

* fix spacing

* no need for PLATFORM_TO_ENUM_NAME!

* prep for PRs

* comments for all, add honda comments

* Auto-generated fingerprint PR from fuzzy fingerprinting cars

* Revert "Auto-generated fingerprint PR from fuzzy fingerprinting cars"

This reverts commit 97bc9e3bdb9d819dcbe684ceba92ea702d40eaf0.

* even closer to original

* readd this comment

* and run script

* add to precommit

* add comments

* add comments

* add to release

* use for auto fingerprint

* disable precommit for now

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-20 11:18:29 -08:00
Shane Smiskol
adb04b5dc5 fingerprints: fix formatting (#30814)
formatting
2023-12-19 23:47:34 -08:00
Shane Smiskol
1a165c6580 interfaces: fix get_interface_attr typing (#30813)
* fix

* Update selfdrive/car/interfaces.py
2023-12-19 23:35:31 -08:00
Shane Smiskol
426072bd87 fix bad CAN fingerprint type (#30809)
fix bad wrong type
2023-12-19 20:30:42 -08:00
Dean Lee
5f04517677 cabana: add csv export (#30800)
export csv
2023-12-19 11:50:16 -08:00
Justin Newberry
8017c25f0b Simulator: only send camera frames at rate that they are generated (#30802)
only send frames at rate that they are generated
2023-12-19 10:45:07 -08:00
Dean Lee
3646ca0a14 refactor swaglog (#30795) 2023-12-19 10:36:35 -08:00
Justin Newberry
adca970ca9 cleanup fingerprinting typing (#30801)
* wip

* undo + add can fingerprints

* add can fingerpints

* those should go there
2023-12-19 09:41:09 -08:00
Shane Smiskol
5052b55c44 test_models: fuzz test panda and CarState (#30443)
* pre-hypothesis

* some hypothesis junk

* this kinda works but is really slow due to counter check

* choose addrs from fingerprint

* stash

* honda nidec brake pressed mismatches fixed

* bump panda

* stash

* tesla: use DI_torque2 (panda msg)

* run

* run

* ah this honda mismatch too

* no more multi can msgs

* clean up, remove old file

* add todo

* prob can remove urandom

* stash, huge examples

* fix pq standstill mismatch

* yuge

* yup there's a leak somewhere

* try to find leak

* skip dashcam (pq and tesla)

* PR comments

* bump

* draft stash

* fix alt brake hondas

* bump

* bump

* bump

* some clean up

* minor clean up

* more clean up

* stash

* fix honda bug

* more

* 100 examples

* revert tesla

* no memory leak any more?

* bring back tests with skips

* parameterize max_examples

* skip interceptor

* is jenkins on my branch?

* ooh that's fast

* 50 is not bad for GH CI

* 300 might be better with rest of test_models

* no more detection

* bump

* need CS_prev to catch bugs where openpilot changes and panda doesn't (eg. not setting interceptor safety mode)

* need to simplify all this

* need a warm up first, since some signals are 1 by default (toyota's gas_released!=1)

* changes

* set honda safety param

* set toyota safety param

* bump panda

* clean up honda

* rm interceptor

* thought interleaving addrs might help, but we can fine tune later

* Revert "thought interleaving addrs might help, but we can fine tune later"

This reverts commit 153301384b48c9f33f9e2af3c224241eaeec41c1.

* get size from dict

* what

* add nocapture marker

* clean up

* try to raise logging level

* need to run last as pytest_runtest_call, since it starts capturing

* get capman conditionally

* mark

* type fingerprint

* should use gen_empty_fingerprint

* no longer needed

* draft

* no longer need gc

* clean that up

* test everything!

* more clean up

* more

* no point

* fix that

* fix errors

* bump

* nice even 300 examples for 300 segs

* final bump :fingers_crossed:

* better import order

* remove debugging prints

* warm up kinda works

* Revert "warm up kinda works"

This reverts commit 7fc77b07d592edb13eadca77deb49540954a7d69.

* random seed

* revert

* strat

strat

* add expl comment

* cmt

* check controls allowed

* Revert "check controls allowed"

This reverts commit e82a0e5396810dd4670e6847aa555194a709e10f.

* not unittests

* run tests!

* run tests 2!

* run tests 3!

* seed unused

* revert

* add shrink phase, and remove health check suppression

* hello

* oncemore

* Update selfdrive/car/tests/test_models.py
2023-12-19 03:18:54 -06:00
Justin Newberry
10b3a22897 Add GH project to bounties.md (#30791)
* update bounties

* just replace the link
2023-12-18 17:12:21 -08:00
Adeeb Shihadeh
cee84381f3 Update README.md (#30793)
* Update README.md

* Update README.md

* Update README.md
2023-12-18 17:05:24 -08:00
Adeeb Shihadeh
b0b4ae9c15 run test_fuzzy.py with pytest 2023-12-18 14:38:57 -08:00
Justin Newberry
28eed156e0 Move all fingerprints to fingerprints.py (#30790)
* move fingerpints

* fix circular imports

* fix circular imports

* fix auto fingerprint

* fix those tests

* and controlsd

* add labeler rule

* no defaultdict
2023-12-18 14:04:27 -08:00
Dean Lee
b9080d2362 camerad: zero memory before returning from MemoryManager::alloc (#30781)
* zero memory

* remove redundant memset

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-12-18 13:54:11 -08:00
Dean Lee
ab0b26d2b8 camerad: cleanup includes (#30782)
* cleanup includes

* continue

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-12-17 22:42:52 -08:00
Adeeb Shihadeh
846be323d5 packages cleanup, part two 2023-12-17 16:37:33 -08:00
Adeeb Shihadeh
51a93cf9aa fix unused 2023-12-17 16:32:56 -08:00
royjr
70624ffc81 dependency: remove pycurl package (#30771)
* Update qcomgpsd.py

* Update url_file.py

* remove pycurl

* requests -> urllib3

* unused

* redundant

* fix import

* Revert "requests -> urllib3"

This reverts commit 7ca39e618917986f50356519d2795a432e3a5280.

* headless

* fix trail

* use requests.exceptions.RequestException

* use fp.tell

* fix indents

* reorder imports

* change timeout

* fix debug timing

* remove exception

* add timeout

* missing headers

* move to constructor

* move import

* unused import

* fix debug

* try

* no retries
2023-12-17 16:25:25 -08:00
Adeeb Shihadeh
8c1176ca83 more common/ pruning (#30778) 2023-12-17 11:40:46 -08:00
Andrei Radulescu
b75cdd1542 wifiManager: fix for lteConnectionPath not set on boot (#30517)
Co-authored-by: Justin Newberry <justin@comma.ai>
2023-12-17 11:07:48 -08:00
Adeeb Shihadeh
2c30421b16 move common.window to xx (#30777) 2023-12-17 10:50:45 -08:00
Adeeb Shihadeh
77bafb0708 Bump submodules (#30776)
bump submodules

Co-authored-by: adeebshihadeh <adeebshihadeh@users.noreply.github.com>
2023-12-17 10:43:14 -08:00
Adeeb Shihadeh
1421551297 Cython KF1D to Python (#30773)
* Cython KF1D to Python

* cleanup

* set x

* less nesting

* fix release

* Revert "fix release"

This reverts commit 97e5d0f80405660efb861c7b9df7fbfd5dda5dd9.
2023-12-16 23:45:28 -08:00
Adeeb Shihadeh
7aeefaad65 jenkins: only do replay when relevant files change 2023-12-16 23:35:43 -08:00
Adeeb Shihadeh
a07060b24b common: remove statlog (#30774)
* common: remove statlog

* fix release
2023-12-16 23:33:55 -08:00
Adeeb Shihadeh
4b54c0b3cd better uploader cpu thresholds 2023-12-16 22:37:35 -08:00
Adeeb Shihadeh
2d466e70cd ui: show wifi password by default (#30766)
* ui: show wifi password by default

* update immediately
2023-12-16 22:36:26 -08:00
Adeeb Shihadeh
1346704426 common/file_helpers: remove xx stuff (#30772)
* remove xx stuff

* cleanup
2023-12-16 22:19:50 -08:00
royjr
7f9e41ce2e dependency: remove atomicwrites package (#30769)
* Update file_helpers.py

* remove dependency

* Revert "remove dependency"

This reverts commit e2bd5f4edab7d14b75f65c296631855d886e38d1.

* remove atomicwrites

* allow overwrite

* fix indents

* add type hints

* Update poetry.lock

* optional

* wrap
2023-12-16 21:58:19 -08:00
Adeeb Shihadeh
bc54ed794b remove PyYAML package (#30770)
* remove PyYAML package

* remove those

* add comments back

* fix lock

* fix those
2023-12-16 20:48:57 -08:00
Maxime Desroches
6239cf6780 CI: Close PRs not against master (#30768)
* check branch

* Update labeler.yaml

* Update labeler.yaml

* Update labeler.yaml

* rename

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-16 19:29:45 -08:00
Adeeb Shihadeh
a7828eba3c remove sconscontrib package (#30767)
* remove sconscontrib package

* lock
2023-12-16 19:16:34 -08:00
Adeeb Shihadeh
dfa2e9146f cleanup python dependencies (#30764)
* less

* try to remove that

* little more

* update

* ugh still need this
2023-12-16 18:52:15 -08:00
Dean Lee
ea7e701052 camerad/CameraBuf: remove deprecated rgb_stride (#30758) 2023-12-15 19:48:26 -08:00
Dean Lee
f9ee7bff00 ui: remove unused roadCameraState from submaster (#30757) 2023-12-15 19:32:25 -08:00
Adeeb Shihadeh
cb53e6579f Bump submodules (#30755)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2023-12-15 17:44:54 -08:00
Shane Smiskol
d9a8846d58 test_models: use gen_empty_fingerprint (#30752)
use gen_empty_fingerprint
2023-12-15 17:16:19 -08:00
Shane Smiskol
123ef46af3 Revert "test_models: check consitency between panda and openpilot for velocity (#30750)" (#30753)
This reverts commit 1ca1cf3922.
2023-12-15 17:16:01 -08:00
Justin Newberry
1ca1cf3922 test_models: check consitency between panda and openpilot for velocity (#30750)
* sanity check on velocity

* import from there

* use raw

* just check last

* ignore body

* reduce tolerance and bump panda

* its not average anymore

* slightly higher tolerance
2023-12-15 14:50:37 -08:00
Adeeb Shihadeh
1733b04741 jenkins: always do the copy in safe_checkout 2023-12-14 23:46:25 -08:00
Adeeb Shihadeh
6f143f6c45 full clean for onroad device 2023-12-14 23:00:07 -08:00
Justin Newberry
d6eb1265a0 Docker: cleanup .git and test folders (#30747)
docker cleanup
2023-12-14 22:31:29 -08:00
Adeeb Shihadeh
37351cbdc1 uploader: reduce max qlog/qcam size (#30746) 2023-12-14 22:30:46 -08:00
Adeeb Shihadeh
10ea451831 test_onroad: fix test_log_sizes when running inside a prefix 2023-12-14 22:24:09 -08:00
Justin Newberry
da12a34ff6 Metadrive: set near clip (#30745)
set near
2023-12-14 21:03:02 -08:00
Kacper Rączy
5fe9f1459c metadrive: fix dual_camera mode (#30743)
* Use wide cam in metadrive

* 120 fov
2023-12-14 20:51:06 -08:00
Adeeb Shihadeh
0830f62b36 also run qcomgpsd on path update 2023-12-14 20:44:14 -08:00
Adeeb Shihadeh
2cad6dfa58 jenkins: only run pandad tests when paths change (#30741)
* jenkins: only run pandad when paths changed

* fix

* ugh shadow
2023-12-14 20:41:11 -08:00
royjr
05d5056e8c car docs: remove outdated video link (#30737)
remove outdated link
2023-12-14 20:36:33 -08:00
Adeeb Shihadeh
303f1cf9cf jenkins: run test_onroad in the normal env (#30740) 2023-12-14 19:59:16 -08:00
Justin Newberry
977dd033c4 Simulator: fix safety param (#30738)
fix param
2023-12-14 19:34:06 -08:00
Justin Newberry
23c20bce8f test_athena: remove slow memory leak test (#30734)
way too long
2023-12-14 17:24:47 -08:00
Justin Newberry
5d668701cb CI: move test_maprenderer to GH actions (#30610)
maprenderer to ci
2023-12-14 16:59:28 -08:00
Shane Smiskol
582743fdb5 Use a safety param for gas interceptor (#30719)
* bump

* bump

* space

* remove from boardd

* set flag for honda to pass tests

* migrate

* Update ref_commit

* final bump

* bump cereal

* bump to master
2023-12-14 16:53:22 -08:00
Adeeb Shihadeh
5b909c7d52 Update CONTRIBUTING.md 2023-12-14 14:51:56 -08:00
YassineYousfi
e82d5419a8 remove carla from README (#30731) 2023-12-14 14:43:42 -08:00
Justin Newberry
bd9d5f363d make the main photo link to the comma shop (#30729) 2023-12-14 14:13:11 -08:00
Adeeb Shihadeh
f78e7ed175 jk 2023-12-14 13:59:22 -08:00
Adeeb Shihadeh
f36866c898 better video thumbnails 2023-12-14 13:50:30 -08:00
Adeeb Shihadeh
57b9e75d6d Docs update (#30726)
* update readme

* three videos looks way better

* shorter picture

* even smaller

* Update README.md

* Update README.md
2023-12-14 13:24:48 -08:00
Justin Newberry
075e6ff3e6 Docker: add xvfb (#30727)
add xvfb
2023-12-14 12:46:24 -08:00
Adeeb Shihadeh
b69c71eda9 Update CONTRIBUTING.md 2023-12-14 11:25:09 -08:00
Adeeb Shihadeh
0c24126a6b add comma10k to contributing 2023-12-14 10:42:43 -08:00
Adeeb Shihadeh
2b12a499f7 bump up installer size (#30722) 2023-12-13 21:18:20 -08:00
Adeeb Shihadeh
bd8a99ba28 fix put_nonblocking reference 2023-12-13 20:52:43 -08:00
Dean Lee
b53b505d2e boardd: improve the performance of PandaUsbHandle::list() (#30673)
* improve list performance

* revert test_onroad

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-12-13 20:48:51 -08:00
Dean Lee
3c4c4d1f7f common/params: support nonblocking write (#29808)
* Safe and efficient asynchronous writing parameters

* call putNonBlocking in locationd

* remove space

* ->AsyncWriter

* remove semicolon

* use member function

* asyc write multiple times

* add test case for AsyncWriter

* merge master

* add missing include

* public

* cleanup

* create once

* cleanup

* update that

* explicit waiting

* improve test case

* pass prefix to asywriter

* move to params

* assert(queue.empty())

* add comment

* add todo

* test_power_monitoring: remove patch

* rm laikad.py

* fix import

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-13 20:36:01 -08:00
Jason Wen
fcc671297e torqued: cache bucket points every minute while onroad (#30515)
* torqued: cache bucket points every minute while onroad

* use put_nonblocking

* remove caching on exit

* unused

* more unused

* remove logging
2023-12-13 20:30:33 -08:00
Adeeb Shihadeh
ea94a6d89f athena: cleanup unused methods 2023-12-13 20:27:54 -08:00
Justin Newberry
abe76065a9 update docs 2023-12-13 20:26:51 -08:00
Dean Lee
dbda641cee ui: destroy egl_images in main thread (#30253)
* call eglDestroyImageKHR in ui thread

* assert
2023-12-13 20:18:45 -08:00
Justin Newberry
5f24078a48 Subaru: enable alpha longitudinal for gen1 cars (#30714)
* enable alpha long

* update docs

* added footnote about eyesight

* only for these cars

* add alpha

Co-authored-by: Shane Smiskol <shane@smiskol.com>

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-13 20:17:33 -08:00
Jason Wen
8009b11516 Hyundai CAN-FD: Panda safety config assignments cleanup (#29733)
* Hyundai CAN-FD: Interface small cleanup

* some more

* Do this too

* fix

* cleaner

* use flag

* consolidate

* do it there

* Fix

* hda2 only

* cleaner

* default to False

* in another PR

* lint
2023-12-13 20:15:25 -08:00
Harald Schäfer
8c25741e46 Ford: radar + long control fixups (#28948)
* enable radar

* manual new track

* Don't filter points

* cleanup

* Update radar_interface.py

* This is non-zero in stock

* add speed

* more extreme

* A few more things

* fixes

* cleanup

* revert that

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-13 19:54:06 -08:00
Adeeb Shihadeh
fe24bdc689 read params in a thread 2023-12-13 19:00:22 -08:00
Adeeb Shihadeh
ae85ee0932 fixup can replay for jungle v2 and tres 2023-12-13 17:00:14 -08:00
Dean Lee
33987d4cc9 ui/onroad: avoid drawing invalid lanes and leads (#29666) 2023-12-13 14:51:09 -08:00
Adeeb Shihadeh
2a1403a46b bounties docs (#30718) 2023-12-13 13:57:50 -08:00
Justin Newberry
a3c0e2bd25 CI: add codecov token (#30716)
* add codecov token

* retrigger with token
2023-12-13 11:50:44 -08:00
Isaac
26a67641d2 Ford: Add Mach-E (#30691)
* Update interface.py

* Update values.py

* Update routes.py

* Update override.yaml

* Update selfdrive/car/ford/values.py

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>

* Update interface.py

* order

* only have dongles for these

42f08a29af3699f4
83a4e056c7072678

from https://github.com/commaai/openpilot/pull/30444

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-13 09:05:41 -08:00
Jason Wen
d6465e39bd Hyundai: Car Port for Staria 2023 (#30672)
* Hyundai: Car Port for Staria 2023

* camera scc!

* add test route

* Update RELEASES.md

* Apply suggestions from code review

* bump down max torque

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-13 08:23:10 -08:00
Adeeb Shihadeh
7ca440fe51 ignore tools/ in codecov (#30711) 2023-12-12 23:59:38 -08:00
Shane Smiskol
c4759c0a50 Car docs: fixes (#30710)
* always lower case

* more fixes

* link

* rm ()
2023-12-12 20:41:43 -08:00
Shane Smiskol
77066a2260 Ford: consolidate comments about unsupported hybrid platforms (#30709)
* fix typo, move comments to one place

* -appear

* Update selfdrive/car/ford/carstate.py
2023-12-12 20:37:37 -08:00
Isaac
2192cc170c Ford: Add F-150 Lightning (#30692)
* Update interface.py

* Update values.py

* Update routes.py

* Update override.yaml

* Update values.py

* Update interface.py

* Update selfdrive/car/ford/interface.py

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-12 20:07:59 -08:00
Cone Guy
fb977e45cd Link to setup guide in WORKFLOW.md (#30708)
* Mention dev containers and WSL

* Update WORKFLOW.md

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-12 19:24:36 -08:00
Adeeb Shihadeh
73db7e8e3a Revert "compressed_vipc: fix issues with VisionIpcServer in ZMQ mode (#30115)"
This reverts commit 0e5cfa3426.
2023-12-12 19:16:46 -08:00
Dean Lee
a4179a7c23 encoder: reduce memory allocations and copying (#28704)
* reduce memory allocations and copying

* #include <vector>
2023-12-12 19:15:47 -08:00
Justin Newberry
5d80858a16 cleanup car port docs (#30707)
readme
2023-12-12 18:17:10 -08:00
Justin Newberry
02373fcb05 jenkins: retry docker_build (#30629)
* retry docker build

* retry docker build

* retry docker build

* does this work nicely?

* docker fail!

* Revert "docker fail!"

This reverts commit ab227a1ea37fad3d6413081e4516211b474b0712.
2023-12-12 18:12:19 -08:00
Justin Newberry
93cd19e3a5 jenkins: retry pc setup (#30659)
* retry pc setup

* sleep and retry

* exception

* throw e

* remove force exit

* make a function for it

* remove force exit

* move to top

* separate exception
2023-12-12 17:54:17 -08:00
Justin Newberry
c066fdd7a3 jenkins: remove old root user permission fixes (#30684)
* Batman

* add debug stuff

* Revert that for now

* remove debug stuff
2023-12-12 17:48:03 -08:00
Adeeb Shihadeh
3a97bde863 Update contributing (#30705)
* update

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md

* Update CONTRIBUTING.md
2023-12-12 17:27:42 -08:00
Justin Newberry
595041ffc0 add car porting docs (#30704)
* add car porting docs

* add cabana

* absolute link

* absolute link

* absolute link

* selfdrive/car
2023-12-12 16:40:21 -08:00
Justin Newberry
4f3a186a6f soundd/micd: retry getting stream (#30701)
retry soundd/micd
2023-12-12 15:58:24 -08:00
Yassine
8184186dd3 update release notes 2023-12-12 15:53:15 -08:00
Adeeb Shihadeh
7931561416 workflow docs (#30703)
* start workflow docs

* update

* update

* linter

* update

* update
2023-12-12 15:19:57 -08:00
Kacper Rączy
e62756596b controlsd: require joystick mode param for the body (#30680)
* Update joystick mode in step

* Stop putting the body in joystick mode by default

* Toggle JoystickDebugMode by default for notCars in process_replay

* Remove subsection about web joystick

* Update param only in non-cars

* Make joystickDebug non-static event, and add it in a loop

* Add comment
2023-12-12 14:14:51 -08:00
Kacper Rączy
43e1409fd2 metadrive: fix wasd steer signs (#30623)
* Swap AD signs

* Fix type annotation

* fix user torque

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2023-12-12 14:09:07 -08:00
YassineYousfi
dd54ec9aa8 blue diamond model 💎 (#30504)
* c53b1113-ca16-434f-a3e7-457a36ba98cc/700

* 672ee0a5-0466-420d-be18-0610c5d71b6d/700

* update model replay ref commit
2023-12-12 11:24:04 -08:00
Jason Young
aaff6aebca VW MQB: Add FW for 2020 Škoda Superb (#30699) 2023-12-12 10:57:12 -08:00
Justin Newberry
be33d29d7a Simulator: --simulator is no longer an argument (#30700)
these are also gone
2023-12-12 09:45:34 -08:00
Rabin Karki
a03a931737 HKG: Add FW Versions for Kia Carnival 2022 (#30677)
* HKG: Add FW Versions for Kia Carnival 2022

* 2022

* should

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-12 00:52:36 -08:00
Shane Smiskol
fc0daa9693 Revert "2022"
This reverts commit ad0a882c1c.
2023-12-12 00:51:05 -08:00
Shane Smiskol
ad0a882c1c 2022 2023-12-12 00:50:42 -08:00
Shane Smiskol
1c011e6024 Ford: add CAN FD harness info (#30698)
* add correct harness to f150 and angled mount

* can remove this
2023-12-12 00:45:13 -08:00
Shane Smiskol
b1ecfd55ce Revert "FW query timing test: mock get_data function for timeout" (#30696)
Revert "FW query timing test: mock get_data function for timeout (#29712)"

This reverts commit 4028cb6121.
2023-12-11 22:12:21 -08:00
Dean Lee
62670e66bf camerad/CameraBuf: rename yuv_type to stream_type (#30695) 2023-12-11 21:53:27 -08:00
Justin Newberry
11ec5bf25e Simulator: remove carla (#30690)
* no carla

* no arg and stylize metadrive
2023-12-11 20:38:37 -08:00
Jason Wen
9807bd99db HKG: Car Port for Kia Niro Plug-in Hybrid 2022 (#30576)
* HKG: Car Port for Kia Niro Plug-in Hybrid 2022

* Update CARS.md and add test route

* add to releases

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-11 20:32:36 -08:00
Sparkguys
d2583d64f0 Update values.py for VW Passat MK8 (#30646)
Update values.py

Added FW for Passat MK8
2023-12-11 19:25:55 -08:00
Justin Newberry
4028cb6121 FW query timing test: mock get_data function for timeout (#29712)
* use a mock function to simulate timeout

* Cleanup

* Cleanup

* clean refs

* tolerance can also go down

* fix

* better name

revert refs

* use unittest

* revert

* Revert "use unittest"

This reverts commit 7a1d6a6fc72fa129a66590e0e5998c2438ecbe55.

* order

* local

* use a context

* revert

* stress test it

* let's try

* it's consistent

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-11 19:24:01 -08:00
Justin Newberry
b0831fb117 soundd/micd: increase stream buffer size (#30685)
* increase buffer

* update cpu refs

* go to 100ms

* correct spot
2023-12-11 17:25:37 -08:00
Adeeb Shihadeh
3a70708228 Revert "remove extra sleep", weston is fixed but a couple other things relied on this
This reverts commit d2d4802ad0.
2023-12-11 16:21:19 -08:00
Lukejb14
76c53e4742 Add 2021 Mazda CX-5 engine fingerprint (#30616) 2023-12-11 15:41:51 -08:00
Kacper Rączy
8049731553 run_process_on_route: qlog and fingerprint options (#30688)
Add --qlog and --fingerprint options for run_process_on_route
2023-12-11 15:38:59 -08:00
Justin Newberry
7b5d4d031a Revert "Process Replay: move to pytest (#30260)" (#30687)
This reverts commit 90c873ab1d.
2023-12-11 14:46:56 -08:00
Adeeb Shihadeh
5a518243dd Bump submodules (#30682)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2023-12-11 09:28:47 -08:00
royjr
84a3b10da9 cabana: fix typo (#30678) 2023-12-10 16:46:41 -08:00
Dean Lee
48cf7eb6d9 ui/driverview: inherit from CameraWidget (#29769)
* refactor DriverViewWidow to inherit from CameraWidget

* emit done on visible

* merge master

* cleanup

* lock_guard

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-12-10 12:12:27 -08:00
Adeeb Shihadeh
702c4392a4 three way merge 2023-12-10 12:10:40 -08:00
Adeeb Shihadeh
3831bf19e4 remove Qt wrapper scripts (#30454)
* remove Qt wrapper scripts

* revert those
2023-12-10 11:45:35 -08:00
Adeeb Shihadeh
f09ee083a2 helper script for fixing up repo size (#30028)
* small

* mv
2023-12-10 11:33:40 -08:00
Dean Lee
13e5e708c2 boardd: cleanup includes (#30674)
cleanup includes

Co-authored-by: Comma Device <device@comma.ai>
2023-12-10 09:18:44 -08:00
Shane Smiskol
86ab1dca18 bump 2023-12-09 17:37:48 -08:00
Jason Wen
63bf098017 Hyundai CAN-FD Longitudinal: Enable for ICE camera-SCC cars (non-HDA2) (#30034)
* Hyundai CAN-FD Longitudinal: Enable for all camera-based SCC platforms (non-HDA2)

* allow ice camera scc longitudinal

* allow ice camera scc longitudinal

* Update docs

* Merge commaai#30021

* Update CARS.md

* revert unrelated changes

* add test route

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-09 17:36:34 -08:00
Shane Smiskol
e03f1282a8 bump panda (#30670) 2023-12-09 17:13:36 -08:00
Shane Smiskol
b3908e3c82 Volkswagen: update MY for Tiguan 2023-12-09 15:05:06 -08:00
hodgiers
dd034bbfb7 Volkswagen: Tiguan R-Line 2024 Fingerprint (#30605)
* Update values.py

2024 Tiguan R Line

* Update values.py

Removed extraneous text

* already here

* Update values.py

Updating model year for Volkswagen Tiguan to include 2024.

* Update values.py

Correcting Tiguan fingerprint values

* Apply suggestions from code review

* Update selfdrive/car/volkswagen/values.py

---------

Co-authored-by: Hodge <rhodge@Hodge-MBP.local>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-09 15:04:27 -08:00
hanyiabc
5051ff0b84 Added fingerprint for 22 Kia Stinger KIA_STINGER_2022 (#30589)
* added fingerprint for my 22 kia stinger

* Apply suggestions from code review

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-09 14:46:40 -08:00
TerryWloch
6d9629b0e1 VW: add missing FW for Skoda Kodiaq 2017 (#30665)
* Update values.py

Added FingerPrint for my Skoda Kodiaq 2017 14. tsi DSG 4x4

* Apply suggestions from code review

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-09 14:35:15 -08:00
Shane Smiskol
ac83318ac4 test_models: randomize internal segment list (#30653)
* randomize internal seg list segments

* random

* pytest-randomly sets random.seed to a consistent value for all the workers/processes

* noeol

* update

* Revert "update"

This reverts commit aff9a69c4e5e3934deebaa33986b42f44b55b002.

* lock

* don't randomize by default

* remove random-order

* strict

* random

* one fix

* test

* does nothing

* rm tests

* Revert "rm tests"

This reverts commit b548e3fcd48e60538695506888d863c01b459d27.

* (can't repro locally) just athena should be fine

* bs1

* bs2

* bs3

* bs4

* bs5

* wrong way

* no controls

* no car

* no board

* controls?

* crazy -common

* Revert "crazy -common"

This reverts commit 02365d712b3d09cab1893cce2261a4b418bb3851.

* test athena

* test athena 2

* test athena 3

* test athena 4

* test athena 5

* test athena 6

* test athena 7

* test athena 8

* test athena 9

* ??

* in one commit

* common?

* car and board

* -controls -board

* random-order

* no board

* revert

* car/tests

* least likely

* try

* try 2

* draft

* draft

* so much better

* cmt

* use randomly

* not needed here

* directly modify option works

* bb

* test time

* Revert "test time"

This reverts commit 2c5caabe2b470b47b7322e37800680b92773fccc.

* tmut

* i concur

* revert
2023-12-09 14:28:32 -08:00
Shane Smiskol
97da129e11 ruff: check newline (#30668)
* check newline

* nothing catches this
2023-12-09 13:24:18 -08:00
Dean Lee
aa744e8437 cabana: cleanp code (#30666) 2023-12-09 08:12:11 -08:00
Dean Lee
8a530621b4 camerad: Remove deprecated 'fps' parameter (#30662)
remove parameter fps
2023-12-09 08:10:53 -08:00
Shane Smiskol
2afff9a0cb athena tests: patch instead of juggling function (#30664)
patch instead of juggling function
2023-12-09 05:06:30 -08:00
Shane Smiskol
90c2aee6c3 athenad: use socket constant (#30663)
Update athenad.py
2023-12-09 04:53:15 -08:00
Shane Smiskol
e78b80c8fe jenkins: run all car tests with one command (#30661)
* run all jenkins car tests in one script, less down time?

* fix

* speed up

* u
2023-12-08 22:15:27 -08:00
Shane Smiskol
17d71d2829 test_athena: remove no-op line (#30660)
* test

* Update selfdrive/athena/tests/test_athenad.py
2023-12-08 21:40:15 -08:00
Justin Newberry
bc70c94f75 soundd/micd: more robust setup procedure (#30640)
* just use the default device :/

* Ruff

* this seems like the most reliable way

* Ruff

* move comments too

* wait for devices

* fix that

* and that

* ruff

* add logging for avaliable devices

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-12-08 17:59:31 -08:00
Adeeb Shihadeh
e909f634f5 Bump submodules (#30655)
bump submodules

Co-authored-by: sshane <sshane@users.noreply.github.com>
2023-12-08 16:44:07 -08:00
Adeeb Shihadeh
371c1366d4 bump cereal 2023-12-08 16:34:23 -08:00
Justin Newberry
bb9dda9764 simulator: set valid flags (#30656)
sim set valid
2023-12-08 16:31:30 -08:00
Dean Lee
ea0b8920f5 camerad: remove camera_id (#30654)
* remove camera_id

* use variable
2023-12-08 16:15:58 -08:00
Shane Smiskol
bf4026ed7e Toyota: enable LTA (#30109)
* bump panda

* enable lta

* try upper/lower delay similar to longcontrol lag comp

* add comment about eps torque rate limits

* more clear

* more clear

* Revert "try upper/lower delay similar to longcontrol lag comp"

This reverts commit 8e85333ee6e2456fcda076af4c31a9e9babbc897.

* bump

* no driver torque limiting to test

* fix the setme_x3

* bump

* bump

* enable inactive safety

* use vEgoRaw

* rename

* fix

* some comments/organization

* bump

* docs

* no corolla

* shorter name

* bump

* bump

* add to releases

* bump panda

* remove camry

* bump

* bump

* rm

* bump

* bump

* bump again

* bump
2023-12-08 15:31:10 -08:00
Dean Lee
21d5d7d07a camerad: move ar0231_register_lut to AR0231 (#30652) 2023-12-08 14:57:29 -08:00
Adeeb Shihadeh
80bc5833e7 remove common/xattr.py 2023-12-08 14:44:39 -08:00
Dean Lee
fb2f2d9cb2 camerad: c++ sensorInfo (#30650)
* move remaining sensor parameters to CameraInfo

* same order

* member functions

* fix segfault
2023-12-08 14:27:28 -08:00
Dean Lee
011b1a6e6a ui/ParamControl: do not create ConfirmationDialog on every click (#30496) 2023-12-08 13:48:31 -08:00
Dean Lee
8fdcddec8a camerad: define the constants directly in ctor (#30651) 2023-12-08 13:01:41 -08:00
Adeeb Shihadeh
e757d9bae7 camerad: renames (#30649)
* sensorinfo

* drop the camera
2023-12-08 11:39:40 -08:00
Adeeb Shihadeh
2590cf8615 update plannerd cpu usage 2023-12-08 11:39:30 -08:00
Dean Lee
ef262ff9eb camerad: move sensor related code to /sensors (#30647) 2023-12-08 11:19:10 -08:00
Dean Lee
51328609d2 camerad: refactor sensor parameters to struct (#30644)
* refactor camerainfo

* include <memory>
2023-12-08 00:01:16 -08:00
Dean Lee
9bff8ccd0f camerad: fix use of uninitialized CameraInfo in camera_open() (#30642) 2023-12-07 20:11:44 -08:00
Shane Smiskol
49317e3903 Ford: add Explorer 2020 FW (#30638)
* 49cead668ca2ac46

* docs

* b18d8435f1460528
2023-12-07 16:37:59 -08:00
Adeeb Shihadeh
0586f86ad0 Revert "camerad: refactor sensor parameters to struct (#30639)"
This reverts commit a70911d639.
2023-12-07 16:21:16 -08:00
Dean Lee
a70911d639 camerad: refactor sensor parameters to struct (#30639)
* refactor camerainfo

* include <memory>
2023-12-07 16:06:55 -08:00
Dean Lee
bdf868ddc2 camerad: split sensor_ic2.h (#30641)
* split sensor_ic2.h

* move start_reg,stop_reg
2023-12-07 15:45:49 -08:00
Dean Lee
ecfe201a57 camerad: move AR0231 functions to camera_ar0231.cc (#30635)
* move AR0231 functions to camera_ar0231.cc

* move to sensors/aro231.cc
2023-12-07 11:48:17 -08:00
Shane Smiskol
1cd7b04e6f Ford: add Explorer 2023 FW (#30637)
* 49cead668ca2ac46

* docs
2023-12-07 11:37:18 -08:00
Kacper Rączy
7f07f47302 locationd: disable locationd temporary error alert on the body (#30608)
* Disable locationd temporary error alert on the body

* Disable locationd/paramsd/planner alerts on body with joystick mode

* joystick_enabled param not joystick_mode
2023-12-07 10:53:33 -08:00
Dean Lee
8bf78399e2 sensor2_i2c.h: add #pragma once (#30636) 2023-12-07 10:21:14 -08:00
Adeeb Shihadeh
2f2b9c782e qcomgpsd: retry quectel setup (#30632) 2023-12-06 20:56:20 -08:00
Adeeb Shihadeh
51fa7b227a qcomgpsd: move retry logic to a decorator (#30633)
* qcomgpsd: move retry logic to a decorator

* make that same

* fix

* fix that
2023-12-06 19:55:27 -08:00
Adeeb Shihadeh
35f819c823 swaglog.py goes in common/ (#30631)
* swaglog.py goes in common/

* all of these go in release

* we'll even include the pyx
2023-12-06 17:27:51 -08:00
Justin Newberry
36bebb1aa0 jenkins: retry build_devel (#30628)
* will it work

* retry build devel

* correct p[ath

* try a failure

* Revert "try a failure"

This reverts commit ba4e6a0a2096b94887fcfbf7d011e34aa2a16c41.
2023-12-06 17:22:32 -08:00
Justin Newberry
f16df8e4b7 pytest: group test_models by route instead of car name (#30625)
* group by route

* dont need those
2023-12-06 16:00:59 -08:00
Justin Newberry
3777bf7fb9 jenkins: disable xdist on tici (#30624)
to preserve it
2023-12-06 15:51:29 -08:00
Justin Newberry
9dc8ecf722 ruff: ignore teleoprtc repo (#30627)
ignore it
2023-12-06 15:33:17 -08:00
Adeeb Shihadeh
492ba68cfc Update RELEASES.md 2023-12-06 15:32:46 -08:00
Justin Newberry
5600a82889 Soundd: only update ambient db when not playing an alert (#30620)
* move to soundd + only when quiet

* not filtered
2023-12-06 14:59:16 -08:00
Justin Newberry
31ab43ce41 jenkins: remove pytest tici conf (#30621)
* remove pytest conf

* remove that too
2023-12-06 11:13:22 -08:00
Greg Hogan
db35dcd0b5 replace common.file_helpers.mkdirs_exists_ok with python os.makedirs funtion (#30618)
replace common.file_helpers.mkdirs_exists_ok with python os.makedirs function
2023-12-06 09:55:29 -08:00
Adeeb Shihadeh
3985103974 update mapsd cpu usage 2023-12-05 21:32:55 -08:00
Adeeb Shihadeh
3b89c5fe29 agnos 9 (#30543)
* agnos 9

* new build

* update

* Soundd: use alsa (#30617)

* update release notes

* agnos does this now

* prod manifest

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2023-12-05 21:17:49 -08:00
Shane Smiskol
67d6186bbd Toyota: LTA unit test (#30613)
LTA unit test
2023-12-05 19:24:28 -08:00
Justin Newberry
abe39e5076 Soundd: move to python (#30567)
soundd python
2023-12-05 18:10:01 -08:00
Justin Newberry
f32e3ae799 Docker: pull image before building (#30614)
* pin to a specific version

* pull latest version

* dont need version debug
2023-12-05 15:48:26 -08:00
Kacper Rączy
7948a61b0e bodyteleop: toggle joystick debug mode (#30611)
* Enable joystick debug mode in web

* Remove mutable vals

* Rename thread back to main
2023-12-05 15:00:05 -08:00
Kacper Rączy
6c62a31466 joystickd: remove WEB (#30612)
Remove WEB option from joystickd
2023-12-05 14:42:44 -08:00
Justin Newberry
56b8a1a5db pytest: add durations to tici (#30609)
add durations to tici
2023-12-05 12:24:03 -08:00
Kacper Rączy
f46f00b373 webrtcd: endpoint for message schema retrieval vol. 2 (#30607)
* webrtcd: endpoint for message schema retrieval (#30578)

* Capnp json schema conversion

* Schema get endpoint

* Type annotation for generate_field

* Filter empty services

* Add schema.py to release
2023-12-04 23:51:52 -08:00
Shane Smiskol
2ae7d99143 Revert "webrtcd: endpoint for message schema retrieval" (#30606)
Revert "webrtcd: endpoint for message schema retrieval (#30578)"

This reverts commit 10eb70daf7.
2023-12-04 22:59:35 -08:00
Shane Smiskol
09a9ba6de1 joystick: bump max angle (#30602) 2023-12-04 21:16:33 -08:00
Shane Smiskol
3fed87dbb7 Toyota: rename LTA torque wind down signal (#30603)
* bump

* rename

* bump
2023-12-04 21:16:12 -08:00
Kacper Rączy
10eb70daf7 webrtcd: endpoint for message schema retrieval (#30578)
* Capnp json schema conversion

* Schema get endpoint

* Type annotation for generate_field

* Filter empty services
2023-12-04 20:43:19 -08:00
Kacper Rączy
6a354ddab7 webrtcd: stop cereal proxy runner when data channel is closed (#30601)
Stop the proxy when channel reaches invalid state
2023-12-04 19:14:11 -08:00
Dean Lee
33ee7530b3 cabana: add test case for parsing all opendbc files (#30584)
* test opendbc files

* bump opendbc

* bump opendbc

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-04 17:12:22 -08:00
Adeeb Shihadeh
36ccbc8bbe Bump submodules (#30596)
bump submodules

Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2023-12-04 17:02:48 -08:00
Adeeb Shihadeh
99d51bf02c Revert "Simplify passive mode handling (#30593)" 2023-12-04 15:05:05 -08:00
Justin Newberry
05e932b088 Fix passive mode (#30600)
remove passive
2023-12-04 13:58:43 -08:00
Adeeb Shihadeh
ce4bac8218 remove unused last_actuators arg from lateral controllers (#30595) 2023-12-03 15:54:18 -08:00
Adeeb Shihadeh
bd0ab957b1 add carParams.passive (#30594) 2023-12-03 14:09:37 -08:00
Adeeb Shihadeh
5ccff25d88 Simplify passive mode handling (#30593)
* simplify passive handling

* makes more sense
2023-12-03 13:59:59 -08:00
Adeeb Shihadeh
a1d36961cf new msgs default to invalid (#30587)
* new msgs default to invalid

* fix lm

* set more valid

* update rest

* update refs

* fix logMessage

* more valids

* cleanup

* fix llk test

* pigeond is also valid

* more valids
2023-12-03 10:50:17 -08:00
Adeeb Shihadeh
a2b48efa20 process replay: check valid flag (#30588) 2023-12-02 10:47:08 -08:00
Adeeb Shihadeh
8971e2c177 longitudinal tests: cleanup old hacks (#30585) 2023-12-02 10:01:28 -08:00
Adeeb Shihadeh
c028688a65 bump cereal (#30582)
* bump cereal

* fix dmonitoringd

* update refs

* update refs
2023-12-02 01:16:07 -08:00
Adeeb Shihadeh
531e62fc03 clear non-release params on startup (#30583) 2023-12-01 23:57:54 -08:00
Adeeb Shihadeh
b97e5b0e03 rename carEvents -> onroadEvents (#30577)
* rename carEvents -> onroadEvents

* bump cereal

* bump cereal
2023-12-01 22:48:29 -08:00
Adeeb Shihadeh
8e00ce672d controlsd: remove old process replay sentinel (#30581) 2023-12-01 22:42:43 -08:00
Shane Smiskol
54517c0638 Toyota: LTA cleanup (#30579)
* have been running this for a few weeks: good

* set setme_x3 closer to stock

* add comment to values about additional EPS torque rate safety

* rename some variables

* should use vEgoRaw here to match panda!

* switch

* more notes

* specify

* smaller

* for

* oof
2023-12-01 22:27:29 -08:00
Kacper Rączy
f058b5d64e webrtcd: webrtc streaming server (audio/video/cereal) (#30186)
* WebRTCClient and WebRTCServer abstractions

* webrtc client implementation

* Interactive test scripts

* Send localDescriptions as offer/asnwer, as they are different

* Tracks need to be added after setting remote description for multi-cam streaming to work

* Remove WebRTCStreamingMetadata

* Wait for tracks

* Move stuff to separate files, rename some things

* Refactor everything, create WebRTCStreamBuilder for both offer and answers

* ta flight done time to grind

* wait for incoming tracks and channels

* Dummy track and frame reader track. Fix timing.

* dt based on camera type

* first trial of the new api

* Fix audio track

* methods for checking for incoming tracks

* Web migration part 2

* Fixes for stream api

* use rtc description for web.py

* experimental cereal proxy

* remove old code from bodyav

* fix is_started

* serialize session description

* fix audio

* messaging channel wrapper

* fix audiotrack

* h264 codec preference

* Add codec preference to tracks

* override sdp codecs

* add logging

* Move cli stuff to separate file

* slight cleanup

* Fix audio track

* create codec_mime inside force_codec function

* fix incoming media estimation

* move builders to __init__

* stream updates following builders

* Update example script

* web.py support for new builder

* web speaker fixes

* StreamingMediaInfo API

* Move things around

* should_add_data_channel rename

* is_connected_and_ready

* fix linter errors

* make cli executable

* remove dumb comments

* logging support

* fix parse_info_from_offer

* improve type annotations

* satisfy linters

* Support for waiting for disconnection

* Split device tracks into video/audio files. Move audio speaker to audio.py

* default dt for dummy video track

* Fix cli

* new speaker fixes

* Remove almost all functionality from web.py

* webrtcd

* continue refactoring web.py

* after handling joystick reset in controlsd with #30409, controls are not necessary anymore

* ping endpoint

* Update js files to at least support what worked previously

* Fixes after some tests on the body

* Streaming fixes

* Remove the use of WebRTCStreamBuilder. Subclass use is now required

* Add todo

* delete all streams on shutdown

* Replace lastPing with lastChannelMessageTime

* Update ping text only if rtc is still on

* That should affect the chart too

* Fix paths in web

* use protocol in SSLContext

* remove warnings since aiortc is not used directly anymore

* check if task is done in stop

* remove channel handler wrapper, since theres only one channel

* Move things around

* Moved webrtc abstractions to separate repository

* Moved webrtcd to tools/webrtc

* Update imports

* Add bodyrtc as dependency

* Add webrtcd to process_config

* Remove usage of DummyVideoStreamTrack

* Add main to webrtcd

* Move webrtcd to system

* Fix imports

* Move cereal proxy logic outside of runner

* Incoming proxy abstractions

* Add some tests

* Make it executable

* Fix process config

* Fix imports

* Additional tests. Add tests to pyproject.toml

* Update poetry lock

* New line

* Bump aiortc to 1.6.0

* Added teleoprtc_repo as submodule, and linked its source dir

* Add init file to webrtc module

* Handle aiortc warnings

* Ignore deprecation warnings

* Ignore resource warning too

* Ignore the warnings

* find free port for test_webrtcd

* Start process inside the test case

* random sleep test

* test 2

* Test endpoint function instead

* Update comment

* Add system/webrtc to release

* default arguments for body fields

* Add teleoprtc to release

* Bump teleoprtc

* Exclude teleoprtc from static analysis

* Use separate event loop for stream session tests
2023-12-01 21:13:37 -08:00
Adeeb Shihadeh
e34ee43eea camerad cleanup (#30573)
* misc cleanup

* rm those

* rm utils

* fix build

* rm pool

* little more

* goodbye imgproc
2023-12-01 20:10:07 -08:00
Adeeb Shihadeh
5dba9187e5 CI: speedup docs build (#30574) 2023-12-01 19:55:27 -08:00
Hoya
169132c6cc Hyundai: add FW for 2019 AZERA_HEV_6TH_GEN (#30548)
* added AZERA_HEV_5TH_GEN (2019)

* Update values.py

* Update interface.py

* Update values.py

* Update hyundaican.py

* Update hyundaican.py

* Update interface.py

* Update values.py

* one line

* didnt see harness change

* Update selfdrive/car/hyundai/values.py

* docs

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-12-01 14:59:49 -08:00
Adeeb Shihadeh
afd5877be8 bump model unit test timeout 2023-11-30 21:48:11 -08:00
Dean Lee
d87191c1c1 cabana: fix missing opendbc files (#30555)
* fix missing dbc files

* remove suffix
2023-11-30 20:46:31 -08:00
Shane Smiskol
e687be939e FW fingerprinting timing: fix refs (#30566) 2023-11-30 16:36:20 -08:00
Adeeb Shihadeh
6ac75e492a bump panda (#30563) 2023-11-30 15:28:46 -08:00
Adeeb Shihadeh
613ccf4b74 falsify rx checks (#30564) 2023-11-30 14:53:33 -08:00
Greg Hogan
7e0f0165f4 replay: get api url from env var (#30562) 2023-11-30 10:42:18 -08:00
Justin Newberry
4086795c29 Pytest: more post-test path cleanup (#30556)
* test cleanup

* missed this one

* remove that

* static class
2023-11-30 09:55:48 -08:00
Justin Newberry
b1e2e0f565 Revert "Subaru: log eyesight fault as a cruise fault" (#30560) 2023-11-30 07:57:29 -08:00
Justin Newberry
a2bb41e0ec Subaru: non-obd FW queries logging (#30552)
* add subaru logging fw

* whitelist + comma

* whitelist is empty for the other requests

* all whitelisted
2023-11-29 17:47:09 -08:00
Justin Newberry
44ef143ae7 Subaru: add 2023 forester (#30554)
23
2023-11-29 14:53:43 -08:00
Shane Smiskol
4f8a232382 Car docs: add '19-'20 Santa Fe video (#30553)
* Add '19-'20 Santa Fe video

Add link to YouTube video for 2019-2020 Hyundai Santa Fe

* update docs

---------

Co-authored-by: Steve J <easternpa@gmail.com>
2023-11-29 14:27:37 -08:00
ebo2k
e61ea66415 Ford: add missing engine FW for Bronco Sport 2021 (#30483)
Update values.py

Updated to have correct engine firmware
2023-11-29 14:26:20 -08:00
DriftedPrism
dcbff66f0c Kia: add missing fwdCamea FW for Sorento PHEV 4th gen (#30526)
* Update values.py

Adding Ecus for KIA Sorento PHEV 4th gen

* Update values.py

added fwdCamera version

* fix

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-29 14:16:17 -08:00
Justin Newberry
9634e7b8af Subaru: log eyesight fault as a cruise fault (#30546)
log cruise fault
2023-11-29 12:55:52 -08:00
Vivek Aithal
573db49deb torqued: Update HYUNDAI TUCSON 4TH GEN offline values (#30513)
* update tucson offline values

* modify params, compute max accel
2023-11-28 15:10:30 -08:00
Shane Smiskol
2e45a7c2fd Toyota: add test route for 2023 RAV4 (#30465)
* test rav4 2023 (stripped)

* don't use initData, remove relay malfunction tolerance!

* all passes!

* some clean up

* more

* uncomment

* rm line

* remove ignore_addr_checks_valid

* right

* some changes for stripping data

* clean up

* check exist

* shouldn't be possible

* should be success if here

* no delete

* ""

* rm

* rm

* cleanup

* one list comp

* more clear

* not used

* add back legit source

* clean up

* copy files we don't need to strip (need sas to copy between accounts)

* default to strip

* revert
2023-11-28 14:55:03 -08:00
Keen-coffee
c56c8a719c Add 2022 Maverick engine and abs fingerprint (#30467) 2023-11-28 14:40:04 -08:00
Justin Newberry
5030824572 jenkins auto cpu count (#30544)
* auto cpu

* build too

* need bash
2023-11-28 14:34:00 -08:00
Vincent Wright
0b41d1c6e8 Chrysler: add Ram HD 2500 2024 FW versions (#30505)
* New Ram HD firmwares. Dongle ID is 0f88f104416b674a.

* docs

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-28 14:17:20 -08:00
Hoya
a7d3eb87c7 Kia: Add missing fwdCamera for KIA_CARNIVAL_4TH_GEN (#30540)
* Update values.py

Dongle ID : f9ec55916091ba61

RouteName : f9ec55916091ba61_2023-11-28--13-53-02

KIA_CARNIVAL_4TH_GEN finger need to be added 

Thanks

* Update values.py

* Update values.py

* Update values.py

* Update values.py

* Update values.py

* Update selfdrive/car/hyundai/values.py

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-28 14:01:00 -08:00
Adeeb Shihadeh
07e75c7cb8 athena: remove primeActivated endpoint (#30542) 2023-11-28 11:43:01 -08:00
Jason Young
2f5c0bd016 JEEP_CHEROKEE -> JEEP_GRAND_CHEROKEE (#30539) 2023-11-27 18:19:03 -08:00
Justin Newberry
7a387962c6 CI: automatically create PR for submodule bump (#30538)
* add job

* add job (#52)

* add body

* Bump submodules (#53)

* add job

* add body

* add .

* rm that

* need submodules too

* better message

* monday at 4am

* i thought i was still est lol
2023-11-27 17:09:32 -08:00
Adeeb Shihadeh
749d192f54 bump panda 2023-11-27 16:36:26 -08:00
Adeeb Shihadeh
d2d4802ad0 remove extra sleep on startup 2023-11-27 14:57:40 -08:00
Adeeb Shihadeh
ae4e848285 Update Python packages and pre-commit hooks (#30534)
Co-authored-by: jnewb1 <jnewb1@users.noreply.github.com>
2023-11-27 09:57:37 -08:00
Adeeb Shihadeh
e0ab068273 Revert "CI: automatically create PR to bump submodules (#30523)"
This reverts commit 6f073aed5f.
2023-11-27 09:40:37 -08:00
Adeeb Shihadeh
6f2af97381 Bump submodules (#30533)
bump submodules

Co-authored-by: sshane <sshane@users.noreply.github.com>
2023-11-27 01:18:27 -06:00
Adeeb Shihadeh
eb3833037f Update Python packages and pre-commit hooks (#30529) 2023-11-26 09:31:20 -08:00
Adeeb Shihadeh
1d0538bdef Bump submodules (#30528) 2023-11-26 09:31:08 -08:00
Justin Newberry
6f073aed5f CI: automatically create PR to bump submodules (#30523) 2023-11-26 08:27:25 -08:00
Adeeb Shihadeh
e25f788318 bump panda (#30519) 2023-11-25 11:47:04 -08:00
Justin Newberry
4b0d0b0f1e cleanup cameraview shader (#30520)
cleanup shader

Co-authored-by: Comma Device <device@comma.ai>
2023-11-24 20:17:51 -08:00
Justin Newberry
f845c69b43 Subaru: ignore eyesight faults when openpilot is controlling long (#30390)
ignore eyesight faults
2023-11-23 11:10:44 -08:00
Justin Newberry
8d3bf1f41a Pytest: add cpp harness (#30471)
cpp harness
2023-11-22 13:45:49 -08:00
Kacper Rączy
f65e6bc30e locationd: remove models unused in openpilot (#30481)
* Remove filters used exclusively by xx

* Update SConstruct

* Remove from release

* Accomodate rednose build changes

* Update rednose ref

* rednose/helpers in rpath

* Add rednose_filters to files_common

* Change rednose_root

* Copy rednose site_scons to docker images

* Remove rednose from rpath

* Bump rednose

* Bump rednose

* Bump rednose
2023-11-22 13:25:29 -08:00
Justin Newberry
7f14bdfb22 allow onscreen cpu rendering (#30510)
* spinner POC cpu

* should be single threaded

* how tf did that get added

* allow non offscreen

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-11-22 12:44:32 -08:00
Adeeb Shihadeh
2a55ff4f55 Update Python packages and pre-commit hooks (#30509)
Co-authored-by: adeebshihadeh <adeebshihadeh@users.noreply.github.com>
2023-11-21 11:50:35 -08:00
Harald Schäfer
8e88366955 Qcomgpsd: Dont use system timezone (#30508) 2023-11-21 11:12:39 -08:00
Adeeb Shihadeh
afd61352d0 bump panda (#30501)
* bump panda

* bump

* bump

* fix renamed variables

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-20 14:45:51 -08:00
Justin Newberry
7a4a8c9a4a update profiler docs again (#30503)
update SD docs again
2023-11-20 13:30:16 -08:00
Justin Newberry
631691c212 SDProfiler: update readme (#30479)
* update instructions

* fix that

* and that too
2023-11-20 10:56:50 -08:00
Adeeb Shihadeh
31ef352234 CI: manage stale PRs (#29367)
* CI: manage stale PRs

* before_close

* rename to ignore stale

* no push

* prod mode!

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2023-11-18 23:31:33 -08:00
Adeeb Shihadeh
4cae08e636 rename rawgpsd to qcomgpsd (#30493)
* rename rawgpsd to qcomgpsd

* fix more paths

* that moved

* forgot the d
2023-11-18 23:23:16 -08:00
DevTekVE
2a9986d948 [cabana] fix clang17 warning (#30490)
[cabana] Improve signal timing calculation in findsingal.cc

The variables `first_sec` and `last_sec` have been separately initialized first before being used in `std::minmax` for signal timings. This resolves compilation warnings and potential risks of using temporary values of these variables.
2023-11-18 23:05:10 -08:00
Logan Lasiter
5b2bcf6bf2 adding --local-partial-types mypy opt (#30491) 2023-11-18 22:47:11 -08:00
Dean Lee
335237aea0 modeld: remove modeldata.h (#30423)
* remove modeldata.h

* remove TRAJECTORY_SIZE
2023-11-18 22:45:26 -08:00
Adeeb Shihadeh
c055fdc853 one more 2023-11-18 22:22:31 -08:00
Adeeb Shihadeh
3d36a0f70d rm old loggerd debug scripts 2023-11-18 22:20:10 -08:00
Dean Lee
17cab9bb50 ui/controls.cc: fix QLabel leak (#30382)
fix QLabel leak
2023-11-18 22:14:05 -08:00
Dean Lee
c5f73a748e replay: support for setting a custom playback speed (#30462)
* support for setting a custom playback speed

* rename to playback speed
2023-11-18 22:12:35 -08:00
Dean Lee
3527c1da67 loggerd: c++ LoggerState (#25869)
* c++ LoggerState

* trigger ci

* trigger ci

* merge master

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
2023-11-18 22:11:13 -08:00
Adeeb Shihadeh
99fbd4b150 updated: wait 1m before first cycle (#30492) 2023-11-18 21:55:56 -08:00
Adeeb Shihadeh
fa353401f4 bump to 0.9.6 2023-11-17 18:44:05 -08:00
Adeeb Shihadeh
d3aad9ca46 esim is metered (#30486)
* esim is metered

* it's an enum

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-11-17 15:29:52 -08:00
DevTekVE
05e4d908df Enhance SConstruct by enabling arbitrary compiler flags (#30484)
* Update SConstruct allow no-inline

Allows disabling inline functions when compiling to help with the debugging process

* Update SConstruct

typos

* Update SConstruct
2023-11-17 13:53:16 -08:00
Adeeb Shihadeh
3b1e9017c5 Update RELEASES.md 2023-11-16 19:17:36 -08:00
Adeeb Shihadeh
460d9af5b7 more esim config (#30480)
* load single conn

* high priority

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-11-16 19:12:36 -08:00
Adeeb Shihadeh
e6e073d099 Revert "tici: use BASEDIR to lookup nm connection path"
This reverts commit 30ab9f8482.
2023-11-16 14:20:55 -08:00
Adeeb Shihadeh
30ab9f8482 tici: use BASEDIR to lookup nm connection path 2023-11-16 14:19:02 -08:00
Dean Lee
3d9f394533 cabana: update message count after filtering (#30461)
update message count after filtering
2023-11-15 23:43:59 -08:00
Shane Smiskol
c2af245b85 CI: use azure-storage-blob for uploading (#30478)
* use azure-storage-blob

* fix pattern

* nsp
2023-11-15 21:22:14 -08:00
Shane Smiskol
0addee2b4b openpilot CI: fix azure bucket names (#30477)
fix azure bucket names
2023-11-15 21:15:10 -08:00
Adeeb Shihadeh
9cd60de0b9 we don't go in the release notes 2023-11-15 19:56:02 -08:00
Shane Smiskol
fc8cfe1280 test_models: check if in relay-breaking safety mode (#30476)
* remove initData, remove tolerance

* can check faster now

* don't
2023-11-15 18:57:37 -08:00
Shane Smiskol
e44d84a7f9 test_models: remove ignored address check list (#30475)
* remove ignore_addr_checks_valid

* lessgoooo
2023-11-15 18:50:39 -08:00
Justin Newberry
291c04163a CI: disable registry caching (#30474)
* Revert "CI: separate image for docker cache (#30413)"

This reverts commit 361ffb5e54.

* Revert "CI: enable buildx for registry cache (#30473)"

This reverts commit edf90f3e76.
2023-11-15 18:21:57 -08:00
Justin Newberry
edf90f3e76 CI: enable buildx for registry cache (#30473)
* just registry cache

* enable buildx
2023-11-15 17:53:00 -08:00
Justin Newberry
361ffb5e54 CI: separate image for docker cache (#30413)
just registry cache
2023-11-15 17:48:43 -08:00
Adeeb Shihadeh
0f0acc190b ui: add purple prime def 2023-11-15 17:04:07 -08:00
Justin Newberry
ba3067a560 Revert "Pytest: run tests in random order" (#30469)
Revert "Pytest: run tests in random order (#30134)"

This reverts commit a5d99e0ebb.
2023-11-15 10:41:11 -08:00
Justin Newberry
a5d99e0ebb Pytest: run tests in random order (#30134)
* enable random order

* logprint info

* revert that

* better logging

* go to dfu

* try to flash every panda if not up to date

* revert panda debugging
2023-11-15 10:16:51 -08:00
Kacper Rączy
2de13bea91 Remove laika submodule (#30453)
* Remove laika submodule

* Remove laika check for minimal builds

* Fix minimal build check

* Bring back exclude for opendbc in codespell

* Fix typo

* Copy GNSS indices from laika

* Delete laika dependencies
2023-11-15 10:06:37 +01:00
Dean Lee
7ded7a0720 cabana: fix double comparisons (#30468)
compare double with epsilon
2023-11-14 21:44:22 -08:00
Shane Smiskol
102687e1ac Sort car ports 2023-11-14 18:45:31 -08:00
Justin Newberry
31c682d407 Pytest: load by group by default (#30466)
* wip

* use a class marker

* this one should be grouped too
2023-11-14 17:33:47 -08:00
Justin Newberry
f99939426f thermald: recover from modemmanager restart (#30464)
* test modem recovery

* static analysis

* also test lte reload

* this should just be try catched as well

* maybe we can find a better way than this

* rm the test

* make it clear

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-11-14 16:57:34 -08:00
Adeeb Shihadeh
b3c7a0c871 remove mui 2023-11-14 15:43:57 -08:00
Adeeb Shihadeh
51207aaae2 Update Python packages and pre-commit hooks (#30463)
Co-authored-by: adeebshihadeh <adeebshihadeh@users.noreply.github.com>
2023-11-14 15:18:42 -08:00
Tam Chau
96eee13836 Mazda: add CX5 2022 fingerprint values (VN 2023) (#30342)
Add mazda cx5 VN 2023 values
2023-11-14 03:36:26 -08:00
Saber
06fbaacefe VW MQB: Add FW for 2021 Tiguan (#30401)
* VW MQB: Add FW for 2021 Tiguan

route name:f3946aa3bdb4bfc7|2023-11-06--14-53-07--0

The carParams always show transmission as "Hyundai", cant get VW format

* add correct transmission

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 03:29:57 -08:00
Dean Lee
86a5ac383e cabana: highlight dowloaded segments (#30459)
highlight dowloaded segments
2023-11-14 03:23:33 -08:00
Viktor Hansson
6ce66dee4f VW: Add FW versions for Passat GTE 2018 (#30450)
* VW: Add fw-versions for Passat GTE 2018

* Remove duplicate fw-versions for PASSAT_MK8

* Removed duplicate fw version for PASSAT_MK8

One of them included \023 and the other \x13 which was interpreted as the same character in python

* Apply suggestions from code review

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 03:13:33 -08:00
Erich Moraga
b643aca8d6 Lexus: add several ECU versions for 2018 Lexus RC (#30322)
`OQO0#8618` 2018 Lexus RC  DongleID/route 01762a5235a24145|2023-10-24--17-44-27
2023-11-14 03:03:56 -08:00
Saber
78ccef28a8 VW MQB: Add FW for 2020 Golf (#30375)
route name:0bbe367c98fa1538|2023-10-25--11-23-54--0
2023-11-14 02:58:20 -08:00
ohber
919303ec08 Kia: add 2023 Stinger FW (#30344)
* Added 2023 Kia Stinger Fingerprint

* Fixed type on FP value

* Fixed typo on fingerprint value

* update docs

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 02:56:04 -08:00
Saber
5b50cc2954 VW MQB: Add FW for 2023 Kamiq (#30376)
* VW MQB: Add FW for 2023 Kamiq


route name:0bbe367c98fa1538|2023-11-04--12-56-37--0

* update docs

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 02:47:04 -08:00
Vadim Pronin
62d4f464a0 VW MQB: Add FW for 2018 and 2022 Volkswagen T-Roc (#30315)
* Added ECU values for VW T-Roc 2022

* Added ECU values for VW T-Roc 2018

* fix docs

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 02:43:11 -08:00
Calvin Chui
2647a4b4a9 Toyota: Add Lexus GS F 2016 (#30245)
* added GSF ECU values

* Added Lexus GSF data

* added route for GSF

* test RC code

* revert fingerprints back from RC test to GSF

* fixed type for route

* specify route segment for GSF

* added GSF to torque substitute

* removed year designation for GSF

* added MY back to all "Lexus GSF"

* removed route, don't think it does anything

* move GSF ecu values to better place

* remove whitespace from toyota > interface.py

* added in public route for LEXUS_GSF

* added GSF to docs

* update test route

* update test route

* update 266 Supported cars

* trying different dbc

* updated to working route

* clean up

* add to releases

* updated test route

* new route

* docs

* slightly better torque params

---------

Co-authored-by: cchui <cchui@eogresources.com>
Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-14 02:31:27 -08:00
Adeeb Shihadeh
e323191299 new sim connection settings (#30457)
* new sim connection settings

* fix att conflict

* sim id

* clenaup

---------

Co-authored-by: Comma Device <device@comma.ai>
2023-11-13 21:38:22 -08:00
Adeeb Shihadeh
cc32a6bf9f tici: fix leftover APN config from AT&T (#30458) 2023-11-13 21:33:22 -08:00
Harald Schäfer
c0942dbf9f Rm laika deps in rawgpsd (#30452)
* Rm more laikad references

* rawgpsd usage of laika

* bugfix
2023-11-13 20:38:24 -08:00
Harald Schäfer
95c6d5140a Rm more laika references (#30451)
Rm more laikad references
2023-11-13 16:52:57 -08:00
Shane Smiskol
32a0b10983 Toyota: bump Camry model years to 2024
3d35748a8816ca62
2023-11-13 15:43:28 -08:00
Justin Newberry
90c873ab1d Process Replay: move to pytest (#30260)
* process replay pytest

* enable long diff

* readd job name

* make it executable

* cleanup imports

* retrigger
2023-11-13 13:50:23 -08:00
Justin Newberry
2ad82cbfb0 Pytest: default settings on PC improvements (#30441)
* always multithreaded

* multithreaded

* pkill correct process

* escape more

* load for interfaces
2023-11-13 10:45:24 -08:00
Dean Lee
da95fd3019 replay: simplify the code for allow/block list (#30449)
simplify allow/block list
2023-11-13 09:19:39 -08:00
Tim Wilson
d3b91f266a C3: add gps_vs_llk plotjuggler layout (#30448)
add gps_vs_llk plotjuggler layout
2023-11-13 09:19:23 -08:00
Dean Lee
9e06525642 replay: remove deprecated support for PANDA_STATE_D_E_P_R_E_C_A_T_E_D (#30447) 2023-11-12 10:54:08 -08:00
Shane Smiskol
816c18a4ec bump panda (#30437)
* bump

* bump
2023-11-10 20:59:14 -08:00
Hoya
252531e1bb Hyundai: Add FW for Genesis G80 2018 (#30425)
* Update values.py

* Update selfdrive/car/hyundai/values.py

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
2023-11-10 20:58:59 -08:00
Adeeb Shihadeh
5f7143df02 jenkins: use build.py to manage cache size (#30440)
* jenkins: use build.py to manage cache size

* label

* set pp

* double

* cleanup

* non mimimal build on PC

---------

Co-authored-by: Justin Newberry <justin@comma.ai>
2023-11-10 16:55:25 -08:00
Justin Newberry
2629417320 CI: codecov for multiprocessing (#30432) 2023-11-10 10:02:05 -08:00
718 changed files with 21073 additions and 18162 deletions

View File

@@ -11,7 +11,6 @@
"DISPLAY": "${localEnv:DISPLAY}",
"PYTHONPATH": "${containerWorkspaceFolder}",
"TERM": "xterm-256color",
"CARLA_HOST": "host.docker.internal",
"force_color_prompt": "1"
},
"runArgs": [

12
.gitattributes vendored
View File

@@ -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

View File

@@ -8,7 +8,7 @@ assignees: ''
**Checklist**
- [ ] added to README
- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
- [ ] route with openpilot:
- [ ] route with stock system:

View File

@@ -6,6 +6,8 @@ labels: 'fingerprint'
assignees: ''
---
Discord username: []
**Car**
Which car (make, model, year) this fingerprint is for
Route: []
**Route**
A route with the fingerprint

View File

@@ -28,5 +28,4 @@ Longitudinal:
Lateral:
* Straight driving at ~25, ~45 and ~65mph
* Turns driving at ~25, ~45 and ~65mph
-->
-->

30
.github/build.py vendored Normal file
View File

@@ -0,0 +1,30 @@
import pathlib
GITHUB_FOLDER = pathlib.Path(__file__).parent
PULL_REQUEST_TEMPLATES = (GITHUB_FOLDER / "PULL_REQUEST_TEMPLATE")
order = ["fingerprint", "car_bugfix", "bugfix", "car_port", "refactor"]
def create_pull_request_template():
with open(GITHUB_FOLDER / "pull_request_template.md", "w") as f:
f.write("<!-- Please copy and paste the relevant template -->\n\n")
for t in order:
template = PULL_REQUEST_TEMPLATES / f"{t}.md"
text = template.read_text()
# Remove metadata for GitHub
start = text.find("---")
end = text.find("---", start+1)
text = text[end + 4:]
# Remove comments
text = text.replace("<!-- ", "").replace("-->", "")
f.write(f"<!--- ***** Template: {template.stem.replace('_', ' ').title()} *****\n")
f.write(text)
f.write("\n\n")
f.write("-->\n\n")
create_pull_request_template()

120
.github/labeler.yaml vendored
View File

@@ -1,65 +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:
- 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}"

View File

@@ -10,39 +10,59 @@ A route with the fingerprint
-->
<!--- ***** Template: Car bug fix *****
<!--- ***** Template: Car Bugfix *****
**Description** [](A description of the bug and the fix. Also link any relevant issues.)
**Description**
**Verification** [](Explain how you tested this bug fix.)
A description of the bug and the fix. Also link the issue if it exists.
**Verification**
Explain how you tested this bug fix.
**Route**
Route: [a route with the bug fix]
-->
<!--- ***** Template: Bug fix *****
**Description** [](A description of the bug and the fix. Also link any relevant issues.)
**Verification** [](Explain how you tested this bug fix.)
-->
<!--- ***** Template: Car port *****
<!--- ***** Template: Bugfix *****
**Description**
A description of the bug and the fix. Also link the issue if it exists.
**Verification**
Explain how you tested this bug fix.
-->
<!--- ***** Template: Car Port *****
**Checklist**
- [ ] added entry to CarInfo in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
- [ ] route with openpilot:
- [ ] route with stock system:
- [ ] car harness used (if comma doesn't sell it, put N/A):
-->
<!--- ***** Template: Refactor *****
**Description** [](A description of the refactor, including the goals it accomplishes.)
**Description**
A description of the refactor, including the goals it accomplishes.
**Verification**
Explain how you tested the refactor for regressions.
**Verification** [](Explain how you tested the refactor for regressions.)
-->

View File

@@ -0,0 +1,49 @@
name: 'automatically cache based on current runner'
inputs:
path:
description: 'path to cache'
required: true
key:
description: 'key'
required: true
restore-keys:
description: 'restore-keys'
required: true
save:
description: 'whether to save the cache'
default: 'false'
required: false
runs:
using: "composite"
steps:
- name: setup namespace cache
if: ${{ contains(runner.name, 'nsc') }}
uses: namespacelabs/nscloud-cache-action@v1
with:
path: ${{ inputs.path }}
- name: setup github cache
if: ${{ !contains(runner.name, 'nsc') && inputs.save != 'false' }}
uses: 'actions/cache@v3'
with:
path: ${{ inputs.path }}
key: ${{ inputs.key }}
restore-keys: ${{ inputs.restore-keys }}
- name: setup github cache
if: ${{ !contains(runner.name, 'nsc') && inputs.save == 'false' }}
uses: 'actions/cache/restore@v3'
with:
path: ${{ inputs.path }}
key: ${{ inputs.key }}
restore-keys: ${{ inputs.restore-keys }}
# make the directory manually in case we didn't get a hit, so it doesn't fail on future steps
- id: scons-cache-setup
shell: bash
run: |
mkdir -p ${{ inputs.path }}
sudo chmod -R 777 ${{ inputs.path }}
sudo chown -R $USER ${{ inputs.path }}

200
.github/workflows/auto_pr_review.yaml vendored Normal file
View File

@@ -0,0 +1,200 @@
name: "PR review"
on:
pull_request_target:
types: [opened, reopened, synchronize, edited, edited]
jobs:
labeler:
name: apply labels
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: false
- uses: actions/labeler@v5.0.0
with:
dot: true
configuration-path: .github/labeler.yaml
pr_branch_check:
name: check branch
runs-on: ubuntu-latest
if: github.repository == 'commaai/openpilot'
steps:
- uses: Vankka/pr-target-branch-action@69ab6dd5c221de3548b3b6c4d102c1f4913d3baa
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
target: /^(?!master$).*/
exclude: /commaai:.*/
change-to: ${{ github.base_ref }}
already-exists-action: close_this
already-exists-comment: "Your PR should be made against the `master` branch"
check-pr-template:
runs-on: ubuntu-latest
permissions:
contents: read
issues: write
pull-requests: write
actions: read
if: github.event.pull_request.head.repo.full_name != 'commaai/openpilot'
steps:
- uses: actions/github-script@v7
with:
script: |
// Comment to add to the PR if no template has been used
const NO_TEMPLATE_MESSAGE =
"It looks like you didn't use one of the Pull Request templates. Please check [the contributing docs](https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md). \
Also make sure that you didn't modify any of the checkboxes or headings within the template.";
// body data for future requests
const body_data = {
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
};
// Utility function to extract all headings
const extractHeadings = (markdown) => {
const headingRegex = /^(#{1,6})\s+(.+)$/gm;
const boldTextRegex = /^(?:\*\*|__)(.+?)(?:\*\*|__)\s*$/gm;
const headings = [];
let headingMatch;
while ((headingMatch = headingRegex.exec(markdown))) {
headings.push(headingMatch[2].trim());
}
let boldMatch;
while ((boldMatch = boldTextRegex.exec(markdown))) {
headings.push(boldMatch[1].trim());
}
return headings;
};
// Utility function to extract all check box descriptions
const extractCheckBoxTexts = (markdown) => {
const checkboxRegex = /^\s*-\s*\[( |x)\]\s+(.+)$/gm;
const checkboxes = [];
let match;
while ((match = checkboxRegex.exec(markdown))) {
checkboxes.push(match[2].trim());
}
return checkboxes;
};
// Utility function to check if a list is a subset of another list
isSubset = (subset, superset) => {
return subset.every((item) => superset.includes(item));
};
// Get filenames of all currently checked-in PR templates
const template_contents = await github.rest.repos.getContent({
owner: context.repo.owner,
repo: context.repo.repo,
path: ".github/PULL_REQUEST_TEMPLATE",
});
var template_filenames = [];
for (const content of template_contents.data) {
template_filenames.push(content.path);
}
console.debug("Received template filenames: " + template_filenames);
// Retrieve templates
var templates = [];
for (const template_filename of template_filenames) {
const template_response = await github.rest.repos.getContent({
owner: context.repo.owner,
repo: context.repo.repo,
path: template_filename,
});
// Convert Base64 content back
const decoded_template = atob(template_response.data.content);
const headings = extractHeadings(decoded_template);
const checkboxes = extractCheckBoxTexts(decoded_template);
if (!headings.length && !checkboxes.length) {
console.warn(
"Invalid template! Contains neither headings nor checkboxes, ignoring it: \n" +
decoded_template
);
} else {
templates.push({ headings: headings, checkboxes: checkboxes });
}
}
// Retrieve the PR Body
const pull_request = await github.rest.issues.get({
...body_data,
});
const pull_request_text = pull_request.data.body;
console.debug("Received Pull Request body: \n" + pull_request_text);
/* Check if the PR Body matches one of the templates
A template is defined by all headings and checkboxes it contains
We extract all Headings and Checkboxes from the PR text and check if any of the templates is a subset of that
*/
const pr_headings = extractHeadings(pull_request_text);
const pr_checkboxes = extractCheckBoxTexts(pull_request_text);
console.debug("Found Headings in PR body:\n" + pr_headings);
console.debug("Found Checkboxes in PR body:\n" + pr_checkboxes);
var template_found = false;
// Iterate over each template to check if it applies
for (const template of templates) {
console.log(
"Checking for headings: [" +
template.headings +
"] and checkboxes: [" +
template.checkboxes + "]"
);
if (
isSubset(template.checkboxes, pr_checkboxes) &&
isSubset(template.headings, pr_headings)
) {
console.debug("Found matching template!");
template_found = true;
}
}
// List comments from previous runs
var existing_comments = [];
const comments = await github.rest.issues.listComments({
...body_data,
});
for (const comment of comments.data) {
if (comment.body === NO_TEMPLATE_MESSAGE) {
existing_comments.push(comment);
}
}
// Add a comment to the PR that it is not using a the template (but only if this comment does not exist already)
if (!template_found) {
var comment_already_sent = false;
// Add an 'in-bot-review' label since this PR doesn't have the template
github.rest.issues.addLabels({
...body_data,
labels: ["in-bot-review"],
});
if (existing_comments.length < 1) {
github.rest.issues.createComment({
...body_data,
body: NO_TEMPLATE_MESSAGE,
});
}
} else {
// If template has been found, delete any old comment about missing template
for (const existing_comment of existing_comments) {
github.rest.issues.deleteComment({
...body_data,
comment_id: existing_comment.id,
});
}
// Remove the 'in-bot-review' label after the review is done and the PR has passed
github.rest.issues.removeLabel({
...body_data,
name: "in-bot-review",
}).catch((error) => {
console.log("Label 'in-bot-review' not found, ignoring");
});
}

View File

@@ -7,13 +7,15 @@ on:
env:
BASE_IMAGE: openpilot-base
DOCKER_REGISTRY: ghcr.io/commaai
RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $DOCKER_REGISTRY/$BASE_IMAGE:latest /bin/sh -c
RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $DOCKER_REGISTRY/$BASE_IMAGE:latest /bin/bash -c
jobs:
badges:
name: create badges
runs-on: ubuntu-20.04
if: github.repository == 'commaai/openpilot'
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
@@ -23,6 +25,8 @@ jobs:
run: |
${{ env.RUN }} "scons -j$(nproc) && python selfdrive/ui/translations/create_badges.py"
rm .gitattributes
git checkout --orphan badges
git rm -rf --cached .
git config user.email "badge-researcher@comma.ai"

View File

@@ -1,11 +1,5 @@
name: 'compile openpilot'
inputs:
cache_key_prefix:
description: 'Prefix for caching key'
required: false
default: 'scons'
runs:
using: "composite"
steps:
@@ -24,4 +18,4 @@ runs:
if: github.ref == 'refs/heads/master'
with:
path: .ci_cache/scons_cache
key: ${{ inputs.cache_key_prefix }}-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
key: scons-${{ runner.arch }}-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}

View File

@@ -15,7 +15,7 @@ env:
BUILD: selfdrive/test/docker_build.sh base
RUN: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/sh -c
RUN: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c
jobs:
docs:
@@ -32,7 +32,7 @@ jobs:
${{ env.RUN }} "scons -j$(nproc)"
- name: Build docs
run: |
${{ env.RUN }} "apt update && apt install -y doxygen && cd docs && make html"
${{ env.RUN }} "apt update && apt install -y doxygen && cd docs && make -j$(nproc) html"
- uses: actions/checkout@v4
if: github.ref == 'refs/heads/master' && github.repository == 'commaai/openpilot'
@@ -50,9 +50,10 @@ jobs:
cd openpilot-docs
git checkout --orphan tmp
git rm -rf --cached .
git rm -rf .
cp -r ../build/docs/html/ docs/
cp -r ../docs/README.md .
touch docs/.nojekyll
echo -n docs.comma.ai > docs/CNAME
git add -f .
@@ -60,4 +61,4 @@ jobs:
git commit -m "build docs"
# docs live in different repo to not bloat openpilot's full clone size
git push -f origin gh-pages
git push -f origin tmp:gh-pages

View File

@@ -1,18 +0,0 @@
name: "Pull Request Labeler"
on:
pull_request_target:
jobs:
labeler:
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: false
- uses: actions/labeler@v5.0.0-alpha.1
with:
dot: true
configuration-path: .github/labeler.yaml

View File

@@ -15,14 +15,19 @@ jobs:
if: github.repository == 'commaai/openpilot'
env:
PUSH_IMAGE: true
permissions:
checks: read
contents: read
packages: write
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
running-workflow-name: 'build prebuilt'
repo-token: ${{ secrets.GITHUB_TOKEN }}
check-regexp: ^((?!.*(build master-ci).*).)*$
- uses: actions/checkout@v4
with:

View File

@@ -14,6 +14,9 @@ jobs:
image: ghcr.io/commaai/openpilot-base:latest
runs-on: ubuntu-20.04
if: github.repository == 'commaai/openpilot'
permissions:
checks: read
contents: write
steps:
- name: Install wait-on-check-action dependencies
run: |
@@ -21,11 +24,12 @@ 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
running-workflow-name: 'build master-ci'
repo-token: ${{ secrets.GITHUB_TOKEN }}
check-regexp: ^((?!.*(build prebuilt).*).)*$
- uses: actions/checkout@v4
with:

View File

@@ -2,12 +2,36 @@ name: repo maintenance
on:
schedule:
- cron: "0 15 * * 2"
- cron: "0 12 * * 1" # every Monday at 12am UTC (4am PST)
workflow_dispatch:
jobs:
updates:
name: updates
bump_submodules:
name: bump_submodules
runs-on: ubuntu-20.04
container:
image: ghcr.io/commaai/openpilot-base:latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: bump submodules
run: |
git config --global --add safe.directory '*'
git -c submodule."tinygrad".update=none submodule update --remote
git add .
- name: Create Pull Request
uses: peter-evans/create-pull-request@5b4a9f6a9e2af26e5f02351490b90d01eb8ec1e5
with:
token: ${{ secrets.ACTIONS_CREATE_PR_PAT }}
commit-message: bump submodules
title: 'Bump submodules'
branch: auto-bump-submodules
base: master
delete-branch: true
body: 'Automatic PR from repo-maintenance -> bump_submodules'
package_updates:
name: package_updates
runs-on: ubuntu-20.04
container:
image: ghcr.io/commaai/openpilot-base:latest
@@ -30,3 +54,4 @@ jobs:
branch: auto-package-updates
base: master
delete-branch: true
body: 'Automatic PR from repo-maintenance -> package_updates'

View File

@@ -20,14 +20,13 @@ 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/sh -c
RUN: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e CI=1 -e PRE_COMMIT_HOME=/tmp/pre-commit -e PYTHONWARNINGS=error -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/pre-commit:/tmp/pre-commit -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c
BUILD_CL: selfdrive/test/docker_build.sh cl
RUN_CL: docker run --shm-size 1G -v $PWD:/tmp/openpilot -w /tmp/openpilot -e 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/sh -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
XDIST: -n auto --dist=loadscope
jobs:
build_release:
@@ -43,6 +42,7 @@ jobs:
- name: Build devel
timeout-minutes: 1
run: TARGET_DIR=$STRIPPED_DIR release/build_devel.sh
- uses: ./.github/workflows/setup-pre-commit
- uses: ./.github/workflows/setup-with-retry
- name: Check submodules
if: github.ref == 'refs/heads/master' && github.repository == 'commaai/openpilot'
@@ -52,13 +52,13 @@ 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: |
cd $STRIPPED_DIR
${{ env.RUN }} "release/check-dirty.sh && \
MAX_EXAMPLES=5 $PYTEST $XDIST selfdrive/car"
MAX_EXAMPLES=5 $PYTEST selfdrive/car"
- name: pre-commit
timeout-minutes: 3
run: |
@@ -67,7 +67,7 @@ jobs:
cp pyproject.toml $STRIPPED_DIR
cp poetry.lock $STRIPPED_DIR
cd $STRIPPED_DIR
${{ env.RUN }} "unset PYTHONWARNINGS && SKIP=check-added-large-files pre-commit run --all"
${{ env.RUN }} "unset PYTHONWARNINGS && SKIP=check-added-large-files pre-commit run --all && chmod -R 777 /tmp/pre-commit"
build:
strategy:
@@ -76,7 +76,7 @@ jobs:
((github.repository == 'commaai/openpilot') &&
((github.event_name != 'pull_request') ||
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && '["x86_64", "aarch64"]' || '["x86_64"]' ) }}
runs-on: ${{ (matrix.arch == 'aarch64') && 'buildjet-2vcpu-ubuntu-2204-arm' || 'ubuntu-20.04' }}
runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-20.04' }}
steps:
- uses: actions/checkout@v4
with:
@@ -84,18 +84,15 @@ jobs:
- uses: ./.github/workflows/setup-with-retry
with:
docker_hub_pat: ${{ secrets.DOCKER_HUB_PAT }}
cache_key_prefix: scons_${{ matrix.arch }}
- uses: ./.github/workflows/compile-openpilot
timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 15 || 30) }} # allow more time when we missed the scons cache
with:
cache_key_prefix: scons_${{ matrix.arch }}
docker_push:
name: docker push
strategy:
matrix:
arch: ${{ fromJson( (github.repository == 'commaai/openpilot') && '["x86_64", "aarch64"]' || '["x86_64"]' ) }}
runs-on: ${{ (matrix.arch == 'aarch64') && 'buildjet-2vcpu-ubuntu-2204-arm' || 'ubuntu-20.04' }}
runs-on: ${{ (matrix.arch == 'aarch64') && 'namespace-profile-arm64-2x8' || 'ubuntu-20.04' }}
if: github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot'
steps:
- uses: actions/checkout@v4
@@ -134,15 +131,18 @@ jobs:
static_analysis:
name: static analysis
runs-on: ubuntu-20.04
runs-on: ${{ ((github.repository == 'commaai/openpilot') &&
((github.event_name != 'pull_request') ||
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: ./.github/workflows/setup-pre-commit
- uses: ./.github/workflows/setup-with-retry
- name: pre-commit
timeout-minutes: 4
run: ${{ env.RUN }} "unset PYTHONWARNINGS && pre-commit run --all"
run: ${{ env.RUN }} "unset PYTHONWARNINGS && pre-commit run --all && chmod -R 777 /tmp/pre-commit"
valgrind:
name: valgrind
@@ -164,34 +164,40 @@ jobs:
unit_tests:
name: unit tests
runs-on: ubuntu-20.04
runs-on: ${{ ((github.repository == 'commaai/openpilot') &&
((github.event_name != 'pull_request') ||
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }}
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: ./.github/workflows/setup-with-retry
with:
docker_hub_pat: ${{ secrets.DOCKER_HUB_PAT }}
- name: Build openpilot
timeout-minutes: ${{ ((steps.restore-scons-cache.outputs.cache-hit == 'true') && 10 || 30) }} # allow more time when we missed the scons cache
run: ${{ env.RUN }} "scons -j$(nproc)"
- name: Run unit tests
timeout-minutes: 15
run: |
${{ env.RUN }} "$PYTEST $XDIST --timeout 30 -o cpp_files=test_* -m 'not slow' && \
${{ env.RUN }} "source selfdrive/test/setup_xvfb.sh && \
export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \
$PYTEST --timeout 60 -m 'not slow' -n $(nproc) && \
./selfdrive/ui/tests/create_test_translations.sh && \
QT_QPA_PLATFORM=offscreen ./selfdrive/ui/tests/test_translations && \
./selfdrive/ui/tests/test_translations.py && \
./system/camerad/test/ae_gray_test && \
./selfdrive/test/process_replay/test_fuzzy.py"
./selfdrive/ui/tests/test_translations.py"
- name: "Upload coverage to Codecov"
uses: codecov/codecov-action@v3
with:
name: ${{ github.job }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
process_replay:
name: process replay
runs-on: ${{ ((github.repository == 'commaai/openpilot') &&
((github.event_name != 'pull_request') ||
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'buildjet-8vcpu-ubuntu-2004' || 'ubuntu-20.04' }}
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }}
steps:
- uses: actions/checkout@v4
with:
@@ -211,8 +217,9 @@ 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"
- name: Print diff
id: print-diff
@@ -227,11 +234,13 @@ 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:
name: ${{ github.job }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
regen:
name: regen
@@ -257,7 +266,7 @@ jobs:
- name: Run regen
timeout-minutes: 30
run: |
${{ env.RUN_CL }} "ONNXCPU=1 $PYTEST $XDIST selfdrive/test/process_replay/test_regen.py && \
${{ env.RUN_CL }} "ONNXCPU=1 $PYTEST selfdrive/test/process_replay/test_regen.py && \
chmod -R 777 /tmp/comma_download_cache"
test_modeld:
@@ -278,10 +287,11 @@ jobs:
${{ env.RUN }} "scons -j$(nproc)"
# PYTHONWARNINGS triggers a SyntaxError in onnxruntime
- name: Run model replay with ONNX
timeout-minutes: 3
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
timeout-minutes: 4
@@ -292,10 +302,14 @@ jobs:
uses: codecov/codecov-action@v3
with:
name: ${{ github.job }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
test_cars:
name: cars
runs-on: ubuntu-20.04
runs-on: ${{ ((github.repository == 'commaai/openpilot') &&
((github.event_name != 'pull_request') ||
(github.event.pull_request.head.repo.full_name == 'commaai/openpilot'))) && 'namespace-profile-amd64-8x16' || 'ubuntu-20.04' }}
strategy:
fail-fast: false
matrix:
@@ -316,7 +330,7 @@ jobs:
- name: Test car models
timeout-minutes: 25
run: |
${{ env.RUN }} "$PYTEST $XDIST selfdrive/car/tests/test_models.py && \
${{ env.RUN }} "$PYTEST selfdrive/car/tests/test_models.py && \
chmod -R 777 /tmp/comma_download_cache"
env:
NUM_JOBS: 5
@@ -325,6 +339,8 @@ jobs:
uses: codecov/codecov-action@v3
with:
name: ${{ github.job }}-${{ matrix.job }}
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
car_docs_diff:
name: PR comments
@@ -379,3 +395,25 @@ jobs:
repo: context.repo.repo,
comment_id: ${{ steps.fc.outputs.comment-id }}
})
# need to figure out some stuff with tkinter before enabling this
# create_ui_report:
# name: Create UI Report
# runs-on: ubuntu-20.04
# steps:
# - uses: actions/checkout@v4
# with:
# submodules: true
# - uses: ./.github/workflows/setup-with-retry
# - name: Build openpilot
# run: ${{ env.RUN }} "scons -j$(nproc)"
# - name: Create Test Report
# run: ${{ env.RUN }} "source selfdrive/test/setup_xvfb.sh && \
# export MAPBOX_TOKEN='pk.eyJ1Ijoiam5ld2IiLCJhIjoiY2xxNW8zZXprMGw1ZzJwbzZneHd2NHljbSJ9.gV7VPRfbXFetD-1OVF0XZg' && \
# python selfdrive/ui/tests/test_ui/run.py"
# - name: Upload Test Report
# uses: actions/upload-artifact@v2
# with:
# name: report
# path: selfdrive/ui/tests/test_ui

View File

@@ -0,0 +1,12 @@
name: 'set up pre-commit environment'
runs:
using: "composite"
steps:
- uses: ./.github/workflows/auto-cache
with:
path: .ci_cache/pre-commit
key: pre-commit-${{ hashFiles('**/.pre-commit-config.yaml') }}
restore-keys: |
pre-commit-
save: ${{ github.ref == 'refs/heads/master' && github.event_name != 'pull_request' && github.repository == 'commaai/openpilot' }}

View File

@@ -5,10 +5,6 @@ inputs:
description: 'Auth token for Docker Hub, required for BuildJet jobs'
required: false
default: ''
cache_key_prefix:
description: 'Prefix for caching key'
required: false
default: 'scons_x86_64'
sleep_time:
description: 'Time to sleep between retries'
required: false
@@ -22,7 +18,6 @@ runs:
continue-on-error: true
with:
docker_hub_pat: ${{ inputs.docker_hub_pat }}
cache_key_prefix: ${{ inputs.cache_key_prefix }}
is_retried: true
- if: steps.setup1.outcome == 'failure'
shell: bash
@@ -33,7 +28,6 @@ runs:
continue-on-error: true
with:
docker_hub_pat: ${{ inputs.docker_hub_pat }}
cache_key_prefix: ${{ inputs.cache_key_prefix }}
is_retried: true
- if: steps.setup2.outcome == 'failure'
shell: bash
@@ -43,5 +37,4 @@ runs:
uses: ./.github/workflows/setup
with:
docker_hub_pat: ${{ inputs.docker_hub_pat }}
cache_key_prefix: ${{ inputs.cache_key_prefix }}
is_retried: true

View File

@@ -5,10 +5,6 @@ inputs:
description: 'Auth token for Docker Hub, required for BuildJet jobs'
required: true
default: ''
cache_key_prefix:
description: 'Prefix for caching key'
required: true
default: 'scons_x86_64'
is_retried:
description: 'A mock param that asserts that we use the setup-with-retry instead of this action directly'
required: false
@@ -47,19 +43,14 @@ runs:
run: echo "CACHE_COMMIT_DATE=$(git log -1 --pretty='format:%cd' --date=format:'%Y-%m-%d-%H:%M')" >> $GITHUB_ENV
- shell: bash
run: echo "$CACHE_COMMIT_DATE"
- id: restore-scons-cache
uses: actions/cache/restore@v3
- id: scons-cache
uses: ./.github/workflows/auto-cache
with:
path: .ci_cache/scons_cache
key: ${{ inputs.cache_key_prefix }}-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
key: scons-${{ runner.arch }}-${{ env.CACHE_COMMIT_DATE }}-${{ github.sha }}
restore-keys: |
${{ inputs.cache_key_prefix }}-${{ env.CACHE_COMMIT_DATE }}-
${{ inputs.cache_key_prefix }}-
# if we didn't get a cache hit, make the directory manually so it doesn't fail on future steps
- id: scons-cache-setup
shell: bash
if: steps.restore-scons-cache.outputs.cache-hit != 'true'
run: mkdir -p $GITHUB_WORKSPACE/.ci_cache/scons_cache
scons-${{ runner.arch }}-${{ env.CACHE_COMMIT_DATE }}
scons-${{ runner.arch }}
# as suggested here: https://github.com/moby/moby/issues/32816#issuecomment-910030001
- id: normalize-file-permissions
shell: bash
@@ -67,12 +58,6 @@ runs:
run: |
find . -type f -executable -not -perm 755 -exec chmod 755 {} \;
find . -type f -not -executable -not -perm 644 -exec chmod 644 {} \;
- id: setup-buildx-action
if: contains(runner.name, 'buildjet')
name: Set up Docker Buildx on buildjet to ensure a consistent cache
uses: docker/setup-buildx-action@v2
with:
driver: docker-container
# build our docker image
- shell: bash
run: eval ${{ env.BUILD }}

28
.github/workflows/stale.yaml vendored Normal file
View File

@@ -0,0 +1,28 @@
name: stale
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
env:
DAYS_BEFORE_PR_CLOSE: 7
DAYS_BEFORE_PR_STALE: 30
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
with:
exempt-milestones: true
# pull request config
stale-pr-message: 'This PR has had no activity for ${{ env.DAYS_BEFORE_PR_STALE }} days. It will be automatically closed in ${{ env.DAYS_BEFORE_PR_CLOSE }} days if there is no activity.'
close-pr-message: 'This PR has been automatically closed due to inactivity. Feel free to re-open once activity resumes.'
delete-branch: ${{ github.event.pull_request.head.repo.full_name == 'commaai/openpilot' }} # only delete branches on the main repo
exempt-pr-labels: "ignore stale,needs testing,car port" # if wip or it needs testing from the community, don't mark as stale
days-before-pr-stale: ${{ env.DAYS_BEFORE_PR_STALE }}
days-before-pr-close: ${{ env.DAYS_BEFORE_PR_CLOSE }}
# issue config
days-before-issue-stale: -1 # ignore issues for now

View File

@@ -17,11 +17,11 @@ env:
BUILD: selfdrive/test/docker_build.sh base
RUN: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/sh -c
RUN: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e FILEREADER_CACHE=1 -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $BASE_IMAGE /bin/bash -c
BUILD_CL: selfdrive/test/docker_build.sh cl
RUN_CL: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/sh -c
RUN_CL: docker run --shm-size 1G -v $GITHUB_WORKSPACE:/tmp/openpilot -w /tmp/openpilot -e PYTHONPATH=/tmp/openpilot -e NUM_JOBS -e JOB_ID -e GITHUB_ACTION -e GITHUB_REF -e GITHUB_HEAD_REF -e GITHUB_SHA -e GITHUB_REPOSITORY -e GITHUB_RUN_ID -v $GITHUB_WORKSPACE/.ci_cache/scons_cache:/tmp/scons_cache -v $GITHUB_WORKSPACE/.ci_cache/comma_download_cache:/tmp/comma_download_cache -v $GITHUB_WORKSPACE/.ci_cache/openpilot_cache:/tmp/openpilot_cache $CL_BASE_IMAGE /bin/bash -c
jobs:
@@ -81,11 +81,29 @@ jobs:
- name: Run dev container
run: |
mkdir -p /tmp/devcontainer_scons_cache/
cp -r $GITHUB_WORKSPACE/.ci_cache/scons_cache/* /tmp/devcontainer_scons_cache/
cp -r $GITHUB_WORKSPACE/.ci_cache/scons_cache/. /tmp/devcontainer_scons_cache/
devcontainer up --workspace-folder .
- name: Test environment
run: |
devcontainer exec --workspace-folder . scons -j$(nproc)
devcontainer exec --workspace-folder . scons -j$(nproc) cereal/ common/
devcontainer exec --workspace-folder . pip install pip-install-test
devcontainer exec --workspace-folder . touch /home/batman/.comma/auth.json
devcontainer exec --workspace-folder . sudo touch /root/test.txt
devcontainer exec --workspace-folder . sudo touch /root/test.txt
notebooks:
name: notebooks
runs-on: ubuntu-20.04
if: github.repository == 'commaai/openpilot'
timeout-minutes: 45
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: ./.github/workflows/setup-with-retry
- name: Build openpilot
timeout-minutes: 5
run: ${{ env.RUN }} "scons -j$(nproc)"
- name: Test notebooks
timeout-minutes: 2
run: |
${{ env.RUN }} "pip install nbmake && pytest --nbmake tools/car_porting/examples/"

1
.gitignore vendored
View File

@@ -46,7 +46,6 @@ selfdrive/boardd/boardd
selfdrive/logcatd/logcatd
selfdrive/mapd/default_speeds_by_region.json
system/proclogd/proclogd
selfdrive/ui/_ui
selfdrive/ui/translations/alerts_generated.h
selfdrive/ui/translations/tmp
selfdrive/test/longitudinal_maneuvers/out

6
.gitmodules vendored
View File

@@ -4,9 +4,6 @@
[submodule "opendbc"]
path = opendbc
url = ../../sunnyhaibin/opendbc.git
[submodule "laika_repo"]
path = laika_repo
url = ../../commaai/laika.git
[submodule "cereal"]
path = cereal
url = ../../sunnyhaibin/cereal.git
@@ -16,6 +13,9 @@
[submodule "body"]
path = body
url = ../../commaai/body.git
[submodule "teleoprtc_repo"]
path = teleoprtc_repo
url = ../../commaai/teleoprtc
[submodule "tinygrad"]
path = tinygrad_repo
url = https://github.com/geohot/tinygrad.git

View File

@@ -19,14 +19,15 @@ 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
hooks:
- id: codespell
exclude: '^(third_party/)|(body/)|(cereal/)|(rednose/)|(panda/)|(laika/)|(opendbc/)|(laika_repo/)|(rednose_repo/)|(selfdrive/ui/translations/.*.ts)|(poetry.lock)'
exclude: '^(third_party/)|(body/)|(cereal/)|(panda/)|(opendbc/)|(rednose/)|(rednose_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(selfdrive/ui/translations/.*.ts)|(poetry.lock)'
args:
# if you've got a short variable name that's getting flagged, add it here
- -L bu,ro,te,ue,alo,hda,ois,nam,nams,ned,som,parm,setts,inout,warmup,bumb,nd,sie,preints
@@ -38,13 +39,15 @@ repos:
entry: mypy
language: system
types: [python]
args: ['--explicit-package-bases']
exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(laika/)|(laika_repo/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(xx/)'
args:
- --local-partial-types
- --explicit-package-bases
exclude: '^(third_party/)|(cereal/)|(opendbc/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)|(xx/)'
- repo: https://github.com/astral-sh/ruff-pre-commit
rev: v0.1.4
rev: v0.1.14
hooks:
- id: ruff
exclude: '^(third_party/)|(cereal/)|(rednose/)|(panda/)|(laika/)|(laika_repo/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)'
exclude: '^(third_party/)|(cereal/)|(panda/)|(rednose/)|(rednose_repo/)|(tinygrad/)|(tinygrad_repo/)|(teleoprtc/)|(teleoprtc_repo/)'
- repo: local
hooks:
- id: cppcheck
@@ -78,6 +81,7 @@ repos:
entry: selfdrive/ui/tests/test_translations.py
language: script
pass_filenames: false
files: 'selfdrive/ui/translations/*'
- repo: https://github.com/python-poetry/poetry
rev: '1.7.0'
hooks:
@@ -86,6 +90,6 @@ repos:
args:
- --lock
- repo: https://github.com/python-jsonschema/check-jsonschema
rev: 0.27.1
rev: 0.27.3
hooks:
- id: check-github-workflows

View File

@@ -13,9 +13,8 @@ COPY SConstruct ${OPENPILOT_PATH}
COPY ./openpilot ${OPENPILOT_PATH}/openpilot
COPY ./third_party ${OPENPILOT_PATH}/third_party
COPY ./site_scons ${OPENPILOT_PATH}/site_scons
COPY ./laika ${OPENPILOT_PATH}/laika
COPY ./laika_repo ${OPENPILOT_PATH}/laika_repo
COPY ./rednose ${OPENPILOT_PATH}/rednose
COPY ./rednose_repo/site_scons ${OPENPILOT_PATH}/rednose_repo/site_scons
COPY ./tools ${OPENPILOT_PATH}/tools
COPY ./release ${OPENPILOT_PATH}/release
COPY ./common ${OPENPILOT_PATH}/common

View File

@@ -4,7 +4,7 @@ ENV PYTHONUNBUFFERED 1
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends sudo tzdata locales ssh && \
apt-get install -y --no-install-recommends sudo tzdata locales ssh pulseaudio && \
rm -rf /var/lib/apt/lists/*
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && locale-gen
@@ -40,7 +40,9 @@ COPY --chown=$USER tools/install_python_dependencies.sh /tmp/tools/
RUN cd /tmp && \
tools/install_python_dependencies.sh && \
rm -rf /tmp/* && \
rm -rf /home/$USER/.cache
rm -rf /home/$USER/.cache && \
find /home/$USER/pyenv -type d -name ".git" | xargs rm -rf && \
rm -rf /home/$USER/pyenv/versions/3.11.4/lib/python3.11/test
USER root
RUN sudo git config --global --add safe.directory /tmp/openpilot

110
Jenkinsfile vendored
View File

@@ -1,3 +1,14 @@
def retryWithDelay(int maxRetries, int delay, Closure body) {
for (int i = 0; i < maxRetries; i++) {
try {
return body()
} catch (Exception e) {
sleep(delay)
}
}
throw Exception("Failed after ${maxRetries} retries")
}
def device(String ip, String step_label, String cmd) {
withCredentials([file(credentialsId: 'id_rsa', variable: 'key_file')]) {
def ssh_cmd = """
@@ -14,6 +25,9 @@ export GIT_BRANCH=${env.GIT_BRANCH}
export GIT_COMMIT=${env.GIT_COMMIT}
export AZURE_TOKEN='${env.AZURE_TOKEN}'
export MAPBOX_TOKEN='${env.MAPBOX_TOKEN}'
# only use 1 thread for tici tests since most require HIL
export PYTEST_ADDOPTS="-n 0"
export GIT_SSH_COMMAND="ssh -i /data/gitkey"
@@ -21,7 +35,9 @@ source ~/.bash_profile
if [ -f /TICI ]; then
source /etc/profile
rm -rf /tmp/tmp*
rm -rf ~/.commacache
rm -rf /dev/shm/*
if ! systemctl is-active --quiet systemd-resolved; then
echo "restarting resolved"
@@ -53,13 +69,14 @@ END"""
}
}
def deviceStage(String stageName, String deviceType, List env, def steps) {
def deviceStage(String stageName, String deviceType, List extra_env, def steps) {
stage(stageName) {
if (currentBuild.result != null) {
return
}
def extra = env.collect { "export ${it}" }.join('\n');
def extra = extra_env.collect { "export ${it}" }.join('\n');
def branch = env.BRANCH_NAME ?: 'master';
docker.image('ghcr.io/commaai/alpine-ssh').inside('--user=root') {
lock(resource: "", label: deviceType, inversePrecedence: true, variable: 'device_ip', quantity: 1) {
@@ -68,6 +85,10 @@ def deviceStage(String stageName, String deviceType, List env, def steps) {
device(device_ip, "git checkout", extra + "\n" + readFile("selfdrive/test/setup_device_ci.sh"))
}
steps.each { item ->
if (branch != "master" && item.size() == 3 && !hasDirectoryChanged(item[2])) {
println "Skipped '${item[0]}', no relevant changes were detected."
return;
}
device(device_ip, item[0], item[1])
}
}
@@ -85,26 +106,31 @@ def pcStage(String stageName, Closure body) {
checkout scm
def dockerArgs = '--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache';
docker.build("openpilot-base:build-${env.GIT_COMMIT}", "-f Dockerfile.openpilot_base .").inside(dockerArgs) {
timeout(time: 20, unit: 'MINUTES') {
try {
// TODO: remove these after all jenkins jobs are running as batman (merged with master)
sh "sudo chown -R batman:batman /tmp/scons_cache"
sh "sudo chown -R batman:batman /tmp/comma_download_cache"
def dockerArgs = "--user=batman -v /tmp/comma_download_cache:/tmp/comma_download_cache -v /tmp/scons_cache:/tmp/scons_cache -e PYTHONPATH=${env.WORKSPACE}";
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"
def openpilot_base = retryWithDelay (3, 15) {
return docker.build("openpilot-base:build-${env.GIT_COMMIT}", "-f Dockerfile.openpilot_base .")
}
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"
}
}
}
}
}
}
}
}
def setupCredentials() {
@@ -117,6 +143,21 @@ def setupCredentials() {
}
}
def hasDirectoryChanged(List<String> paths) {
for (change in currentBuild.changeSets) {
for (item in change.items) {
for (affectedPath in item.affectedPaths) {
for (path in paths) {
if (affectedPath.startsWith(path)) {
return true
}
}
}
}
}
return false
}
node {
env.CI = "1"
env.PYTHONWARNINGS = "error"
@@ -128,7 +169,7 @@ node {
env.GIT_COMMIT = checkout(scm).GIT_COMMIT
def excludeBranches = ['master-ci', 'devel', 'devel-staging', 'release3', 'release3-staging',
'dashcam3', 'dashcam3-staging', 'testing-closet*', 'hotfix-*']
'testing-closet*', 'hotfix-*']
def excludeRegex = excludeBranches.join('|').replaceAll('\\*', '.*')
if (env.BRANCH_NAME != 'master') {
@@ -140,7 +181,7 @@ node {
try {
if (env.BRANCH_NAME == 'devel-staging') {
deviceStage("build release3-staging", "tici-needs-can", [], [
["build release3-staging & dashcam3-staging", "RELEASE_BRANCH=release3-staging DASHCAM_BRANCH=dashcam3-staging $SOURCE_DIR/release/build_release.sh"],
["build release3-staging", "RELEASE_BRANCH=release3-staging $SOURCE_DIR/release/build_release.sh"],
])
}
@@ -154,23 +195,23 @@ node {
parallel (
// tici tests
'onroad tests': {
deviceStage("onroad", "tici-needs-can", ["SKIP_COPY=1"], [
["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR ./build_devel.sh"],
deviceStage("onroad", "tici-needs-can", [], [
// TODO: ideally, this test runs in master-ci, but it takes 5+m to build it
//["build master-ci", "cd $SOURCE_DIR/release && TARGET_DIR=$TEST_DIR $SOURCE_DIR/scripts/retry.sh ./build_devel.sh"],
["build openpilot", "cd selfdrive/manager && ./build.py"],
["check dirty", "release/check-dirty.sh"],
["onroad tests", "pytest selfdrive/test/test_onroad.py -s"],
["time to onroad", "cd selfdrive/test/ && pytest test_time_to_onroad.py"],
["time to onroad", "pytest selfdrive/test/test_time_to_onroad.py"],
])
},
'HW + Unit Tests': {
deviceStage("tici", "tici-common", ["UNSAFE=1"], [
["build", "cd selfdrive/manager && ./build.py"],
["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"],
["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py", ["panda/", "selfdrive/boardd/"]],
["test power draw", "./system/hardware/tici/tests/test_power_draw.py"],
["test encoder", "LD_LIBRARY_PATH=/usr/local/lib pytest system/loggerd/tests/test_encoder.py"],
["test pigeond", "pytest system/sensord/tests/test_pigeond.py"],
["test manager", "pytest selfdrive/manager/test/test_manager.py"],
["test nav", "pytest selfdrive/navd/tests/"],
])
},
'loopback': {
@@ -194,27 +235,27 @@ node {
'sensord': {
deviceStage("LSM + MMC", "tici-lsmc", ["UNSAFE=1"], [
["build", "cd selfdrive/manager && ./build.py"],
["test sensord", "cd system/sensord/tests && pytest test_sensord.py"],
["test sensord", "pytest system/sensord/tests/test_sensord.py"],
])
deviceStage("BMX + LSM", "tici-bmx-lsm", ["UNSAFE=1"], [
["build", "cd selfdrive/manager && ./build.py"],
["test sensord", "cd system/sensord/tests && pytest test_sensord.py"],
["test sensord", "pytest system/sensord/tests/test_sensord.py"],
])
},
'replay': {
deviceStage("tici", "tici-replay", ["UNSAFE=1"], [
["build", "cd selfdrive/manager && ./build.py"],
["model replay", "cd selfdrive/test/process_replay && ./model_replay.py"],
["model replay", "selfdrive/test/process_replay/model_replay.py"],
])
},
'tizi': {
deviceStage("tizi", "tizi", ["UNSAFE=1"], [
["build openpilot", "cd selfdrive/manager && ./build.py"],
["test boardd loopback", "SINGLE_PANDA=1 pytest selfdrive/boardd/tests/test_boardd_loopback.py"],
["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py"],
["test pandad", "pytest selfdrive/boardd/tests/test_pandad.py", ["panda/", "selfdrive/boardd/"]],
["test amp", "pytest system/hardware/tici/tests/test_amplifier.py"],
["test hw", "pytest system/hardware/tici/tests/test_hardware.py"],
["test rawgpsd", "pytest system/sensord/rawgps/test_rawgps.py"],
["test qcomgpsd", "pytest system/qcomgpsd/tests/test_qcomgpsd.py", ["system/qcomgpsd/"]],
])
},
@@ -223,15 +264,16 @@ node {
pcStage("PC tests") {
// tests that our build system's dependencies are configured properly,
// needs a machine with lots of cores
sh label: "test multi-threaded build", script: "scons --no-cache --random -j42"
sh label: "test multi-threaded build",
script: '''#!/bin/bash
scons --no-cache --random -j$(nproc)'''
}
},
'car tests': {
pcStage("car tests") {
sh "scons -j30"
sh label: "test_models.py", script: "INTERNAL_SEG_CNT=250 INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt FILEREADER_CACHE=1 \
pytest -n42 --dist=loadscope selfdrive/car/tests/test_models.py"
sh label: "test_car_interfaces.py", script: "MAX_EXAMPLES=100 pytest -n42 selfdrive/car/tests/test_car_interfaces.py"
sh label: "build", script: "selfdrive/manager/build.py"
sh label: "run car tests", script: "cd selfdrive/car/tests && MAX_EXAMPLES=300 INTERNAL_SEG_CNT=300 FILEREADER_CACHE=1 \
INTERNAL_SEG_LIST=selfdrive/car/tests/test_models_segs.txt pytest test_models.py test_car_interfaces.py"
}
},

View File

@@ -1,4 +1,16 @@
Version 0.9.5 (2023-11-16)
Version 0.9.6 (20XX-XX-XX)
========================
* New driving model
* Vision model trained on more data
* Improved driving performance
* AGNOS 9
* comma body streaming and controls over WebRTC
* Hyundai Staria 2023 support thanks to sunnyhaibin!
* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Toyota RAV4 2023-24 support
* Toyota RAV4 Hybrid 2023-24 support
Version 0.9.5 (2023-11-17)
========================
* New driving model
* Improved navigate on openpilot performance using navigation instructions as an additional model input
@@ -8,11 +20,12 @@ Version 0.9.5 (2023-11-16)
* Hyundai Azera 2022 support thanks to sunnyhaibin!
* Hyundai Azera Hybrid 2020 support thanks to chanhojung and haram-KONA!
* Hyundai Custin 2023 support thanks to sunnyhaibin and Saber422!
* Hyundai Ioniq 6 2023 support thanks to sunnyhaibin, alamo3, and sshane!
* Hyundai Ioniq 6 2023 support thanks to sunnyhaibin and alamo3!
* Hyundai Kona Electric 2023 (Korean version) support thanks to sunnyhaibin and haram-KONA!
* Kia K8 Hybrid (with HDA II) 2023 support thanks to sunnyhaibin!
* Kia Sorento Hybrid 2023 support thanks to sunnyhaibin!
* Kia Optima Hybrid 2019 support
* Kia Sorento Hybrid 2023 support thanks to sunnyhaibin!
* Lexus GS F 2016 support thanks to snyperifle!
* Lexus IS 2023 support thanks to L3R5!
Version 0.9.4 (2023-07-27)

View File

@@ -9,11 +9,16 @@ import SCons.Errors
SCons.Warnings.warningAsException(True)
# pending upstream fix - https://github.com/SCons/scons/issues/4461
#SetOption('warn', 'all')
TICI = os.path.isfile('/TICI')
AGNOS = TICI
Decider('MD5-timestamp')
SetOption('num_jobs', int(os.cpu_count()/2))
AddOption('--kaitai',
action='store_true',
help='Regenerate kaitai struct parsers')
@@ -38,6 +43,12 @@ AddOption('--compile_db',
action='store_true',
help='build clang compilation database')
AddOption('--ccflags',
action='store',
type='string',
default='',
help='pass arbitrary flags over the command line')
AddOption('--snpe',
action='store_true',
help='use SNPE on PC')
@@ -56,7 +67,7 @@ AddOption('--pc-thneed',
AddOption('--minimal',
action='store_false',
dest='extras',
default=os.path.islink(Dir('#laika/').abspath),
default=os.path.islink(Dir('#rednose/').abspath), # minimal by default on release branch (where rednose is not a link)
help='the minimum build to run openpilot. no tests, tools, etc.')
## Architecture name breakdown (arch)
@@ -110,10 +121,7 @@ else:
cflags = []
cxxflags = []
cpppath = []
rpath += [
Dir("#cereal").abspath,
Dir("#common").abspath
]
rpath += []
# MacOS
if arch == "Darwin":
@@ -138,8 +146,6 @@ else:
f"#third_party/acados/{arch}/lib",
f"#third_party/libyuv/{arch}/lib",
f"#third_party/mapbox-gl-native-qt/{arch}",
"#cereal",
"#common",
"/usr/lib",
"/usr/local/lib",
]
@@ -170,6 +176,10 @@ if arch != "Darwin":
cflags += ['-DSWAGLOG="\\"common/swaglog.h\\""']
cxxflags += ['-DSWAGLOG="\\"common/swaglog.h\\""']
ccflags_option = GetOption('ccflags')
if ccflags_option:
ccflags += ccflags_option.split(' ')
env = Environment(
ENV=lenv,
CCFLAGS=[
@@ -219,10 +229,13 @@ env = Environment(
"#opendbc/can",
"#selfdrive/boardd",
"#common",
"#rednose/helpers",
],
CYTHONCFILESUFFIX=".cpp",
COMPILATIONDB_USE_ABSPATH=True,
tools=["default", "cython", "compilation_db"],
REDNOSE_ROOT="#",
tools=["default", "cython", "compilation_db", "rednose_filter"],
toolpath=["#rednose_repo/site_scons/site_tools"],
)
if arch == "Darwin":
@@ -284,8 +297,11 @@ else:
qt_env['QTDIR'] = qt_install_prefix
qt_dirs = [
f"{qt_install_headers}",
f"{qt_install_headers}/QtGui/5.12.8/QtGui",
]
qt_gui_path = os.path.join(qt_install_headers, "QtGui")
qt_gui_dirs = [d for d in os.listdir(qt_gui_path) if os.path.isdir(os.path.join(qt_gui_path, d))]
qt_dirs += [f"{qt_install_headers}/QtGui/{qt_gui_dirs[0]}/QtGui", ] if qt_gui_dirs else []
qt_dirs += [f"{qt_install_headers}/Qt{m}" for m in qt_modules]
qt_libs = [f"Qt5{m}" for m in qt_modules]
@@ -357,31 +373,7 @@ SConscript([
'panda/SConscript',
])
# Build rednose library and ekf models
rednose_deps = [
"#selfdrive/locationd/models/constants.py",
"#selfdrive/locationd/models/gnss_helpers.py",
]
rednose_config = {
'generated_folder': '#selfdrive/locationd/models/generated',
'to_build': {
'gnss': ('#selfdrive/locationd/models/gnss_kf.py', True, [], rednose_deps),
'live': ('#selfdrive/locationd/models/live_kf.py', True, ['live_kf_constants.h'], rednose_deps),
'car': ('#selfdrive/locationd/models/car_kf.py', True, [], rednose_deps),
},
}
if arch != "larch64":
rednose_config['to_build'].update({
'loc_4': ('#selfdrive/locationd/models/loc_kf.py', True, [], rednose_deps),
'lane': ('#selfdrive/locationd/models/lane_kf.py', True, [], rednose_deps),
'pos_computer_4': ('#rednose/helpers/lst_sq_computer.py', False, [], []),
'pos_computer_5': ('#rednose/helpers/lst_sq_computer.py', False, [], []),
'feature_handler_5': ('#rednose/helpers/feature_handler.py', False, [], []),
})
Export('rednose_config')
# Build rednose library
SConscript(['rednose/SConscript'])
# Build system services

2
body

Submodule body updated: 6ff44357a3...61ace31efa

2
cereal

Submodule cereal updated: d3d5b06703...d44f1aece9

View File

@@ -9,4 +9,5 @@ coverage:
ignore:
- "**/test_*.py"
- "selfdrive/test/**"
- "system/version.py" # codecov changes depending on if we are in a branch or not
- "system/version.py" # codecov changes depending on if we are in a branch or not
- "tools"

View File

@@ -2,7 +2,6 @@ Import('env', 'envCython', 'arch')
common_libs = [
'params.cc',
'statlog.cc',
'swaglog.cc',
'util.cc',
'i2c.cc',
@@ -24,18 +23,17 @@ Export('_common', '_gpucommon')
if GetOption('extras'):
env.Program('tests/test_common',
['tests/test_runner.cc', 'tests/test_util.cc', 'tests/test_swaglog.cc', 'tests/test_ratekeeper.cc'],
['tests/test_runner.cc', 'tests/test_params.cc', 'tests/test_util.cc', 'tests/test_swaglog.cc'],
LIBS=[_common, 'json11', 'zmq', 'pthread'])
# Cython bindings
params_python = envCython.Program('params_pyx.so', 'params_pyx.pyx', LIBS=envCython['LIBS'] + [_common, 'zmq', 'json11'])
SConscript([
'kalman/SConscript',
'transformations/SConscript'
'transformations/SConscript',
])
Import('simple_kalman_python', 'transformations_python')
common_python = [params_python, simple_kalman_python, transformations_python]
Import('transformations_python')
common_python = [params_python, transformations_python]
Export('common_python')

View File

@@ -2,7 +2,7 @@ import jwt
import os
import requests
from datetime import datetime, timedelta
from openpilot.common.basedir import PERSIST
from openpilot.system.hardware.hw import Paths
from openpilot.system.version import get_version
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
@@ -10,7 +10,7 @@ API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
class Api():
def __init__(self, dongle_id):
self.dongle_id = dongle_id
with open(PERSIST+'/comma/id_rsa') as f:
with open(Paths.persist_root()+'/comma/id_rsa') as f:
self.private_key = f.read()
def get(self, *args, **kwargs):

View File

@@ -1,11 +1,4 @@
import os
from pathlib import Path
from openpilot.system.hardware import PC
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
if PC:
PERSIST = os.path.join(str(Path.home()), ".comma", "persist")
else:
PERSIST = "/persist"

View File

@@ -1,55 +1,8 @@
import os
import sys
import fcntl
import hashlib
import platform
from cffi import FFI
def suffix():
if platform.system() == "Darwin":
return ".dylib"
else:
return ".so"
def ffi_wrap(name, c_code, c_header, tmpdir="/tmp/ccache", cflags="", libraries=None):
if libraries is None:
libraries = []
cache = name + "_" + hashlib.sha1(c_code.encode('utf-8')).hexdigest()
try:
os.mkdir(tmpdir)
except OSError:
pass
fd = os.open(tmpdir, 0)
fcntl.flock(fd, fcntl.LOCK_EX)
try:
sys.path.append(tmpdir)
try:
mod = __import__(cache)
except Exception:
print(f"cache miss {cache}")
compile_code(cache, c_code, c_header, tmpdir, cflags, libraries)
mod = __import__(cache)
finally:
os.close(fd)
return mod.ffi, mod.lib
def compile_code(name, c_code, c_header, directory, cflags="", libraries=None):
if libraries is None:
libraries = []
ffibuilder = FFI()
ffibuilder.set_source(name, c_code, source_extension='.cpp', libraries=libraries)
ffibuilder.cdef(c_header)
os.environ['OPT'] = "-fwrapv -O2 -DNDEBUG -std=c++1z"
os.environ['CFLAGS'] = cflags
ffibuilder.compile(verbose=True, debug=False, tmpdir=directory)
def wrap_compiled(name, directory):
sys.path.append(directory)
mod = __import__(name)
return mod.ffi, mod.lib

View File

@@ -1,60 +1,7 @@
import os
import shutil
import tempfile
from atomicwrites import AtomicWriter
def mkdirs_exists_ok(path):
if path.startswith(('http://', 'https://')):
raise ValueError('URL path')
try:
os.makedirs(path)
except OSError:
if not os.path.isdir(path):
raise
def rm_not_exists_ok(path):
try:
os.remove(path)
except OSError:
if os.path.exists(path):
raise
def rm_tree_or_link(path):
if os.path.islink(path):
os.unlink(path)
elif os.path.isdir(path):
shutil.rmtree(path)
def get_tmpdir_on_same_filesystem(path):
normpath = os.path.normpath(path)
parts = normpath.split("/")
if len(parts) > 1 and parts[1] == "scratch":
return "/scratch/tmp"
elif len(parts) > 2 and parts[2] == "runner":
return f"/{parts[1]}/runner/tmp"
return "/tmp"
class NamedTemporaryDir():
def __init__(self, temp_dir=None):
self._path = tempfile.mkdtemp(dir=temp_dir)
@property
def name(self):
return self._path
def close(self):
shutil.rmtree(self._path)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
import contextlib
from typing import Optional
class CallbackReader:
@@ -76,24 +23,16 @@ class CallbackReader:
return chunk
def _get_fileobject_func(writer, temp_dir):
def _get_fileobject():
return writer.get_fileobject(dir=temp_dir)
return _get_fileobject
@contextlib.contextmanager
def atomic_write_in_dir(path: str, mode: str = 'w', buffering: int = -1, encoding: Optional[str] = None, newline: Optional[str] = None,
overwrite: bool = False):
"""Write to a file atomically using a temporary file in the same directory as the destination file."""
dir_name = os.path.dirname(path)
def atomic_write_on_fs_tmp(path, **kwargs):
"""Creates an atomic writer using a temporary file in a temporary directory
on the same filesystem as path.
"""
# TODO(mgraczyk): This use of AtomicWriter relies on implementation details to set the temp
# directory.
writer = AtomicWriter(path, **kwargs)
return writer._open(_get_fileobject_func(writer, get_tmpdir_on_same_filesystem(path)))
if not overwrite and os.path.exists(path):
raise FileExistsError(f"File '{path}' already exists. To overwrite it, set 'overwrite' to True.")
def atomic_write_in_dir(path, **kwargs):
"""Creates an atomic writer using a temporary file in the same directory
as the destination file.
"""
writer = AtomicWriter(path, **kwargs)
return writer._open(_get_fileobject_func(writer, os.path.dirname(path)))
with tempfile.NamedTemporaryFile(mode=mode, buffering=buffering, encoding=encoding, newline=newline, dir=dir_name, delete=False) as tmp_file:
yield tmp_file
tmp_file_name = tmp_file.name
os.replace(tmp_file_name, path)

View File

@@ -1 +0,0 @@
simple_kalman_impl.c

View File

@@ -1,5 +0,0 @@
Import('envCython')
simple_kalman_python = envCython.Program('simple_kalman_impl.so', 'simple_kalman_impl.pyx')
Export('simple_kalman_python')

View File

@@ -1,12 +0,0 @@
from openpilot.common.kalman.simple_kalman_impl import KF1D as KF1D
assert KF1D
import numpy as np
def get_kalman_gain(dt, A, C, Q, R, iterations=100):
P = np.zeros_like(Q)
for _ in range(iterations):
P = A.dot(P).dot(A.T) + dt * Q
S = C.dot(P).dot(C.T) + R
K = P.dot(C.T).dot(np.linalg.inv(S))
P = (np.eye(len(P)) - K.dot(C)).dot(P)
return K

View File

@@ -1,18 +0,0 @@
# cython: language_level = 3
cdef class KF1D:
cdef public:
double x0_0
double x1_0
double K0_0
double K1_0
double A0_0
double A0_1
double A1_0
double A1_1
double C0_0
double C0_1
double A_K_0
double A_K_1
double A_K_2
double A_K_3

View File

@@ -1,37 +0,0 @@
# distutils: language = c++
# cython: language_level=3
cdef class KF1D:
def __init__(self, x0, A, C, K):
self.x0_0 = x0[0][0]
self.x1_0 = x0[1][0]
self.A0_0 = A[0][0]
self.A0_1 = A[0][1]
self.A1_0 = A[1][0]
self.A1_1 = A[1][1]
self.C0_0 = C[0]
self.C0_1 = C[1]
self.K0_0 = K[0][0]
self.K1_0 = K[1][0]
self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0
self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1
self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0
self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1
def update(self, meas):
cdef double x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas
cdef double x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas
self.x0_0 = x0_0
self.x1_0 = x1_0
return [self.x0_0, self.x1_0]
@property
def x(self):
return [[self.x0_0], [self.x1_0]]
@x.setter
def x(self, x):
self.x0_0 = x[0][0]
self.x1_0 = x[1][0]

View File

@@ -1,23 +0,0 @@
import numpy as np
class KF1D:
# this EKF assumes constant covariance matrix, so calculations are much simpler
# the Kalman gain also needs to be precomputed using the control module
def __init__(self, x0, A, C, K):
self.x = x0
self.A = A
self.C = np.atleast_2d(C)
self.K = K
self.A_K = self.A - np.dot(self.K, self.C)
# K matrix needs to be pre-computed as follow:
# import control
# (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R)
# self.K = np.transpose(K)
def update(self, meas):
self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas)
return self.x

View File

@@ -1,87 +0,0 @@
import unittest
import random
import timeit
import numpy as np
from openpilot.common.kalman.simple_kalman import KF1D
from openpilot.common.kalman.simple_kalman_old import KF1D as KF1D_old
class TestSimpleKalman(unittest.TestCase):
def setUp(self):
dt = 0.01
x0_0 = 0.0
x1_0 = 0.0
A0_0 = 1.0
A0_1 = dt
A1_0 = 0.0
A1_1 = 1.0
C0_0 = 1.0
C0_1 = 0.0
K0_0 = 0.12287673
K1_0 = 0.29666309
self.kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]),
A=np.array([[A0_0, A0_1], [A1_0, A1_1]]),
C=np.array([C0_0, C0_1]),
K=np.array([[K0_0], [K1_0]]))
self.kf = KF1D(x0=[[x0_0], [x1_0]],
A=[[A0_0, A0_1], [A1_0, A1_1]],
C=[C0_0, C0_1],
K=[[K0_0], [K1_0]])
def test_getter_setter(self):
self.kf.x = [[1.0], [1.0]]
self.assertEqual(self.kf.x, [[1.0], [1.0]])
def update_returns_state(self):
x = self.kf.update(100)
self.assertEqual(x, self.kf.x)
def test_old_equal_new(self):
for _ in range(1000):
v_wheel = random.uniform(0, 200)
x_old = self.kf_old.update(v_wheel)
x = self.kf.update(v_wheel)
# Compare the output x, verify that the error is less than 1e-4
np.testing.assert_almost_equal(x_old[0], x[0])
np.testing.assert_almost_equal(x_old[1], x[1])
def test_new_is_faster(self):
setup = """
import numpy as np
from openpilot.common.kalman.simple_kalman import KF1D
from openpilot.common.kalman.simple_kalman_old import KF1D as KF1D_old
dt = 0.01
x0_0 = 0.0
x1_0 = 0.0
A0_0 = 1.0
A0_1 = dt
A1_0 = 0.0
A1_1 = 1.0
C0_0 = 1.0
C0_1 = 0.0
K0_0 = 0.12287673
K1_0 = 0.29666309
kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]),
A=np.array([[A0_0, A0_1], [A1_0, A1_1]]),
C=np.array([C0_0, C0_1]),
K=np.array([[K0_0], [K1_0]]))
kf = KF1D(x0=[[x0_0], [x1_0]],
A=[[A0_0, A0_1], [A1_0, A1_1]],
C=[C0_0, C0_1],
K=[[K0_0], [K1_0]])
"""
kf_speed = timeit.timeit("kf.update(1234)", setup=setup, number=10000)
kf_old_speed = timeit.timeit("kf_old.update(1234)", setup=setup, number=10000)
self.assertTrue(kf_speed < kf_old_speed / 4)
if __name__ == "__main__":
unittest.main()

View File

@@ -1,12 +0,0 @@
class lazy_property():
"""Defines a property whose value will be computed only once and as needed.
This can only be used on instance methods.
"""
def __init__(self, func):
self._func = func
def __get__(self, obj_self, cls):
value = self._func(obj_self)
setattr(obj_self, self._func.__name__, value)
return value

View File

@@ -65,7 +65,7 @@ class SwagFormatter(logging.Formatter):
return record_dict
def format(self, record): # noqa: A003
def format(self, record):
if self.swaglogger is None:
raise Exception("must set swaglogger before calling format()")
return json_robust_dumps(self.format_dict(record))
@@ -95,7 +95,7 @@ class SwagLogFileFormatter(SwagFormatter):
k += "$a"
return k, v
def format(self, record): # noqa: A003
def format(self, record):
if isinstance(record, str):
v = json.loads(record)
else:

View File

@@ -1,38 +0,0 @@
#pragma once
#include <array>
#include "common/mat.h"
#include "system/hardware/hw.h"
const int TRAJECTORY_SIZE = 33;
const int LAT_MPC_N = 16;
const int LON_MPC_N = 32;
const float MIN_DRAW_DISTANCE = 10.0;
const float MAX_DRAW_DISTANCE = 100.0;
const float RYG_GREEN = 0.01165;
const float RYG_YELLOW = 0.06157;
template <typename T, size_t size>
constexpr std::array<T, size> build_idxs(float max_val) {
std::array<T, size> result{};
for (int i = 0; i < size; ++i) {
result[i] = max_val * ((i / (double)(size - 1)) * (i / (double)(size - 1)));
}
return result;
}
constexpr auto T_IDXS = build_idxs<double, TRAJECTORY_SIZE>(10.0);
constexpr auto T_IDXS_FLOAT = build_idxs<float, TRAJECTORY_SIZE>(10.0);
constexpr auto X_IDXS = build_idxs<double, TRAJECTORY_SIZE>(192.0);
constexpr auto X_IDXS_FLOAT = build_idxs<float, TRAJECTORY_SIZE>(192.0);
const mat3 FCAM_INTRINSIC_MATRIX = (mat3){{2648.0, 0.0, 1928.0 / 2,
0.0, 2648.0, 1208.0 / 2,
0.0, 0.0, 1.0}};
// tici ecam focal probably wrong? magnification is not consistent across frame
// Need to retrain model before this can be changed
const mat3 ECAM_INTRINSIC_MATRIX = (mat3){{567.0, 0.0, 1928.0 / 2,
0.0, 567.0, 1208.0 / 2,
0.0, 0.0, 1.0}};

View File

@@ -1,22 +0,0 @@
import numpy as np
def deep_interp_np(x, xp, fp, axis=None):
if axis is not None:
fp = fp.swapaxes(0,axis)
x = np.atleast_1d(x)
xp = np.array(xp)
if len(xp) < 2:
return np.repeat(fp, len(x), axis=0)
if min(np.diff(xp)) < 0:
raise RuntimeError('Bad x array for interpolation')
j = np.searchsorted(xp, x) - 1
j = np.clip(j, 0, len(xp)-2)
d = np.divide(x - xp[j], xp[j + 1] - xp[j], out=np.ones_like(x, dtype=np.float64), where=xp[j + 1] - xp[j] != 0)
vals_interp = (fp[j].T*(1 - d)).T + (fp[j + 1].T*d).T
if axis is not None:
vals_interp = vals_interp.swapaxes(0,axis)
if len(vals_interp) == 1:
return vals_interp[0]
else:
return vals_interp

View File

@@ -4,9 +4,11 @@
#include <sys/file.h>
#include <algorithm>
#include <cassert>
#include <csignal>
#include <unordered_map>
#include "common/queue.h"
#include "common/swaglog.h"
#include "common/util.h"
#include "system/hardware/hw.h"
@@ -92,6 +94,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"AssistNowToken", PERSISTENT},
{"AthenadPid", PERSISTENT},
{"AthenadUploadQueue", PERSISTENT},
{"AthenadRecentlyViewedRoutes", PERSISTENT},
{"CalibrationParams", PERSISTENT},
{"CameraDebugExpGain", CLEAR_ON_MANAGER_START},
{"CameraDebugExpTime", CLEAR_ON_MANAGER_START},
@@ -114,7 +117,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"DoReboot", CLEAR_ON_MANAGER_START},
{"DoShutdown", CLEAR_ON_MANAGER_START},
{"DoUninstall", CLEAR_ON_MANAGER_START},
{"ExperimentalLongitudinalEnabled", PERSISTENT},
{"ExperimentalLongitudinalEnabled", PERSISTENT | DEVELOPMENT_ONLY},
{"ExperimentalMode", PERSISTENT},
{"ExperimentalModeConfirmed", PERSISTENT},
{"FirmwareQueryDone", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
@@ -142,16 +145,13 @@ std::unordered_map<std::string, uint32_t> keys = {
{"IsReleaseBranch", CLEAR_ON_MANAGER_START},
{"IsTakingSnapshot", CLEAR_ON_MANAGER_START},
{"IsTestedBranch", CLEAR_ON_MANAGER_START},
{"IsUpdateAvailable", CLEAR_ON_MANAGER_START},
{"JoystickDebugMode", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"LaikadEphemerisV3", PERSISTENT | DONT_LOG},
{"LanguageSetting", PERSISTENT},
{"LastAthenaPingTime", CLEAR_ON_MANAGER_START},
{"LastGPSPosition", PERSISTENT},
{"LastManagerExitReason", CLEAR_ON_MANAGER_START},
{"LastOffroadStatusPacket", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"LastPowerDropDetected", CLEAR_ON_MANAGER_START},
{"LastSystemShutdown", CLEAR_ON_MANAGER_START},
{"LastUpdateException", CLEAR_ON_MANAGER_START},
{"LastUpdateTime", PERSISTENT},
{"LiveParameters", PERSISTENT},
@@ -162,7 +162,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"NavPastDestinations", PERSISTENT},
{"NavSettingLeftSide", PERSISTENT},
{"NavSettingTime24h", PERSISTENT},
{"NavdRender", PERSISTENT},
{"NetworkMetered", PERSISTENT},
{"ObdMultiplexingChanged", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"ObdMultiplexingEnabled", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"Offroad_BadNvme", CLEAR_ON_MANAGER_START},
@@ -182,22 +182,19 @@ std::unordered_map<std::string, uint32_t> keys = {
{"PandaHeartbeatLost", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"PandaSomResetTriggered", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"PandaSignatures", CLEAR_ON_MANAGER_START},
{"Passive", PERSISTENT},
{"PrimeType", PERSISTENT},
{"RecordFront", PERSISTENT},
{"RecordFrontLock", PERSISTENT}, // for the internal fleet
{"ReplayControlsState", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"ShouldDoUpdate", CLEAR_ON_MANAGER_START},
{"SnoozeUpdate", CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION},
{"SshEnabled", PERSISTENT},
{"SubscriberInfo", PERSISTENT},
{"TermsVersion", PERSISTENT},
{"Timezone", PERSISTENT},
{"TrainingVersion", PERSISTENT},
{"UbloxAvailable", PERSISTENT},
{"UpdateAvailable", CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION},
{"UpdateFailedCount", CLEAR_ON_MANAGER_START},
{"UpdaterAvailableBranches", CLEAR_ON_MANAGER_START},
{"UpdaterAvailableBranches", PERSISTENT},
{"UpdaterCurrentDescription", CLEAR_ON_MANAGER_START},
{"UpdaterCurrentReleaseNotes", CLEAR_ON_MANAGER_START},
{"UpdaterFetchAvailable", CLEAR_ON_MANAGER_START},
@@ -205,6 +202,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"UpdaterNewReleaseNotes", CLEAR_ON_MANAGER_START},
{"UpdaterState", CLEAR_ON_MANAGER_START},
{"UpdaterTargetBranch", CLEAR_ON_MANAGER_START},
{"UpdaterLastFetchTime", PERSISTENT},
{"Version", PERSISTENT},
{"VisionRadarToggle", PERSISTENT},
{"WheeledBody", PERSISTENT},
@@ -308,8 +306,15 @@ std::unordered_map<std::string, uint32_t> keys = {
Params::Params(const std::string &path) {
prefix = "/" + util::getenv("OPENPILOT_PREFIX", "d");
params_path = ensure_params_path(prefix, path);
params_prefix = "/" + util::getenv("OPENPILOT_PREFIX", "d");
params_path = ensure_params_path(params_prefix, path);
}
Params::~Params() {
if (future.valid()) {
future.wait();
}
assert(queue.empty());
}
std::vector<std::string> Params::allKeys() const {
@@ -422,3 +427,20 @@ void Params::clearAll(ParamKeyType key_type) {
fsync_dir(getParamPath());
}
void Params::putNonBlocking(const std::string &key, const std::string &val) {
queue.push(std::make_pair(key, val));
// start thread on demand
if (!future.valid() || future.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) {
future = std::async(std::launch::async, &Params::asyncWriteThread, this);
}
}
void Params::asyncWriteThread() {
// TODO: write the latest one if a key has multiple values in the queue.
std::pair<std::string, std::string> p;
while (queue.try_pop(p, 0)) {
// Params::put is Thread-Safe
put(p.first, p.second);
}
}

View File

@@ -1,21 +1,28 @@
#pragma once
#include <future>
#include <map>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
#include "common/queue.h"
enum ParamKeyType {
PERSISTENT = 0x02,
CLEAR_ON_MANAGER_START = 0x04,
CLEAR_ON_ONROAD_TRANSITION = 0x08,
CLEAR_ON_OFFROAD_TRANSITION = 0x10,
DONT_LOG = 0x20,
DEVELOPMENT_ONLY = 0x40,
ALL = 0xFFFFFFFF
};
class Params {
public:
explicit Params(const std::string &path = {});
~Params();
// Not copyable.
Params(const Params&) = delete;
Params& operator=(const Params&) = delete;
@@ -24,7 +31,7 @@ public:
bool checkKey(const std::string &key);
ParamKeyType getKeyType(const std::string &key);
inline std::string getParamPath(const std::string &key = {}) {
return params_path + prefix + (key.empty() ? "" : "/" + key);
return params_path + params_prefix + (key.empty() ? "" : "/" + key);
}
// Delete a value
@@ -46,8 +53,18 @@ public:
inline int putBool(const std::string &key, bool val) {
return put(key.c_str(), val ? "1" : "0", 1);
}
void putNonBlocking(const std::string &key, const std::string &val);
inline void putBoolNonBlocking(const std::string &key, bool val) {
putNonBlocking(key, val ? "1" : "0");
}
private:
void asyncWriteThread();
std::string params_path;
std::string prefix;
std::string params_prefix;
// for nonblocking write
std::future<void> future;
SafeQueue<std::pair<std::string, std::string>> queue;
};

View File

@@ -1,10 +1,7 @@
from openpilot.common.params_pyx import Params, ParamKeyType, UnknownKeyName, put_nonblocking, \
put_bool_nonblocking
from openpilot.common.params_pyx import Params, ParamKeyType, UnknownKeyName
assert Params
assert ParamKeyType
assert UnknownKeyName
assert put_nonblocking
assert put_bool_nonblocking
if __name__ == "__main__":
import sys

View File

@@ -3,7 +3,6 @@
from libcpp cimport bool
from libcpp.string cimport string
from libcpp.vector cimport vector
import threading
cdef extern from "common/params.h":
cpdef enum ParamKeyType:
@@ -11,6 +10,7 @@ cdef extern from "common/params.h":
CLEAR_ON_MANAGER_START
CLEAR_ON_ONROAD_TRANSITION
CLEAR_ON_OFFROAD_TRANSITION
DEVELOPMENT_ONLY
ALL
cdef cppclass c_Params "Params":
@@ -19,6 +19,8 @@ cdef extern from "common/params.h":
bool getBool(string, bool) nogil
int remove(string) nogil
int put(string, string) nogil
void putNonBlocking(string, string) nogil
void putBoolNonBlocking(string, bool) nogil
int putBool(string, bool) nogil
bool checkKey(string) nogil
string getParamPath(string) nogil
@@ -79,7 +81,7 @@ cdef class Params:
"""
Warning: This function blocks until the param is written to disk!
In very rare cases this can take over a second, and your code will hang.
Use the put_nonblocking helper function in time sensitive code, but
Use the put_nonblocking, put_bool_nonblocking in time sensitive code, but
in general try to avoid writing params as much as possible.
"""
cdef string k = self.check_key(key)
@@ -92,6 +94,17 @@ cdef class Params:
with nogil:
self.p.putBool(k, val)
def put_nonblocking(self, key, dat):
cdef string k = self.check_key(key)
cdef string dat_bytes = ensure_bytes(dat)
with nogil:
self.p.putNonBlocking(k, dat_bytes)
def put_bool_nonblocking(self, key, bool val):
cdef string k = self.check_key(key)
with nogil:
self.p.putBoolNonBlocking(k, val)
def remove(self, key):
cdef string k = self.check_key(key)
with nogil:
@@ -103,9 +116,3 @@ cdef class Params:
def all_keys(self):
return self.p.allKeys()
def put_nonblocking(key, val, d=""):
threading.Thread(target=lambda: Params(d).put(key, val)).start()
def put_bool_nonblocking(key, bool val, d=""):
threading.Thread(target=lambda: Params(d).put_bool(key, val)).start()

View File

@@ -6,12 +6,14 @@ from typing import Optional
from openpilot.common.params import Params
from openpilot.system.hardware.hw import Paths
from openpilot.system.hardware.hw import DEFAULT_DOWNLOAD_CACHE_ROOT
class OpenpilotPrefix:
def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True):
def __init__(self, prefix: Optional[str] = None, clean_dirs_on_exit: bool = True, shared_download_cache: bool = False):
self.prefix = prefix if prefix else str(uuid.uuid4().hex[0:15])
self.msgq_path = os.path.join('/dev/shm', self.prefix)
self.clean_dirs_on_exit = clean_dirs_on_exit
self.shared_download_cache = shared_download_cache
def __enter__(self):
self.original_prefix = os.environ.get('OPENPILOT_PREFIX', None)
@@ -22,6 +24,9 @@ class OpenpilotPrefix:
pass
os.makedirs(Paths.log_root(), exist_ok=True)
if self.shared_download_cache:
os.environ["COMMA_CACHE"] = DEFAULT_DOWNLOAD_CACHE_ROOT
return self
def __exit__(self, exc_type, exc_obj, exc_tb):
@@ -42,5 +47,6 @@ class OpenpilotPrefix:
os.remove(symlink_path)
shutil.rmtree(self.msgq_path, ignore_errors=True)
shutil.rmtree(Paths.log_root(), ignore_errors=True)
shutil.rmtree(Paths.download_cache_root(), ignore_errors=True)
if not os.environ.get("COMMA_CACHE", False):
shutil.rmtree(Paths.download_cache_root(), ignore_errors=True)
shutil.rmtree(Paths.comma_home(), ignore_errors=True)

View File

@@ -1,45 +0,0 @@
import time
class Profiler():
def __init__(self, enabled=False):
self.enabled = enabled
self.cp = {}
self.cp_ignored = []
self.iter = 0
self.start_time = time.time()
self.last_time = self.start_time
self.tot = 0.
def reset(self, enabled=False):
self.enabled = enabled
self.cp = {}
self.cp_ignored = []
self.iter = 0
self.start_time = time.time()
self.last_time = self.start_time
def checkpoint(self, name, ignore=False):
# ignore flag needed when benchmarking threads with ratekeeper
if not self.enabled:
return
tt = time.time()
if name not in self.cp:
self.cp[name] = 0.
if ignore:
self.cp_ignored.append(name)
self.cp[name] += tt - self.last_time
if not ignore:
self.tot += tt - self.last_time
self.last_time = tt
def display(self):
if not self.enabled:
return
self.iter += 1
print("******* Profiling %d *******" % self.iter)
for n, ms in sorted(self.cp.items(), key=lambda x: -x[1]):
if n in self.cp_ignored:
print("%30s: %9.2f avg: %7.2f percent: %3.0f IGNORED" % (n, ms*1000.0, ms*1000.0/self.iter, ms/self.tot*100))
else:
print("%30s: %9.2f avg: %7.2f percent: %3.0f" % (n, ms*1000.0, ms*1000.0/self.iter, ms/self.tot*100))
print(f"Iter clock: {self.tot / self.iter:2.6f} TOTAL: {self.tot:2.2f}")

View File

@@ -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()

30
common/retry.py Normal file
View File

@@ -0,0 +1,30 @@
import time
import functools
from openpilot.common.swaglog import cloudlog
def retry(attempts=3, delay=1.0, ignore_failure=False):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
for _ in range(attempts):
try:
return func(*args, **kwargs)
except Exception:
cloudlog.exception(f"{func.__name__} failed, trying again")
time.sleep(delay)
if ignore_failure:
cloudlog.error(f"{func.__name__} failed after retry")
else:
raise Exception(f"{func.__name__} failed after retry")
return wrapper
return decorator
if __name__ == "__main__":
@retry(attempts=10)
def abc():
raise ValueError("abc failed :(")
abc()

54
common/simple_kalman.py Normal file
View File

@@ -0,0 +1,54 @@
import numpy as np
def get_kalman_gain(dt, A, C, Q, R, iterations=100):
P = np.zeros_like(Q)
for _ in range(iterations):
P = A.dot(P).dot(A.T) + dt * Q
S = C.dot(P).dot(C.T) + R
K = P.dot(C.T).dot(np.linalg.inv(S))
P = (np.eye(len(P)) - K.dot(C)).dot(P)
return K
class KF1D:
# this EKF assumes constant covariance matrix, so calculations are much simpler
# the Kalman gain also needs to be precomputed using the control module
def __init__(self, x0, A, C, K):
self.x0_0 = x0[0][0]
self.x1_0 = x0[1][0]
self.A0_0 = A[0][0]
self.A0_1 = A[0][1]
self.A1_0 = A[1][0]
self.A1_1 = A[1][1]
self.C0_0 = C[0]
self.C0_1 = C[1]
self.K0_0 = K[0][0]
self.K1_0 = K[1][0]
self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0
self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1
self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0
self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1
# K matrix needs to be pre-computed as follow:
# import control
# (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R)
# self.K = np.transpose(K)
def update(self, meas):
#self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas)
x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas
x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas
self.x0_0 = x0_0
self.x1_0 = x1_0
return [self.x0_0, self.x1_0]
@property
def x(self):
return [[self.x0_0], [self.x1_0]]
def set_x(self, x):
self.x0_0 = x[0][0]
self.x1_0 = x[1][0]

View File

@@ -1,47 +0,0 @@
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include "common/statlog.h"
#include "common/util.h"
#include <cstdarg>
#include <stdio.h>
#include <mutex>
#include <zmq.h>
class StatlogState : public LogState {
public:
StatlogState() : LogState("ipc:///tmp/stats") {}
};
static StatlogState s = {};
static void log(const char* metric_type, const char* metric, const char* fmt, ...) {
std::lock_guard lk(s.lock);
if (!s.initialized) s.initialize();
char* value_buf = nullptr;
va_list args;
va_start(args, fmt);
int ret = vasprintf(&value_buf, fmt, args);
va_end(args);
if (ret > 0 && value_buf) {
char* line_buf = nullptr;
ret = asprintf(&line_buf, "%s:%s|%s", metric, value_buf, metric_type);
if (ret > 0 && line_buf) {
zmq_send(s.sock, line_buf, ret, ZMQ_NOBLOCK);
free(line_buf);
}
free(value_buf);
}
}
void statlog_log(const char* metric_type, const char* metric, int value) {
log(metric_type, metric, "%d", value);
}
void statlog_log(const char* metric_type, const char* metric, float value) {
log(metric_type, metric, "%f", value);
}

View File

@@ -1,10 +0,0 @@
#pragma once
#define STATLOG_GAUGE "g"
#define STATLOG_SAMPLE "sa"
void statlog_log(const char* metric_type, const char* metric, int value);
void statlog_log(const char* metric_type, const char* metric, float value);
#define statlog_gauge(metric, value) statlog_log(STATLOG_GAUGE, metric, value)
#define statlog_sample(metric, value) statlog_log(STATLOG_SAMPLE, metric, value)

View File

@@ -5,30 +5,29 @@
#include "common/swaglog.h"
#include <cassert>
#include <cstdarg>
#include <cstring>
#include <limits>
#include <mutex>
#include <string>
#include <zmq.h>
#include <stdarg.h>
#include "third_party/json11/json11.hpp"
#include "common/util.h"
#include "common/version.h"
#include "system/hardware/hw.h"
class SwaglogState : public LogState {
public:
SwaglogState() : LogState(Path::swaglog_ipc().c_str()) {}
class SwaglogState {
public:
SwaglogState() {
zctx = zmq_ctx_new();
sock = zmq_socket(zctx, ZMQ_PUSH);
json11::Json::object ctx_j;
// Timeout on shutdown for messages to be received by the logging process
int timeout = 100;
zmq_setsockopt(sock, ZMQ_LINGER, &timeout, sizeof(timeout));
zmq_connect(sock, Path::swaglog_ipc().c_str());
inline void initialize() {
ctx_j = json11::Json::object {};
print_level = CLOUDLOG_WARNING;
const char* print_lvl = getenv("LOGPRINT");
if (print_lvl) {
if (const char* print_lvl = getenv("LOGPRINT")) {
if (strcmp(print_lvl, "debug") == 0) {
print_level = CLOUDLOG_DEBUG;
} else if (strcmp(print_lvl, "info") == 0) {
@@ -38,39 +37,44 @@ class SwaglogState : public LogState {
}
}
// openpilot bindings
char* dongle_id = getenv("DONGLE_ID");
if (dongle_id) {
ctx_j = json11::Json::object{};
if (char* dongle_id = getenv("DONGLE_ID")) {
ctx_j["dongle_id"] = dongle_id;
}
char* daemon_name = getenv("MANAGER_DAEMON");
if (daemon_name) {
if (char* daemon_name = getenv("MANAGER_DAEMON")) {
ctx_j["daemon"] = daemon_name;
}
ctx_j["version"] = COMMA_VERSION;
ctx_j["dirty"] = !getenv("CLEAN");
// device type
ctx_j["device"] = Hardware::get_name();
LogState::initialize();
}
~SwaglogState() {
zmq_close(sock);
zmq_ctx_destroy(zctx);
}
void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) {
std::lock_guard lk(lock);
if (levelnum >= print_level) {
printf("%s: %s\n", filename, msg);
}
zmq_send(sock, log_s.data(), log_s.length(), ZMQ_NOBLOCK);
}
std::mutex lock;
void* zctx = nullptr;
void* sock = nullptr;
int print_level;
json11::Json::object ctx_j;
};
static SwaglogState s = {};
bool LOG_TIMESTAMPS = getenv("LOG_TIMESTAMPS");
uint32_t NO_FRAME_ID = std::numeric_limits<uint32_t>::max();
static void log(int levelnum, const char* filename, int lineno, const char* func, const char* msg, const std::string& log_s) {
if (levelnum >= s.print_level) {
printf("%s: %s\n", filename, msg);
}
zmq_send(s.sock, log_s.data(), log_s.length(), ZMQ_NOBLOCK);
}
static void cloudlog_common(int levelnum, const char* filename, int lineno, const char* func,
char* msg_buf, const json11::Json::object &msg_j={}) {
std::lock_guard lk(s.lock);
if (!s.initialized) s.initialize();
static SwaglogState s;
json11::Json::object log_j = json11::Json::object {
{"ctx", s.ctx_j},
@@ -89,7 +93,7 @@ static void cloudlog_common(int levelnum, const char* filename, int lineno, cons
std::string log_s;
log_s += (char)levelnum;
((json11::Json)log_j).dump(log_s);
log(levelnum, filename, lineno, func, msg_buf, log_s);
s.log(levelnum, filename, lineno, func, msg_buf, log_s);
free(msg_buf);
}

View File

@@ -2,7 +2,6 @@ import os
import unittest
from uuid import uuid4
from openpilot.common.file_helpers import atomic_write_on_fs_tmp
from openpilot.common.file_helpers import atomic_write_in_dir
@@ -11,14 +10,12 @@ class TestFileHelpers(unittest.TestCase):
path = f"/tmp/tmp{uuid4()}"
with atomic_write_func(path) as f:
f.write("test")
assert not os.path.exists(path)
with open(path) as f:
self.assertEqual(f.read(), "test")
os.remove(path)
def test_atomic_write_on_fs_tmp(self):
self.run_atomic_write_func(atomic_write_on_fs_tmp)
def test_atomic_write_in_dir(self):
self.run_atomic_write_func(atomic_write_in_dir)

View File

@@ -0,0 +1,27 @@
#include "catch2/catch.hpp"
#define private public
#include "common/params.h"
#include "common/util.h"
TEST_CASE("params_nonblocking_put") {
char tmp_path[] = "/tmp/asyncWriter_XXXXXX";
const std::string param_path = mkdtemp(tmp_path);
auto param_names = {"CarParams", "IsMetric"};
{
Params params(param_path);
for (const auto &name : param_names) {
params.putNonBlocking(name, "1");
// param is empty
REQUIRE(params.get(name).empty());
}
// check if thread is running
REQUIRE(params.future.valid());
REQUIRE(params.future.wait_for(std::chrono::milliseconds(0)) == std::future_status::timeout);
}
// check results
Params p(param_path);
for (const auto &name : param_names) {
REQUIRE(p.get(name) == "1");
}
}

View File

@@ -4,7 +4,7 @@ import time
import uuid
import unittest
from openpilot.common.params import Params, ParamKeyType, UnknownKeyName, put_nonblocking, put_bool_nonblocking
from openpilot.common.params import Params, ParamKeyType, UnknownKeyName
class TestParams(unittest.TestCase):
def setUp(self):
@@ -86,7 +86,7 @@ class TestParams(unittest.TestCase):
q = Params()
def _delayed_writer():
time.sleep(0.1)
put_nonblocking("CarParams", "test")
Params().put_nonblocking("CarParams", "test")
threading.Thread(target=_delayed_writer).start()
assert q.get("CarParams") is None
assert q.get("CarParams", True) == b"test"
@@ -95,7 +95,7 @@ class TestParams(unittest.TestCase):
q = Params()
def _delayed_writer():
time.sleep(0.1)
put_bool_nonblocking("CarParams", True)
Params().put_bool_nonblocking("CarParams", True)
threading.Thread(target=_delayed_writer).start()
assert q.get("CarParams") is None
assert q.get("CarParams", True) == b"1"

View File

@@ -1,23 +0,0 @@
#include "catch2/catch.hpp"
#include "common/ratekeeper.h"
#include "common/timing.h"
#include "common/util.h"
TEST_CASE("RateKeeper") {
float freq = GENERATE(10, 50, 100);
RateKeeper rk("Test RateKeeper", freq);
int lags = 0;
int bad_keep_times = 0;
for (int i = 0; i < freq; ++i) {
double begin = seconds_since_boot();
util::sleep_for(util::random_int(0, 1000.0 / freq - 1));
bool lagged = rk.keepTime();
lags += lagged;
bad_keep_times += (seconds_since_boot() - begin - (1 / freq)) > 1e-3;
}
// need a tolerance here due to scheduling
REQUIRE(lags < 5);
REQUIRE(bad_keep_times < 5);
}

View File

@@ -0,0 +1,35 @@
import unittest
from openpilot.common.simple_kalman import KF1D
class TestSimpleKalman(unittest.TestCase):
def setUp(self):
dt = 0.01
x0_0 = 0.0
x1_0 = 0.0
A0_0 = 1.0
A0_1 = dt
A1_0 = 0.0
A1_1 = 1.0
C0_0 = 1.0
C0_1 = 0.0
K0_0 = 0.12287673
K1_0 = 0.29666309
self.kf = KF1D(x0=[[x0_0], [x1_0]],
A=[[A0_0, A0_1], [A1_0, A1_1]],
C=[C0_0, C0_1],
K=[[K0_0], [K1_0]])
def test_getter_setter(self):
self.kf.set_x([[1.0], [1.0]])
self.assertEqual(self.kf.x, [[1.0], [1.0]])
def update_returns_state(self):
x = self.kf.update(100)
self.assertEqual(x, self.kf.x)
if __name__ == "__main__":
unittest.main()

View File

@@ -3,4 +3,4 @@ import datetime
MIN_DATE = datetime.datetime(year=2023, month=6, day=1)
def system_time_valid():
return datetime.datetime.now() > MIN_DATE
return datetime.datetime.now() > MIN_DATE

View File

@@ -3,7 +3,6 @@
#include <fcntl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <zmq.h>
#include <algorithm>
#include <atomic>
@@ -180,36 +179,3 @@ void update_max_atomic(std::atomic<T>& max, T const& value) {
T prev = max;
while (prev < value && !max.compare_exchange_weak(prev, value)) {}
}
class LogState {
public:
bool initialized = false;
std::mutex lock;
void *zctx = nullptr;
void *sock = nullptr;
int print_level;
std::string endpoint;
LogState(std::string _endpoint) {
endpoint = _endpoint;
}
inline void initialize() {
zctx = zmq_ctx_new();
sock = zmq_socket(zctx, ZMQ_PUSH);
// Timeout on shutdown for messages to be received by the logging process
int timeout = 100;
zmq_setsockopt(sock, ZMQ_LINGER, &timeout, sizeof(timeout));
zmq_connect(sock, endpoint.c_str());
initialized = true;
}
~LogState() {
if (initialized) {
zmq_close(sock);
zmq_ctx_destroy(zctx);
}
}
};

View File

@@ -1 +1 @@
#define COMMA_VERSION "0.9.5.3"
#define COMMA_VERSION "0.9.6"

View File

@@ -1,61 +0,0 @@
import sys
import pygame
import cv2
class Window:
def __init__(self, w, h, caption="window", double=False, halve=False):
self.w = w
self.h = h
pygame.display.init()
pygame.display.set_caption(caption)
self.double = double
self.halve = halve
if self.double:
self.rw, self.rh = w*2, h*2
elif self.halve:
self.rw, self.rh = w//2, h//2
else:
self.rw, self.rh = w, h
self.screen = pygame.display.set_mode((self.rw, self.rh))
pygame.display.flip()
# hack for xmonad, it shrinks the window by 6 pixels after the display.flip
if self.screen.get_width() != self.rw:
self.screen = pygame.display.set_mode((self.rw+(self.rw-self.screen.get_width()), self.rh+(self.rh-self.screen.get_height())))
pygame.display.flip()
def draw(self, out):
pygame.event.pump()
if self.double:
out2 = cv2.resize(out, (self.w*2, self.h*2))
pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
elif self.halve:
out2 = cv2.resize(out, (self.w//2, self.h//2))
pygame.surfarray.blit_array(self.screen, out2.swapaxes(0, 1))
else:
pygame.surfarray.blit_array(self.screen, out.swapaxes(0, 1))
pygame.display.flip()
def getkey(self):
while 1:
event = pygame.event.wait()
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
return event.key
def getclick(self):
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN:
mx, my = pygame.mouse.get_pos()
return mx, my
if __name__ == "__main__":
import numpy as np
win = Window(200, 200, double=True)
img: np.ndarray = np.zeros((200, 200, 3), np.uint8)
while 1:
print("draw")
img += 1
win.draw(img)

View File

@@ -1,46 +0,0 @@
import os
from cffi import FFI
from typing import Any, List
# Workaround for the EON/termux build of Python having os.*xattr removed.
ffi = FFI()
ffi.cdef("""
int setxattr(const char *path, const char *name, const void *value, size_t size, int flags);
ssize_t getxattr(const char *path, const char *name, void *value, size_t size);
ssize_t listxattr(const char *path, char *list, size_t size);
int removexattr(const char *path, const char *name);
""")
libc = ffi.dlopen(None)
def setxattr(path, name, value, flags=0) -> None:
path = path.encode()
name = name.encode()
if libc.setxattr(path, name, value, len(value), flags) == -1:
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: setxattr({path}, {name}, {value}, {flags})")
def getxattr(path, name, size=128):
path = path.encode()
name = name.encode()
value = ffi.new(f"char[{size}]")
l = libc.getxattr(path, name, value, size)
if l == -1:
# errno 61 means attribute hasn't been set
if ffi.errno == 61:
return None
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: getxattr({path}, {name}, {size})")
return ffi.buffer(value)[:l]
def listxattr(path, size=128) -> List[Any]:
path = path.encode()
attrs = ffi.new(f"char[{size}]")
l = libc.listxattr(path, attrs, size)
if l == -1:
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: listxattr({path}, {size})")
# attrs is b'\0' delimited values (so chop off trailing empty item)
return [a.decode() for a in ffi.buffer(attrs)[:l].split(b"\0")[0:-1]]
def removexattr(path, name) -> None:
path = path.encode()
name = name.encode()
if libc.removexattr(path, name) == -1:
raise OSError(ffi.errno, f"{os.strerror(ffi.errno)}: removexattr({path}, {name})")

View File

@@ -3,17 +3,35 @@ import pytest
import random
from openpilot.common.prefix import OpenpilotPrefix
from openpilot.selfdrive.manager import manager
from openpilot.system.hardware import TICI
def pytest_sessionstart(session):
# TODO: fix tests and enable test order randomization
if session.config.pluginmanager.hasplugin('randomly'):
session.config.option.randomly_reorganize = False
@pytest.hookimpl(hookwrapper=True, trylast=True)
def pytest_runtest_call(item):
# ensure we run as a hook after capturemanager's
if item.get_closest_marker("nocapture") is not None:
capmanager = item.config.pluginmanager.getplugin("capturemanager")
with capmanager.global_and_fixture_disabled():
yield
else:
yield
@pytest.fixture(scope="function", autouse=True)
def openpilot_function_fixture():
def openpilot_function_fixture(request):
starting_env = dict(os.environ)
random.seed(0)
# setup a clean environment for each test
with OpenpilotPrefix():
with OpenpilotPrefix(shared_download_cache=request.node.get_closest_marker("shared_download_cache") is not None) as prefix:
prefix = os.environ["OPENPILOT_PREFIX"]
yield
@@ -24,6 +42,8 @@ def openpilot_function_fixture():
os.environ.clear()
os.environ.update(starting_env)
# cleanup any started processes
manager.manager_cleanup()
# If you use setUpClass, the environment variables won't be cleared properly,
# so we need to hook both the function and class pytest fixtures
@@ -37,8 +57,26 @@ def openpilot_class_fixture():
os.environ.update(starting_env)
@pytest.hookimpl(tryfirst=True)
def pytest_collection_modifyitems(config, items):
skipper = pytest.mark.skip(reason="Skipping tici test on PC")
for item in items:
if not TICI and "tici" in item.keywords:
item.add_marker(skipper)
item.add_marker(skipper)
if "xdist_group_class_property" in item.keywords:
class_property_name = item.get_closest_marker('xdist_group_class_property').args[0]
class_property_value = getattr(item.cls, class_property_name)
item.add_marker(pytest.mark.xdist_group(class_property_value))
@pytest.hookimpl(trylast=True)
def pytest_configure(config):
config_line = "xdist_group_class_property: group tests by a property of the class that contains them"
config.addinivalue_line("markers", config_line)
config_line = "nocapture: don't capture test output"
config.addinivalue_line("markers", config_line)
config_line = "shared_download_cache: share download cache between tests"
config.addinivalue_line("markers", config_line)

62
docs/BOUNTIES.md Normal file
View File

@@ -0,0 +1,62 @@
# [Bounties](https://github.com/orgs/commaai/projects/26/views/1)
Get paid to improve openpilot!
## Rules
* code must be merged into openpilot master
* bounty eligibility is solely at our discretion
* once you open a PR, the bounty is locked to you until you stop working on it
* open a ticket at [comma.ai/support](https://comma.ai/support/shop-order) with links to your PRs to claim
* get an extra 20% if you redeem your bounty in [comma shop](https://comma.ai/shop) credit (including refunds on previous orders)
New bounties can be proposed in the [**#contributing**](https://discord.com/channels/469524606043160576/1183173332531687454) channel in Discord.
## 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:
* **$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
* **$1k+** - a week or two of work (could be less for the right person)
## Car bounties
The car bounties only apply to cars that have a path to ship in openpilot release, which excludes unsupportable cars (e.g. Fords with a steering lockout) or cars that require extra hardware (Honda Accord with serial steering).
#### Brand or platform port - $2000
Example PR: [commaai/openpilot#23331](https://github.com/commaai/openpilot/pull/23331)
This is for adding support for an entirely new brand or a substantially new ADAS platform within a brand (e.g. the Volkswagen PQ platform).
#### Model port - $250
Example PR: [commaai/openpilot#30245](https://github.com/commaai/openpilot/pull/30245)
This is for porting a new car model that runs on a platform openpilot already supports.
In the average case, this is a few hours of work for an experienced software developer.
This bounty also covers getting openpilot supported on a previously unsupported trim of an already supported car, e.g. the Chevy Bolt without ACC.
#### Reverse Engineering a new Actuation Message - $300
This is for cars that are already supported, and it has three components:
* reverse a new steering, adaptive cruise, or AEB message
* merge the DBC definitions to [opendbc](http://github.com/commaai/opendbc)
* merge the openpilot code to use it and post a demo route
The control doesn't have to be perfect, but it should generally do what it's supposed to do.
### Specific Cars
#### Rivian R1T or R1S - $3000
Get a Rivian driving with openpilot.
Requires a merged port with lateral control and at least a POC of longitudinal control.
#### Toyota SecOc - $5000
We're contributing $5k to the [community-organized bounty](https://github.com/commaai/openpilot/discussions/19932).
#### Chevy Bolt with SuperCruise - $2500
The Bolt is already supported on the trim with standard ACC. Get openpilot working on the trim with SuperCruise. It must be a normal install: no extra pandas or other hardware, no ECU reflashes, etc. The full bounty is for a port with lateral and longitudinal control. $1500 of the bounty can be claimed with a lateral-only port.

View File

@@ -28,13 +28,14 @@ A supported vehicle is one that just works when you install a comma device. All
|Chevrolet|Volt 2017-18[<sup>4</sup>](#footnotes)|Adaptive Cruise Control (ACC)|openpilot|0 mph|7 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 OBD-II connector<br>- 1 comma 3X<br>- 2 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chevrolet&model=Volt 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/QeMCN_4TFfQ" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Chrysler|Pacifica 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica 2017-18">Buy Here</a></sub></details>||
|Chrysler|Pacifica 2019-20|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica 2019-20">Buy Here</a></sub></details>||
|Chrysler|Pacifica 2021|All|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica 2021">Buy Here</a></sub></details>||
|Chrysler|Pacifica Hybrid 2017-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2017-18">Buy Here</a></sub></details>||
|Chrysler|Pacifica 2021-23|All|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica 2021-23">Buy Here</a></sub></details>||
|Chrysler|Pacifica Hybrid 2017|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2017">Buy Here</a></sub></details>||
|Chrysler|Pacifica Hybrid 2018|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2018">Buy Here</a></sub></details>||
|Chrysler|Pacifica Hybrid 2019-23|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Chrysler&model=Pacifica Hybrid 2019-23">Buy Here</a></sub></details>||
|comma|body|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|None||
|Ford|Bronco Sport 2021-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Bronco Sport 2021-22">Buy Here</a></sub></details>||
|Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Escape 2020-22">Buy Here</a></sub></details>||
|Ford|Explorer 2020-22|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Explorer 2020-22">Buy Here</a></sub></details>||
|Ford|Explorer 2020-23|Co-Pilot360 Assist+|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Explorer 2020-23">Buy Here</a></sub></details>||
|Ford|Focus 2018[<sup>3</sup>](#footnotes)|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Focus 2018">Buy Here</a></sub></details>||
|Ford|Kuga 2020-22|Adaptive Cruise Control with Lane Centering|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Kuga 2020-22">Buy Here</a></sub></details>||
|Ford|Maverick 2022|LARIAT Luxury|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 RJ45 cable (7 ft)<br>- 1 angled mount (8 degrees)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Ford&model=Maverick 2022">Buy Here</a></sub></details>||
@@ -76,6 +77,7 @@ A supported vehicle is one that just works when you install a comma device. All
|Honda|Pilot 2016-22|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Pilot 2016-22">Buy Here</a></sub></details>||
|Honda|Ridgeline 2017-23|Honda Sensing|openpilot|25 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Honda&model=Ridgeline 2017-23">Buy Here</a></sub></details>||
|Hyundai|Azera 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera 2022">Buy Here</a></sub></details>||
|Hyundai|Azera Hybrid 2019|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera Hybrid 2019">Buy Here</a></sub></details>||
|Hyundai|Azera Hybrid 2020|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Azera Hybrid 2020">Buy Here</a></sub></details>||
|Hyundai|Bayon Non-SCC 2021|No Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Bayon Non-SCC 2021">Buy Here</a></sub></details>||
|Hyundai|Custin 2023|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Custin 2023">Buy Here</a></sub></details>||
@@ -101,26 +103,27 @@ A supported vehicle is one that just works when you install a comma device. All
|Hyundai|Kona Electric 2018-21|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Electric 2018-21">Buy Here</a></sub></details>||
|Hyundai|Kona Electric 2022-23|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai O connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Electric 2022-23">Buy Here</a></sub></details>||
|Hyundai|Kona Electric (with HDA II, Korea only) 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai R connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Electric (with HDA II, Korea only) 2023">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=U2fOCmcQ8hw" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai I connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Hybrid 2020">Buy Here</a></sub></details>|<a href="https://youtu.be/0dwpAHiZgFo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Kona Hybrid 2020|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai I connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Hybrid 2020">Buy Here</a></sub></details>||
|Hyundai|Kona Non-SCC 2019|No Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai B connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Kona Non-SCC 2019">Buy Here</a></sub></details>||
|Hyundai|Palisade 2020-22|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai H connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Palisade 2020-22">Buy Here</a></sub></details>|<a href="https://youtu.be/TAnDqjF4fDY?t=456" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Santa Cruz 2022-23[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Cruz 2022-23">Buy Here</a></sub></details>||
|Hyundai|Santa Fe 2019-20|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai D connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Fe 2019-20">Buy Here</a></sub></details>||
|Hyundai|Santa Cruz 2022-23[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Cruz 2022-23">Buy Here</a></sub></details>||
|Hyundai|Santa Fe 2019-20|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai D connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Fe 2019-20">Buy Here</a></sub></details>|<a href="https://youtu.be/bjDR0YjM__s" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Santa Fe 2021-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Fe 2021-23">Buy Here</a></sub></details>|<a href="https://youtu.be/VnHzSTygTS4" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Santa Fe Hybrid 2022-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Fe Hybrid 2022-23">Buy Here</a></sub></details>||
|Hyundai|Santa Fe Plug-in Hybrid 2022-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Santa Fe Plug-in Hybrid 2022-23">Buy Here</a></sub></details>||
|Hyundai|Sonata 2018-19|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Sonata 2018-19">Buy Here</a></sub></details>||
|Hyundai|Sonata 2020-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Sonata 2020-23">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=ix63r9kE3Fw" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Hyundai|Sonata Hybrid 2020-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Sonata Hybrid 2020-23">Buy Here</a></sub></details>||
|Hyundai|Staria 2023[<sup>6</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Staria 2023">Buy Here</a></sub></details>||
|Hyundai|Tucson 2021|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson 2021">Buy Here</a></sub></details>||
|Hyundai|Tucson 2022[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson 2022">Buy Here</a></sub></details>||
|Hyundai|Tucson 2023[<sup>8</sup>](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson 2023">Buy Here</a></sub></details>||
|Hyundai|Tucson 2022[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson 2022">Buy Here</a></sub></details>||
|Hyundai|Tucson 2023[<sup>8</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson 2023">Buy Here</a></sub></details>||
|Hyundai|Tucson Diesel 2019|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai L connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson Diesel 2019">Buy Here</a></sub></details>||
|Hyundai|Tucson Hybrid 2022-24[<sup>8</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Tucson Hybrid 2022-24">Buy Here</a></sub></details>||
|Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Hyundai&model=Veloster 2019-20">Buy Here</a></sub></details>||
|Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Jeep&model=Grand Cherokee 2016-18">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=eLR9o2JkuRk" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Jeep&model=Grand Cherokee 2019-21">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=jBe4lWnRSu4" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Kia|Carnival 2023-24[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Carnival 2023-24">Buy Here</a></sub></details>||
|Kia|Carnival 2022-24[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Carnival 2022-24">Buy Here</a></sub></details>||
|Kia|Carnival (China only) 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Carnival (China only) 2023">Buy Here</a></sub></details>||
|Kia|Ceed 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Ceed 2019">Buy Here</a></sub></details>||
|Kia|EV6 (Southeast Asia only) 2022-23[<sup>8</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai P connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=EV6 (Southeast Asia only) 2022-23">Buy Here</a></sub></details>||
@@ -138,10 +141,12 @@ A supported vehicle is one that just works when you install a comma device. All
|Kia|Niro EV 2021|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro EV 2021">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=lT7zcG6ZpGo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Kia|Niro EV 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai H connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro EV 2022">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=lT7zcG6ZpGo" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Kia|Niro EV 2023[<sup>8</sup>](#footnotes)|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro EV 2023">Buy Here</a></sub></details>||
|Kia|Niro Hybrid 2021-22|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Hybrid 2021-22">Buy Here</a></sub></details>||
|Kia|Niro Hybrid 2021|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai D connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Hybrid 2021">Buy Here</a></sub></details>||
|Kia|Niro Hybrid 2022|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Hybrid 2022">Buy Here</a></sub></details>||
|Kia|Niro Hybrid 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Hybrid 2023">Buy Here</a></sub></details>||
|Kia|Niro Plug-in Hybrid 2018-19|All|Stock|10 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Plug-in Hybrid 2018-19">Buy Here</a></sub></details>||
|Kia|Niro Plug-in Hybrid 2020|All|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai D connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Plug-in Hybrid 2020">Buy Here</a></sub></details>||
|Kia|Niro Plug-in Hybrid 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai F connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Niro Plug-in Hybrid 2022">Buy Here</a></sub></details>||
|Kia|Optima 2017|Advanced Smart Cruise Control|Stock|0 mph|32 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai B connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Optima 2017">Buy Here</a></sub></details>||
|Kia|Optima 2019-20|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai G connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Optima 2019-20">Buy Here</a></sub></details>||
|Kia|Optima Hybrid 2019|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai H connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Optima Hybrid 2019">Buy Here</a></sub></details>||
@@ -152,16 +157,17 @@ A supported vehicle is one that just works when you install a comma device. All
|Kia|Sorento 2021-23[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sorento 2021-23">Buy Here</a></sub></details>||
|Kia|Sorento Hybrid 2021-23[<sup>8</sup>](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sorento Hybrid 2021-23">Buy Here</a></sub></details>||
|Kia|Sorento Plug-in Hybrid 2022-23[<sup>8</sup>](#footnotes)|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sorento Plug-in Hybrid 2022-23">Buy Here</a></sub></details>||
|Kia|Sportage 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sportage 2023">Buy Here</a></sub></details>||
|Kia|Sportage 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sportage 2023">Buy Here</a></sub></details>||
|Kia|Sportage Hybrid 2023[<sup>8</sup>](#footnotes)|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Sportage Hybrid 2023">Buy Here</a></sub></details>||
|Kia|Stinger 2018-20|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai C connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Stinger 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=MJ94qoofYw0" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Kia|Stinger 2022|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Stinger 2022">Buy Here</a></sub></details>||
|Kia|Stinger 2022-23|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Stinger 2022-23">Buy Here</a></sub></details>||
|Kia|Telluride 2020-22|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai H connector<br>- 1 RJ45 cable (7 ft)<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Kia&model=Telluride 2020-22">Buy Here</a></sub></details>||
|Lexus|CT Hybrid 2017-18|Lexus Safety System+|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=CT Hybrid 2017-18">Buy Here</a></sub></details>||
|Lexus|ES 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=ES 2017-18">Buy Here</a></sub></details>||
|Lexus|ES 2019-24|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=ES 2019-24">Buy Here</a></sub></details>||
|Lexus|ES Hybrid 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=ES Hybrid 2017-18">Buy Here</a></sub></details>||
|Lexus|ES Hybrid 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=ES Hybrid 2017-18">Buy Here</a></sub></details>||
|Lexus|ES Hybrid 2019-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=ES Hybrid 2019-23">Buy Here</a></sub></details>|<a href="https://youtu.be/BZ29osRVJeg?t=12" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Lexus|GS F 2016|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=GS F 2016">Buy Here</a></sub></details>||
|Lexus|IS 2017-19|All|Stock|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=IS 2017-19">Buy Here</a></sub></details>||
|Lexus|IS 2022-23|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=IS 2022-23">Buy Here</a></sub></details>||
|Lexus|NX 2018-19|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Lexus&model=NX 2018-19">Buy Here</a></sub></details>||
@@ -250,10 +256,12 @@ A supported vehicle is one that just works when you install a comma device. All
|Toyota|RAV4 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2017-18">Buy Here</a></sub></details>||
|Toyota|RAV4 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2019-21">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=wJxjDd42gGA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2022">Buy Here</a></sub></details>||
|Toyota|RAV4 2023-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 2023-24">Buy Here</a></sub></details>||
|Toyota|RAV4 Hybrid 2016|Toyota Safety Sense P|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2016">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2017-18|All|openpilot available[<sup>2</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2017-18">Buy Here</a></sub></details>|<a href="https://youtu.be/LhT5VzJVfNI?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2019-21|All|openpilot|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2019-21">Buy Here</a></sub></details>||
|Toyota|RAV4 Hybrid 2022|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2022">Buy Here</a></sub></details>|<a href="https://youtu.be/U0nH9cnrFB0" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Toyota|RAV4 Hybrid 2023-24|All|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=RAV4 Hybrid 2023-24">Buy Here</a></sub></details>||
|Toyota|Sienna 2018-20|All|openpilot available[<sup>2</sup>](#footnotes)|19 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 RJ45 cable (7 ft)<br>- 1 Toyota A connector<br>- 1 comma 3X<br>- 1 comma power v2<br>- 1 harness box<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Toyota&model=Sienna 2018-20">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=q1UPOo4Sh68" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Volkswagen|Arteon 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,14</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon 2018-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|
|Volkswagen|Arteon eHybrid 2020-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,14</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 J533 connector<br>- 1 USB-C coupler<br>- 1 comma 3X<br>- 1 harness box<br>- 1 long OBD-C cable<br>- 1 mount<br>- 1 right angle OBD-C cable (1.5 ft)<br><a href="https://comma.ai/shop/comma-3x.html?make=Volkswagen&model=Arteon eHybrid 2020-23">Buy Here</a></sub></details>|<a href="https://youtu.be/FAomFKPFlDA" target="_blank"><img height="18px" src="assets/icon-youtube.svg"></img></a>|

View File

@@ -1,26 +1,50 @@
# How to contribute
Our software is open source so you can solve your own problems without needing help from others. And if you solve a problem and are so kind, you can upstream it for the rest of the world to use. Check out our [post about externalization](https://blog.comma.ai/a-2020-theme-externalization/).
Most open source development activity is coordinated through our [GitHub Discussions](https://github.com/commaai/openpilot/discussions) and [Discord](https://discord.comma.ai). A lot of documentation is available at https://docs.comma.ai and on our [blog](https://blog.comma.ai/).
Our software is open source so you can solve your own problems without needing help from others. And if you solve a problem and are so kind, you can upstream it for the rest of the world to use. Check out our [post about externalization](https://blog.comma.ai/a-2020-theme-externalization/). Development activity is coordinated through our GitHub Issues, [GitHub Discussions](https://github.com/commaai/openpilot/discussions), and [Discord](https://discord.comma.ai).
### Getting Started
* Setup your [development environment](../tools/)
* Join our [Discord](https://discord.comma.ai)
* Make sure you have a [GitHub account](https://github.com/signup/free)
* Fork [our repositories](https://github.com/commaai) on GitHub
* Setup your [development environment](../tools/)
* Read about the [development workflow](WORKFLOW.md)
* Join our [Discord](https://discord.comma.ai)
* Docs are at https://docs.comma.ai and https://blog.comma.ai
## 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** development is towards that goal.
### What gets merged?
The probability of a pull request being merged is a function of its value to the project and the effort it will take us to get it merged.
If a PR offers *some* value but will take lots of time to get merged, it will be closed.
Simple, well-tested bug fixes are the easiest to merge, and new features are the hardest to get merged.
All of these are examples of good PRs:
* typo fix: https://github.com/commaai/openpilot/pull/30678
* removing unused code: https://github.com/commaai/openpilot/pull/30573
* simple car model port: https://github.com/commaai/openpilot/pull/30245
* car brand port: https://github.com/commaai/openpilot/pull/23331
### What doesn't get merged?
* **arbitrary style changes**: code is art, and it's up to the author to make it beautiful
* **500+ line PRs**: clean it up, break it up into smaller PRs, or both
* **PRs without a clear goal**: every PR must have a singular and clear goal
* **UI design changes**: we do not have a good review process for this yet
* **New features**: We believe openpilot is mostly feature-complete, and the rest is a matter of refinement and fixing bugs. As a result of this, most feature PRs will be immediately closed, however the beauty of open source is that forks can and do offer features that upstream openpilot doesn't.
### First contribution
Try out some of these first pull requests ideas to dive into the codebase:
* Increase our [mypy](http://mypy-lang.org/) coverage
* Write some documentation
* Tackle an open [good first issue](https://github.com/commaai/openpilot/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
Check out any [good first issue](https://github.com/commaai/openpilot/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) to get started.
### What do I need to contribute?
A lot of openpilot work requires only a PC, and some requires a comma device.
Most car-related contributions require access to that car, plus a comma device installed in the car.
## Pull Requests
Pull requests should be against the master branch. Welcomed contributions include bug reports, car ports, and any [open issue](https://github.com/commaai/openpilot/issues). If you're unsure about a contribution, feel free to open a discussion, issue, or draft PR to discuss the problem you're trying to solve.
Pull requests should be against the master branch. If you're unsure about a contribution, feel free to open a discussion, issue, or draft PR to discuss the problem you're trying to solve.
A good pull request has all of the following:
* a clearly stated purpose
@@ -31,18 +55,11 @@ A good pull request has all of the following:
* if you've improved your car's tuning, post before and after plots
* passes the CI tests
### Car Ports
## Contributing without Code
We've released a [Model Port guide](https://blog.comma.ai/openpilot-port-guide-for-toyota-models/) for porting to Toyota/Lexus models.
If you port openpilot to a substantially new car brand, see this more generic [Brand Port guide](https://blog.comma.ai/how-to-write-a-car-port-for-openpilot/).
## Testing
### Automated Testing
All PRs and commits are automatically checked by GitHub Actions. Check out `.github/workflows/` for what GitHub Actions runs. Any new tests should be added to GitHub Actions.
### Code Style and Linting
Code is automatically checked for style by GitHub Actions as part of the automated tests. You can also run these tests yourself by running `pre-commit run --all`.
* Report bugs in GitHub issues.
* Report driving issues in the `#driving-feedback` Discord channel.
* Consider opting into driver camera uploads to improve the driver monitoring model.
* Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models.
* Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release.
* Annotate images in the [comma10k dateset](https://github.com/commaai/comma10k).

View File

@@ -41,13 +41,13 @@ clean:
@echo "Building rst files..."
sphinx-apidoc -o "$(DOCSBUILDDIR)" ../ \
../xx ../laika_repo ../rednose_repo ../notebooks ../panda_jungle \
../xx ../rednose_repo ../notebooks ../panda_jungle \
../third_party \
../panda/examples \
../scripts \
../selfdrive/modeld \
../selfdrive/debug \
$(shell find .. -type d -name "*test*")
$(shell find .. -type d -name "*test* -not -path "**.venv**" \")
@echo "Building html files..."
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(DOCSBUILDDIR)" $(SPHINXOPTS) $(O)

3
docs/README.md Normal file
View File

@@ -0,0 +1,3 @@
# openpilot-docs
These docs are autogenerated from [this folder](https://github.com/commaai/openpilot/tree/master/docs) in the main openpilot repository.

42
docs/WORKFLOW.md Normal file
View File

@@ -0,0 +1,42 @@
# openpilot development workflow
Aside from the ML models, most tools used for openpilot development are in this repo.
Most development happens on normal Ubuntu workstations, and not in cars or directly on comma devices. See the [setup guide](../tools) for getting your PC setup for openpilot development.
## Quick start
```bash
# get the latest stuff
git pull
git submodule update --init --recursive
# update dependencies
tools/ubuntu_setup.sh
# build everything
scons -j$(nproc)
# build just the ui with either of these
scons -j8 selfdrive/ui/
cd selfdrive/ui/ && scons -u -j8
# test everything
pytest .
# test just logging services
cd system/loggerd && pytest .
# run the linter
pre-commit run --all
```
## Testing
### Automated Testing
All PRs and commits are automatically checked by GitHub Actions. Check out `.github/workflows/` for what GitHub Actions runs. Any new tests should be added to GitHub Actions.
### Code Style and Linting
Code is automatically checked for style by GitHub Actions as part of the automated tests. You can also run these tests yourself by running `pre-commit run --all`.

BIN
docs/_static/logo.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 129 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 129 B

View File

@@ -29,8 +29,6 @@ camerad
^^^^^^^
.. autodoxygenindex::
:project: system_camerad_cameras
.. autodoxygenindex::
:project: system_camerad_imgproc
locationd
^^^^^^^^^
@@ -43,12 +41,6 @@ ui
.. autodoxygenindex::
:project: selfdrive_ui
soundd
""""""
.. autodoxygenindex::
:project: selfdrive_ui_soundd
replay
""""""
.. autodoxygenindex::

View File

@@ -18,14 +18,6 @@ cereal
cereal/README.md
cereal/messaging/msgq.md
laika
=========
.. toctree::
:maxdepth: 4
laika_repo/README.md
models
=========

1
laika
View File

@@ -1 +0,0 @@
laika_repo/laika/

Submodule laika_repo deleted from 8861844c9b

View File

@@ -9,11 +9,6 @@ source "$BASEDIR/launch_env.sh"
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
function agnos_init {
# wait longer for weston to come up
if [ -f "$BASEDIR/prebuilt" ]; then
sleep 3
fi
# TODO: move this to agnos
sudo rm -f /data/etc/NetworkManager/system-connections/*.nmmeta
@@ -35,9 +30,6 @@ function launch {
# Remove orphaned git lock if it exists on boot
[ -f "$DIR/.git/index.lock" ] && rm -f $DIR/.git/index.lock
# Pull time from panda
$DIR/selfdrive/boardd/set_time.py
# Check to see if there's a valid overlay-based update available. Conditions
# are as follows:
#
@@ -77,14 +69,19 @@ function launch {
export PYTHONPATH="$PWD"
# hardware specific init
agnos_init
if [ -f /AGNOS ]; then
agnos_init
fi
# write tmux scrollback to a file
tmux capture-pane -pq -S-1000 > /tmp/launch_log
# start manager
cd selfdrive/manager
./build.py && ./manager.py
if [ ! -f $DIR/prebuilt ]; then
./build.py
fi
./manager.py
# if broken, keep on screen error
while true; do sleep 1; done

View File

@@ -7,11 +7,7 @@ export OPENBLAS_NUM_THREADS=1
export VECLIB_MAXIMUM_THREADS=1
if [ -z "$AGNOS_VERSION" ]; then
export AGNOS_VERSION="8.2"
fi
if [ -z "$PASSIVE" ]; then
export PASSIVE="1"
export AGNOS_VERSION="9.1"
fi
export STAGING_ROOT="/data/safe_staging"

View File

@@ -1,5 +1,3 @@
#!/usr/bin/bash
export PASSIVE="0"
exec ./launch_chffrplus.sh

Submodule opendbc updated: ab68094723...639bf0a4db

2
panda

Submodule panda updated: 89b34a757a...39c33e9db0

5897
poetry.lock generated

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,8 @@
[tool.pytest.ini_options]
minversion = "6.0"
addopts = "--ignore=openpilot/ --ignore=cereal/ --ignore=opendbc/ --ignore=panda/ --ignore=rednose_repo/ --ignore=tinygrad_repo/ --ignore=laika_repo/ -Werror --strict-config --strict-markers --durations=10"
#cpp_files = "test_*" # uncomment when agnos has pytest-cpp and remove from CI
addopts = "--ignore=openpilot/ --ignore=cereal/ --ignore=opendbc/ --ignore=panda/ --ignore=rednose_repo/ --ignore=tinygrad_repo/ --ignore=teleoprtc_repo/ -Werror --strict-config --strict-markers --durations=10 -n auto --dist=loadgroup"
cpp_files = "test_*"
cpp_harness = "selfdrive/test/cpp_harness.py"
python_files = "test_*.py"
#timeout = "30" # you get this long by default
markers = [
@@ -16,13 +17,17 @@ testpaths = [
"selfdrive/controls",
"selfdrive/locationd",
"selfdrive/monitoring",
"selfdrive/navd/tests",
"selfdrive/thermald",
"selfdrive/test/longitudinal_maneuvers",
"selfdrive/test/process_replay/test_fuzzy.py",
"system/camerad",
"system/hardware/tici",
"system/loggerd",
"system/proclogd",
"system/tests",
"system/ubloxd",
"system/webrtc",
"tools/lib/tests",
"tools/replay",
"tools/cabana"
@@ -38,12 +43,12 @@ exclude = [
"cereal/",
"opendbc/",
"panda/",
"laika/",
"laika_repo/",
"rednose/",
"rednose_repo/",
"tinygrad/",
"tinygrad_repo/",
"teleoprtc/",
"teleoprtc_repo/",
"third_party/",
]
@@ -72,49 +77,39 @@ documentation = "https://docs.comma.ai"
[tool.poetry.dependencies]
python = "~3.11"
atomicwrites = "*"
aiohttp = "*"
aiortc = "*"
casadi = "==3.6.3"
cffi = "*"
control = "*"
crcmod = "*"
cryptography = "*"
Cython = "*"
future-fstrings = "*" # for acados
hatanaka = "==2.4"
hexdump = "*"
Jinja2 = "*"
json-rpc = "*"
libusb1 = "*"
numpy = "*"
onnx = ">=1.14.0"
onnxruntime = { version = ">=1.15.1", platform = "linux", markers = "platform_machine == 'aarch64'" }
onnxruntime-gpu = { version = ">=1.15.1", platform = "linux", markers = "platform_machine == 'x86_64'" }
onnxruntime = { version = ">=1.16.3", platform = "linux", markers = "platform_machine == 'aarch64'" }
onnxruntime-gpu = { version = ">=1.16.3", platform = "linux", markers = "platform_machine == 'x86_64'" }
psutil = "*"
pyaudio = "*"
pycapnp = "*"
pycryptodome = "*"
pycurl = "*"
pydub = "*"
PyJWT = "*"
pyopencl = "*"
pyserial = "*"
PyYAML = "*"
pyzmq = "*"
requests = "*"
scons = "*"
sentry-sdk = "==1.28.1" # needs to be updated with AGNOS
setproctitle = "*"
smbus2 = "*"
sounddevice = "*"
spidev = { version = "*", platform = "linux" }
sympy = "*"
timezonefinder = "*"
tqdm = "*"
websocket_client = "*"
polyline = "*"
sconscontrib = {git = "https://github.com/SCons/scons-contrib.git"}
# these should be removed
markdown-it-py = "*"
timezonefinder = "*"
setproctitle = "*"
[tool.poetry.group.dev.dependencies]
@@ -122,26 +117,29 @@ av = "*"
azure-identity = "*"
azure-storage-blob = "*"
breathe = "*"
control = "*"
coverage = "*"
dictdiffer = "*"
ft4222 = "*"
hypothesis = "~6.47"
inputs = "*"
Jinja2 = "*"
lru-dict = "*"
markdown-it-py = "*"
matplotlib = "*"
metadrive-simulator = { git = "https://github.com/metadriverse/metadrive.git", rev ="72e842cd1d025bf676e4af8797a01e4aa282109f", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies
metadrive-simulator = { git = "https://github.com/metadriverse/metadrive.git", rev ="main", markers = "platform_machine != 'aarch64'" } # no linux/aarch64 wheels for certain dependencies
mpld3 = "*"
mypy = "*"
myst-parser = "*"
natsort = "*"
opencv-python-headless = "*"
pandas = "*"
parameterized = "^0.8"
pprofile = "*"
polyline = "*"
pre-commit = "*"
pyautogui = "*"
pyopencl = "*"
pygame = "*"
pympler = "*"
pywinctl = "*"
pyprof2calltree = "*"
pytest = "*"
pytest-cov = "*"
@@ -149,31 +147,20 @@ pytest-cpp = "*"
pytest-subtests = "*"
pytest-xdist = "*"
pytest-timeout = "*"
pytest-timeouts = "*"
pytest-random-order = "*"
pytest-randomly = "*"
ruff = "*"
scipy = "*"
sphinx = "*"
sphinx-rtd-theme = "*"
sphinx-sitemap = "*"
tabulate = "*"
tenacity = "*"
types-atomicwrites = "*"
types-certifi = "*"
types-pycurl = "*"
types-PyYAML = "*"
types-requests = "*"
types-tabulate = "*"
tqdm = "*"
# this is only pinned since 5.15.11 is broken
pyqt5 = { version = "==5.15.2", markers = "platform_machine == 'x86_64'" } # no aarch64 wheels for macOS/linux
[tool.poetry.group.carla]
optional = true
[tool.poetry.group.carla.dependencies]
carla = { url = "https://github.com/commaai/carla/releases/download/3.11.4/carla-0.9.14-cp311-cp311-linux_x86_64.whl", platform = "linux", markers = "platform_machine == 'x86_64'" }
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"
@@ -181,15 +168,16 @@ build-backend = "poetry.core.masonry.api"
# https://beta.ruff.rs/docs/configuration/#using-pyprojecttoml
[tool.ruff]
select = ["E", "F", "W", "PIE", "C4", "ISC", "RUF008", "RUF100", "A", "B", "TID251"]
ignore = ["W292", "E741", "E402", "C408", "ISC003", "B027", "B024"]
ignore = ["E741", "E402", "C408", "ISC003", "B027", "B024"]
line-length = 160
target-version="py311"
exclude = [
"panda",
"opendbc",
"laika_repo",
"rednose_repo",
"tinygrad_repo",
"teleoprtc",
"teleoprtc_repo",
"third_party",
]
flake8-implicit-str-concat.allow-multiline=false
@@ -199,3 +187,6 @@ flake8-implicit-str-concat.allow-multiline=false
"system".msg = "Use openpilot.system"
"third_party".msg = "Use openpilot.third_party"
"tools".msg = "Use openpilot.tools"
[tool.coverage.run]
concurrency = ["multiprocessing", "thread"]

View File

@@ -22,6 +22,7 @@ pre-commit uninstall || true
echo "[-] bringing master-ci and devel in sync T=$SECONDS"
cd $TARGET_DIR
git fetch --depth 1 origin master-ci
git fetch --depth 1 origin devel

View File

@@ -102,11 +102,4 @@ if [ ! -z "$RELEASE_BRANCH" ]; then
git push -f origin $RELEASE_BRANCH:$RELEASE_BRANCH
fi
if [ ! -z "$DASHCAM_BRANCH" ]; then
# Create dashcam
git rm selfdrive/car/*/carcontroller.py
git commit -m "create dashcam release from release"
git push -f origin $RELEASE_BRANCH:$DASHCAM_BRANCH
fi
echo "[-] done T=$SECONDS"

View File

@@ -21,27 +21,8 @@ openpilot/**
common/.gitignore
common/__init__.py
common/conversions.py
common/gpio.py
common/realtime.py
common/timeout.py
common/ffi_wrapper.py
common/file_helpers.py
common/logging_extra.py
common/numpy_fast.py
common/params.py
common/params_pyx.pyx
common/profiler.py
common/basedir.py
common/dict_helpers.py
common/filter_simple.py
common/stat_live.py
common/spinner.py
common/text_window.py
common/time.py
common/kalman/.gitignore
common/kalman/*
common/*.py
common/*.pyx
common/transformations/__init__.py
common/transformations/camera.py
@@ -76,7 +57,6 @@ selfdrive/statsd.py
system/logmessaged.py
system/micd.py
system/swaglog.py
system/version.py
selfdrive/athena/__init__.py
@@ -115,9 +95,7 @@ selfdrive/car/ecu_addrs.py
selfdrive/car/isotp_parallel_query.py
selfdrive/car/tests/__init__.py
selfdrive/car/tests/test_car_interfaces.py
selfdrive/car/torque_data/params.yaml
selfdrive/car/torque_data/substitute.yaml
selfdrive/car/torque_data/override.yaml
selfdrive/car/torque_data/*.toml
selfdrive/car/body/*.py
selfdrive/car/chrysler/*.py
@@ -137,6 +115,7 @@ selfdrive/debug/can_printer.py
selfdrive/debug/check_freq.py
selfdrive/debug/dump.py
selfdrive/debug/filter_log_message.py
selfdrive/debug/format_fingerprints.py
selfdrive/debug/get_fingerprint.py
selfdrive/debug/uiview.py
@@ -149,31 +128,8 @@ selfdrive/gpxd/gpxd.py
common/SConscript
common/version.h
common/prefix.h
common/swaglog.h
common/swaglog.cc
common/statlog.h
common/statlog.cc
common/util.cc
common/util.h
common/queue.h
common/clutil.cc
common/clutil.h
common/params.h
common/params.cc
common/ratekeeper.cc
common/ratekeeper.h
common/watchdog.cc
common/watchdog.h
common/modeldata.h
common/mat.h
common/timing.h
common/gpio.cc
common/gpio.h
common/i2c.cc
common/i2c.h
common/*.h
common/*.cc
selfdrive/controls/__init__.py
selfdrive/controls/controlsd.py
@@ -189,7 +145,6 @@ selfdrive/controls/lib/latcontrol_angle.py
selfdrive/controls/lib/latcontrol_torque.py
selfdrive/controls/lib/latcontrol_pid.py
selfdrive/controls/lib/latcontrol.py
selfdrive/controls/lib/lateral_planner.py
selfdrive/controls/lib/longcontrol.py
selfdrive/controls/lib/longitudinal_planner.py
selfdrive/controls/lib/pid.py
@@ -201,6 +156,7 @@ selfdrive/controls/lib/lateral_mpc_lib/*
selfdrive/controls/lib/longitudinal_mpc_lib/*
system/__init__.py
system/*.py
system/hardware/__init__.py
system/hardware/base.h
@@ -217,6 +173,7 @@ system/hardware/tici/agnos.json
system/hardware/tici/amplifier.py
system/hardware/tici/updater
system/hardware/tici/iwlist.py
system/hardware/tici/esim.nmconnection
system/hardware/pc/__init__.py
system/hardware/pc/hardware.h
system/hardware/pc/hardware.py
@@ -236,12 +193,10 @@ selfdrive/locationd/paramsd.py
selfdrive/locationd/models/__init__.py
selfdrive/locationd/models/.gitignore
selfdrive/locationd/models/car_kf.py
selfdrive/locationd/models/gnss_kf.py
selfdrive/locationd/models/live_kf.py
selfdrive/locationd/models/live_kf.h
selfdrive/locationd/models/live_kf.cc
selfdrive/locationd/models/constants.py
selfdrive/locationd/models/gnss_helpers.py
selfdrive/locationd/torqued.py
selfdrive/locationd/calibrationd.py
@@ -286,6 +241,12 @@ system/sensord/sensors/*.cc
system/sensord/sensors/*.h
system/sensord/pigeond.py
system/webrtc/__init__.py
system/webrtc/webrtcd.py
system/webrtc/schema.py
system/webrtc/device/audio.py
system/webrtc/device/video.py
selfdrive/thermald/thermald.py
selfdrive/thermald/power_monitoring.py
selfdrive/thermald/fan_controller.py
@@ -301,13 +262,9 @@ selfdrive/ui/.gitignore
selfdrive/ui/SConscript
selfdrive/ui/*.cc
selfdrive/ui/*.h
selfdrive/ui/ui
selfdrive/ui/text
selfdrive/ui/spinner
selfdrive/ui/soundd/*.cc
selfdrive/ui/soundd/*.h
selfdrive/ui/soundd/soundd
selfdrive/ui/soundd/.gitignore
selfdrive/ui/soundd.py
selfdrive/ui/translations/*.ts
selfdrive/ui/translations/languages.json
selfdrive/ui/update_translations.py
@@ -337,12 +294,8 @@ system/camerad/main.cc
system/camerad/snapshot/*
system/camerad/cameras/camera_common.h
system/camerad/cameras/camera_common.cc
system/camerad/cameras/sensor2_i2c.h
system/camerad/imgproc/conv.cl
system/camerad/imgproc/pool.cl
system/camerad/imgproc/utils.cc
system/camerad/imgproc/utils.h
system/camerad/sensors/*.h
system/camerad/sensors/*.cc
selfdrive/manager/__init__.py
selfdrive/manager/build.py
@@ -448,9 +401,11 @@ third_party/qt5/larch64/bin/**
scripts/update_now.sh
scripts/stop_updater.sh
teleoprtc/**
rednose_repo/site_scons/site_tools/rednose_filter.py
rednose/.gitignore
rednose/**
laika/**
body/.gitignore
body/board/SConscript

Some files were not shown because too many files have changed in this diff Show More