From 1f79ca865f72f16b92aa5a2422a74412e8f6d41f Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Thu, 29 Oct 2026 11:54:05 -0500 Subject: [PATCH] Recognize Outback Wilderness camera firmware and credit jacobw Subaru support --- CREDITS.md | 6 +++ THIRD_PARTY_NOTICES.md | 4 ++ .../opendbc/car/subaru/ORIGIN_HISTORY.tsv | 17 ++++++++ .../opendbc/car/subaru/fingerprints.py | 1 + .../tests/test_outback_wilderness_firmware.py | 42 +++++++++++++++++++ prebuilt.json | 2 +- 6 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv create mode 100644 opendbc_repo/opendbc/car/subaru/tests/test_outback_wilderness_firmware.py diff --git a/CREDITS.md b/CREDITS.md index c537ec0729..febe479667 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -37,3 +37,9 @@ The Pre-AP configuration, pedal codec/feedback, VirtualDAS feedforward table, gr ## Ford optional pinion measurement The default-off Use Pinion Yaw Sensor measurement option is adapted from jrneulight’s BluePilot PR #145 (https://github.com/BluePilotDev/bluepilot/pull/145), merged as `fe5b019568c8c13fb894dc6d8d779d60985051a8`. Its per-platform geometry, native pinion measurement, integrity requirements and host vehicle-model compensation are retained. StarPilot adapts the option to its existing exact safety-profile word, modern curvature checks, AOL authority and Galaxy/native settings; the upstream maintainers do not maintain this integration. Existing upstream copyright and license notices remain in THIRD_PARTY_NOTICES.md. + +## Subaru angle steering from Jacob Waller's fork + +Subaru angle support includes implementation maintained and integrated by **Jacob Waller (jacobw)** in [jacobwaller/openpilot, jul-angle-based](https://github.com/jacobwaller/openpilot/tree/542816196a18dba5f6f0af093c1ece4f415b5a22), with its [opendbc implementation at 8acbeccdab45a47aa7af170d2d17b61f0eb5e4f0](https://github.com/jacobwaller/opendbc/tree/8acbeccdab45a47aa7af170d2d17b61f0eb5e4f0). Jacob authored the VehicleModel angle-limit type correction and integrated the Crosstrek support. The branch also retains the original angle implementation and follow-up work by **lukasloetkolben and elkoled**, alongside comma contributors; their authorship remains theirs. + +The inherited source covers Subaru angle platform/firmware definitions, `ES_Status` cruise state, angle controller/CAN integration, vehicle-model limits and native angle enforcement. StarPilot has additional platform-specific limits, driver handoff, discovery and AOL safety guards; this attribution does not claim identical tuning or complete parity with the reference fork. Original source commits, author names, emails and titles are recorded in [the Subaru origin history](opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv). diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index 6112e2614c..36c6b73a13 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -140,3 +140,7 @@ dbus-next 0.2.3 (MIT), ifaddr 0.2.0 (MIT) and Zeroconf 0.151.3 `vendor/VENDOR.json` records each PyPI source file and its SHA-256. Zeroconf is kept as separate, unmodified source files that can be replaced with another compatible version, as the LGPL requires. + +## Subaru angle support from jacobw + +The Subaru angle implementation includes work from Jacob Waller's `jul-angle-based` openpilot/opendbc branches and their upstream contributors. See [CREDITS.md](CREDITS.md#subaru-angle-steering-from-jacob-wallers-fork) and `opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv` for pinned sources, original authors and titles. The source repositories publish the comma MIT license; the complete applicable notice remains in the project `LICENSE` and `opendbc_repo/LICENSE`. StarPilot's adaptations preserve additional native and caller safety guards. diff --git a/opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv b/opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv new file mode 100644 index 0000000000..4e69bb3376 --- /dev/null +++ b/opendbc_repo/opendbc/car/subaru/ORIGIN_HISTORY.tsv @@ -0,0 +1,17 @@ +source_repository commit author_name author_email original_title +jacobwaller/opendbc 8b4703bbd678f643659102350d54bc8477c4746f lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com Subaru: Add 2025 Crosstrek angle steering support +jacobwaller/opendbc e49bb48bba83078ece71dcfd470990c4a29eee38 elkoled elkoled@gmail.com reduce angle rate limit +jacobwaller/opendbc 7aedc019d208018b6a23f0c071d54eb2a3c86c9d elkoled elkoled@gmail.com add deadband +jacobwaller/opendbc 9d217de804bf95bd42c838c4e2c57aeb45f31ccc lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com add SUBARU_CROSSTREK_2025 fingerprint +jacobwaller/opendbc f3cdd5ff7d1f7415bbc10214f3cd83681bf093ce lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com add fingerprint +jacobwaller/opendbc 42889e319eb73599ee66b350a777aa68130b1bca lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com 10 m/s +jacobwaller/opendbc 0dd4797ad9eeaf1de66bd99b8c458209b6110611 lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com add route +jacobwaller/opendbc 128daadb19b61b3d54e0e212043fbc7a0412ba46 lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com speed dependent steering deadzone +jacobwaller/opendbc a358966bc6099b9e022e0a6f0e1647928f904107 lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com deadzone filter +jacobwaller/opendbc a116120c3b149f02bccbb87665e35122cc9626c8 lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com remove unrelated dbc +jacobwaller/opendbc 3d4400559133d0dbcff6c55abfc37f47ec03a620 lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com ES_Status->Cruise_Activated +jacobwaller/opendbc db8d3aee3c90013e44aa70f56bb9896d8a42c4cb lukasloetkolben 61192133+lukasloetkolben@users.noreply.github.com use ES_Status +jacobwaller/opendbc 19df75992398f6661c7ed18a1914219d42e5883f elkoled elkoled@gmail.com lateral clip target to avoid jerk violation +jacobwaller/opendbc 8acbeccdab45a47aa7af170d2d17b61f0eb5e4f0 Jacob Waller jacobwaller@Jacobs-MacBook-Pro.local subaru: fix ANGLE_LIMITS to use AngleSteeringLimitsVM +jacobwaller/openpilot 156ee4240d9029fbf97a1fd87a4e774e4578ddf1 Jacob Waller jacobwaller@Jacobs-MacBook-Pro.local bump opendbc to jul-angle-based (Subaru Crosstrek 2025 angle steering) +jacobwaller/openpilot 542816196a18dba5f6f0af093c1ece4f415b5a22 Jacob Waller jacobwaller@Jacobs-MacBook-Pro.local FF 'da Crosstrek diff --git a/opendbc_repo/opendbc/car/subaru/fingerprints.py b/opendbc_repo/opendbc/car/subaru/fingerprints.py index 13d1915dfa..3a7ba8c60b 100644 --- a/opendbc_repo/opendbc/car/subaru/fingerprints.py +++ b/opendbc_repo/opendbc/car/subaru/fingerprints.py @@ -584,6 +584,7 @@ FW_VERSIONS = { ], (Ecu.fwdCamera, 0x787, None): [ b'\t!\x08\x046\x05!\x08\x01/', + b'\t!\x08\x046\x00\x00\x00\x00\x00', ], (Ecu.engine, 0x7a2, None): [ b'\xed,\xa0q\x07', diff --git a/opendbc_repo/opendbc/car/subaru/tests/test_outback_wilderness_firmware.py b/opendbc_repo/opendbc/car/subaru/tests/test_outback_wilderness_firmware.py new file mode 100644 index 0000000000..60164fe0bb --- /dev/null +++ b/opendbc_repo/opendbc/car/subaru/tests/test_outback_wilderness_firmware.py @@ -0,0 +1,42 @@ +"""Recorded 2024 Outback Wilderness identity, with discovery guards intact.""" +import pytest + +from opendbc.car import structs +from opendbc.car.fw_versions import match_fw_to_car +from opendbc.car.subaru.values import CAR + + +def observed_firmware(): + # Real non-logging replies; no transmission/EPS reply was available. + return [structs.CarParams.CarFw(ecu=ecu, address=address, fwVersion=bytes.fromhex(version), brand='subaru') + for ecu, address, version in ( + (structs.CarParams.Ecu.abs, 0x7b0, 'a120241700'), + (structs.CarParams.Ecu.engine, 0x7a2, 'fb2ca27007'), + (structs.CarParams.Ecu.fwdCamera, 0x787, '09210804360000000000'), + )] + + +def test_recorded_wilderness_automatically_matches_without_a_manual_override(): + exact, matches = match_fw_to_car(observed_firmware(), '0' * 17, log=False) + assert exact + assert matches == {CAR.SUBARU_OUTBACK_2023} + + +@pytest.mark.parametrize('ecu', (structs.CarParams.Ecu.abs, structs.CarParams.Ecu.engine, structs.CarParams.Ecu.fwdCamera)) +@pytest.mark.parametrize('failure', ('missing', 'unknown', 'mixed')) +def test_recorded_wilderness_rejects_incomplete_or_contradictory_platform_ecus(ecu, failure): + records = observed_firmware() + target = next(record for record in records if record.ecu == ecu) + if failure != 'mixed': + records.remove(target) + if failure != 'missing': + records.append(structs.CarParams.CarFw(ecu=ecu, address=target.address, fwVersion=b'unknown firmware', brand='subaru')) + _, matches = match_fw_to_car(records, '0' * 17, log=False) + assert not matches + + +def test_recorded_wilderness_does_not_accept_the_diagnostic_camera_response(): + records = observed_firmware() + records[-1].fwVersion = bytes.fromhex('20020e') + _, matches = match_fw_to_car(records, '0' * 17, log=False) + assert not matches diff --git a/prebuilt.json b/prebuilt.json index fa7dffff16..6e1d45d044 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "9f4c75c4032a85b550d4327a8534c9fa207749ca4b69864dd7ddf433539c6174", "schema_version": 1} +{"protected_inventory_sha256": "af5e3a835fba4429405da7e9b6c318ceb40aaa118d5708e62e00d4c947a5845b", "schema_version": 1}