mirror of
https://github.com/sunnypilot/sunnypilot.git
synced 2026-08-21 20:03:46 +08:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| db98aa0b3f |
@@ -2,6 +2,5 @@ Wen
|
||||
REGIST
|
||||
PullRequest
|
||||
cancelled
|
||||
indeces
|
||||
FOF
|
||||
NoO
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
* @sunnypilot/dev-internal
|
||||
/.github/ @devtekve @sunnyhaibin
|
||||
/release/ci/ @devtekve @sunnyhaibin
|
||||
/tinygrad_repo @devtekve @Discountchubbs
|
||||
/tinygrad/ @devtekve @Discountchubbs
|
||||
/selfdrive/controls/lib/longitudinal_planner.py @devtekve @Discountchubbs
|
||||
/selfdrive/controls/lib/longitudinal_mpc_lib/long_mpc.py @devtekve @Discountchubbs
|
||||
/selfdrive/modeld/ @devtekve @Discountchubbs
|
||||
/sunnypilot/model* @devtekve @Discountchubbs
|
||||
/sunnypilot/sunnylink/ @devtekve
|
||||
/system/athena/ @devtekve
|
||||
@@ -0,0 +1,47 @@
|
||||
name: Bug report
|
||||
description: For issues with running openpilot on your comma device
|
||||
labels: ["bug"]
|
||||
body:
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
Before creating a **bug report**, please check the following:
|
||||
* If the issue likely only affects your car model or make, go back and open a **car bug report** instead.
|
||||
* If the issue is related to the driving or driver monitoring models, you should open a [discussion](https://github.com/commaai/openpilot/discussions/categories/model-feedback) instead.
|
||||
* Ensure you're running the latest openpilot release.
|
||||
* Ensure you're using officially supported hardware. Issues running on PCs have a different issue template.
|
||||
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
|
||||
* Ensure you're running stock openpilot. We cannot look into bug reports from forks.
|
||||
|
||||
If you're unsure whether you've hit a bug, check out the #installation-help channel in the [community Discord server](https://discord.comma.ai).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: Also include a description of how to reproduce the bug
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: route
|
||||
attributes:
|
||||
label: Provide a route where the issue occurs
|
||||
description: Ensure the route is fully uploaded at https://useradmin.comma.ai. We cannot look into issues without routes, or at least a Dongle ID.
|
||||
placeholder: 77611a1fac303767|2020-05-11--16-37-07
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: openpilot version
|
||||
description: If you're not on release, provide the commit hash
|
||||
placeholder: 0.8.10
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional info
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Car bug report
|
||||
url: https://github.com/commaai/opendbc/issues/new
|
||||
about: For issues with a particular car make or model
|
||||
- name: Join the Discord
|
||||
url: https://discord.comma.ai
|
||||
about: The community Discord is for both openpilot development and experience discussion
|
||||
- name: Report driving behavior feedback
|
||||
url: https://discord.com/channels/469524606043160576/1254834193066623017
|
||||
about: Feedback for the driving and driver monitoring models goes in the #driving-feedback in Discord
|
||||
- name: Community Wiki
|
||||
url: https://github.com/commaai/openpilot/wiki
|
||||
about: Check out our community wiki
|
||||
@@ -0,0 +1,42 @@
|
||||
name: PC bug report
|
||||
description: For issues with running openpilot on PC
|
||||
labels: ["PC"]
|
||||
body:
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
Before creating a **bug report**, please check the following:
|
||||
* Ensure you're running the latest openpilot release.
|
||||
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
|
||||
* Ensure you're running stock openpilot. We cannot look into bug reports from forks.
|
||||
|
||||
If you're unsure whether you've hit a bug, check out the #installation-help channel in the [community Discord server](https://discord.comma.ai).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the bug
|
||||
description: Also include a description of how to reproduce the bug
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: os-version
|
||||
attributes:
|
||||
label: OS Version
|
||||
placeholder: Ubuntu 24.04
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: openpilot version or commit
|
||||
placeholder: bd36f2ec8d3559909678eff2690c10a520938367
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional info
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
ci:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: "{.github/**,**/test_*,**/test/**,Jenkinsfile}"
|
||||
|
||||
chore:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: "{.github/**}"
|
||||
|
||||
car:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: '{openpilot/selfdrive/car/**,opendbc_repo}'
|
||||
|
||||
simulation:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: 'openpilot/tools/sim/**'
|
||||
|
||||
ui:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: '{openpilot/selfdrive/assets/**,openpilot/selfdrive/ui/**,openpilot/system/ui/**}'
|
||||
|
||||
tools:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: 'openpilot/tools/**'
|
||||
|
||||
multilanguage:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: 'openpilot/selfdrive/ui/translations/**'
|
||||
|
||||
autonomy:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: "{openpilot/selfdrive/modeld/models/**,openpilot/selfdrive/test/process_replay/model_replay_ref_commit,openpilot/sunnypilot/modeld*/models/**}"
|
||||
@@ -0,0 +1,43 @@
|
||||
exclude-labels:
|
||||
- 'no-changelog'
|
||||
categories:
|
||||
- title: '🚀 Features'
|
||||
labels:
|
||||
- 'feature'
|
||||
- 'enhancement'
|
||||
- title: '🐛 Bug Fixes'
|
||||
collapse-after: 5
|
||||
labels:
|
||||
- 'fix'
|
||||
- 'bugfix'
|
||||
- 'bug'
|
||||
- title: '🧰 Maintenance'
|
||||
collapse-after: 5
|
||||
label: 'chore'
|
||||
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
|
||||
change-title-escapes: '\<*_&'
|
||||
replacers:
|
||||
- search: '/[Ss][Uu][Nn][Nn][Yy][Pp][Ii][Ll][Oo][Tt]/g'
|
||||
replace: 'sunnypilot'
|
||||
- search: '/\b[Ss][Pp]\b/g'
|
||||
replace: 'SP'
|
||||
version-resolver:
|
||||
major:
|
||||
labels:
|
||||
- 'major'
|
||||
minor:
|
||||
labels:
|
||||
- 'minor'
|
||||
patch:
|
||||
labels:
|
||||
- 'patch'
|
||||
default: patch
|
||||
name-template: 'v$RESOLVED_VERSION 🚀'
|
||||
tag-template: 'v$RESOLVED_VERSION'
|
||||
version-template: "0.$MAJOR.$MINOR.$PATCH" # The day OP becomes v1, we need to bump this
|
||||
tag-prefix: "v0." # The day OP becomes v1, we need to bump this
|
||||
prerelease-identifier: "staging"
|
||||
template: |
|
||||
## Changes
|
||||
|
||||
$CHANGES
|
||||
+14
-11
@@ -4,7 +4,7 @@
|
||||
|
||||
A supported vehicle is one that just works when you install a comma device. All supported cars provide a better experience than any stock system. Supported vehicles reference the US market unless otherwise specified.
|
||||
|
||||
# 342 Supported Cars
|
||||
# 345 Supported Cars
|
||||
|
||||
|Make|Model|Supported Package|ACC|No ACC accel below|No ALC below|Steering Torque|Resume from stop|<a href="##"><img width=2000></a>Hardware Needed<br> |Video|Setup Video|
|
||||
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|
||||
@@ -34,6 +34,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Chrysler|Pacifica Hybrid 2019-25|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Chrysler Pacifica Hybrid 2019-25">Buy Here</a></sub></details>|||
|
||||
|comma|body|All|openpilot|0 mph|0 mph|[](##)|[](##)|None|<a href="https://youtu.be/VT-i3yRsX2s?t=2736" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|CUPRA[<sup>12</sup>](#footnotes)|Ateca 2018-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=CUPRA Ateca 2018-23">Buy Here</a></sub></details>|||
|
||||
|CUPRA[<sup>12</sup>](#footnotes)|Born 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[<sup>16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=CUPRA Born 2021-23">Buy Here</a></sub></details>|||
|
||||
|Dodge|Durango 2020-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Dodge Durango 2020-21">Buy Here</a></sub></details>|||
|
||||
|Ford|Bronco Sport 2021-24|Co-Pilot360 Assist+|openpilot|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Ford Bronco Sport 2021-24">Buy Here</a></sub></details>|||
|
||||
|Ford|Escape 2020-22|Co-Pilot360 Assist+|openpilot|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Ford Q3 connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Ford Escape 2020-22">Buy Here</a></sub></details>|||
|
||||
@@ -82,7 +83,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Honda|City (Brazil only) 2023-25|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|14 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda City (Brazil only) 2023-25">Buy Here</a></sub></details>|||
|
||||
|Honda|Civic 2016-18|Honda Sensing|openpilot|0 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Nidec connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic 2016-18">Buy Here</a></sub></details>|<a href="https://youtu.be/-IkImTe1NYE" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Honda|Civic 2019-21|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|2 mph[<sup>4</sup>](#footnotes)|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic 2019-21">Buy Here</a></sub></details>|<a href="https://www.youtube.com/watch?v=4Iz1Mz5LGF8" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Honda|Civic 2022-24|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic 2022-24">Buy Here</a></sub></details>|<a href="https://youtu.be/ytiOT5lcp6Q" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Honda|Civic 2022-26|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic 2022-26">Buy Here</a></sub></details>|<a href="https://youtu.be/ytiOT5lcp6Q" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Honda|Civic Hatchback 2017-18|Honda Sensing|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2017-18">Buy Here</a></sub></details>|||
|
||||
|Honda|Civic Hatchback 2019-21|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|12 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch A connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2019-21">Buy Here</a></sub></details>|||
|
||||
|Honda|Civic Hatchback 2022-24|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Honda Bosch B connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Honda Civic Hatchback 2022-24">Buy Here</a></sub></details>|<a href="https://youtu.be/ytiOT5lcp6Q" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
@@ -158,7 +159,7 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Hyundai|Tucson Plug-in Hybrid 2024|All|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai N connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Hyundai Tucson Plug-in Hybrid 2024">Buy Here</a></sub></details>|||
|
||||
|Hyundai|Veloster 2019-20|Smart Cruise Control (SCC)|Stock|5 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Hyundai Veloster 2019-20">Buy Here</a></sub></details>|||
|
||||
|Jeep|Grand Cherokee 2016-18|Adaptive Cruise Control (ACC)|Stock|0 mph|9 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Jeep 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" /></a>||
|
||||
|Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Jeep 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" /></a>||
|
||||
|Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Jeep Grand Cherokee 2019-21">Buy Here</a></sub></details>|||
|
||||
|Kia|Carnival 2022-24|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Carnival 2022-24">Buy Here</a></sub></details>|||
|
||||
|Kia|Carnival (China only) 2023|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai K connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Carnival (China only) 2023">Buy Here</a></sub></details>|||
|
||||
|Kia|Ceed 2019-21|Smart Cruise Control (SCC)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 Hyundai E connector<br>- 1 OBD-C cable (2 ft)<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Kia Ceed 2019-21">Buy Here</a></sub></details>|||
|
||||
@@ -242,20 +243,20 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Rivian|R1T 2025|All|openpilot|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Rivian B connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Rivian R1T 2025">Buy Here</a></sub></details>|||
|
||||
|SEAT[<sup>12</sup>](#footnotes)|Ateca 2016-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=SEAT Ateca 2016-23">Buy Here</a></sub></details>|||
|
||||
|SEAT[<sup>12</sup>](#footnotes)|Leon 2014-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=SEAT Leon 2014-20">Buy Here</a></sub></details>|||
|
||||
|Subaru|Ascent 2019-21|All[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Ascent 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Crosstrek 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Crosstrek 2020-23">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Ascent 2019-21|All[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Ascent 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Crosstrek 2018-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Crosstrek 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Subaru|Crosstrek 2020-23|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Crosstrek 2020-23">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Forester 2017-18|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Forester 2017-18">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Forester 2019-21|All[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Forester 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Impreza 2017-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Impreza 2017-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Impreza 2020-22|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Impreza 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Forester 2019-21|All[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Forester 2019-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Impreza 2017-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Impreza 2017-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Impreza 2020-22|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Impreza 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Legacy 2015-18|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Legacy 2015-18">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Legacy 2020-22|All[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru B connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Legacy 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Outback 2015-17|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Outback 2015-17">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Outback 2018-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Outback 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|Outback 2020-22|All[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru B connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru Outback 2020-22">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|XV 2018-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru XV 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Subaru|XV 2020-21|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru XV 2020-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Subaru|XV 2018-19|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru XV 2018-19">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|<a href="https://youtu.be/Agww7oE1k-s?t=26" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Subaru|XV 2020-21|EyeSight Driver Assistance[<sup>7</sup>](#footnotes)|Stock|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 Subaru A connector<br>- 1 comma four<br>- 1 comma power v3<br>- 1 harness box<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Subaru XV 2020-21">Buy Here</a></sub></details><details><summary>Tools</summary><sub>- 1 Pry Tool<br>- 1 Socket Wrench 8mm or 5/16" (deep)</sub></details>|||
|
||||
|Škoda|Fabia 2022-23[<sup>15</sup>](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Škoda Fabia 2022-23">Buy Here</a></sub></details>[<sup>17</sup>](#footnotes)|||
|
||||
|Škoda|Kamiq 2021-23[<sup>13,15</sup>](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Škoda Kamiq 2021-23">Buy Here</a></sub></details>[<sup>17</sup>](#footnotes)|||
|
||||
|Škoda[<sup>12</sup>](#footnotes)|Karoq 2019-23[<sup>15</sup>](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Škoda Karoq 2019-23">Buy Here</a></sub></details>|||
|
||||
@@ -334,6 +335,8 @@ A supported vehicle is one that just works when you install a comma device. All
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|Golf R 2015-19|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Golf R 2015-19">Buy Here</a></sub></details>|||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|Golf SportsVan 2015-20|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Golf SportsVan 2015-20">Buy Here</a></sub></details>|||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|Grand California 2019-24|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|31 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Grand California 2019-24">Buy Here</a></sub></details>|<a href="https://youtu.be/4100gLeabmo" target="_blank"><img height="18px" src="assets/icon-youtube.svg" /></a>||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|ID.4 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[<sup>16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen ID.4 2021-23">Buy Here</a></sub></details>|||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|ID.4 2024-25|Adaptive Cruise Control (ACC) & Lane Assist|openpilot[<sup>16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen ID.4 2024-25">Buy Here</a></sub></details>|||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|Jetta 2019-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Jetta 2019-23">Buy Here</a></sub></details>|||
|
||||
|Volkswagen[<sup>12</sup>](#footnotes)|Jetta GLI 2021-23|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Jetta GLI 2021-23">Buy Here</a></sub></details>|||
|
||||
|Volkswagen|Passat 2015-22[<sup>14</sup>](#footnotes)|Adaptive Cruise Control (ACC) & Lane Assist|openpilot available[<sup>1,16</sup>](#footnotes)|0 mph|0 mph|[](##)|[](##)|<details><summary>Parts</summary><sub>- 1 OBD-C cable (2 ft)<br>- 1 VW J533 connector<br>- 1 comma four<br>- 1 harness box<br>- 1 long OBD-C cable (9.5 ft)<br>- 1 mount<br><a href="https://comma.ai/shop/comma-3x?harness=Volkswagen Passat 2015-22">Buy Here</a></sub></details>|||
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: msgq
|
||||
Version: 0.0.1
|
||||
Summary: Lock-free IPC pub/sub message queue
|
||||
Author: comma.ai
|
||||
License: MIT
|
||||
Classifier: Natural Language :: English
|
||||
Classifier: Programming Language :: Python :: 3
|
||||
Classifier: Topic :: System :: Hardware
|
||||
Requires-Python: >=3.11
|
||||
Description-Content-Type: text/markdown
|
||||
Provides-Extra: dev
|
||||
Requires-Dist: setuptools; extra == "dev"
|
||||
Requires-Dist: Cython; extra == "dev"
|
||||
Requires-Dist: scons; extra == "dev"
|
||||
Requires-Dist: ruff; extra == "dev"
|
||||
Requires-Dist: cppcheck; extra == "dev"
|
||||
Requires-Dist: cpplint; extra == "dev"
|
||||
Requires-Dist: codespell; extra == "dev"
|
||||
Requires-Dist: ty; extra == "dev"
|
||||
Requires-Dist: lefthook; extra == "dev"
|
||||
|
||||
# MSGQ: A lock free single producer multi consumer message queue
|
||||
|
||||
## What is this library?
|
||||
MSGQ is a generic high performance IPC pub sub system with a single publisher and multiple subscribers. It uses a ring buffer in shared memory to efficiently read and write data. Each read requires a copy. Writing can be done without a copy, as long as the size of the data is known in advance. This library also provides a spoofed implementation that can be used for deterministic testing, and visionipc, an IPC system specifically for large contiguous buffers (like images/video).
|
||||
|
||||
## Storage
|
||||
The storage for the queue consists of an area of metadata, and the actual buffer. The metadata contains:
|
||||
|
||||
1. A counter to the number of readers that are active
|
||||
2. A pointer to the head of the queue for writing. From now on referred to as *write pointer*
|
||||
3. A cycle counter for the writer. This counter is incremented when the writer wraps around
|
||||
4. N pointers, pointing to the current read position for all the readers. From now on referred to as *read pointer*
|
||||
5. N counters, counting the number of cycles for all the readers
|
||||
6. N booleans, indicating validity for all the readers. From now on referred to as *validity flag*
|
||||
|
||||
The counter and the pointer are both 32 bit values, packed into 64 bit so they can be read and written atomically.
|
||||
|
||||
The data buffer is a ring buffer. All messages are prefixed by an 8 byte size field, followed by the data. A size of -1 indicates a wrap-around, and means the next message is stored at the beginning of the buffer.
|
||||
|
||||
|
||||
## Writing
|
||||
Writing involves the following steps:
|
||||
|
||||
1. Check if the area that is to be written overlaps with any of the read pointers, mark those readers as invalid by clearing the validity flag.
|
||||
2. Write the message
|
||||
3. Increase the write pointer by the size of the message
|
||||
|
||||
In case there is not enough space at the end of the buffer, a special empty message with a prefix of -1 is written. The cycle counter is incremented by one. In this case step 1 will check there are no read pointers pointing to the remainder of the buffer. Then another write cycle will start with the actual message.
|
||||
|
||||
There always needs to be 8 bytes of empty space at the end of the buffer. By doing this there is always space to write the -1.
|
||||
|
||||
## Reset reader
|
||||
When the reader is lagging too much behind the read pointer becomes invalid and no longer points to the beginning of a valid message. To reset a reader to the current write pointer, the following steps are performed:
|
||||
|
||||
1. Set valid flag
|
||||
2. Set read cycle counter to that of the writer
|
||||
3. Set read pointer to write pointer
|
||||
|
||||
## Reading
|
||||
Reading involves the following steps:
|
||||
|
||||
1. Read the size field at the current read pointer
|
||||
2. Read the validity flag
|
||||
3. Copy the data out of the buffer
|
||||
4. Increase the read pointer by the size of the message
|
||||
5. Check the validity flag again
|
||||
|
||||
Before starting the copy, the valid flag is checked. This is to prevent a race condition where the size prefix was invalid, and the read could read outside of the buffer. Make sure that step 1 and 2 are not reordered by your compiler or CPU.
|
||||
|
||||
If a writer overwrites the data while it's being copied out, the data will be invalid. Therefore the validity flag is also checked after reading it. The order of step 4 and 5 does not matter.
|
||||
|
||||
If at steps 2 or 5 the validity flag is not set, the reader is reset. Any data that was already read is discarded. After the reader is reset, the reading starts from the beginning.
|
||||
|
||||
If a message with size -1 is encountered, step 3 and 4 are replaced by increasing the cycle counter and setting the read pointer to the beginning of the buffer. After that another read is performed.
|
||||
@@ -1,17 +0,0 @@
|
||||
README.md
|
||||
pyproject.toml
|
||||
msgq/__init__.py
|
||||
msgq/ipc_pyx.so
|
||||
msgq.egg-info/PKG-INFO
|
||||
msgq.egg-info/SOURCES.txt
|
||||
msgq.egg-info/dependency_links.txt
|
||||
msgq.egg-info/requires.txt
|
||||
msgq.egg-info/top_level.txt
|
||||
msgq/tests/__init__.py
|
||||
msgq/tests/test_fake.py
|
||||
msgq/tests/test_messaging.py
|
||||
msgq/tests/test_poller.py
|
||||
msgq/visionipc/__init__.py
|
||||
msgq/visionipc/visionipc_pyx.so
|
||||
msgq/visionipc/tests/__init__.py
|
||||
msgq/visionipc/tests/test_visionipc.py
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
[dev]
|
||||
setuptools
|
||||
Cython
|
||||
scons
|
||||
ruff
|
||||
cppcheck
|
||||
cpplint
|
||||
codespell
|
||||
ty
|
||||
lefthook
|
||||
@@ -1 +0,0 @@
|
||||
msgq
|
||||
+345
-192
@@ -1,12 +1,9 @@
|
||||
/* Generated by Cython 3.2.4 */
|
||||
/* Generated by Cython 3.2.9 */
|
||||
|
||||
/* BEGIN: Cython Metadata
|
||||
{
|
||||
"distutils": {
|
||||
"depends": [
|
||||
"msgq/impl_fake.h",
|
||||
"msgq/ipc.h"
|
||||
],
|
||||
"depends": [],
|
||||
"language": "c++",
|
||||
"name": "msgq.ipc_pyx",
|
||||
"sources": [
|
||||
@@ -39,8 +36,8 @@ END: Cython Metadata */
|
||||
#elif PY_VERSION_HEX < 0x03080000
|
||||
#error Cython requires Python 3.8+.
|
||||
#else
|
||||
#define __PYX_ABI_VERSION "3_2_4"
|
||||
#define CYTHON_HEX_VERSION 0x030204F0
|
||||
#define __PYX_ABI_VERSION "3_2_9"
|
||||
#define CYTHON_HEX_VERSION 0x030209F0
|
||||
#define CYTHON_FUTURE_DIVISION 1
|
||||
/* CModulePreamble */
|
||||
#include <stddef.h>
|
||||
@@ -922,28 +919,39 @@ enum __Pyx_ReferenceSharing {
|
||||
#else
|
||||
#define __Pyx_IS_UNIQUELY_REFERENCED(o, sharing) (((void)o), ((void)sharing), 0)
|
||||
#endif
|
||||
#if CYTHON_AVOID_BORROWED_REFS || CYTHON_AVOID_THREAD_UNSAFE_BORROWED_REFS
|
||||
#if __PYX_LIMITED_VERSION_HEX >= 0x030d0000
|
||||
#define __Pyx_PyList_GetItemRef(o, i) PyList_GetItemRef(o, i)
|
||||
#elif CYTHON_COMPILING_IN_LIMITED_API || !CYTHON_ASSUME_SAFE_MACROS
|
||||
#if __PYX_LIMITED_VERSION_HEX >= 0x030d0000
|
||||
#define __Pyx_PyList_GetItemRef(o, i) PyList_GetItemRef(o, i)
|
||||
#elif CYTHON_AVOID_BORROWED_REFS || CYTHON_AVOID_THREAD_UNSAFE_BORROWED_REFS
|
||||
#if CYTHON_COMPILING_IN_LIMITED_API || !CYTHON_ASSUME_SAFE_MACROS
|
||||
#define __Pyx_PyList_GetItemRef(o, i) (likely((i) >= 0) ? PySequence_GetItem(o, i) : (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
|
||||
#else
|
||||
#define __Pyx_PyList_GetItemRef(o, i) PySequence_ITEM(o, i)
|
||||
#endif
|
||||
#elif CYTHON_COMPILING_IN_LIMITED_API || !CYTHON_ASSUME_SAFE_MACROS
|
||||
#if __PYX_LIMITED_VERSION_HEX >= 0x030d0000
|
||||
#define __Pyx_PyList_GetItemRef(o, i) PyList_GetItemRef(o, i)
|
||||
#else
|
||||
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_XNewRef(PyList_GetItem(o, i))
|
||||
#endif
|
||||
#elif CYTHON_COMPILING_IN_LIMITED_API || !(CYTHON_ASSUME_SAFE_MACROS && CYTHON_ASSUME_SAFE_SIZE)
|
||||
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_XNewRef(PyList_GetItem(o, i))
|
||||
#else
|
||||
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_NewRef(PyList_GET_ITEM(o, i))
|
||||
#define __Pyx_PyList_GetItemRef(o, i) (likely(__Pyx_is_valid_index(i, PyList_GET_SIZE(o))) ?\
|
||||
__Pyx_NewRef(PyList_GET_ITEM(o, i)) : (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
|
||||
#endif
|
||||
#if CYTHON_AVOID_THREAD_UNSAFE_BORROWED_REFS && !CYTHON_COMPILING_IN_LIMITED_API && CYTHON_ASSUME_SAFE_MACROS
|
||||
#define __Pyx_PyList_GetItemRefFast(o, i, unsafe_shared) (__Pyx_IS_UNIQUELY_REFERENCED(o, unsafe_shared) ?\
|
||||
__Pyx_NewRef(PyList_GET_ITEM(o, i)) : __Pyx_PyList_GetItemRef(o, i))
|
||||
#if CYTHON_AVOID_BORROWED_REFS || CYTHON_COMPILING_IN_LIMITED_API
|
||||
#define __Pyx_PyList_GET_ITEM_REF(o, i, unsafe_shared) ((void)(unsafe_shared),\
|
||||
__Pyx_PyList_GetItemRef(o, i))
|
||||
#elif CYTHON_AVOID_THREAD_UNSAFE_BORROWED_REFS
|
||||
#if CYTHON_ASSUME_SAFE_MACROS
|
||||
#define __Pyx_PyList_GET_ITEM_REF(o, i, unsafe_shared) (\
|
||||
__Pyx_IS_UNIQUELY_REFERENCED(o, unsafe_shared) ?\
|
||||
__Pyx_NewRef(PyList_GET_ITEM(o, i)) : __Pyx_PyList_GetItemRef(o, i))
|
||||
#else
|
||||
#define __Pyx_PyList_GET_ITEM_REF(o, i, unsafe_shared) (\
|
||||
__Pyx_IS_UNIQUELY_REFERENCED(o, unsafe_shared) ?\
|
||||
__Pyx_XNewRef(PyList_GetItem(o, i)) : __Pyx_PyList_GetItemRef(o, i))
|
||||
#endif
|
||||
#elif CYTHON_ASSUME_SAFE_MACROS
|
||||
#define __Pyx_PyList_GET_ITEM_REF(o, i, unsafe_shared) ((void)(unsafe_shared),\
|
||||
__Pyx_NewRef(PyList_GET_ITEM(o, i)))
|
||||
#else
|
||||
#define __Pyx_PyList_GetItemRefFast(o, i, unsafe_shared) __Pyx_PyList_GetItemRef(o, i)
|
||||
#define __Pyx_PyList_GET_ITEM_REF(o, i, unsafe_shared) ((void)(unsafe_shared),\
|
||||
__Pyx_XNewRef(PyList_GetItem(o, i)))
|
||||
#endif
|
||||
#if __PYX_LIMITED_VERSION_HEX >= 0x030d0000
|
||||
#define __Pyx_PyDict_GetItemRef(dict, key, result) PyDict_GetItemRef(dict, key, result)
|
||||
@@ -1865,10 +1873,10 @@ static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int
|
||||
#define __Pyx_KwargsAsDict_FASTCALL __Pyx_KwargsAsDict_VARARGS
|
||||
#endif
|
||||
#define __Pyx_ArgsSlice_VARARGS(args, start, stop) PyTuple_GetSlice(args, start, stop)
|
||||
#if CYTHON_METH_FASTCALL || (CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
|
||||
#if CYTHON_METH_FASTCALL
|
||||
#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(args + start, stop - start)
|
||||
#else
|
||||
#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop)
|
||||
#define __Pyx_ArgsSlice_FASTCALL __Pyx_ArgsSlice_VARARGS
|
||||
#endif
|
||||
|
||||
/* py_dict_items.proto (used by OwnedDictNext) */
|
||||
@@ -2168,6 +2176,20 @@ void __Pyx_default_placement_construct(T* x) {
|
||||
new (static_cast<void*>(x)) T();
|
||||
}
|
||||
|
||||
/* DeallocKeepAlive.proto */
|
||||
#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
#define __Pyx_DeallocKeepAliveBegin(o) do {\
|
||||
_Py_atomic_store_uintptr_relaxed(&(o)->ob_tid, _Py_ThreadId());\
|
||||
_Py_atomic_store_uint32_relaxed(&(o)->ob_ref_local, 1);\
|
||||
_Py_atomic_store_ssize_relaxed(&(o)->ob_ref_shared, 0);\
|
||||
} while (0)
|
||||
#define __Pyx_DeallocKeepAliveEnd(o)\
|
||||
_Py_atomic_store_uint32_relaxed(&(o)->ob_ref_local, 0)
|
||||
#else
|
||||
#define __Pyx_DeallocKeepAliveBegin(o) __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1)
|
||||
#define __Pyx_DeallocKeepAliveEnd(o) __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1)
|
||||
#endif
|
||||
|
||||
/* CallTypeTraverse.proto */
|
||||
#if !CYTHON_USE_TYPE_SPECS || (!CYTHON_COMPILING_IN_LIMITED_API && PY_VERSION_HEX < 0x03090000)
|
||||
#define __Pyx_call_type_traverse(o, always_call, visit, arg) 0
|
||||
@@ -2744,7 +2766,7 @@ typedef struct {
|
||||
std::string __pyx_k__3;
|
||||
PyObject *__pyx_tuple[5];
|
||||
PyObject *__pyx_codeobj_tab[32];
|
||||
PyObject *__pyx_string_tab[157];
|
||||
PyObject *__pyx_string_tab[158];
|
||||
PyObject *__pyx_number_tab[4];
|
||||
/* #### Code section: module_state_contents ### */
|
||||
/* CommonTypesMetaclass.module_state_decls */
|
||||
@@ -2842,107 +2864,108 @@ static __pyx_mstatetype * const __pyx_mstate_global = &__pyx_mstate_global_stati
|
||||
#define __pyx_n_u_SubSocket_setTimeout __pyx_string_tab[53]
|
||||
#define __pyx_n_u_address __pyx_string_tab[54]
|
||||
#define __pyx_n_u_all_readers_updated __pyx_string_tab[55]
|
||||
#define __pyx_n_u_asyncio_coroutines __pyx_string_tab[56]
|
||||
#define __pyx_n_u_clear __pyx_string_tab[57]
|
||||
#define __pyx_n_u_cline_in_traceback __pyx_string_tab[58]
|
||||
#define __pyx_n_u_conflate __pyx_string_tab[59]
|
||||
#define __pyx_n_u_connect __pyx_string_tab[60]
|
||||
#define __pyx_n_u_context __pyx_string_tab[61]
|
||||
#define __pyx_n_u_data __pyx_string_tab[62]
|
||||
#define __pyx_n_u_deadline __pyx_string_tab[63]
|
||||
#define __pyx_n_u_decode __pyx_string_tab[64]
|
||||
#define __pyx_n_u_delete_fake_prefix __pyx_string_tab[65]
|
||||
#define __pyx_n_u_doc __pyx_string_tab[66]
|
||||
#define __pyx_n_u_enabled __pyx_string_tab[67]
|
||||
#define __pyx_n_u_endpoint __pyx_string_tab[68]
|
||||
#define __pyx_n_u_event __pyx_string_tab[69]
|
||||
#define __pyx_n_u_events __pyx_string_tab[70]
|
||||
#define __pyx_n_u_func __pyx_string_tab[71]
|
||||
#define __pyx_n_u_get_fake_prefix __pyx_string_tab[72]
|
||||
#define __pyx_n_u_getstate __pyx_string_tab[73]
|
||||
#define __pyx_n_u_identifier __pyx_string_tab[74]
|
||||
#define __pyx_n_u_init __pyx_string_tab[75]
|
||||
#define __pyx_n_u_interval __pyx_string_tab[76]
|
||||
#define __pyx_n_u_is_coroutine __pyx_string_tab[77]
|
||||
#define __pyx_n_u_items __pyx_string_tab[78]
|
||||
#define __pyx_n_u_length __pyx_string_tab[79]
|
||||
#define __pyx_n_u_m __pyx_string_tab[80]
|
||||
#define __pyx_n_u_main __pyx_string_tab[81]
|
||||
#define __pyx_n_u_message __pyx_string_tab[82]
|
||||
#define __pyx_n_u_metaclass __pyx_string_tab[83]
|
||||
#define __pyx_n_u_module __pyx_string_tab[84]
|
||||
#define __pyx_n_u_monotonic __pyx_string_tab[85]
|
||||
#define __pyx_n_u_mro_entries __pyx_string_tab[86]
|
||||
#define __pyx_n_u_msg __pyx_string_tab[87]
|
||||
#define __pyx_n_u_msgq_ipc_pyx __pyx_string_tab[88]
|
||||
#define __pyx_n_u_name __pyx_string_tab[89]
|
||||
#define __pyx_n_u_non_blocking __pyx_string_tab[90]
|
||||
#define __pyx_n_u_override __pyx_string_tab[91]
|
||||
#define __pyx_n_u_peek __pyx_string_tab[92]
|
||||
#define __pyx_n_u_poll __pyx_string_tab[93]
|
||||
#define __pyx_n_u_pop __pyx_string_tab[94]
|
||||
#define __pyx_n_u_prefix __pyx_string_tab[95]
|
||||
#define __pyx_n_u_prepare __pyx_string_tab[96]
|
||||
#define __pyx_n_u_ptr __pyx_string_tab[97]
|
||||
#define __pyx_n_u_pyx_state __pyx_string_tab[98]
|
||||
#define __pyx_n_u_pyx_vtable __pyx_string_tab[99]
|
||||
#define __pyx_n_u_qualname __pyx_string_tab[100]
|
||||
#define __pyx_n_u_r __pyx_string_tab[101]
|
||||
#define __pyx_n_u_receive __pyx_string_tab[102]
|
||||
#define __pyx_n_u_reduce __pyx_string_tab[103]
|
||||
#define __pyx_n_u_reduce_cython __pyx_string_tab[104]
|
||||
#define __pyx_n_u_reduce_ex __pyx_string_tab[105]
|
||||
#define __pyx_n_u_registerSocket __pyx_string_tab[106]
|
||||
#define __pyx_n_u_result __pyx_string_tab[107]
|
||||
#define __pyx_n_u_s __pyx_string_tab[108]
|
||||
#define __pyx_n_u_segment_size __pyx_string_tab[109]
|
||||
#define __pyx_n_u_self __pyx_string_tab[110]
|
||||
#define __pyx_n_u_send __pyx_string_tab[111]
|
||||
#define __pyx_n_u_set __pyx_string_tab[112]
|
||||
#define __pyx_n_u_setTimeout __pyx_string_tab[113]
|
||||
#define __pyx_n_u_set_fake_prefix __pyx_string_tab[114]
|
||||
#define __pyx_n_u_set_name __pyx_string_tab[115]
|
||||
#define __pyx_n_u_setdefault __pyx_string_tab[116]
|
||||
#define __pyx_n_u_setstate __pyx_string_tab[117]
|
||||
#define __pyx_n_u_setstate_cython __pyx_string_tab[118]
|
||||
#define __pyx_n_u_sleep __pyx_string_tab[119]
|
||||
#define __pyx_n_u_socket __pyx_string_tab[120]
|
||||
#define __pyx_n_u_sockets __pyx_string_tab[121]
|
||||
#define __pyx_n_u_suffix __pyx_string_tab[122]
|
||||
#define __pyx_n_u_super __pyx_string_tab[123]
|
||||
#define __pyx_n_u_sz __pyx_string_tab[124]
|
||||
#define __pyx_n_u_t __pyx_string_tab[125]
|
||||
#define __pyx_n_u_term __pyx_string_tab[126]
|
||||
#define __pyx_n_u_test __pyx_string_tab[127]
|
||||
#define __pyx_n_u_time __pyx_string_tab[128]
|
||||
#define __pyx_n_u_timeout __pyx_string_tab[129]
|
||||
#define __pyx_n_u_toggle_fake_events __pyx_string_tab[130]
|
||||
#define __pyx_n_u_values __pyx_string_tab[131]
|
||||
#define __pyx_n_u_wait __pyx_string_tab[132]
|
||||
#define __pyx_n_u_wait_for_one_event __pyx_string_tab[133]
|
||||
#define __pyx_n_u_wait_for_readers __pyx_string_tab[134]
|
||||
#define __pyx_kp_b_ __pyx_string_tab[135]
|
||||
#define __pyx_kp_b_127_0_0_1 __pyx_string_tab[136]
|
||||
#define __pyx_kp_b_iso88591_4vU __pyx_string_tab[137]
|
||||
#define __pyx_kp_b_iso88591_4vV1 __pyx_string_tab[138]
|
||||
#define __pyx_kp_b_iso88591_4w __pyx_string_tab[139]
|
||||
#define __pyx_kp_b_iso88591_AQ __pyx_string_tab[140]
|
||||
#define __pyx_kp_b_iso88591_A_1 __pyx_string_tab[141]
|
||||
#define __pyx_kp_b_iso88591_A_iq_1L_85_awa __pyx_string_tab[142]
|
||||
#define __pyx_kp_b_iso88591_A_t_S_j_2Q_aq __pyx_string_tab[143]
|
||||
#define __pyx_kp_b_iso88591_EEaa_gXQgZz_FRS_r_A_gXQ_Qa_haq __pyx_string_tab[144]
|
||||
#define __pyx_kp_b_iso88591_G1A_avQ __pyx_string_tab[145]
|
||||
#define __pyx_kp_b_iso88591_J_G81G_ZvQ_r_A_gXQ_Qa_haq __pyx_string_tab[146]
|
||||
#define __pyx_kp_b_iso88591_Q __pyx_string_tab[147]
|
||||
#define __pyx_kp_b_iso88591_Q_WAXWA_XV7_9AQ __pyx_string_tab[148]
|
||||
#define __pyx_kp_b_iso88591_S_G5_a_r_A_gXQ_a_a __pyx_string_tab[149]
|
||||
#define __pyx_kp_b_iso88591__5 __pyx_string_tab[150]
|
||||
#define __pyx_kp_b_iso88591__6 __pyx_string_tab[151]
|
||||
#define __pyx_kp_b_iso88591_a_D_xq_t3a_Q_3ha_XRr_A_Q __pyx_string_tab[152]
|
||||
#define __pyx_kp_b_iso88591_a_e1A __pyx_string_tab[153]
|
||||
#define __pyx_kp_b_iso88591_a_t7_q_Q_y_G1A_WAQ_1 __pyx_string_tab[154]
|
||||
#define __pyx_kp_b_iso88591_aq __pyx_string_tab[155]
|
||||
#define __pyx_kp_b_iso88591_d __pyx_string_tab[156]
|
||||
#define __pyx_n_u_annotate __pyx_string_tab[56]
|
||||
#define __pyx_n_u_asyncio_coroutines __pyx_string_tab[57]
|
||||
#define __pyx_n_u_clear __pyx_string_tab[58]
|
||||
#define __pyx_n_u_cline_in_traceback __pyx_string_tab[59]
|
||||
#define __pyx_n_u_conflate __pyx_string_tab[60]
|
||||
#define __pyx_n_u_connect __pyx_string_tab[61]
|
||||
#define __pyx_n_u_context __pyx_string_tab[62]
|
||||
#define __pyx_n_u_data __pyx_string_tab[63]
|
||||
#define __pyx_n_u_deadline __pyx_string_tab[64]
|
||||
#define __pyx_n_u_decode __pyx_string_tab[65]
|
||||
#define __pyx_n_u_delete_fake_prefix __pyx_string_tab[66]
|
||||
#define __pyx_n_u_doc __pyx_string_tab[67]
|
||||
#define __pyx_n_u_enabled __pyx_string_tab[68]
|
||||
#define __pyx_n_u_endpoint __pyx_string_tab[69]
|
||||
#define __pyx_n_u_event __pyx_string_tab[70]
|
||||
#define __pyx_n_u_events __pyx_string_tab[71]
|
||||
#define __pyx_n_u_func __pyx_string_tab[72]
|
||||
#define __pyx_n_u_get_fake_prefix __pyx_string_tab[73]
|
||||
#define __pyx_n_u_getstate __pyx_string_tab[74]
|
||||
#define __pyx_n_u_identifier __pyx_string_tab[75]
|
||||
#define __pyx_n_u_init __pyx_string_tab[76]
|
||||
#define __pyx_n_u_interval __pyx_string_tab[77]
|
||||
#define __pyx_n_u_is_coroutine __pyx_string_tab[78]
|
||||
#define __pyx_n_u_items __pyx_string_tab[79]
|
||||
#define __pyx_n_u_length __pyx_string_tab[80]
|
||||
#define __pyx_n_u_m __pyx_string_tab[81]
|
||||
#define __pyx_n_u_main __pyx_string_tab[82]
|
||||
#define __pyx_n_u_message __pyx_string_tab[83]
|
||||
#define __pyx_n_u_metaclass __pyx_string_tab[84]
|
||||
#define __pyx_n_u_module __pyx_string_tab[85]
|
||||
#define __pyx_n_u_monotonic __pyx_string_tab[86]
|
||||
#define __pyx_n_u_mro_entries __pyx_string_tab[87]
|
||||
#define __pyx_n_u_msg __pyx_string_tab[88]
|
||||
#define __pyx_n_u_msgq_ipc_pyx __pyx_string_tab[89]
|
||||
#define __pyx_n_u_name __pyx_string_tab[90]
|
||||
#define __pyx_n_u_non_blocking __pyx_string_tab[91]
|
||||
#define __pyx_n_u_override __pyx_string_tab[92]
|
||||
#define __pyx_n_u_peek __pyx_string_tab[93]
|
||||
#define __pyx_n_u_poll __pyx_string_tab[94]
|
||||
#define __pyx_n_u_pop __pyx_string_tab[95]
|
||||
#define __pyx_n_u_prefix __pyx_string_tab[96]
|
||||
#define __pyx_n_u_prepare __pyx_string_tab[97]
|
||||
#define __pyx_n_u_ptr __pyx_string_tab[98]
|
||||
#define __pyx_n_u_pyx_state __pyx_string_tab[99]
|
||||
#define __pyx_n_u_pyx_vtable __pyx_string_tab[100]
|
||||
#define __pyx_n_u_qualname __pyx_string_tab[101]
|
||||
#define __pyx_n_u_r __pyx_string_tab[102]
|
||||
#define __pyx_n_u_receive __pyx_string_tab[103]
|
||||
#define __pyx_n_u_reduce __pyx_string_tab[104]
|
||||
#define __pyx_n_u_reduce_cython __pyx_string_tab[105]
|
||||
#define __pyx_n_u_reduce_ex __pyx_string_tab[106]
|
||||
#define __pyx_n_u_registerSocket __pyx_string_tab[107]
|
||||
#define __pyx_n_u_result __pyx_string_tab[108]
|
||||
#define __pyx_n_u_s __pyx_string_tab[109]
|
||||
#define __pyx_n_u_segment_size __pyx_string_tab[110]
|
||||
#define __pyx_n_u_self __pyx_string_tab[111]
|
||||
#define __pyx_n_u_send __pyx_string_tab[112]
|
||||
#define __pyx_n_u_set __pyx_string_tab[113]
|
||||
#define __pyx_n_u_setTimeout __pyx_string_tab[114]
|
||||
#define __pyx_n_u_set_fake_prefix __pyx_string_tab[115]
|
||||
#define __pyx_n_u_set_name __pyx_string_tab[116]
|
||||
#define __pyx_n_u_setdefault __pyx_string_tab[117]
|
||||
#define __pyx_n_u_setstate __pyx_string_tab[118]
|
||||
#define __pyx_n_u_setstate_cython __pyx_string_tab[119]
|
||||
#define __pyx_n_u_sleep __pyx_string_tab[120]
|
||||
#define __pyx_n_u_socket __pyx_string_tab[121]
|
||||
#define __pyx_n_u_sockets __pyx_string_tab[122]
|
||||
#define __pyx_n_u_suffix __pyx_string_tab[123]
|
||||
#define __pyx_n_u_super __pyx_string_tab[124]
|
||||
#define __pyx_n_u_sz __pyx_string_tab[125]
|
||||
#define __pyx_n_u_t __pyx_string_tab[126]
|
||||
#define __pyx_n_u_term __pyx_string_tab[127]
|
||||
#define __pyx_n_u_test __pyx_string_tab[128]
|
||||
#define __pyx_n_u_time __pyx_string_tab[129]
|
||||
#define __pyx_n_u_timeout __pyx_string_tab[130]
|
||||
#define __pyx_n_u_toggle_fake_events __pyx_string_tab[131]
|
||||
#define __pyx_n_u_values __pyx_string_tab[132]
|
||||
#define __pyx_n_u_wait __pyx_string_tab[133]
|
||||
#define __pyx_n_u_wait_for_one_event __pyx_string_tab[134]
|
||||
#define __pyx_n_u_wait_for_readers __pyx_string_tab[135]
|
||||
#define __pyx_kp_b_ __pyx_string_tab[136]
|
||||
#define __pyx_kp_b_127_0_0_1 __pyx_string_tab[137]
|
||||
#define __pyx_kp_b_iso88591_4vU __pyx_string_tab[138]
|
||||
#define __pyx_kp_b_iso88591_4vV1 __pyx_string_tab[139]
|
||||
#define __pyx_kp_b_iso88591_4w __pyx_string_tab[140]
|
||||
#define __pyx_kp_b_iso88591_AQ __pyx_string_tab[141]
|
||||
#define __pyx_kp_b_iso88591_A_1 __pyx_string_tab[142]
|
||||
#define __pyx_kp_b_iso88591_A_iq_1L_85_awa __pyx_string_tab[143]
|
||||
#define __pyx_kp_b_iso88591_A_t_S_j_2Q_aq __pyx_string_tab[144]
|
||||
#define __pyx_kp_b_iso88591_EEaa_gXQgZz_FRS_r_A_gXQ_Qa_haq __pyx_string_tab[145]
|
||||
#define __pyx_kp_b_iso88591_G1A_avQ __pyx_string_tab[146]
|
||||
#define __pyx_kp_b_iso88591_J_G81G_ZvQ_r_A_gXQ_Qa_haq __pyx_string_tab[147]
|
||||
#define __pyx_kp_b_iso88591_Q __pyx_string_tab[148]
|
||||
#define __pyx_kp_b_iso88591_Q_WAXWA_XV7_9AQ __pyx_string_tab[149]
|
||||
#define __pyx_kp_b_iso88591_S_G5_a_r_A_gXQ_a_a __pyx_string_tab[150]
|
||||
#define __pyx_kp_b_iso88591__5 __pyx_string_tab[151]
|
||||
#define __pyx_kp_b_iso88591__6 __pyx_string_tab[152]
|
||||
#define __pyx_kp_b_iso88591_a_D_xq_t3a_Q_3ha_XRr_A_Q __pyx_string_tab[153]
|
||||
#define __pyx_kp_b_iso88591_a_e1A __pyx_string_tab[154]
|
||||
#define __pyx_kp_b_iso88591_a_t7_q_Q_y_G1A_WAQ_1 __pyx_string_tab[155]
|
||||
#define __pyx_kp_b_iso88591_aq __pyx_string_tab[156]
|
||||
#define __pyx_kp_b_iso88591_d __pyx_string_tab[157]
|
||||
#define __pyx_float_1_0 __pyx_number_tab[0]
|
||||
#define __pyx_float_0_001 __pyx_number_tab[1]
|
||||
#define __pyx_int_0 __pyx_number_tab[2]
|
||||
@@ -2975,7 +2998,7 @@ static CYTHON_SMALL_CODE int __pyx_m_clear(PyObject *m) {
|
||||
Py_CLEAR(clear_module_state->__pyx_type_4msgq_7ipc_pyx_PubSocket);
|
||||
for (int i=0; i<5; ++i) { Py_CLEAR(clear_module_state->__pyx_tuple[i]); }
|
||||
for (int i=0; i<32; ++i) { Py_CLEAR(clear_module_state->__pyx_codeobj_tab[i]); }
|
||||
for (int i=0; i<157; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); }
|
||||
for (int i=0; i<158; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); }
|
||||
for (int i=0; i<4; ++i) { Py_CLEAR(clear_module_state->__pyx_number_tab[i]); }
|
||||
/* #### Code section: module_state_clear_contents ### */
|
||||
/* CommonTypesMetaclass.module_state_clear */
|
||||
@@ -3013,7 +3036,7 @@ static CYTHON_SMALL_CODE int __pyx_m_traverse(PyObject *m, visitproc visit, void
|
||||
Py_VISIT(traverse_module_state->__pyx_type_4msgq_7ipc_pyx_PubSocket);
|
||||
for (int i=0; i<5; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_tuple[i]); }
|
||||
for (int i=0; i<32; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_codeobj_tab[i]); }
|
||||
for (int i=0; i<157; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); }
|
||||
for (int i=0; i<158; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); }
|
||||
for (int i=0; i<4; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_number_tab[i]); }
|
||||
/* #### Code section: module_state_traverse_contents ### */
|
||||
/* CommonTypesMetaclass.module_state_traverse */
|
||||
@@ -3457,7 +3480,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_self,&__pyx_mstate_global->__pyx_n_u_endpoint,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 22, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 22, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 2:
|
||||
@@ -3703,7 +3726,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_enabled,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 32, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 32, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -3825,7 +3848,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_prefix,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 36, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 36, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -4077,7 +4100,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_events,&__pyx_mstate_global->__pyx_n_u_timeout,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 48, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 48, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 2:
|
||||
@@ -4185,7 +4208,7 @@ static PyObject *__pyx_pf_4msgq_7ipc_pyx_8wait_for_one_event(CYTHON_UNUSED PyObj
|
||||
#endif
|
||||
if (__pyx_t_2 >= __pyx_temp) break;
|
||||
}
|
||||
__pyx_t_3 = __Pyx_PyList_GetItemRefFast(__pyx_t_1, __pyx_t_2, __Pyx_ReferenceSharing_OwnStrongReference);
|
||||
__pyx_t_3 = __Pyx_PyList_GET_ITEM_REF(__pyx_t_1, __pyx_t_2, __Pyx_ReferenceSharing_OwnStrongReference);
|
||||
++__pyx_t_2;
|
||||
if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 50, __pyx_L1_error)
|
||||
__Pyx_GOTREF(__pyx_t_3);
|
||||
@@ -4516,7 +4539,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_timeout,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 67, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 67, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -4957,7 +4980,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -5067,7 +5090,7 @@ static int __pyx_pw_4msgq_7ipc_pyx_17SocketEventHandle_1__cinit__(PyObject *__py
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_endpoint,&__pyx_mstate_global->__pyx_n_u_identifier,&__pyx_mstate_global->__pyx_n_u_override,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_VARARGS(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 85, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 85, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 3:
|
||||
@@ -5643,7 +5666,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -6019,7 +6042,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -6273,7 +6296,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_socket,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 142, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 142, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -6427,7 +6450,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_timeout,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 146, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 146, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -6775,7 +6798,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -7248,7 +7271,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_context,&__pyx_mstate_global->__pyx_n_u_endpoint,&__pyx_mstate_global->__pyx_n_u_address,&__pyx_mstate_global->__pyx_n_u_conflate,&__pyx_mstate_global->__pyx_n_u_segment_size,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 186, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 186, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 5:
|
||||
@@ -7593,7 +7616,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_timeout,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 197, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 197, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -7746,7 +7769,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_non_blocking,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 201, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 201, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -8101,7 +8124,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -8375,7 +8398,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_context,&__pyx_mstate_global->__pyx_n_u_endpoint,&__pyx_mstate_global->__pyx_n_u_segment_size,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 228, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 228, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 3:
|
||||
@@ -8663,7 +8686,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_data,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 237, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 237, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -8988,7 +9011,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_timeout,&__pyx_mstate_global->__pyx_n_u_interval,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(0, 250, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(0, 250, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 2:
|
||||
@@ -9395,7 +9418,7 @@ PyObject *__pyx_args, PyObject *__pyx_kwds
|
||||
{
|
||||
PyObject ** const __pyx_pyargnames[] = {&__pyx_mstate_global->__pyx_n_u_pyx_state,0};
|
||||
const Py_ssize_t __pyx_kwds_len = (__pyx_kwds) ? __Pyx_NumKwargs_FASTCALL(__pyx_kwds) : 0;
|
||||
if (unlikely(__pyx_kwds_len) < 0) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (unlikely(__pyx_kwds_len < 0)) __PYX_ERR(1, 3, __pyx_L3_error)
|
||||
if (__pyx_kwds_len > 0) {
|
||||
switch (__pyx_nargs) {
|
||||
case 1:
|
||||
@@ -9645,9 +9668,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_SocketEventHandle(PyObject *o) {
|
||||
{
|
||||
PyObject *etype, *eval, *etb;
|
||||
PyErr_Fetch(&etype, &eval, &etb);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
|
||||
__Pyx_DeallocKeepAliveBegin(o);
|
||||
__pyx_pw_4msgq_7ipc_pyx_17SocketEventHandle_3__dealloc__(o);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
|
||||
__Pyx_DeallocKeepAliveEnd(o);
|
||||
PyErr_Restore(etype, eval, etb);
|
||||
}
|
||||
PyTypeObject *tp = Py_TYPE(o);
|
||||
@@ -9810,9 +9833,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_Context(PyObject *o) {
|
||||
{
|
||||
PyObject *etype, *eval, *etb;
|
||||
PyErr_Fetch(&etype, &eval, &etb);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
|
||||
__Pyx_DeallocKeepAliveBegin(o);
|
||||
__pyx_pw_4msgq_7ipc_pyx_7Context_5__dealloc__(o);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
|
||||
__Pyx_DeallocKeepAliveEnd(o);
|
||||
PyErr_Restore(etype, eval, etb);
|
||||
}
|
||||
PyTypeObject *tp = Py_TYPE(o);
|
||||
@@ -9951,9 +9974,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_Poller(PyObject *o) {
|
||||
{
|
||||
PyObject *etype, *eval, *etb;
|
||||
PyErr_Fetch(&etype, &eval, &etb);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
|
||||
__Pyx_DeallocKeepAliveBegin(o);
|
||||
__pyx_pw_4msgq_7ipc_pyx_6Poller_3__dealloc__(o);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
|
||||
__Pyx_DeallocKeepAliveEnd(o);
|
||||
PyErr_Restore(etype, eval, etb);
|
||||
}
|
||||
Py_CLEAR(p->sub_sockets);
|
||||
@@ -10117,9 +10140,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_SubSocket(PyObject *o) {
|
||||
{
|
||||
PyObject *etype, *eval, *etb;
|
||||
PyErr_Fetch(&etype, &eval, &etb);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
|
||||
__Pyx_DeallocKeepAliveBegin(o);
|
||||
__pyx_pw_4msgq_7ipc_pyx_9SubSocket_3__dealloc__(o);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
|
||||
__Pyx_DeallocKeepAliveEnd(o);
|
||||
PyErr_Restore(etype, eval, etb);
|
||||
}
|
||||
PyTypeObject *tp = Py_TYPE(o);
|
||||
@@ -10255,9 +10278,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_PubSocket(PyObject *o) {
|
||||
{
|
||||
PyObject *etype, *eval, *etb;
|
||||
PyErr_Fetch(&etype, &eval, &etb);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
|
||||
__Pyx_DeallocKeepAliveBegin(o);
|
||||
__pyx_pw_4msgq_7ipc_pyx_9PubSocket_3__dealloc__(o);
|
||||
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
|
||||
__Pyx_DeallocKeepAliveEnd(o);
|
||||
PyErr_Restore(etype, eval, etb);
|
||||
}
|
||||
PyTypeObject *tp = Py_TYPE(o);
|
||||
@@ -11565,16 +11588,20 @@ static int __Pyx_InitCachedConstants(__pyx_mstatetype *__pyx_mstate) {
|
||||
{
|
||||
PyObject **table = __pyx_mstate->__pyx_tuple;
|
||||
for (Py_ssize_t i=0; i<5; ++i) {
|
||||
#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
#if PY_VERSION_HEX >= 0x030F0000
|
||||
PyUnstable_SetImmortal(table[i]);
|
||||
#elif CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
if ((PY_SSIZE_T_MAX <= _Py_IMMORTAL_REFCNT_LOCAL)) break;
|
||||
#if PY_VERSION_HEX < 0x030E0000
|
||||
if (_Py_IsOwnedByCurrentThread(table[i]) && Py_REFCNT(table[i]) == 1)
|
||||
#else
|
||||
if (PyUnstable_Object_IsUniquelyReferenced(table[i]))
|
||||
#endif
|
||||
{
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
|
||||
Py_SET_REFCNT(table[i], ((Py_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
|
||||
}
|
||||
#else
|
||||
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
|
||||
#endif
|
||||
}
|
||||
@@ -11591,31 +11618,31 @@ static int __Pyx_InitCachedConstants(__pyx_mstatetype *__pyx_mstate) {
|
||||
static int __Pyx_InitConstants(__pyx_mstatetype *__pyx_mstate) {
|
||||
CYTHON_UNUSED_VAR(__pyx_mstate);
|
||||
{
|
||||
const struct { const unsigned int length: 8; } index[] = {{0},{18},{4},{179},{2},{1},{8},{7},{6},{2},{9},{26},{50},{62},{14},{26},{5},{5},{7},{25},{27},{12},{5},{23},{25},{11},{10},{9},{10},{8},{17},{23},{6},{24},{26},{11},{21},{9},{27},{29},{29},{17},{14},{26},{20},{17},{35},{37},{9},{27},{29},{17},{17},{20},{7},{19},{18},{5},{18},{8},{7},{7},{4},{8},{6},{18},{7},{7},{8},{5},{6},{8},{15},{12},{10},{8},{8},{13},{5},{6},{1},{8},{7},{13},{10},{9},{15},{3},{12},{8},{12},{8},{4},{4},{3},{6},{11},{3},{11},{14},{12},{1},{7},{10},{17},{13},{14},{6},{1},{12},{4},{4},{3},{10},{15},{12},{10},{12},{19},{5},{6},{7},{6},{5},{2},{1},{4},{8},{4},{7},{18},{6},{4},{18},{16},{0},{9},{13},{13},{14},{16},{16},{40},{65},{78},{26},{63},{9},{57},{56},{9},{9},{70},{16},{65},{9},{11}};
|
||||
#if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (1443 bytes) */
|
||||
const char* const cstring = "BZh91AY&SYP\223\323\246\000\000\313\377\377\177\377\277\273\177\277\376\365\257\367\177\325\277\377\377\366\300@@@@@@@@@@@@\000P\005>vU\250\024t\035wX\3520jz\204\324\312\236\325\017\023\323)\345=\023L\247\232Q\351\250\033H\036\2204\3204\032h\000z\232d\323F\236\221\355#$\362\201\251\242S\364\232j4z\236\210\364\201\2022d\311\210\0004\000\0001\006 4\003@\310\304d\032dB\021\252i\3456\240\332\200= 4h\000\000\000\032\000\000\000\000\032\000\365\016\000\000\000\000\000\000\000\310h\000\000\000\000\000\000\000\001)\242 \004\320\002\230OSD\321\241\220\006A\241\240\000\032i\241\240\001\2404\r\017P\323\375\352\261\374\035\276>\330\350\376\216\347r\244\230\211\310$\311\014$\301\306\t\207BL\327A<\001\354\231BB$\300\356\207\305fq\320\214\3417\204\324\325D\203\340\272\342d\246\222.\304\"\022&\347\363\031\264c\0272\036\353\nZ.\312\364\2472v\365we\340\272\327\006\345\3663Y?\202&.Y{5?S\035\302\335\3658\247\026\274m\005\315mIa,u\350\363N\214u\363\310)HE\270\321#j\n\271M\373\253\254\320)\252Y\265>\205\037>\270\202\030A)(D\"\006\032\276\357/\322D3\313\020\263@\260i\330\203\234\240u\363\223K\037Yflf\372\352\\V\200\247Fm6\200\3453a.,\241e\353\"`\221t\263\360\010\033lE\302\256\"\212\256\331u\034\271\314D\253T\227F\340\236O\215U\0035V\343j\211\243\314\334\260\340\n\324\235\313j\035\362k|\366b\312\373\250\275*$)\275V~\023+7\246MC\0348)=L\305(9\250b\316p \201\224@\206\n\003\233\363\303\"\243W\241\257\rr\024\252\247&\206\263XhU\244\240j\253\207\262\272\006g9\256\304\330\200t\333\0234-\227M\240\274D\024\016\301\335\246b\225z--#\t\310\222\253T\276T\\\305\006\314x\330p\376x\364Q\342\375\222\301\272X\366[WK!\306lm\265,\343\020\346\250\314qn\334\334\223\222s\036RRI\264\260\330#6\303w\222\304\267)\347'\256\230%\226\201\212\253+\253\237+\030b\307\334pp[g{!\357\324\257\2253k\022M!\231\357\206Z\336\254K\3320\266p\352\242a\004T\320\365\305j\006'Vm\2711\273\203><\203~\367'\016\2504\306\353%D\024BI$\204%\252\247\244<5\000\275!7\017?\335\032\022{\344)Q\314\303\010\321\207\033\t\211\000\344\302\213\010\254""\242b\254\313\246SSU\344f2)P\355\r\\\2259\254\251\204k\207*\246\324\331\"W\021N\037\345\375\254*Zk\320\314$24\242\225\213\312\020\244\231\271\025\031\331\007\350\266m\374\342\335{\325\003\230gp\342\321E\rJ\206\237\004\026\274\030\254hL\214\000\365\301\202\204`\002\014\323\253UZ\244\245\345\271\330&\354\334S\0101\322\270@at4\262F\0019;o\267\220\3715\322\364Yq~fM\257\234\366A\206v5\3659S\332\257\254\020\314;\336\221\rV\006\225V\274h!\256J\246,\tS\252\215W\010d\364\275\206\362\035\353\307\224\264\315\260\241\240]Gh\333\205t\336=N3$$\355M\312\357\036\231\246E\005;\001mD&$\356\310&t'].\236t\203R'a0\266\223D\265e\253\017\334`\326c\257\227E\225\235\026\026\262\3643+\371\231l\251\005\235\240r\275\374\254\232\013\032\264j\307E \210L\372\342p\204h4\227\030Z\\\014\247\004/\214\302&\024\006rQJ\325\243 5[\344\022Cs\272M\276\354\237<\222\270.\323\232\000\274\310\023\215\020\371\355\332\253Mq\277\r\200\244f1\000bk\371\017^R\025\262w\210\006\031\361i^\310\225\355L\205\367\026\n\013\305\214\313\000,\200vR\355\320\2662\016\010\344\022F2\241zD=\234+\204\251\326d\256n\336\223\264\266Q\004\223\022\t\004\244\222@\026\265A\202\210.\323\262\003\261\236\315a\262a\213+\262\210\230\303\253Q\n\312)5_vT\315u8\206m\300\023\302\234\265\027\275\365\205\270h\252\274\226\257.\270\225\312\3241\034\371O\031_g\007$\303\306\3579\311!\t!b:\341f1}\321\244\350K\225x\366\324\265\240\336\226f\325\313\030A=\022\2571\314\350\360\334+|\326\231L8\tt\245\005!\026'>\344N\213K\214!\025\022@vk}k\221de\332\235\326\260\250*J?X\366\272\341\3560ux\231\037\0037\275\255\007\307\326\371\033\260\316u\273\010;=s\264\261>\367aI\245xz\220^\323\337\327\2746\266\017_\237\203\357\nb&\256\014A9\306\266\r\344\343\361\017\010\n\331\027\215\264{b\303\251\357\267\235\213s\036n\256\377\356\001B\216\351G\344\377?\306[\276\356\030Gh[\227\217\271\305}/\331\352M\026,?\245\275\330\314\n\241\213&\237\036\225!\222\266Z\212\321\333\221\357\263\334\334\232\231g\317\347@\024\375ue\326D}_\256\026\366n\t\035\"4A\013L\244\200\264\2417=N\251\023z""\200yO\214\232\247\240\235%\233\001\010\206\306g\377\027rE8P\220P\223\323\246";
|
||||
PyObject *data = __Pyx_DecompressString(cstring, 1443, 2);
|
||||
const struct { const unsigned int length: 8; } index[] = {{0},{18},{4},{179},{2},{1},{8},{7},{6},{2},{9},{26},{50},{62},{14},{26},{5},{5},{7},{25},{27},{12},{5},{23},{25},{11},{10},{9},{10},{8},{17},{23},{6},{24},{26},{11},{21},{9},{27},{29},{29},{17},{14},{26},{20},{17},{35},{37},{9},{27},{29},{17},{17},{20},{7},{19},{12},{18},{5},{18},{8},{7},{7},{4},{8},{6},{18},{7},{7},{8},{5},{6},{8},{15},{12},{10},{8},{8},{13},{5},{6},{1},{8},{7},{13},{10},{9},{15},{3},{12},{8},{12},{8},{4},{4},{3},{6},{11},{3},{11},{14},{12},{1},{7},{10},{17},{13},{14},{6},{1},{12},{4},{4},{3},{10},{15},{12},{10},{12},{19},{5},{6},{7},{6},{5},{2},{1},{4},{8},{4},{7},{18},{6},{4},{18},{16},{0},{9},{13},{13},{14},{16},{16},{40},{65},{78},{26},{63},{9},{57},{56},{9},{9},{70},{16},{65},{9},{11}};
|
||||
#if (CYTHON_COMPRESS_STRINGS) == 2 /* compression: bz2 (1434 bytes) */
|
||||
const char* const cstring = "BZh91AY&SY\346\000:\002\000\000\313\377\377\177\377\277\273\177\277\376\365\257\367\177\325\277\377\377\366\300@@@@@@@@@@@@\000P\005>vU\206\200\001\245\0300h\204M)\371SO\023\323&S\rS\364\214P\332\201\2645\036\2204\3204\036\246\236\246F\207\251\246\032&\236Sm#\024\362C\200\000\000\000\000\000\0002\032\000\000\000\000\000\000\000\000i\222\021\030\251\241\342\206\010\320\321\243!\240\300\231\000\003&F\206\21522hh44\304\003\3248\000\000\000\000\000\000\003!\240\000\000\000\000\000\000\000\004\246\210&\221\223Bbh\231O(\302\236)\345\032\014\000h@\001\204\300\010di\261#\323H\375D\364\373\275\206>\263\303\321\341\035\037\364\361x\256I\210\234\202L\220\302L\035\000\230t$\315\236\t\342\017|\312$\"L\016\350|\226\247\035\010\326\023xM[\251 \366\251q\"SE\027b\021\t\023G\362\331\250[\024\\=,&\250S\035\364e\"w\365\370\242\275ak\334\027W_a\034\206#*(\274P\177#5\201\213\251\216\230\352V%\202\231a(\\\315v\233\2330\364f\350P0h@*\263J\233\t\t\255=\313\n\242\2604Bk\357I\225/\341\262\035y\340f\203$B ]\317\272\361\375$C<o\305}\342\265x\304\034\345\001\241\234\2326\374k\231\312\223\361\346\241=q>[3\326\0031{(\216\243%\033u\004aMS\250_\016\260\300\177\235=\006P\265Q\242\353H\\\243YM\034\312\004\254\372\324\360\030j\263\216j&g\221\242\271\264\025I;\226\275w\263Y\367\031\213\355\324\214\022\244\2057\272\377\3652\307\034\311\250c\227\025'\271\230\252\016\252\030\277\256\022A\304\202L<\210Z\326\272\361\321<\271\264\337\307|\312\335t%Uea\244\366wx\032\353Fb\025\25039\325v&\304\003\246\341L\320\260\3176\203\001\020Pv\016\262f*\260Fc1\030\316D\225\333e\361#;\0248r\350a\303\354\350\340\245n\025f\025y\027\t\306\353\310\030\304\302S\0176D\024\200\352sD0@T\005\001\236\205(\324fN0\332\021\257y\315\3471-Jz\311\356\254\022\323A\213\254Z\356\324\257a\213\337\230\344\344\315\177bC\341\265a*\315\257I4\206g\302\031-\327d`\322\3074\341\325\304\302\010\271\241\355\026P1;\265o\321\226~Myq\035,\034\234:\243l\216k\345H)\t$\222\020\226\333\242\262\2115CL\312A\024\350\253I\3365!\347XT\030\226\322\016\265\t\204#""\032^E\212LV4\354\224\324\325\2643\032\024\250\355\ri*\352\276\346\021\272\034\272\271\223h\211g\"\270\375\270w\361\271l\267\0030\220\310\330\212\254\236P\205$\315\305q\255\220}K\207\177z3n\343\270\034\307[\207\217\301J5T4\371 \314\360d\262\242db\034\330\261$\300Cp\354\317^\036\354\270\264>\225~\274\274\0043\3231\006\234\321\303j\034\253\201\356\371\370\237F\352\275/\316a\251\223n\353\275\360c\255\215\335\316y\357XX\020\314;\340\221\rv&\305v\354\250CgJ\346/\tWm6\347\020\311\352\367\234hw\266\\\353d\333\0324\013\270\355\033\361\265p\036\347\031\222\022v\256u\237\312\254\323\"\205xAoD&$\356\310&\335\271\332\256\207\235A\252'a0\267\223D\266\351\273\037\000\301\270\313w\221K\354yl-\306\010fXt\364\337r\013\373\340\345\272ZY4\027\205\221\267.\n\210\336\264\365\014\215\347<\336\324S\226\352r\356\337\264\326\212\246)\203rv{+\254\0364\365\311 _$K^&*\304\t\244\nmo\334\001P\270\002/e\325\212.Mb\331\316\2246%e\370Y\001\323mZ\"\334NY\236\"R\024\232:|1|\247\247\226f\250/*iL\332\364\205\240}t\337\260\301\241\304\350\242f\251\233\272\216\3665\352U\355\255j\340\337\033\231O\004\022LH$\022\222I\000Z\245\003\002\210.\322\257\000\354i\330~;\351z`V\276\2216a\326dB\276\2256\341\237Jf\317\\\203W0\004\361\256\233\214\037\013\006lx.\266\214\313\320\264K:\314\206#\265)\345,/\344\361\214\177?\340\353\244\204$\205\220\353\225\230\311\371\243a\333\227>\003\346\271nA\307-M\267\310\030A>\t[P\317\325\236\3206|\213/<G\006m\032\010\320\n\224\207#\276\320\355*h\"\201\006\003L\261^\263\371\027\261\007\231l\t\tQ\247\231>\375\260,\220\033P\221\215\302/\223\246\007\332\327\334\267I\002\326\351\201sl^9\003\221\004\022\211\326\305\2426\364\371vm\215\353'\340\355\337\270\362\0373\206\376\020\214\343\243\177\215\030\275c\324\002v\205\263\252[\217\340\326\372\325\316\303\301\212f\277/\365\321*_\021\227\354\371\272N+\037Nw\207\214U\213\037\227\242\352\034\251\250\310\245I\315.?\016hL\25494\361\351N\031(\345\201:;\364\333\341o\261\223[,\231=\227B\\\320N]\202\233\217\354\334\237C\020`RD,\004*1\212\002\242\204""\234\347\370\210\223\316\003\306]d\323\274\302SG\016\001\010A\255\231\177\305\334\221N\024$9\200\016\200\200";
|
||||
PyObject *data = __Pyx_DecompressString(cstring, 1434, 2);
|
||||
if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
|
||||
const char* const bytes = __Pyx_PyBytes_AsString(data);
|
||||
#if !CYTHON_ASSUME_SAFE_MACROS
|
||||
if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
|
||||
#endif
|
||||
#elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (1321 bytes) */
|
||||
const char* const cstring = "x\332\215U\315o\023G\024o\334\324$\344\243r?\250\332\212j\322\002Q)\230\206\202HQEeAH\251\n\212q\013\010U\035\215w\337\256\207\254w63\263N\214\250\312q\216{\334\343\036s\3141G\216\034\367\350c\376\224\276\331\3358i\234Vu\344\335\361\274\257\337\373\275\217<\004\245\230\317C\237x\214\007\261\004\362H\204\360Hh \272\3074\271;\324=\021\022\256\210\013\001\357\202d\032\202!QZrG\203\264J!\331X\333\270zc\365\006a\241K$\274\000G+\242\342\256\0230\245@\021\341\221n\314\003\315C\242\207\021\250&y\340\221\241\210I\010\340\022-H\204z\307\rt\017B\242@\333\003Yfa(4\323\\\204\024\315\021\3522q\271\304 |\000\326\372>\013\0244o\223\037\231\353RT\005\227+\326\r\000B\373\364\035\256\312\223\333W\376\026\225\020\211k\366t\215G\016\215\206;M\374\206\002\323\363X\034hBQ\303\215\035\240\224\270q\341?\024\341ULw\300Y\200R\207\207\\S\252 \360\2320\200P\023\247\000H\272@\034\021\016@\3522)F6J\356D\3272B<!I\304\235\315\0003\370\301\362\027\372J\304\322\201;\230\271r\244%\027\023s\211u\206\236B4\212\265wuu\233\353\036\271+B\r;\272z5\307(\235\"\006\245G\002\344M!]\223\",W\177\315\".\036\223.\016\257'\034\224\002'\000&\313c\004\260Y\236P\267<l3\256\037D\316\232\224B\036\276\321WI\326C$\226G\001l\304\335\200\253\036HU\3107D\020@\365\234\2043\276\237\300SI\"|UG\t>W\230_G8\233\2401\314\211\303)\336\217\211&\003\214\205,\010\320\222\271\010\231\306\221\213J\356\221\260*\322\321\0056\3321\261\245\204b\325\307\016\350\306p\007\277\367pr\350#\254\310c\360J\325\202\302\237pz\002\230\270\230\204~\232\312D\n\235C\030\235\177\347\240\363_\034tN\246yt\201\263\0078{\235cy\353_y\037D\254q\004\245\335(\223\26415\014\035.\320\233D=\036\202*\032\312\301q\000l\023\252%s\240\313\234M\014\347\005hQ\205u\312\356E\037\350\216\271V\335E\231\213\317\000\020\257\3076\201F\022<\276C\251+\034J\253i\307ZD\202\243\261%\252x`\005\2748D\r\037\364?\355\374\303\354)G;\315=\016\362\260y\255\0139`\001\345\212\216\301s\r}\025@\350\353^\237\322>\303\004h\277X\245`\017\232\025\253\214\342\247/\3348\260\227\002\347Z\204\034\303\367""\245@\220\270\001\0005p\025\331m\324\254\266\021\245!\353\243:.\035\332\r\220^\\\023\002\227\212D`v\354l\323G\":\004\216\357\210I\324\2174\002\266\366U\036\3668\320\226\010\013b+fA\351WV\305;Zs\023m1\276\200\035{<>YX[\034e\334\321~\037\023\240\212\277\004\273\010m\337\333\006\032\267\201:I\260\275(\001\340\251Z\265\307\232\216\236\322\200H/D\252\010[=U\354\2413\025G\330V/\265]g\224jP\350HcX]\206\326\302\367\203\252-\312\252c\355bPv\032\307\023\211\377\342J\341\311\031]\271~\253\371-\376\255\274^\032M\317\231\033f\220\374\226.\035\375x\222\216%\333\371\271\313\273V4{vT?k\226\223\317\323V\332\266\322\0313mZ\3665\227\254\344\357\\\310Z\007\265\372kn\266F\323\263\346\263d%\371%\233\333]\335\273\271?5\2525\222\363)K\2673\226\327\256\344WZo\032\243\351\367\215Nn\247\235\254\226\241\253\263\346\202y\221\276\233^O\333\243\372\254\371(_X\312\032\243\231Y\033\361R2\2254\254\312\225\204%[ym-_c9{\225\277\372\363\240\204t\301\370\311\263\264\235\372\331\363\335\227\373\237\276\271\374\366~\376\270s0}\346\2654\037\"\302\372b\2510\232Y\314\027/f\355\214\035\314,\232\236\365V\2461\237\254\247+i\221\312\031\363\027\002\035d\355\274\366\363\333*\307\365d\025\305\353\331\355\335\347{\203\375\366\377s<e\021\177\223\240\237\217\223\366hz\301<MZ\250\3734ke\177\354\335\261\004\240\315\227\331\022z}\266\367d\377\326\233\345\267\r\033p\326|`\276G\325\202\341\005\323)\223/a\334L\247\322O\262:\2069\r\202)\2423\214|\356\353\335\006\226\014y?\237\376\276\333\310k\227\320\304r5o\356%g\222\235t+\233\262.\264\371\316\260Q}\301\264\017\352sxF\344\226\317\257\314\263\344q\"\323\306hn~43oZ\007V%\257}\2212\213\244n\000\213\333\262\3700\334h\272\2214\n\347\266\240\267\322\213\245\363\031\363\236i\333\273a:e\343\256[\023\033\312\322\200\024\316\231\025\013\024\201eU\021\352\306M\226\376\006\2378\307\370";
|
||||
PyObject *data = __Pyx_DecompressString(cstring, 1321, 1);
|
||||
#elif (CYTHON_COMPRESS_STRINGS) != 0 /* compression: zlib (1327 bytes) */
|
||||
const char* const cstring = "x\332\215U\315o\023G\024o\334\324$\344\243r?\250\332\212j\322\002Q)\230\206\202HQEeAH\251\n\212q\013\010U\035\215w\337\256\207\254w63\263N\214\250\312q\216{\334\343\036s\3141G\216\034\367\350c\376\224\276\331\3358i\234Vu\344\335\347y_\277\367{\363^\036\202R\314\347\241O<\306\203X\002y$Bx$4\020\335c\232\334\035\352\236\010\tW\304\205\200wA2\r\301\220(-\271\243AZ\243\220l\254m\\\275\261z\203\260\320%\022^\200\243\025Qq\327\t\230R\240\210\360H7\346\201\346!\321\303\010T\223<\360\310P\304$\004p\211\026$B\273\343\016\272\007!Q\240\255@\226Y\030\n\3154\027!Ew\204\272L\\.1\t\037\200\365\276\317\002\005\315\333\344G\346\272\024M\301\345\212u\003\200\320>}\207\253Rr\373\312\337\242\022\"q\315J\327x\344\320h\270\323\304o(\260<\217\305\201&\024-\334\330\001J\211\033\027\361C\021^\305r\007\234\005\250ux\3105\245\n\002\257\t\003\0105q\n\200\244\013\304\021\341\000\244.\213bd\243\344Nt-#\304\023\222D\334\331\014\260\202\037,\177\241\257D,\035\270\203\225+GZr\2610\227\330`\030)D\247X{WW\267\271\356\221\273\"\324\260\243\253Ws\214\322)rPz\244@\336\024\3225\251\302v\365\327,\342\3421\031\342\360x\"@\251p\002`\262\024#\200\315RB\333R\330f\\?\210\2345)\205<|c\254\222\254\207H,\217\002\330\210\273\001W=\220\252\320o\210 \200\3529\tg|>\201\247\322D\370\252D\t>WX_G8\233\2401\315\t\341\224\350\307T\223\t\306J\026\004\350\311\\\204L\343\310E#\367HY5\351\350\000/\3321\265\245\204b\327\307\001\350\306p\007\277\367pr\350#\354\310c\360J\323\202\302\237pz\002\2308\230\204~\232\311D\t\235C\030\235\177\347\240\363_\034tN\226yt\200\263\0078{\235cu\353_y\037D\254q\004\245\335(\223\264QZ\3151N\026S\303\320\341\002#K\364\341!\250\342r98\032\200W\206j\311\034\3502g\023S{\001\272T\020\234\362&c<\014\315\\k\356\242\316\305g\000\030\330c\233@#\t\036\337\241\324\025\016\245\325\344c_\"\301\321\331\222V<\260\033^\034\242\205\017\372\237~\376!\023\224\243\237\346\036\007yx\221m\0109`\001\345\212\216\301s\r}\025@\350\353^\237\322>\303\002h\277X\253`\005\315\212\265F\361\323\027n\034\330C\201L\210\220c\372""\276\024\010\022\267\001\240\005\256%\273\231\232\325f\2424d}4\307\005D\273\001R\215+C\340\202\221\010\314\216\240\035\200HD\207\300\361\0351\211\366\221F\300\326\277\252\303\212\003m\211\260 \266b\026\224qe\325\310\243\2257qE\306\007\260c\305\343S\206}\306\261\306}\355\367\261\000\252\370K\260K\321\316\200\275L\343+\241N\022l\017J\000(Uk\367\330\005\244\247\\F\244\027\"U\244\255\236*\3660\230\212#\274b/\265]m\224jP\030HcZ]\246\326\302\367\203\352Z\224]\307\336\305\240\354d\216\247\023\377\335\225\312\223\363\272r\375V\363[\374[y\2754\232\23637\314 \371-]:\372\361$\035k\266\363s\227w\255j\366\354\250~\326,'\237\247\255\264m\2653f\332\264\354k.Y\311\337\271\220\265\016j\365\327\334l\215\246g\315g\311J\362K6\267\273\272ws\177jTk$\347S\226ng,\257]\311\257\264\3364F\323\357\033\235\334N;Y-\303Pg\315\005\363\"}7\275\236\266G\365Y\363Q\276\260\2245F3\2636\343\245d*iX\223+\tK\266\362\332Z\276\306r\366*\177\365\347A\t\351\202\361\223gi;\365\263\347\273/\367?}s\371\355\375\374q\347`\372\314ki>D\204\365\305\322`4\263\230/^\314\332\031;\230Y4=\033\255,c>YOW\322\242\2243\346/\004:\310\332y\355\347\267U\215\353\311*\252\327\263\333\273\317\367\006\373\355\377\027x\312\"\376&\3018\037'\355\321\364\202y\232\264\320\366i\326\312\376\330\273c\t@\237/\263%\214\372l\357\311\376\2557\313o\0336\341\254\371\300|\217\246\005\303\013\246S\026_\302\270\231N\245\237duLs\032\004Sdg\230\371\334\327\273\rl\031\362~>\375}\267\221\327.\241\213\345j\336\334K\316$;\351V6eCh\363\235a\243\372\202i\037\324\347PF\344\226\317\257\314\263\344q\"\323\306hn~43oZ\007\326$\257}\2212\213\244n\000\233\333\262\3700\335h\272\2214\212\340\266\241\267\322\213e\360\031\363\236i\333\263a:e\363\256[\027\233\312\322\200\024\316\231\025\013\024\201eU\023\352\306M\226\376\006\246\025\314\316";
|
||||
PyObject *data = __Pyx_DecompressString(cstring, 1327, 1);
|
||||
if (unlikely(!data)) __PYX_ERR(0, 1, __pyx_L1_error)
|
||||
const char* const bytes = __Pyx_PyBytes_AsString(data);
|
||||
#if !CYTHON_ASSUME_SAFE_MACROS
|
||||
if (likely(bytes)); else { Py_DECREF(data); __PYX_ERR(0, 1, __pyx_L1_error) }
|
||||
#endif
|
||||
#else /* compression: none (2471 bytes) */
|
||||
const char* const bytes = "Messaging failure NoneNote that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.: ?add_notedisableenablegcisenabledmsgq_repo/msgq/ipc_pyx.pyxno default __reduce__ due to non-trivial __cinit__self.event cannot be converted to a Python object for pickling<stringsource>subscriber did not connectutf-8with ContextContext.__reduce_cython__Context.__setstate_cython__Context.termEventEvent.__reduce_cython__Event.__setstate_cython__Event.clearEvent.peekEvent.setEvent.waitIpcErrorIpcError.__init__MultiplePublishersErrorPollerPoller.__reduce_cython__Poller.__setstate_cython__Poller.pollPoller.registerSocketPubSocketPubSocket.__reduce_cython__PubSocket.__setstate_cython__PubSocket.all_readers_updatedPubSocket.connectPubSocket.sendPubSocket.wait_for_readers__Pyx_PyDict_NextRefSocketEventHandleSocketEventHandle.__reduce_cython__SocketEventHandle.__setstate_cython__SubSocketSubSocket.__reduce_cython__SubSocket.__setstate_cython__SubSocket.connectSubSocket.receiveSubSocket.setTimeoutaddressall_readers_updatedasyncio.coroutinesclearcline_in_tracebackconflateconnectcontextdatadeadlinedecodedelete_fake_prefix__doc__enabledendpointeventevents__func__get_fake_prefix__getstate__identifier__init__interval_is_coroutineitemslengthm__main__message__metaclass____module__monotonic__mro_entries__msgmsgq.ipc_pyx__name__non_blockingoverridepeekpollpopprefix__prepare__ptr__pyx_state__pyx_vtable____qualname__rreceive__reduce____reduce_cython____reduce_ex__registerSocketresultssegment_sizeselfsendsetsetTimeoutset_fake_prefix__set_name__setdefault__setstate____setstate_cython__sleepsocketsocketssuffixsupersztterm__test__timetimeouttoggle_fake_eventsvalueswaitwait_for_one_eventwait_for_readers127.0.0.1\200!\330\004\013\2104\210v\220U\230!\200!\330\004\013\2104\210v\220V\2301\200!\330\004\013\2104\210w\320\026*\250!\200!\330\t\n\330\006\n\210'\220\033\230A\230Q\200!\330\004\010\210""\004\210A\330\004\010\210\013\2201\320\000$\240A\340\002\006\200i\210q\330\004\t\210\032\2201\220L\240\013\2508\2605\270\001\330\002\021\220\035\230a\230w\240a\320\002,\320,A\300\021\330\004\017\210t\220:\230S\240\002\240!\330\004\n\210$\210j\230\003\2302\230Q\330\006\t\210\024\320\r!\240\021\330\010\t\330\006\n\210&\220\001\220\021\330\004\n\210,\220a\220q\320\002E\320Ea\320a|\320|}\340\t\n\330\006\n\210$\210g\220X\230Q\230g\240Z\250z\270\031\300*\310F\320RS\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\320\016%\240Q\240a\340\010\016\210h\220a\220q\200!\330\004\010\210\014\220G\2301\230A\330\004\010\210\007\210\177\230a\230v\240Q\320\002J\310!\330\004\010\210\004\210G\2208\2301\230G\240:\250Z\260v\270Q\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\320\016%\240Q\240a\340\010\016\210h\220a\220q\200\001\330\004\n\210+\220Q\320\002\025\220Q\330\004\r\210W\220A\220X\230W\240A\240^\260>\300\021\330\004\016\320\016\"\240!\240:\250X\260V\2707\300'\310\021\310!\330\004\t\210\022\2109\220A\220Q\200!\330\004\r\210S\220\001\220\021\330\004\010\210\004\210G\2205\230\001\230\027\240\006\240a\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\210a\340\010\016\210a\200\001\330\026)\250\021\250!\200\001\330\002\035\230\\\250\021\320\002&\240a\340\t\n\330\006\014\210D\220\007\220x\230q\240\001\340\004\007\200t\2103\210a\330\006\r\210Q\340\006\013\2103\210h\220a\330\006\n\210#\210X\220R\220r\230\021\330\013\014\330\010\014\210A\340\006\r\210Q\320\002\036\230a\330\004\010\210\006\210e\2201\220A\200!\330\004\016\210a\330\004\021\220\021\340\t\n\330\006\017\210t\2207\230%\230q\240\001\340\004\010\210\005\210Q\330\006\017\210y\230\001\330\006\014\210G\2201\220A\330\006\r\210W\220A\220Q\340\004\013\2101\200\001\330\026&\240a\240q\200!\330\004\010\210\006\210d\220!";
|
||||
#else /* compression: none (2483 bytes) */
|
||||
const char* const bytes = "Messaging failure NoneNote that Cython is deliberately stricter than PEP-484 and rejects subclasses of builtin types. If you need to pass subclasses then set the 'annotation_typing' directive to False.: ?add_notedisableenablegcisenabledmsgq_repo/msgq/ipc_pyx.pyxno default __reduce__ due to non-trivial __cinit__self.event cannot be converted to a Python object for pickling<stringsource>subscriber did not connectutf-8with ContextContext.__reduce_cython__Context.__setstate_cython__Context.termEventEvent.__reduce_cython__Event.__setstate_cython__Event.clearEvent.peekEvent.setEvent.waitIpcErrorIpcError.__init__MultiplePublishersErrorPollerPoller.__reduce_cython__Poller.__setstate_cython__Poller.pollPoller.registerSocketPubSocketPubSocket.__reduce_cython__PubSocket.__setstate_cython__PubSocket.all_readers_updatedPubSocket.connectPubSocket.sendPubSocket.wait_for_readers__Pyx_PyDict_NextRefSocketEventHandleSocketEventHandle.__reduce_cython__SocketEventHandle.__setstate_cython__SubSocketSubSocket.__reduce_cython__SubSocket.__setstate_cython__SubSocket.connectSubSocket.receiveSubSocket.setTimeoutaddressall_readers_updated__annotate__asyncio.coroutinesclearcline_in_tracebackconflateconnectcontextdatadeadlinedecodedelete_fake_prefix__doc__enabledendpointeventevents__func__get_fake_prefix__getstate__identifier__init__interval_is_coroutineitemslengthm__main__message__metaclass____module__monotonic__mro_entries__msgmsgq.ipc_pyx__name__non_blockingoverridepeekpollpopprefix__prepare__ptr__pyx_state__pyx_vtable____qualname__rreceive__reduce____reduce_cython____reduce_ex__registerSocketresultssegment_sizeselfsendsetsetTimeoutset_fake_prefix__set_name__setdefault__setstate____setstate_cython__sleepsocketsocketssuffixsupersztterm__test__timetimeouttoggle_fake_eventsvalueswaitwait_for_one_eventwait_for_readers127.0.0.1\200!\330\004\013\2104\210v\220U\230!\200!\330\004\013\2104\210v\220V\2301\200!\330\004\013\2104\210w\320\026*\250!\200!\330\t\n\330\006\n\210'\220\033\230A\230Q\200!\330""\004\010\210\004\210A\330\004\010\210\013\2201\320\000$\240A\340\002\006\200i\210q\330\004\t\210\032\2201\220L\240\013\2508\2605\270\001\330\002\021\220\035\230a\230w\240a\320\002,\320,A\300\021\330\004\017\210t\220:\230S\240\002\240!\330\004\n\210$\210j\230\003\2302\230Q\330\006\t\210\024\320\r!\240\021\330\010\t\330\006\n\210&\220\001\220\021\330\004\n\210,\220a\220q\320\002E\320Ea\320a|\320|}\340\t\n\330\006\n\210$\210g\220X\230Q\230g\240Z\250z\270\031\300*\310F\320RS\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\320\016%\240Q\240a\340\010\016\210h\220a\220q\200!\330\004\010\210\014\220G\2301\230A\330\004\010\210\007\210\177\230a\230v\240Q\320\002J\310!\330\004\010\210\004\210G\2208\2301\230G\240:\250Z\260v\270Q\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\320\016%\240Q\240a\340\010\016\210h\220a\220q\200\001\330\004\n\210+\220Q\320\002\025\220Q\330\004\r\210W\220A\220X\230W\240A\240^\260>\300\021\330\004\016\320\016\"\240!\240:\250X\260V\2707\300'\310\021\310!\330\004\t\210\022\2109\220A\220Q\200!\330\004\r\210S\220\001\220\021\330\004\010\210\004\210G\2205\230\001\230\027\240\006\240a\340\004\007\200r\210\023\210A\330\006\016\210g\220X\230Q\330\010\016\210a\340\010\016\210a\200\001\330\026)\250\021\250!\200\001\330\002\035\230\\\250\021\320\002&\240a\340\t\n\330\006\014\210D\220\007\220x\230q\240\001\340\004\007\200t\2103\210a\330\006\r\210Q\340\006\013\2103\210h\220a\330\006\n\210#\210X\220R\220r\230\021\330\013\014\330\010\014\210A\340\006\r\210Q\320\002\036\230a\330\004\010\210\006\210e\2201\220A\200!\330\004\016\210a\330\004\021\220\021\340\t\n\330\006\017\210t\2207\230%\230q\240\001\340\004\010\210\005\210Q\330\006\017\210y\230\001\330\006\014\210G\2201\220A\330\006\r\210W\220A\220Q\340\004\013\2101\200\001\330\026&\240a\240q\200!\330\004\010\210\006\210d\220!";
|
||||
PyObject *data = NULL;
|
||||
CYTHON_UNUSED_VAR(__Pyx_DecompressString);
|
||||
#endif
|
||||
PyObject **stringtab = __pyx_mstate->__pyx_string_tab;
|
||||
Py_ssize_t pos = 0;
|
||||
for (int i = 0; i < 135; i++) {
|
||||
for (int i = 0; i < 136; i++) {
|
||||
Py_ssize_t bytes_length = index[i].length;
|
||||
PyObject *string = PyUnicode_DecodeUTF8(bytes + pos, bytes_length, NULL);
|
||||
if (likely(string) && i >= 18) PyUnicode_InternInPlace(&string);
|
||||
@@ -11626,7 +11653,7 @@ const char* const bytes = "Messaging failure NoneNote that Cython is deliberatel
|
||||
stringtab[i] = string;
|
||||
pos += bytes_length;
|
||||
}
|
||||
for (int i = 135; i < 157; i++) {
|
||||
for (int i = 136; i < 158; i++) {
|
||||
Py_ssize_t bytes_length = index[i].length;
|
||||
PyObject *string = PyBytes_FromStringAndSize(bytes + pos, bytes_length);
|
||||
stringtab[i] = string;
|
||||
@@ -11637,25 +11664,29 @@ const char* const bytes = "Messaging failure NoneNote that Cython is deliberatel
|
||||
}
|
||||
}
|
||||
Py_XDECREF(data);
|
||||
for (Py_ssize_t i = 0; i < 157; i++) {
|
||||
for (Py_ssize_t i = 0; i < 158; i++) {
|
||||
if (unlikely(PyObject_Hash(stringtab[i]) == -1)) {
|
||||
__PYX_ERR(0, 1, __pyx_L1_error)
|
||||
}
|
||||
}
|
||||
#if CYTHON_IMMORTAL_CONSTANTS
|
||||
{
|
||||
PyObject **table = stringtab + 135;
|
||||
PyObject **table = stringtab + 136;
|
||||
for (Py_ssize_t i=0; i<22; ++i) {
|
||||
#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
#if PY_VERSION_HEX >= 0x030F0000
|
||||
PyUnstable_SetImmortal(table[i]);
|
||||
#elif CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
if ((PY_SSIZE_T_MAX <= _Py_IMMORTAL_REFCNT_LOCAL)) break;
|
||||
#if PY_VERSION_HEX < 0x030E0000
|
||||
if (_Py_IsOwnedByCurrentThread(table[i]) && Py_REFCNT(table[i]) == 1)
|
||||
#else
|
||||
if (PyUnstable_Object_IsUniquelyReferenced(table[i]))
|
||||
#endif
|
||||
{
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
|
||||
Py_SET_REFCNT(table[i], ((Py_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
|
||||
}
|
||||
#else
|
||||
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
|
||||
#endif
|
||||
}
|
||||
@@ -11682,16 +11713,20 @@ const char* const bytes = "Messaging failure NoneNote that Cython is deliberatel
|
||||
{
|
||||
PyObject **table = __pyx_mstate->__pyx_number_tab;
|
||||
for (Py_ssize_t i=0; i<4; ++i) {
|
||||
#if CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
#if PY_VERSION_HEX >= 0x030F0000
|
||||
PyUnstable_SetImmortal(table[i]);
|
||||
#elif CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
|
||||
if ((PY_SSIZE_T_MAX <= _Py_IMMORTAL_REFCNT_LOCAL)) break;
|
||||
#if PY_VERSION_HEX < 0x030E0000
|
||||
if (_Py_IsOwnedByCurrentThread(table[i]) && Py_REFCNT(table[i]) == 1)
|
||||
#else
|
||||
if (PyUnstable_Object_IsUniquelyReferenced(table[i]))
|
||||
#endif
|
||||
{
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
|
||||
Py_SET_REFCNT(table[i], ((Py_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
|
||||
}
|
||||
#else
|
||||
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
|
||||
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
|
||||
#endif
|
||||
}
|
||||
@@ -12123,11 +12158,11 @@ __Pyx_PyTuple_FromArray(PyObject *const *src, Py_ssize_t n)
|
||||
res = PyTuple_New(n);
|
||||
if (unlikely(res == NULL)) return NULL;
|
||||
for (i = 0; i < n; i++) {
|
||||
Py_INCREF(src[i]);
|
||||
if (unlikely(__Pyx_PyTuple_SET_ITEM(res, i, src[i]) < (0))) {
|
||||
Py_DECREF(res);
|
||||
return NULL;
|
||||
}
|
||||
Py_INCREF(src[i]);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -12413,7 +12448,7 @@ static PyObject* __Pyx_PyObject_FastCall_fallback(PyObject *func, PyObject * con
|
||||
#elif CYTHON_COMPILING_IN_CPYTHON
|
||||
static CYTHON_INLINE vectorcallfunc __Pyx_PyVectorcall_Function(PyObject *callable) {
|
||||
PyTypeObject *tp = Py_TYPE(callable);
|
||||
#if defined(__Pyx_CyFunction_USED)
|
||||
#if defined(__Pyx_CyFunction_USED) && CYTHON_METH_FASTCALL
|
||||
if (__Pyx_CyFunction_CheckExact(callable)) {
|
||||
return __Pyx_CyFunction_func_vectorcall(callable);
|
||||
}
|
||||
@@ -13260,8 +13295,8 @@ bad:
|
||||
CYTHON_UNUSED_VAR(max_char);
|
||||
CYTHON_UNUSED_VAR(result_ulength);
|
||||
for (i=0; i<value_count; i++) {
|
||||
if (__Pyx_PyTuple_SET_ITEM(value_tuple, i, values[i]) != (0)) goto bad;
|
||||
Py_INCREF(values[i]);
|
||||
if (__Pyx_PyTuple_SET_ITEM(value_tuple, i, values[i]) != (0)) goto bad;
|
||||
}
|
||||
result = PyUnicode_Join(__pyx_mstate_global->__pyx_empty_unicode, value_tuple);
|
||||
bad:
|
||||
@@ -15177,6 +15212,7 @@ __Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op, void *context) {
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
return result;
|
||||
}
|
||||
static int __Pyx_CyFunction_set_annotate_in_dict_if_exists(PyObject *op_in, PyObject *value);
|
||||
static int
|
||||
__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, void *context) {
|
||||
CYTHON_UNUSED_VAR(context);
|
||||
@@ -15191,8 +15227,54 @@ __Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value, vo
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op);
|
||||
__Pyx_Py_XDECREF_SET(op->func_annotations, value);
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
if (unlikely(__Pyx_CyFunction_set_annotate_in_dict_if_exists((PyObject*) op, Py_None) < 0)) return -1;
|
||||
return 0;
|
||||
}
|
||||
static int
|
||||
__Pyx_CyFunction_get_dict_if_exists(PyObject *op_in, PyObject **dict) {
|
||||
/* Return 1 if the function dict exists, 0 otherwise. This cannot fail:
|
||||
* _PyObject_GetDictPtr() may clear errors internally, but never reports them. */
|
||||
#if CYTHON_COMPILING_IN_PYPY
|
||||
*dict = PyObject_GenericGetDict(op_in, NULL);
|
||||
#elif CYTHON_COMPILING_IN_LIMITED_API || PY_VERSION_HEX < 0x030C0000
|
||||
*dict = ((__pyx_CyFunctionObject*) op_in)->func_dict;
|
||||
#else
|
||||
PyObject **dictptr = _PyObject_GetDictPtr(op_in);
|
||||
*dict = likely(dictptr) ? *dictptr : NULL;
|
||||
#endif
|
||||
return *dict ? 1 : 0;
|
||||
}
|
||||
static int
|
||||
__Pyx_CyFunction_get_annotate_from_dict_if_exists(PyObject *op_in, PyObject **annotate) {
|
||||
PyObject *dict;
|
||||
int dict_found;
|
||||
*annotate = NULL;
|
||||
dict_found = __Pyx_CyFunction_get_dict_if_exists(op_in, &dict);
|
||||
if (!dict_found) return 0;
|
||||
return __Pyx_PyDict_GetItemRef(dict, __pyx_mstate_global->__pyx_n_u_annotate, annotate);
|
||||
}
|
||||
static int
|
||||
__Pyx_CyFunction_set_annotate_in_dict_if_exists(PyObject *op_in, PyObject *value) {
|
||||
PyObject *dict;
|
||||
int dict_found;
|
||||
dict_found = __Pyx_CyFunction_get_dict_if_exists(op_in, &dict);
|
||||
if (!dict_found) return 0;
|
||||
return PyDict_SetItem(dict, __pyx_mstate_global->__pyx_n_u_annotate, value);
|
||||
}
|
||||
static int
|
||||
__Pyx_CyFunction_set_annotate_in_dict(PyObject *op_in, PyObject *value) {
|
||||
PyObject *dict;
|
||||
int result;
|
||||
#if CYTHON_COMPILING_IN_LIMITED_API && __PYX_LIMITED_VERSION_HEX < 0x030A0000
|
||||
dict = __Pyx_CyFunction_get_dict((__pyx_CyFunctionObject*) op_in, NULL);
|
||||
#else
|
||||
dict = PyObject_GenericGetDict(op_in, NULL);
|
||||
#endif
|
||||
if (unlikely(!dict)) return -1;
|
||||
result = PyDict_SetItem(dict, __pyx_mstate_global->__pyx_n_u_annotate, value);
|
||||
Py_DECREF(dict);
|
||||
return result;
|
||||
}
|
||||
static PyObject *
|
||||
__Pyx_CyFunction_get_annotations_locked(__pyx_CyFunctionObject *op) {
|
||||
PyObject* result = op->func_annotations;
|
||||
@@ -15205,14 +15287,88 @@ __Pyx_CyFunction_get_annotations_locked(__pyx_CyFunctionObject *op) {
|
||||
return result;
|
||||
}
|
||||
static PyObject *
|
||||
__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) {
|
||||
PyObject *result;
|
||||
__Pyx_CyFunction_get_annotations(PyObject *op_in, void *context) {
|
||||
PyObject *annotate = NULL;
|
||||
PyObject *result = NULL;
|
||||
__pyx_CyFunctionObject *op = (__pyx_CyFunctionObject*) op_in;
|
||||
CYTHON_UNUSED_VAR(context);
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op);
|
||||
result = __Pyx_CyFunction_get_annotations_locked(op);
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op_in);
|
||||
result = __Pyx_XNewRef(op->func_annotations);
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
if (result) return result;
|
||||
if (unlikely(__Pyx_CyFunction_get_annotate_from_dict_if_exists(op_in, &annotate) < 0)) return NULL;
|
||||
if (!annotate || annotate == Py_None) {
|
||||
Py_XDECREF(annotate);
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op_in);
|
||||
result = __Pyx_CyFunction_get_annotations_locked(op);
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
return result;
|
||||
}
|
||||
PyObject *format = PyLong_FromLong(1L); // annotationlib.Format.VALUE
|
||||
if (likely(format)) {
|
||||
result = __Pyx_PyObject_CallOneArg(annotate, format);
|
||||
Py_DECREF(format);
|
||||
}
|
||||
Py_DECREF(annotate);
|
||||
if (unlikely(!result)) return NULL;
|
||||
if (unlikely(!PyDict_Check(result))) {
|
||||
PyErr_SetString(PyExc_TypeError, "__annotate__ must return a dict");
|
||||
Py_DECREF(result);
|
||||
return NULL;
|
||||
}
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op_in);
|
||||
__Pyx_Py_XDECREF_SET(op->func_annotations, __Pyx_NewRef(result));
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
return result;
|
||||
}
|
||||
static PyObject *__Pyx_CyFunction_annotate_impl(PyObject *self, PyObject *args) {
|
||||
CYTHON_UNUSED_VAR(args);
|
||||
if (unlikely(!self)) {
|
||||
PyErr_SetString(PyExc_SystemError, "cython __annotate__ called without 'self' argument");
|
||||
}
|
||||
Py_XINCREF(self);
|
||||
return self;
|
||||
}
|
||||
static PyMethodDef __Pyx_CyFunction_annotate_method = {
|
||||
"__annotate__",
|
||||
(PyCFunction)(void (*)(void))__Pyx_CyFunction_annotate_impl,
|
||||
METH_VARARGS,
|
||||
"Placeholder __annotate__ function to allow 'functools.wraps' to work "
|
||||
"on Cython functions."
|
||||
};
|
||||
static PyObject *
|
||||
__Pyx_CyFunction_get_annotate(PyObject *op_in, void *context) {
|
||||
PyObject *annotate = NULL;
|
||||
CYTHON_UNUSED_VAR(context);
|
||||
if (unlikely(__Pyx_CyFunction_get_annotate_from_dict_if_exists(op_in, &annotate) < 0)) return NULL;
|
||||
if (annotate) return annotate;
|
||||
PyObject *annotations = __Pyx_CyFunction_get_annotations(op_in, NULL);
|
||||
if (unlikely(!annotations)) return NULL;
|
||||
PyObject *method = PyCFunction_New(
|
||||
&__Pyx_CyFunction_annotate_method,
|
||||
annotations);
|
||||
Py_DECREF(annotations);
|
||||
return method;
|
||||
}
|
||||
static int
|
||||
__Pyx_CyFunction_set_annotate(PyObject *op_in, PyObject* value, void *context) {
|
||||
CYTHON_UNUSED_VAR(context);
|
||||
if (value == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError, "__annotate__ cannot be deleted");
|
||||
return -1;
|
||||
}
|
||||
if (unlikely(value != Py_None && !PyCallable_Check(value))) {
|
||||
PyErr_SetString(PyExc_TypeError, "__annotate__ must be callable or None");
|
||||
return -1;
|
||||
}
|
||||
if (value != Py_None) {
|
||||
__pyx_CyFunctionObject *op = (__pyx_CyFunctionObject*) op_in;
|
||||
__Pyx_BEGIN_CRITICAL_SECTION(op_in);
|
||||
Py_CLEAR(op->func_annotations);
|
||||
__Pyx_END_CRITICAL_SECTION();
|
||||
}
|
||||
return __Pyx_CyFunction_set_annotate_in_dict(op_in, value);
|
||||
}
|
||||
static PyObject *
|
||||
__Pyx_CyFunction_get_is_coroutine_value(__pyx_CyFunctionObject *op) {
|
||||
int is_coroutine = op->flags & __Pyx_CYFUNCTION_COROUTINE;
|
||||
@@ -15225,7 +15381,6 @@ __Pyx_CyFunction_get_is_coroutine_value(__pyx_CyFunctionObject *op) {
|
||||
PyList_SET_ITEM(fromlist, 0, marker);
|
||||
#else
|
||||
if (unlikely(PyList_SetItem(fromlist, 0, marker) < 0)) {
|
||||
Py_DECREF(marker);
|
||||
Py_DECREF(fromlist);
|
||||
return NULL;
|
||||
}
|
||||
@@ -15328,6 +15483,7 @@ static PyGetSetDef __pyx_CyFunction_getsets[] = {
|
||||
{"__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
|
||||
{"__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0},
|
||||
{"__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0},
|
||||
{"__annotate__", (getter)__Pyx_CyFunction_get_annotate, (setter)__Pyx_CyFunction_set_annotate, 0, 0},
|
||||
{"_is_coroutine", (getter)__Pyx_CyFunction_get_is_coroutine, 0, 0, 0},
|
||||
#if CYTHON_COMPILING_IN_LIMITED_API
|
||||
{"__module__", (getter)__Pyx_CyFunction_get_module, (setter)__Pyx_CyFunction_set_module, 0, 0},
|
||||
@@ -15466,8 +15622,7 @@ __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
|
||||
Py_CLEAR(m->func_doc);
|
||||
Py_CLEAR(m->func_globals);
|
||||
Py_CLEAR(m->func_code);
|
||||
#if !CYTHON_COMPILING_IN_LIMITED_API
|
||||
#if PY_VERSION_HEX < 0x030900B1
|
||||
#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
|
||||
Py_CLEAR(__Pyx_CyFunction_GetClassObj(m));
|
||||
#else
|
||||
{
|
||||
@@ -15475,7 +15630,6 @@ __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
|
||||
((PyCMethodObject *) (m))->mm_class = NULL;
|
||||
Py_XDECREF(cls);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
Py_CLEAR(m->defaults_tuple);
|
||||
Py_CLEAR(m->defaults_kwdict);
|
||||
@@ -15527,11 +15681,10 @@ static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit,
|
||||
Py_VISIT(m->func_doc);
|
||||
Py_VISIT(m->func_globals);
|
||||
__Pyx_VISIT_CONST(m->func_code);
|
||||
#if !CYTHON_COMPILING_IN_LIMITED_API
|
||||
Py_VISIT(__Pyx_CyFunction_GetClassObj(m));
|
||||
#endif
|
||||
Py_VISIT(m->defaults_tuple);
|
||||
Py_VISIT(m->defaults_kwdict);
|
||||
Py_VISIT(m->func_annotations);
|
||||
Py_VISIT(m->func_is_coroutine);
|
||||
Py_VISIT(m->defaults);
|
||||
return 0;
|
||||
@@ -16581,8 +16734,8 @@ raise_neg_overflow:
|
||||
#if CYTHON_VECTORCALL
|
||||
static int __Pyx_VectorcallBuilder_AddArg(PyObject *key, PyObject *value, PyObject *builder, PyObject **args, int n) {
|
||||
(void)__Pyx_PyObject_FastCallDict;
|
||||
if (__Pyx_PyTuple_SET_ITEM(builder, n, key) != (0)) return -1;
|
||||
Py_INCREF(key);
|
||||
if (__Pyx_PyTuple_SET_ITEM(builder, n, key) != (0)) return -1;
|
||||
args[n] = value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Binary file not shown.
+1836
-2331
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,49 @@
|
||||
name: Car bug report
|
||||
description: For issues with a particular car make or model
|
||||
labels: ["car", "bug"]
|
||||
body:
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
Before creating a **car bug report**, please check the following:
|
||||
* If the issue likely isn't specific to your car model or make, go back and open an **openpilot bug report** instead.
|
||||
* If the issue is related to the driving or driver monitoring models, you should open a [discussion](https://github.com/commaai/openpilot/discussions/categories/model-feedback) instead.
|
||||
* If you are fingerprinting your car, refer to the [fingerprinting guide](https://github.com/commaai/openpilot/wiki/Fingerprinting) or visit the [community Discord server](https://discord.comma.ai) to request help.
|
||||
* If you are inquiring about future car support, check the [community Discord server](https://discord.comma.ai) for progress on your vehicle and help contribute. Issues simply requesting support for new vehicles will be closed.
|
||||
* Ensure you're running the latest openpilot release.
|
||||
* Ensure you're using officially supported hardware.
|
||||
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
|
||||
* Ensure you're running stock openpilot. We cannot look into bug reports from forks.
|
||||
|
||||
If you're unsure whether you've hit a bug, check out the #installation-help channel in the [community Discord server](https://discord.comma.ai).
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the car bug
|
||||
description: Also include a description of how to reproduce the bug
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: route
|
||||
attributes:
|
||||
label: Provide a route where the issue occurs
|
||||
description: Ensure the route is fully uploaded at https://useradmin.comma.ai. We cannot look into issues without routes, or at least a Dongle ID.
|
||||
placeholder: 77611a1fac303767|2020-05-11--16-37-07
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: openpilot version
|
||||
description: If you're not on release, provide the commit hash
|
||||
placeholder: 0.8.10
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional info
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: openpilot bug report
|
||||
url: https://github.com/commaai/openpilot/issues/new
|
||||
about: For issues not limited to a particular car make or model, e.g. driving model performance or issues with your comma device.
|
||||
- name: Join the Discord
|
||||
url: https://discord.comma.ai
|
||||
about: The community Discord is for both car port development and experience discussion
|
||||
- name: Report driving behavior feedback
|
||||
url: https://discord.com/channels/469524606043160576/1254834193066623017
|
||||
about: Feedback for the driving and driver monitoring models goes in the #driving-feedback in Discord
|
||||
- name: Community Wiki
|
||||
url: https://github.com/commaai/openpilot/wiki
|
||||
about: Check out our community wiki
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
name: Miscellaneous
|
||||
description: For tools or test bugs, or enhancements
|
||||
labels: ["bug"]
|
||||
body:
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: >
|
||||
* If the issue likely only affects your car model or make, go back and open a **car bug report** instead.
|
||||
Before creating a **miscellaneous bug report**, please check the following:
|
||||
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Describe the bug or enhancement
|
||||
description: Also include a description of how to reproduce the bug or how the enhancement would work
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: route
|
||||
attributes:
|
||||
label: Provide a route where the issue occurs if applicable
|
||||
description: Ensure the route is fully uploaded at https://useradmin.comma.ai
|
||||
placeholder: 77611a1fac303767|2020-05-11--16-37-07
|
||||
|
||||
- type: input
|
||||
id: version
|
||||
attributes:
|
||||
label: openpilot version if applicable
|
||||
description: If you're not on release, provide the commit hash
|
||||
placeholder: 0.8.10
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Additional info
|
||||
Vendored
+80
@@ -0,0 +1,80 @@
|
||||
CI / testing:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: '.github/**'
|
||||
|
||||
car:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/**'
|
||||
|
||||
car safety:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/safety/**'
|
||||
|
||||
can:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/can/**'
|
||||
|
||||
DBC signals:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/dbc/**'
|
||||
|
||||
|
||||
body:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/body/**'
|
||||
|
||||
chrysler:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/chrysler/**'
|
||||
|
||||
ford:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/ford/**'
|
||||
|
||||
gm:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/gm/**'
|
||||
|
||||
honda:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/honda/**'
|
||||
|
||||
hyundai:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/hyundai/**'
|
||||
|
||||
mazda:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/mazda/**'
|
||||
|
||||
nissan:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/nissan/**'
|
||||
|
||||
rivian:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/rivian/**'
|
||||
|
||||
mg:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/mg/**'
|
||||
|
||||
subaru:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/subaru/**'
|
||||
|
||||
tesla:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/tesla/**'
|
||||
|
||||
toyota:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/toyota/**'
|
||||
|
||||
volkswagen:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: 'opendbc/car/volkswagen/**'
|
||||
|
||||
fingerprint:
|
||||
- changed-files:
|
||||
- any-glob-to-all-files: 'opendbc/car/*/fingerprints.py'
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
<!--
|
||||
We need these details to verify your pull request.
|
||||
|
||||
Find your device's dongle ID and a route at https://connect.comma.ai.
|
||||
Ideally, the route is recorded with the exact branch of your pull request.
|
||||
|
||||
If you are porting a car with a new harness variant, please add it to https://github.com/commaai/opendbc/blob/master/opendbc/car/docs_definitions.py. Let us know and we can add it to the shop at the time of merge.
|
||||
-->
|
||||
Validation
|
||||
* Dongle ID:
|
||||
* Route:
|
||||
Vendored
-42
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Attach LLDB to Python",
|
||||
"type": "lldb",
|
||||
"request": "attach",
|
||||
"pid": "${command:pickMyProcess}",
|
||||
"initCommands": [
|
||||
"script import time; time.sleep(5)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Python Launch",
|
||||
"type": "python",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/opendbc/safety/tests/safety_replay/replay_drive.py",
|
||||
"args": [
|
||||
"e1107f9d04dfb1e2/0000045c--da2e374469"
|
||||
],
|
||||
"console": "integratedTerminal",
|
||||
"justMyCode": false,
|
||||
"debugOptions": [
|
||||
"RedirectOutput"
|
||||
],
|
||||
"env": {
|
||||
"PYTHONPATH": "${workspaceFolder}"
|
||||
},
|
||||
"subProcess": true,
|
||||
"stopOnEntry": false
|
||||
}
|
||||
],
|
||||
"compounds": [
|
||||
{
|
||||
"name": "Python + Native (LLDB)",
|
||||
"configurations": [
|
||||
"Python Launch",
|
||||
"Attach LLDB to Python"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
<!--- AUTOGENERATED FROM selfdrive/car/CARS_template.md, DO NOT EDIT. --->
|
||||
|
||||
# Support Information for 401 Known Cars
|
||||
# Support Information for 402 Known Cars
|
||||
|
||||
|Make|Model|Package|Support Level|
|
||||
|---|---|---|:---:|
|
||||
@@ -257,6 +257,7 @@
|
||||
|Mazda|CX-5 2022-25|All|[Upstream](#upstream)|
|
||||
|Mazda|CX-9 2016-20|All|[Dashcam mode](#dashcam)|
|
||||
|Mazda|CX-9 2021-23|All|[Upstream](#upstream)|
|
||||
|MG|5 EV 2021|All|[Dashcam mode](#dashcam)|
|
||||
|Nissan|Altima 2019-24|ProPILOT Assist|[Upstream](#upstream)|
|
||||
|Nissan|Leaf 2018-23|ProPILOT Assist|[Upstream](#upstream)|
|
||||
|Nissan|Rogue 2018-20|ProPILOT Assist|[Upstream](#upstream)|
|
||||
|
||||
@@ -18,7 +18,7 @@ test:
|
||||
ty:
|
||||
run: ty check
|
||||
codespell:
|
||||
run: codespell {files} -L tge,stdio -S "*.dbc,*.ipynb" --ignore-words=.codespellignore
|
||||
run: codespell {files} -L tge,stdio -S *.dbc --ignore-words=.codespellignore
|
||||
files: git ls-tree -r HEAD --name-only
|
||||
cpplint:
|
||||
run: cpplint --exclude=opendbc/can/*_pyx.cpp --recursive --quiet --counting=detailed --linelength=240 --filter=-build,-legal,-readability,-runtime,-whitespace,+build/include_subdir,+build/forward_decl,+build/include_what_you_use,+build/deprecated,+whitespace/comma,+whitespace/line_length,+whitespace/empty_if_body,+whitespace/empty_loop_body,+whitespace/empty_conditional_body,+whitespace/forcolon,+whitespace/parens,+whitespace/semicolon,+whitespace/tab,+readability/braces opendbc/
|
||||
|
||||
@@ -1,240 +0,0 @@
|
||||
Metadata-Version: 2.4
|
||||
Name: opendbc
|
||||
Version: 0.3.1
|
||||
Summary: a Python API for your car
|
||||
Author-email: Vehicle Researcher <user@comma.ai>
|
||||
License-Expression: MIT
|
||||
Project-URL: homepage, https://github.com/commaai/opendbc
|
||||
Requires-Python: <3.13,>=3.11
|
||||
Description-Content-Type: text/markdown
|
||||
License-File: LICENSE
|
||||
License-File: LICENSE.md
|
||||
Requires-Dist: numpy
|
||||
Requires-Dist: tqdm
|
||||
Requires-Dist: pycapnp
|
||||
Requires-Dist: pycryptodome
|
||||
Provides-Extra: testing
|
||||
Requires-Dist: cffi; extra == "testing"
|
||||
Requires-Dist: tree-sitter; extra == "testing"
|
||||
Requires-Dist: tree-sitter-c; extra == "testing"
|
||||
Requires-Dist: gcovr; extra == "testing"
|
||||
Requires-Dist: unittest-parallel; extra == "testing"
|
||||
Requires-Dist: zstandard; extra == "testing"
|
||||
Requires-Dist: ruff; extra == "testing"
|
||||
Requires-Dist: ty; extra == "testing"
|
||||
Requires-Dist: lefthook; extra == "testing"
|
||||
Requires-Dist: cpplint; extra == "testing"
|
||||
Requires-Dist: codespell; extra == "testing"
|
||||
Provides-Extra: examples
|
||||
Requires-Dist: inputs; extra == "examples"
|
||||
Dynamic: license-file
|
||||
|
||||
<div align="center" style="text-align: center;">
|
||||
|
||||
<h1>opendbc</h1>
|
||||
<p>
|
||||
<b>opendbc is a Python API for your car.</b>
|
||||
<br>
|
||||
Control the gas, brake, steering, and more. Read the speed, steering angle, and more.
|
||||
</p>
|
||||
|
||||
<h3>
|
||||
<a href="https://docs.comma.ai">Docs</a>
|
||||
<span> · </span>
|
||||
<a href="https://github.com/commaai/openpilot/blob/master/docs/CONTRIBUTING.md">Contribute</a>
|
||||
<span> · </span>
|
||||
<a href="https://discord.comma.ai">Discord</a>
|
||||
</h3>
|
||||
|
||||
[](LICENSE)
|
||||
[](https://x.com/comma_ai)
|
||||
[](https://discord.comma.ai)
|
||||
|
||||
<br>
|
||||
<h3><i>How to Port a Car — Jason Young, COMMA_CON 2023</i></h3>
|
||||
<a href="https://www.youtube.com/watch?v=XxPS5TpTUnI&t=142s">
|
||||
<img src="https://github.com/user-attachments/assets/ae89198e-561b-4210-a0d4-ccecd917577d" alt="▶ How to Port a Car - Jason Young, COMMA_CON 2023" width="800">
|
||||
</a>
|
||||
<br>
|
||||
|
||||
<h3><i>How Do We Control The Car? — Robbe Derks, COMMA_CON 2021</i></h3>
|
||||
<a href="https://www.youtube.com/watch?v=nNU6ipme878">
|
||||
<img src="https://github.com/user-attachments/assets/28c40bc0-7884-47e9-b392-f47f03190497" alt="▶ How Do We Control The Car? - Robbe Derks, COMMA_CON 2021" width="800">
|
||||
</a>
|
||||
<br>
|
||||
|
||||
</div>
|
||||
|
||||
---
|
||||
|
||||
Most cars since 2016 have electronically-actuatable steering, gas, and brakes thanks to [LKAS](https://en.wikipedia.org/wiki/Lane_departure_warning_system#Lane_keeping_and_next_technologies) and [ACC](https://en.wikipedia.org/wiki/Adaptive_cruise_control).
|
||||
The goal of this project is to support controlling the steering, gas, and brakes on every single one of those cars.
|
||||
|
||||
While the primary focus is on supporting ADAS interfaces for [openpilot](https://github.com/commaai/openpilot), we're also interested in reading and writing as many things as we can (EV charge status, lock/unlocking doors, etc) such that we can build the best vehicle management app ever.
|
||||
|
||||
---
|
||||
|
||||
This README and the [supported cars list](docs/CARS.md) are all the docs for the opendbc project.
|
||||
Everything you need to know to use, contribute, and extend opendbc are in these docs.
|
||||
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
git clone https://github.com/commaai/opendbc.git
|
||||
cd opendbc
|
||||
|
||||
# you probably just want to use this. it's an all-in-one for dependency
|
||||
# installation, compiling, linting, and tests. it's also what runs in CI
|
||||
./test.sh
|
||||
|
||||
# here are the individual commands it runs
|
||||
pip3 install -e .[testing] # install dependencies
|
||||
scons -j8 # build with 8 cores
|
||||
unittest-parallel # run the tests
|
||||
lefthook run lint # run the linter
|
||||
```
|
||||
|
||||
[`examples/`](examples/) contains small example programs that can read state from the car and control the steering, gas, and brakes.
|
||||
[`examples/joystick.py`](examples/joystick.py) allows you to control a car with a joystick.
|
||||
|
||||
### Project Structure
|
||||
* [`opendbc/dbc/`](opendbc/dbc/) is a repository of [DBC](https://en.wikipedia.org/wiki/CAN_bus#DBC_(CAN_Database_Files)) files
|
||||
* [`opendbc/can/`](opendbc/can/) is a library for parsing and building CAN messages from DBC files
|
||||
* [`opendbc/car/`](opendbc/car/) is a high-level library for interfacing with cars using Python
|
||||
* [`opendbc/safety/`](opendbc/safety/) is the functional safety for all the cars supported by `opendbc/car/`
|
||||
|
||||
## How to Port a Car
|
||||
|
||||
This guide covers everything from adding support to a new car all the way to improving existing cars (e.g. adding longitudinal control or radar parsing). If similar cars to yours are already compatible, most of this work is likely already done for you.
|
||||
|
||||
At its most basic, a car port will control the steering on a car. A "complete" car port will have all of: lateral control, longitudinal control, good tuning for both lateral and longitudinal, radar parsing (if equipped), fuzzy fingerprinting, and more. The new car support docs will clearly communicate each car's support level.
|
||||
|
||||
### Connect to the Car
|
||||
|
||||
The first step is to get connected to the car with a comma four and a car harness.
|
||||
The car harness gets you connected to two different CAN buses and splits one of those buses to send our own actuation messages.
|
||||
|
||||
If you're lucky, a harness compatible with your car will already be designed and sold on comma.ai/shop.
|
||||
If you're not so lucky, start with a "developer harness" from comma.ai/shop and crimp on whatever connector you need.
|
||||
|
||||
### Structure of a port
|
||||
|
||||
Depending on the brand, most of this basic structure will already be in place.
|
||||
|
||||
The entirety of a car port lives in `opendbc/car/<brand>/`:
|
||||
* `carstate.py`: parses out the relevant information from the CAN stream using the car's DBC file
|
||||
* `carcontroller.py`: outputs CAN messages to control the car
|
||||
* `<brand>can.py`: thin Python helpers around the DBC file to build CAN messages
|
||||
* `fingerprints.py`: database of ECU firmware versions for identifying car models
|
||||
* `interface.py`: high level class for interfacing with the car
|
||||
* `radar_interface.py`: parses out the radar
|
||||
* `values.py`: enumerates the brand's supported cars
|
||||
|
||||
### Reverse Engineer CAN messages
|
||||
|
||||
Start off by recording a route with lots of interesting events: enable LKAS and ACC, turn the steering wheel both extremes, etc. Then, load up that route in [cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana).
|
||||
|
||||
### Tuning
|
||||
|
||||
#### Longitudinal
|
||||
|
||||
Use the [longitudinal maneuvers](https://github.com/commaai/openpilot/tree/master/tools/longitudinal_maneuvers) report to evaluate your car's longitudinal control and tune it.
|
||||
|
||||
## Contributing
|
||||
|
||||
All opendbc development is coordinated on GitHub and [Discord](https://discord.comma.ai). Check out the `#dev-opendbc-cars` channel and `Vehicle Specific` section.
|
||||
|
||||
### Roadmap
|
||||
|
||||
Short term
|
||||
- [ ] `pip install opendbc`
|
||||
- [ ] 100% type coverage
|
||||
- [ ] 100% line coverage
|
||||
- [ ] Make car ports easier: refactors, tools, tests, and docs
|
||||
- [ ] Expose the state of all supported cars better: https://github.com/commaai/opendbc/issues/1144
|
||||
|
||||
Longer term
|
||||
- [ ] Extend support to every car with LKAS + ACC interfaces
|
||||
- [ ] Automatic lateral and longitudinal control/tuning evaluation
|
||||
- [ ] Auto-tuning for [lateral](https://blog.comma.ai/090release/#torqued-an-auto-tuner-for-lateral-control) and longitudinal control
|
||||
- [ ] [Automatic Emergency Braking](https://en.wikipedia.org/wiki/Automated_emergency_braking_system)
|
||||
|
||||
Contributions towards anything here are welcome.
|
||||
|
||||
## Safety Model
|
||||
|
||||
When a [panda](https://comma.ai/shop/panda) powers up with [opendbc safety firmware](opendbc/safety), by default it's in `SAFETY_SILENT` mode. While in `SAFETY_SILENT` mode, the CAN buses are forced to be silent. In order to send messages, you have to select a safety mode. Some of safety modes (for example `SAFETY_ALLOUTPUT`) are disabled in release firmwares. In order to use them, compile and flash your own build.
|
||||
|
||||
Safety modes optionally support `controls_allowed`, which allows or blocks a subset of messages based on a customizable state in the board.
|
||||
|
||||
## Code Rigor
|
||||
|
||||
The opendbc safety firmware is written for its use in conjunction with [openpilot](https://github.com/commaai/openpilot) and [panda](https://github.com/commaai/panda). The safety firmware, through its safety model, provides and enforces the
|
||||
[openpilot safety](https://github.com/commaai/openpilot/blob/master/docs/SAFETY.md). Due to its critical function, it's important that the application code rigor within the `safety` folder is held to high standards.
|
||||
|
||||
These are the [CI regression tests](https://github.com/commaai/opendbc/actions) we have in place:
|
||||
* A generic static code analysis is performed by [cppcheck](https://github.com/danmar/cppcheck/).
|
||||
* In addition, [cppcheck](https://github.com/danmar/cppcheck/) has a specific addon to check for [MISRA C:2012](https://misra.org.uk/) violations. See [current coverage](opendbc/safety/tests/misra/coverage_table).
|
||||
* Compiler options are relatively strict: the flags `-Wall -Wextra -Wstrict-prototypes -Werror` are enforced.
|
||||
* The [safety logic](opendbc/safety) is tested and verified by [unit tests](opendbc/safety/tests) for each supported car variant.
|
||||
|
||||
The above tests are themselves tested by:
|
||||
* a [mutation test](opendbc/safety/tests/misra/test_mutation.py) on the MISRA coverage
|
||||
* 100% line coverage enforced on the safety unit tests
|
||||
|
||||
In addition, we run the [ruff linter](https://github.com/astral-sh/ruff) and [ty](https://github.com/astral-sh/ty) on the car interface library.
|
||||
|
||||
### Bounties
|
||||
|
||||
Every car port is eligible for a bounty:
|
||||
* $2000 - [Any car brand / platform port](https://github.com/orgs/commaai/projects/26/views/1?pane=issue&itemId=47913774)
|
||||
* $250 - [Any car model port](https://github.com/orgs/commaai/projects/26/views/1?pane=issue&itemId=47913790)
|
||||
* $300 - [Reverse Engineering a new Actuation Message](https://github.com/orgs/commaai/projects/26/views/1?pane=issue&itemId=73445563)
|
||||
|
||||
In addition to the standard bounties, we also offer higher value bounties for more popular cars. See those at [comma.ai/bounties](https://comma.ai/bounties).
|
||||
|
||||
## FAQ
|
||||
|
||||
***How do I use this?*** A [comma four](https://comma.ai/shop/comma-four) is custom-designed to be the best way to run and develop opendbc and openpilot.
|
||||
|
||||
***Which cars are supported?*** See the [supported cars list](docs/CARS.md).
|
||||
|
||||
***Can I add support for my car?*** Yes, most car support comes from the community. Read the guide [here](https://github.com/commaai/opendbc/blob/master/README.md#how-to-port-a-car).
|
||||
|
||||
***Which cars can be supported?*** Any car with LKAS and ACC. More info [here](https://github.com/commaai/openpilot/blob/master/docs/CARS.md#dont-see-your-car-here).
|
||||
|
||||
***How does this work?*** In short, we designed hardware to replace your car's built-in lane keep and adaptive cruise features. See [this talk](https://www.youtube.com/watch?v=FL8CxUSfipM) for an in-depth explanation.
|
||||
|
||||
***Is there a timeline or roadmap for adding car support?*** No, most car support comes from the community, with comma doing final safety and quality validation. The more complete the community car port is and the more popular the car is, the more likely we are to pick it up as the next one to validate.
|
||||
|
||||
### Terms
|
||||
|
||||
* **port**: refers to the integration and support of a specific car
|
||||
* **lateral control**: aka steering control
|
||||
* **longitudinal control**: aka gas/brakes control
|
||||
* **fingerprinting**: automatic process for identifying the car
|
||||
* **[LKAS](https://en.wikipedia.org/wiki/Lane_departure_warning_system)**: lane keeping assist
|
||||
* **[ACC](https://en.wikipedia.org/wiki/Adaptive_cruise_control)**: adaptive cruise control
|
||||
* **[harness](https://comma.ai/shop/car-harness)**: car-specific hardware to attach to the car and intercept the ADAS messages
|
||||
* **[panda](https://github.com/commaai/panda)**: hardware used to get on a car's CAN bus
|
||||
* **[ECU](https://en.wikipedia.org/wiki/Electronic_control_unit)**: computers or control modules inside the car
|
||||
* **[CAN bus](https://en.wikipedia.org/wiki/CAN_bus)**: a bus that connects the ECUs in a car
|
||||
* **[cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana#readme)**: our tool for reverse engineering CAN messages
|
||||
* **[DBC file](https://en.wikipedia.org/wiki/CAN_bus#DBC)**: contains definitions for messages on a CAN bus
|
||||
* **[openpilot](https://github.com/commaai/openpilot)**: an ADAS system for cars supported by opendbc
|
||||
* **[comma](https://github.com/commaai)**: the company behind opendbc
|
||||
* **[comma four](https://comma.ai/shop/comma-four)**: the hardware used to run openpilot
|
||||
|
||||
### More resources
|
||||
|
||||
* [*How Do We Control The Car?*](https://www.youtube.com/watch?v=nNU6ipme878&pp=ygUoY29tbWEgY29uIDIwMjEgaG93IGRvIHdlIGNvbnRyb2wgdGhlIGNhcg%3D%3D) by [@robbederks](https://github.com/robbederks) from COMMA_CON 2021
|
||||
* [*How to Port a Car*](https://www.youtube.com/watch?v=XxPS5TpTUnI&t=142s&pp=ygUPamFzb24gY29tbWEgY29u) by [@jyoung8607](https://github.com/jyoung8607) from COMMA_CON 2023
|
||||
* [commaCarSegments](https://huggingface.co/datasets/commaai/commaCarSegments): a massive dataset of CAN data from 300 different car models
|
||||
* [cabana](https://github.com/commaai/openpilot/tree/master/tools/cabana#readme): our tool for reverse engineering CAN messages
|
||||
* [can_print_changes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/debug/can_print_changes.py): diff the whole CAN bus across two drives, such as one without any LKAS and one with LKAS
|
||||
* [longitudinal maneuvers](https://github.com/commaai/openpilot/tree/master/tools/longitudinal_maneuvers): a tool for evaluating and tuning longitudinal control
|
||||
* [opendbc data](https://commaai.github.io/opendbc-data/): a repository of longitudinal maneuver evaluations
|
||||
|
||||
## Come work with us -- [comma.ai/jobs](https://comma.ai/jobs)
|
||||
|
||||
comma is hiring engineers to work on opendbc and [openpilot](https://github.com/commaai/openpilot). We love hiring contributors.
|
||||
@@ -1,492 +0,0 @@
|
||||
LICENSE
|
||||
LICENSE.md
|
||||
MANIFEST.in
|
||||
README.md
|
||||
pyproject.toml
|
||||
opendbc/__init__.py
|
||||
opendbc/testing.py
|
||||
opendbc.egg-info/PKG-INFO
|
||||
opendbc.egg-info/SOURCES.txt
|
||||
opendbc.egg-info/dependency_links.txt
|
||||
opendbc.egg-info/requires.txt
|
||||
opendbc.egg-info/top_level.txt
|
||||
opendbc/can/__init__.py
|
||||
opendbc/can/dbc.py
|
||||
opendbc/can/packer.py
|
||||
opendbc/can/parser.py
|
||||
opendbc/can/tests/__init__.py
|
||||
opendbc/can/tests/benchmark.py
|
||||
opendbc/can/tests/test_checksums.py
|
||||
opendbc/can/tests/test_dbc_exceptions.py
|
||||
opendbc/can/tests/test_dbc_parser.py
|
||||
opendbc/can/tests/test_define.py
|
||||
opendbc/can/tests/test_packer_parser.py
|
||||
opendbc/car/__init__.py
|
||||
opendbc/car/can_definitions.py
|
||||
opendbc/car/car.capnp
|
||||
opendbc/car/car_helpers.py
|
||||
opendbc/car/carlog.py
|
||||
opendbc/car/ccp.py
|
||||
opendbc/car/crc.py
|
||||
opendbc/car/disable_ecu.py
|
||||
opendbc/car/docs.py
|
||||
opendbc/car/docs_definitions.py
|
||||
opendbc/car/ecu_addrs.py
|
||||
opendbc/car/extra_cars.py
|
||||
opendbc/car/fingerprints.py
|
||||
opendbc/car/fw_query_definitions.py
|
||||
opendbc/car/fw_versions.py
|
||||
opendbc/car/interfaces.py
|
||||
opendbc/car/isotp.py
|
||||
opendbc/car/isotp_parallel_query.py
|
||||
opendbc/car/lateral.py
|
||||
opendbc/car/logreader.py
|
||||
opendbc/car/panda_runner.py
|
||||
opendbc/car/rlog.capnp
|
||||
opendbc/car/secoc.py
|
||||
opendbc/car/structs.py
|
||||
opendbc/car/uds.py
|
||||
opendbc/car/values.py
|
||||
opendbc/car/vehicle_model.py
|
||||
opendbc/car/vin.py
|
||||
opendbc/car/xcp.py
|
||||
opendbc/car/body/__init__.py
|
||||
opendbc/car/body/bodycan.py
|
||||
opendbc/car/body/carcontroller.py
|
||||
opendbc/car/body/carstate.py
|
||||
opendbc/car/body/fingerprints.py
|
||||
opendbc/car/body/interface.py
|
||||
opendbc/car/body/values.py
|
||||
opendbc/car/chrysler/__init__.py
|
||||
opendbc/car/chrysler/carcontroller.py
|
||||
opendbc/car/chrysler/carstate.py
|
||||
opendbc/car/chrysler/chryslercan.py
|
||||
opendbc/car/chrysler/fingerprints.py
|
||||
opendbc/car/chrysler/interface.py
|
||||
opendbc/car/chrysler/radar_interface.py
|
||||
opendbc/car/chrysler/values.py
|
||||
opendbc/car/common/__init__.py
|
||||
opendbc/car/common/basedir.py
|
||||
opendbc/car/common/conversions.py
|
||||
opendbc/car/common/filter_simple.py
|
||||
opendbc/car/common/pid.py
|
||||
opendbc/car/common/simple_kalman.py
|
||||
opendbc/car/ford/__init__.py
|
||||
opendbc/car/ford/carcontroller.py
|
||||
opendbc/car/ford/carstate.py
|
||||
opendbc/car/ford/fingerprints.py
|
||||
opendbc/car/ford/fordcan.py
|
||||
opendbc/car/ford/interface.py
|
||||
opendbc/car/ford/radar_interface.py
|
||||
opendbc/car/ford/values.py
|
||||
opendbc/car/ford/tests/__init__.py
|
||||
opendbc/car/ford/tests/print_platform_codes.py
|
||||
opendbc/car/ford/tests/test_ford.py
|
||||
opendbc/car/gm/__init__.py
|
||||
opendbc/car/gm/carcontroller.py
|
||||
opendbc/car/gm/carstate.py
|
||||
opendbc/car/gm/fingerprints.py
|
||||
opendbc/car/gm/gmcan.py
|
||||
opendbc/car/gm/interface.py
|
||||
opendbc/car/gm/radar_interface.py
|
||||
opendbc/car/gm/values.py
|
||||
opendbc/car/gm/tests/__init__.py
|
||||
opendbc/car/gm/tests/test_gm.py
|
||||
opendbc/car/honda/__init__.py
|
||||
opendbc/car/honda/carcontroller.py
|
||||
opendbc/car/honda/carstate.py
|
||||
opendbc/car/honda/fingerprints.py
|
||||
opendbc/car/honda/hondacan.py
|
||||
opendbc/car/honda/interface.py
|
||||
opendbc/car/honda/radar_interface.py
|
||||
opendbc/car/honda/values.py
|
||||
opendbc/car/honda/tests/__init__.py
|
||||
opendbc/car/honda/tests/test_honda.py
|
||||
opendbc/car/hyundai/__init__.py
|
||||
opendbc/car/hyundai/carcontroller.py
|
||||
opendbc/car/hyundai/carstate.py
|
||||
opendbc/car/hyundai/fingerprints.py
|
||||
opendbc/car/hyundai/hyundaican.py
|
||||
opendbc/car/hyundai/hyundaicanfd.py
|
||||
opendbc/car/hyundai/interface.py
|
||||
opendbc/car/hyundai/radar_interface.py
|
||||
opendbc/car/hyundai/values.py
|
||||
opendbc/car/hyundai/tests/__init__.py
|
||||
opendbc/car/hyundai/tests/print_platform_codes.py
|
||||
opendbc/car/hyundai/tests/test_hyundai.py
|
||||
opendbc/car/include/c++.capnp
|
||||
opendbc/car/mazda/__init__.py
|
||||
opendbc/car/mazda/carcontroller.py
|
||||
opendbc/car/mazda/carstate.py
|
||||
opendbc/car/mazda/fingerprints.py
|
||||
opendbc/car/mazda/interface.py
|
||||
opendbc/car/mazda/mazdacan.py
|
||||
opendbc/car/mazda/values.py
|
||||
opendbc/car/mock/__init__.py
|
||||
opendbc/car/mock/carcontroller.py
|
||||
opendbc/car/mock/carstate.py
|
||||
opendbc/car/mock/interface.py
|
||||
opendbc/car/mock/values.py
|
||||
opendbc/car/nissan/__init__.py
|
||||
opendbc/car/nissan/carcontroller.py
|
||||
opendbc/car/nissan/carstate.py
|
||||
opendbc/car/nissan/fingerprints.py
|
||||
opendbc/car/nissan/interface.py
|
||||
opendbc/car/nissan/nissancan.py
|
||||
opendbc/car/nissan/values.py
|
||||
opendbc/car/psa/__init__.py
|
||||
opendbc/car/psa/carcontroller.py
|
||||
opendbc/car/psa/carstate.py
|
||||
opendbc/car/psa/fingerprints.py
|
||||
opendbc/car/psa/interface.py
|
||||
opendbc/car/psa/psacan.py
|
||||
opendbc/car/psa/values.py
|
||||
opendbc/car/rivian/__init__.py
|
||||
opendbc/car/rivian/carcontroller.py
|
||||
opendbc/car/rivian/carstate.py
|
||||
opendbc/car/rivian/fingerprints.py
|
||||
opendbc/car/rivian/interface.py
|
||||
opendbc/car/rivian/radar_interface.py
|
||||
opendbc/car/rivian/riviancan.py
|
||||
opendbc/car/rivian/values.py
|
||||
opendbc/car/rivian/tests/__init__.py
|
||||
opendbc/car/rivian/tests/test_rivian.py
|
||||
opendbc/car/subaru/__init__.py
|
||||
opendbc/car/subaru/carcontroller.py
|
||||
opendbc/car/subaru/carstate.py
|
||||
opendbc/car/subaru/fingerprints.py
|
||||
opendbc/car/subaru/interface.py
|
||||
opendbc/car/subaru/subarucan.py
|
||||
opendbc/car/subaru/values.py
|
||||
opendbc/car/subaru/tests/__init__.py
|
||||
opendbc/car/subaru/tests/test_subaru.py
|
||||
opendbc/car/tesla/__init__.py
|
||||
opendbc/car/tesla/carcontroller.py
|
||||
opendbc/car/tesla/carstate.py
|
||||
opendbc/car/tesla/fingerprints.py
|
||||
opendbc/car/tesla/interface.py
|
||||
opendbc/car/tesla/radar_interface.py
|
||||
opendbc/car/tesla/teslacan.py
|
||||
opendbc/car/tesla/values.py
|
||||
opendbc/car/tesla/tests/__init__.py
|
||||
opendbc/car/tesla/tests/test_tesla.py
|
||||
opendbc/car/tests/__init__.py
|
||||
opendbc/car/tests/car_diff.py
|
||||
opendbc/car/tests/routes.py
|
||||
opendbc/car/tests/test_can_fingerprint.py
|
||||
opendbc/car/tests/test_car_interfaces.py
|
||||
opendbc/car/tests/test_docs.py
|
||||
opendbc/car/tests/test_fw_fingerprint.py
|
||||
opendbc/car/tests/test_lateral_limits.py
|
||||
opendbc/car/tests/test_models.py
|
||||
opendbc/car/tests/test_platform_configs.py
|
||||
opendbc/car/tests/test_routes.py
|
||||
opendbc/car/tests/test_vehicle_model.py
|
||||
opendbc/car/torque_data/override.toml
|
||||
opendbc/car/torque_data/params.toml
|
||||
opendbc/car/torque_data/substitute.toml
|
||||
opendbc/car/toyota/__init__.py
|
||||
opendbc/car/toyota/carcontroller.py
|
||||
opendbc/car/toyota/carstate.py
|
||||
opendbc/car/toyota/fingerprints.py
|
||||
opendbc/car/toyota/interface.py
|
||||
opendbc/car/toyota/radar_interface.py
|
||||
opendbc/car/toyota/toyotacan.py
|
||||
opendbc/car/toyota/values.py
|
||||
opendbc/car/toyota/tests/__init__.py
|
||||
opendbc/car/toyota/tests/print_platform_codes.py
|
||||
opendbc/car/toyota/tests/test_toyota.py
|
||||
opendbc/car/volkswagen/__init__.py
|
||||
opendbc/car/volkswagen/carcontroller.py
|
||||
opendbc/car/volkswagen/carstate.py
|
||||
opendbc/car/volkswagen/fingerprints.py
|
||||
opendbc/car/volkswagen/interface.py
|
||||
opendbc/car/volkswagen/mebcan.py
|
||||
opendbc/car/volkswagen/mlbcan.py
|
||||
opendbc/car/volkswagen/mqbcan.py
|
||||
opendbc/car/volkswagen/pqcan.py
|
||||
opendbc/car/volkswagen/radar_interface.py
|
||||
opendbc/car/volkswagen/values.py
|
||||
opendbc/car/volkswagen/tests/__init__.py
|
||||
opendbc/car/volkswagen/tests/test_volkswagen.py
|
||||
opendbc/dbc/ESR.dbc
|
||||
opendbc/dbc/FORD_CADS.dbc
|
||||
opendbc/dbc/FORD_CADS_64.dbc
|
||||
opendbc/dbc/__init__.py
|
||||
opendbc/dbc/acura_ilx_2016_nidec.dbc
|
||||
opendbc/dbc/bmw_e9x_e8x.dbc
|
||||
opendbc/dbc/cadillac_ct6_chassis.dbc
|
||||
opendbc/dbc/cadillac_ct6_object.dbc
|
||||
opendbc/dbc/cadillac_ct6_powertrain.dbc
|
||||
opendbc/dbc/chrysler_cusw.dbc
|
||||
opendbc/dbc/chrysler_pacifica_2017_hybrid_private_fusion.dbc
|
||||
opendbc/dbc/comma_body.dbc
|
||||
opendbc/dbc/fca_giorgio.dbc
|
||||
opendbc/dbc/ford_cgea1_2_bodycan_2011.dbc
|
||||
opendbc/dbc/ford_cgea1_2_ptcan_2011.dbc
|
||||
opendbc/dbc/ford_fusion_2018_adas.dbc
|
||||
opendbc/dbc/ford_fusion_2018_pt.dbc
|
||||
opendbc/dbc/ford_lincoln_base_pt.dbc
|
||||
opendbc/dbc/gm_global_a_chassis.dbc
|
||||
opendbc/dbc/gm_global_a_high_voltage_management.dbc
|
||||
opendbc/dbc/gm_global_a_lowspeed.dbc
|
||||
opendbc/dbc/gm_global_a_lowspeed_1818125.dbc
|
||||
opendbc/dbc/gm_global_a_object.dbc
|
||||
opendbc/dbc/gm_global_a_powertrain_expansion.dbc
|
||||
opendbc/dbc/gwm_haval_h6_phev_2024.dbc
|
||||
opendbc/dbc/hongqi_hs5.dbc
|
||||
opendbc/dbc/hyundai_2015_ccan.dbc
|
||||
opendbc/dbc/hyundai_2015_mcan.dbc
|
||||
opendbc/dbc/hyundai_i30_2014.dbc
|
||||
opendbc/dbc/hyundai_santafe_2007.dbc
|
||||
opendbc/dbc/luxgen_s5_2015.dbc
|
||||
opendbc/dbc/mazda_2017.dbc
|
||||
opendbc/dbc/mazda_3_2019.dbc
|
||||
opendbc/dbc/mazda_radar.dbc
|
||||
opendbc/dbc/mazda_rx8.dbc
|
||||
opendbc/dbc/mercedes_benz_e350_2010.dbc
|
||||
opendbc/dbc/nissan_xterra_2011.dbc
|
||||
opendbc/dbc/opel_omega_2001.dbc
|
||||
opendbc/dbc/psa_aee2010_r3.dbc
|
||||
opendbc/dbc/rivian_park_assist_can.dbc
|
||||
opendbc/dbc/rivian_primary_actuator.dbc
|
||||
opendbc/dbc/tesla_can.dbc
|
||||
opendbc/dbc/tesla_model3_party.dbc
|
||||
opendbc/dbc/tesla_model3_vehicle.dbc
|
||||
opendbc/dbc/tesla_powertrain.dbc
|
||||
opendbc/dbc/toyota_2017_ref_pt.dbc
|
||||
opendbc/dbc/toyota_adas.dbc
|
||||
opendbc/dbc/toyota_iQ_2009_can.dbc
|
||||
opendbc/dbc/toyota_prius_2010_pt.dbc
|
||||
opendbc/dbc/toyota_radar_dsu_tssp.dbc
|
||||
opendbc/dbc/toyota_tss2_adas.dbc
|
||||
opendbc/dbc/volvo_v40_2017_pt.dbc
|
||||
opendbc/dbc/volvo_v60_2015_pt.dbc
|
||||
opendbc/dbc/vw_mlb.dbc
|
||||
opendbc/dbc/vw_mqb.dbc
|
||||
opendbc/dbc/vw_mqbevo.dbc
|
||||
opendbc/dbc/vw_pq.dbc
|
||||
opendbc/dbc/generator/generator.py
|
||||
opendbc/dbc/generator/chrysler/_stellantis_common.dbc
|
||||
opendbc/dbc/generator/chrysler/_stellantis_common_ram.py
|
||||
opendbc/dbc/generator/chrysler/chrysler_pacifica_2017_hybrid.dbc
|
||||
opendbc/dbc/generator/chrysler/chrysler_ram_dt.dbc
|
||||
opendbc/dbc/generator/chrysler/chrysler_ram_hd.dbc
|
||||
opendbc/dbc/generator/gm/_community.dbc
|
||||
opendbc/dbc/generator/gm/gm_global_a_powertrain.dbc
|
||||
opendbc/dbc/generator/honda/_bosch_2018.dbc
|
||||
opendbc/dbc/generator/honda/_bosch_radar_acc.dbc
|
||||
opendbc/dbc/generator/honda/_bosch_standstill.dbc
|
||||
opendbc/dbc/generator/honda/_community.dbc
|
||||
opendbc/dbc/generator/honda/_gearbox_common.dbc
|
||||
opendbc/dbc/generator/honda/_honda_common.dbc
|
||||
opendbc/dbc/generator/honda/_lkas_hud_5byte.dbc
|
||||
opendbc/dbc/generator/honda/_lkas_hud_8byte.dbc
|
||||
opendbc/dbc/generator/honda/_nidec_common.dbc
|
||||
opendbc/dbc/generator/honda/_nidec_scm_group_a.dbc
|
||||
opendbc/dbc/generator/honda/_nidec_scm_group_b.dbc
|
||||
opendbc/dbc/generator/honda/_steering_control_a.dbc
|
||||
opendbc/dbc/generator/honda/_steering_control_b.dbc
|
||||
opendbc/dbc/generator/honda/_steering_control_c.dbc
|
||||
opendbc/dbc/generator/honda/_steering_control_d_ext.dbc
|
||||
opendbc/dbc/generator/honda/_steering_sensors_a.dbc
|
||||
opendbc/dbc/generator/honda/_steering_sensors_b.dbc
|
||||
opendbc/dbc/generator/honda/_steering_sensors_c.dbc
|
||||
opendbc/dbc/generator/honda/acura_ilx_2016_can.dbc
|
||||
opendbc/dbc/generator/honda/acura_rdx_2018_can.dbc
|
||||
opendbc/dbc/generator/honda/acura_rdx_2020_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_accord_2017_can_ext.dbc
|
||||
opendbc/dbc/generator/honda/honda_bosch_radarless.dbc
|
||||
opendbc/dbc/generator/honda/honda_civic_hatchback_ex_2017_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_civic_touring_2016_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_clarity_hybrid_2018_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_common_canfd.dbc
|
||||
opendbc/dbc/generator/honda/honda_crv_ex_2017_body.dbc
|
||||
opendbc/dbc/generator/honda/honda_crv_touring_2016_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_e_advance_2020_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_insight_ex_2019_can.dbc
|
||||
opendbc/dbc/generator/honda/honda_odyssey_exl_2018.dbc
|
||||
opendbc/dbc/generator/honda/honda_odyssey_twn_2018.dbc
|
||||
opendbc/dbc/generator/hyundai/_20240705_STD_DB_CAR_R2-0_2024_FD_C_v24-05-01_SFA_RWA.dbc
|
||||
opendbc/dbc/generator/hyundai/_hyundai_canfd_ccnc_og.dbc
|
||||
opendbc/dbc/generator/hyundai/_hyundai_canfd_common.dbc
|
||||
opendbc/dbc/generator/hyundai/_hyundai_canfd_hda2_cam_unknown.dbc
|
||||
opendbc/dbc/generator/hyundai/_hyundai_reversed_ccnc_canfd.dbc
|
||||
opendbc/dbc/generator/hyundai/hyundai_can.dbc
|
||||
opendbc/dbc/generator/hyundai/hyundai_canfd.dbc
|
||||
opendbc/dbc/generator/hyundai/hyundai_canfd_og.dbc
|
||||
opendbc/dbc/generator/hyundai/hyundai_kia_mando_corner_radar.py
|
||||
opendbc/dbc/generator/hyundai/hyundai_kia_mando_front_radar.py
|
||||
opendbc/dbc/generator/hyundai/hyundai_palisade_2023.dbc
|
||||
opendbc/dbc/generator/nissan/_nissan_common.dbc
|
||||
opendbc/dbc/generator/nissan/nissan_leaf_2018.dbc
|
||||
opendbc/dbc/generator/nissan/nissan_x_trail_2017.dbc
|
||||
opendbc/dbc/generator/rivian/rivian_mando_front_radar.py
|
||||
opendbc/dbc/generator/subaru/_subaru_global.dbc
|
||||
opendbc/dbc/generator/subaru/_subaru_preglobal_2015.dbc
|
||||
opendbc/dbc/generator/subaru/subaru_forester_2017.dbc
|
||||
opendbc/dbc/generator/subaru/subaru_global_2017.dbc
|
||||
opendbc/dbc/generator/subaru/subaru_global_2020_hybrid.dbc
|
||||
opendbc/dbc/generator/subaru/subaru_outback_2015.dbc
|
||||
opendbc/dbc/generator/subaru/subaru_outback_2019.dbc
|
||||
opendbc/dbc/generator/tesla/_radar_common.py
|
||||
opendbc/dbc/generator/tesla/tesla_radar_bosch.py
|
||||
opendbc/dbc/generator/tesla/tesla_radar_continental.py
|
||||
opendbc/dbc/generator/toyota/_community.dbc
|
||||
opendbc/dbc/generator/toyota/_toyota_2017.dbc
|
||||
opendbc/dbc/generator/toyota/_toyota_adas_standard.dbc
|
||||
opendbc/dbc/generator/toyota/toyota_new_mc_pt.dbc
|
||||
opendbc/dbc/generator/toyota/toyota_nodsu_pt.dbc
|
||||
opendbc/dbc/generator/toyota/toyota_secoc_pt.dbc
|
||||
opendbc/dbc/generator/toyota/toyota_tnga_k_pt.dbc
|
||||
opendbc/dbc/generator/volkswagen/_vw_meb_common.dbc
|
||||
opendbc/dbc/generator/volkswagen/vw_meb.dbc
|
||||
opendbc/dbc/generator/volkswagen/vw_meb_2024.dbc
|
||||
opendbc/safety/__init__.py
|
||||
opendbc/safety/can.h
|
||||
opendbc/safety/declarations.h
|
||||
opendbc/safety/helpers.h
|
||||
opendbc/safety/ignition.h
|
||||
opendbc/safety/lateral.h
|
||||
opendbc/safety/longitudinal.h
|
||||
opendbc/safety/safety.h
|
||||
opendbc/safety/modes/body.h
|
||||
opendbc/safety/modes/chrysler.h
|
||||
opendbc/safety/modes/chrysler_common.h
|
||||
opendbc/safety/modes/chrysler_cusw.h
|
||||
opendbc/safety/modes/defaults.h
|
||||
opendbc/safety/modes/elm327.h
|
||||
opendbc/safety/modes/ford.h
|
||||
opendbc/safety/modes/gm.h
|
||||
opendbc/safety/modes/honda.h
|
||||
opendbc/safety/modes/hyundai.h
|
||||
opendbc/safety/modes/hyundai_canfd.h
|
||||
opendbc/safety/modes/hyundai_common.h
|
||||
opendbc/safety/modes/mazda.h
|
||||
opendbc/safety/modes/nissan.h
|
||||
opendbc/safety/modes/psa.h
|
||||
opendbc/safety/modes/rivian.h
|
||||
opendbc/safety/modes/subaru.h
|
||||
opendbc/safety/modes/subaru_common.h
|
||||
opendbc/safety/modes/subaru_preglobal.h
|
||||
opendbc/safety/modes/tesla.h
|
||||
opendbc/safety/modes/toyota.h
|
||||
opendbc/safety/modes/volkswagen_common.h
|
||||
opendbc/safety/modes/volkswagen_meb.h
|
||||
opendbc/safety/modes/volkswagen_mlb.h
|
||||
opendbc/safety/modes/volkswagen_mqb.h
|
||||
opendbc/safety/modes/volkswagen_pq.h
|
||||
opendbc/safety/sunnypilot/mads.h
|
||||
opendbc/safety/sunnypilot/mads_declarations.h
|
||||
opendbc/safety/tests/__init__.py
|
||||
opendbc/safety/tests/common.py
|
||||
opendbc/safety/tests/gas_interceptor_common.py
|
||||
opendbc/safety/tests/hyundai_common.py
|
||||
opendbc/safety/tests/mads_common.py
|
||||
opendbc/safety/tests/mutation.py
|
||||
opendbc/safety/tests/test_body.py
|
||||
opendbc/safety/tests/test_chrysler.py
|
||||
opendbc/safety/tests/test_chrysler_cusw.py
|
||||
opendbc/safety/tests/test_defaults.py
|
||||
opendbc/safety/tests/test_elm327.py
|
||||
opendbc/safety/tests/test_ford.py
|
||||
opendbc/safety/tests/test_gm.py
|
||||
opendbc/safety/tests/test_honda.py
|
||||
opendbc/safety/tests/test_hyundai.py
|
||||
opendbc/safety/tests/test_hyundai_canfd.py
|
||||
opendbc/safety/tests/test_mazda.py
|
||||
opendbc/safety/tests/test_nissan.py
|
||||
opendbc/safety/tests/test_psa.py
|
||||
opendbc/safety/tests/test_release_build.py
|
||||
opendbc/safety/tests/test_rivian.py
|
||||
opendbc/safety/tests/test_subaru.py
|
||||
opendbc/safety/tests/test_subaru_preglobal.py
|
||||
opendbc/safety/tests/test_tesla.py
|
||||
opendbc/safety/tests/test_toyota.py
|
||||
opendbc/safety/tests/test_volkswagen_meb.py
|
||||
opendbc/safety/tests/test_volkswagen_mlb.py
|
||||
opendbc/safety/tests/test_volkswagen_mqb.py
|
||||
opendbc/safety/tests/test_volkswagen_pq.py
|
||||
opendbc/safety/tests/libsafety/__init__.py
|
||||
opendbc/safety/tests/libsafety/fake_stm.h
|
||||
opendbc/safety/tests/libsafety/libsafety_py.py
|
||||
opendbc/safety/tests/misra/test_mutation.py
|
||||
opendbc/safety/tests/safety_replay/__init__.py
|
||||
opendbc/safety/tests/safety_replay/helpers.py
|
||||
opendbc/safety/tests/safety_replay/replay_drive.py
|
||||
opendbc/sunnypilot/__init__.py
|
||||
opendbc/sunnypilot/mads_base.py
|
||||
opendbc/sunnypilot/car/__init__.py
|
||||
opendbc/sunnypilot/car/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/intelligent_cruise_button_management_interface_base.py
|
||||
opendbc/sunnypilot/car/interfaces.py
|
||||
opendbc/sunnypilot/car/lateral_ext.py
|
||||
opendbc/sunnypilot/car/platform_list.py
|
||||
opendbc/sunnypilot/car/chrysler/__init__.py
|
||||
opendbc/sunnypilot/car/chrysler/carcontroller_ext.py
|
||||
opendbc/sunnypilot/car/chrysler/carstate_ext.py
|
||||
opendbc/sunnypilot/car/chrysler/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/chrysler/icbm.py
|
||||
opendbc/sunnypilot/car/chrysler/mads.py
|
||||
opendbc/sunnypilot/car/chrysler/values_ext.py
|
||||
opendbc/sunnypilot/car/ford/__init__.py
|
||||
opendbc/sunnypilot/car/ford/mads.py
|
||||
opendbc/sunnypilot/car/gm/__init__.py
|
||||
opendbc/sunnypilot/car/gm/carstate_ext.py
|
||||
opendbc/sunnypilot/car/gm/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/gm/interface_ext.py
|
||||
opendbc/sunnypilot/car/gm/values_ext.py
|
||||
opendbc/sunnypilot/car/honda/__init__.py
|
||||
opendbc/sunnypilot/car/honda/carstate_ext.py
|
||||
opendbc/sunnypilot/car/honda/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/honda/gas_interceptor.py
|
||||
opendbc/sunnypilot/car/honda/icbm.py
|
||||
opendbc/sunnypilot/car/honda/mads.py
|
||||
opendbc/sunnypilot/car/honda/test_honda.py
|
||||
opendbc/sunnypilot/car/honda/values_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/__init__.py
|
||||
opendbc/sunnypilot/car/hyundai/carstate_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/enable_radar_tracks.py
|
||||
opendbc/sunnypilot/car/hyundai/escc.py
|
||||
opendbc/sunnypilot/car/hyundai/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/icbm.py
|
||||
opendbc/sunnypilot/car/hyundai/lead_data_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/mads.py
|
||||
opendbc/sunnypilot/car/hyundai/radar_interface_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/values.py
|
||||
opendbc/sunnypilot/car/hyundai/longitudinal/__init__.py
|
||||
opendbc/sunnypilot/car/hyundai/longitudinal/config.py
|
||||
opendbc/sunnypilot/car/hyundai/longitudinal/controller.py
|
||||
opendbc/sunnypilot/car/hyundai/longitudinal/helpers.py
|
||||
opendbc/sunnypilot/car/hyundai/tests/__init__.py
|
||||
opendbc/sunnypilot/car/hyundai/tests/test_escc_base.py
|
||||
opendbc/sunnypilot/car/hyundai/tests/test_lead_data_car_controller.py
|
||||
opendbc/sunnypilot/car/hyundai/tests/test_radar_interface_ext.py
|
||||
opendbc/sunnypilot/car/hyundai/tests/test_tuning_controller.py
|
||||
opendbc/sunnypilot/car/mazda/__init__.py
|
||||
opendbc/sunnypilot/car/mazda/icbm.py
|
||||
opendbc/sunnypilot/car/nissan/__init__.py
|
||||
opendbc/sunnypilot/car/nissan/carstate_ext.py
|
||||
opendbc/sunnypilot/car/nissan/nissancan_ext.py
|
||||
opendbc/sunnypilot/car/nissan/values.py
|
||||
opendbc/sunnypilot/car/rivian/__init__.py
|
||||
opendbc/sunnypilot/car/rivian/carstate_ext.py
|
||||
opendbc/sunnypilot/car/rivian/mads.py
|
||||
opendbc/sunnypilot/car/rivian/values.py
|
||||
opendbc/sunnypilot/car/subaru/__init__.py
|
||||
opendbc/sunnypilot/car/subaru/mads.py
|
||||
opendbc/sunnypilot/car/subaru/stop_and_go.py
|
||||
opendbc/sunnypilot/car/subaru/subarucan_ext.py
|
||||
opendbc/sunnypilot/car/subaru/values_ext.py
|
||||
opendbc/sunnypilot/car/tesla/__init__.py
|
||||
opendbc/sunnypilot/car/tesla/carstate_ext.py
|
||||
opendbc/sunnypilot/car/tesla/coop_steering.py
|
||||
opendbc/sunnypilot/car/tesla/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/tesla/values.py
|
||||
opendbc/sunnypilot/car/tests/__init__.py
|
||||
opendbc/sunnypilot/car/tests/test_car_list.py
|
||||
opendbc/sunnypilot/car/toyota/__init__.py
|
||||
opendbc/sunnypilot/car/toyota/carstate_ext.py
|
||||
opendbc/sunnypilot/car/toyota/fingerprints_ext.py
|
||||
opendbc/sunnypilot/car/toyota/gas_interceptor.py
|
||||
opendbc/sunnypilot/car/toyota/values.py
|
||||
@@ -1 +0,0 @@
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
numpy
|
||||
tqdm
|
||||
pycapnp
|
||||
pycryptodome
|
||||
|
||||
[examples]
|
||||
inputs
|
||||
|
||||
[testing]
|
||||
cffi
|
||||
tree-sitter
|
||||
tree-sitter-c
|
||||
gcovr
|
||||
unittest-parallel
|
||||
zstandard
|
||||
ruff
|
||||
ty
|
||||
lefthook
|
||||
cpplint
|
||||
codespell
|
||||
@@ -1 +0,0 @@
|
||||
opendbc
|
||||
@@ -568,8 +568,6 @@ struct CarParams {
|
||||
}
|
||||
|
||||
struct LongitudinalPIDTuning {
|
||||
kpBP @0 :List(Float32);
|
||||
kpV @1 :List(Float32);
|
||||
kiBP @2 :List(Float32);
|
||||
kiV @3 :List(Float32);
|
||||
|
||||
@@ -577,6 +575,8 @@ struct CarParams {
|
||||
kf @6 :Float32;
|
||||
deadzoneBP @4 :List(Float32);
|
||||
deadzoneV @5 :List(Float32);
|
||||
kpBP @0 :List(Float32);
|
||||
kpV @1 :List(Float32);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -648,6 +648,10 @@ struct CarParams {
|
||||
fcaGiorgio @32;
|
||||
rivian @33;
|
||||
volkswagenMeb @34;
|
||||
byd @35;
|
||||
volvo @36;
|
||||
bmw @37;
|
||||
mg @38;
|
||||
}
|
||||
|
||||
enum SteerControlType {
|
||||
|
||||
@@ -78,7 +78,7 @@ class CAR(Platforms):
|
||||
)
|
||||
|
||||
JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk
|
||||
[ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video="https://www.youtube.com/watch?v=jBe4lWnRSu4")],
|
||||
[ChryslerCarDocs("Jeep Grand Cherokee 2019-21")],
|
||||
JEEP_GRAND_CHEROKEE.specs,
|
||||
)
|
||||
|
||||
|
||||
@@ -130,7 +130,6 @@ class CarHarness(EnumBase):
|
||||
hyundai_p = BaseCarHarness("Hyundai P connector")
|
||||
hyundai_q = BaseCarHarness("Hyundai Q connector")
|
||||
hyundai_r = BaseCarHarness("Hyundai R connector")
|
||||
hyundai_s = BaseCarHarness("Hyundai S connector")
|
||||
custom = BaseCarHarness("Developer connector")
|
||||
obd_ii = BaseCarHarness("OBD-II connector", parts=[Cable.long_obdc_cable], has_connector=False)
|
||||
gm = BaseCarHarness("GM connector", parts=[Accessory.harness_box])
|
||||
|
||||
@@ -209,7 +209,6 @@ MIGRATION = {
|
||||
"HYUNDAI SONATA HYBRID 2021": HYUNDAI.HYUNDAI_SONATA_HYBRID,
|
||||
"HYUNDAI IONIQ 5 2022": HYUNDAI.HYUNDAI_IONIQ_5,
|
||||
"HYUNDAI IONIQ 6 2023": HYUNDAI.HYUNDAI_IONIQ_6,
|
||||
"HYUNDAI IONIQ 9 2025": HYUNDAI.HYUNDAI_IONIQ_9,
|
||||
"HYUNDAI TUCSON 4TH GEN": HYUNDAI.HYUNDAI_TUCSON_4TH_GEN,
|
||||
"HYUNDAI SANTA CRUZ 1ST GEN": HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN,
|
||||
"HYUNDAI CUSTIN 1ST GEN": HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN,
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
# About Angle Steering, Baseline Model, and ISO Safety Limits
|
||||
|
||||
## Overview
|
||||
|
||||
The baseline vehicle model serves as our safety reference point for establishing universal control parameters across our entire vehicle fleet. This approach ensures that all vehicles operate within ISO safety standards regardless of their individual physics characteristics.
|
||||
|
||||
## How It Works
|
||||
|
||||
For any given speed and driving conditions, we query each vehicle model with the question: "What's the maximum steering angle I can apply right now while staying below the ISO standard limits for lateral acceleration and jerk?"
|
||||
|
||||
Each vehicle model responds differently based on its unique physics characteristics:
|
||||
- **Baseline Vehicle Model**: Has the most restrictive limits - requires the smallest steering angles to stay within ISO safety thresholds
|
||||
- **Current Vehicle Model**: May be able to handle larger steering angles while remaining within the same ISO safety standards, depending on its physical characteristics
|
||||
|
||||
## Safety Logic
|
||||
|
||||
Both the baseline and current vehicle models target the same ISO safety limits. The key difference is that the baseline vehicle's physics require more conservative steering inputs to stay within those standards.
|
||||
|
||||
By applying the baseline vehicle's more restrictive steering limits to all vehicles in the fleet:
|
||||
- Every model stays well within ISO safety thresholds
|
||||
- No vehicle will breach safety standards regardless of its individual characteristics
|
||||
- We maintain a consistent safety margin across the entire fleet
|
||||
|
||||
If we instead used a less restrictive model as our baseline, any naturally more restrictive vehicles in the fleet would exceed ISO standards and create unsafe driving conditions.
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### Two-Layer Validation Process
|
||||
|
||||
We use a two-layer validation approach to balance vehicle-specific optimization with baseline safety:
|
||||
|
||||
1. **Current Vehicle Model Calculation**: We first calculate the optimal steering limits from the current vehicle model, which determines the best steering angle based on that vehicle's physical characteristics and desired maneuver.
|
||||
|
||||
2. **Baseline Model Validation**: We then pass the current vehicle's requested steering command through the baseline model as a final safety filter.
|
||||
|
||||
This two-layer approach is essential because while the current vehicle model may generally be more capable, it might sometimes request smaller jerk or lateral acceleration values to achieve specific driving goals. The baseline validation ensures that regardless of what the current vehicle requests, we never exceed the safety limits of our most restrictive vehicle.
|
||||
|
||||
### Special Case: Driving the Baseline Vehicle
|
||||
|
||||
When actually driving the baseline vehicle itself (e.g., Kia Sportage HEV 2026), the two-layer validation is skipped since the current vehicle model and the baseline model are the same. The panda safety layer still enforces the ISO limits using the baseline vehicle's parameters.
|
||||
|
||||
## Example Implementation
|
||||
|
||||
### Baseline Vehicle: Kia Sportage HEV 2026
|
||||
Due to its physics characteristics, the Sportage HEV 2026 requires smaller steering angles to remain within ISO safety limits.
|
||||
|
||||
### Current Vehicle: Ioniq 5 PE
|
||||
Due to different physical characteristics, the Ioniq 5 PE can handle larger steering angles while still remaining within the same ISO safety standards.
|
||||
|
||||
By using the Sportage HEV 2026's conservative limits across all vehicles, we ensure the Ioniq 5 PE operates well within its capabilities, while preventing the Sportage HEV 2026 from exceeding its safety thresholds.
|
||||
@@ -1,10 +1,7 @@
|
||||
import numpy as np
|
||||
from opendbc.car.vehicle_model import VehicleModel
|
||||
from opendbc.car.common.filter_simple import FirstOrderFilter
|
||||
|
||||
from opendbc.can import CANPacker
|
||||
from opendbc.car import Bus, DT_CTRL, make_tester_present_msg, structs, rate_limit
|
||||
from opendbc.car.lateral import apply_driver_steer_torque_limits, common_fault_avoidance, apply_steer_angle_limits_vm
|
||||
from opendbc.car import Bus, DT_CTRL, make_tester_present_msg, structs
|
||||
from opendbc.car.lateral import apply_driver_steer_torque_limits, common_fault_avoidance
|
||||
from opendbc.car.common.conversions import Conversions as CV
|
||||
from opendbc.car.hyundai import hyundaicanfd, hyundaican
|
||||
from opendbc.car.hyundai.hyundaicanfd import CanBus
|
||||
@@ -32,31 +29,6 @@ MAX_ANGLE_CONSECUTIVE_FRAMES = 2
|
||||
# naturally on brake press. We send ~100 ms later if it fails to do so, or if we want to cancel for another reason.
|
||||
CANCEL_BUTTON_DELAY_FRAMES = 10
|
||||
|
||||
MAX_ANGLE_RATE = 5
|
||||
ANGLE_SAFETY_BASELINE_MODEL = "KIA_SPORTAGE_HEV_2026"
|
||||
|
||||
|
||||
def get_baseline_safety_cp():
|
||||
from opendbc.car.hyundai.interface import CarInterface
|
||||
return CarInterface.get_non_essential_params(ANGLE_SAFETY_BASELINE_MODEL)
|
||||
|
||||
|
||||
def compute_torque_reduction_gain(steering_torque, v_ego, lat_active, last_gain):
|
||||
if lat_active:
|
||||
ceiling = np.interp(v_ego, [0.5, 1.5], [1.0, 0.85])
|
||||
shelf = np.interp(v_ego, [2, 11], [0.45, 0.6])
|
||||
floor = np.interp(v_ego, [2, 22], [0.1, 0.3])
|
||||
bp1 = np.interp(v_ego, [2, 11], [75, 125])
|
||||
bp2 = np.interp(v_ego, [2, 11], [125, 150])
|
||||
bp3 = np.interp(v_ego, [2, 11], [175, 275])
|
||||
bp4 = np.interp(v_ego, [2, 22], [400, 700])
|
||||
target = np.interp(abs(steering_torque), [bp1, bp2, bp3, bp4], [ceiling, shelf, shelf, floor])
|
||||
|
||||
else:
|
||||
target = 0.0
|
||||
gain = rate_limit(target, last_gain, -0.014, 0.004)
|
||||
return round(gain / 0.004) * 0.004
|
||||
|
||||
|
||||
def process_hud_alert(enabled, fingerprint, hud_control):
|
||||
sys_warning = (hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw))
|
||||
@@ -82,21 +54,6 @@ def process_hud_alert(enabled, fingerprint, hud_control):
|
||||
return sys_warning, sys_state, left_lane_warning, right_lane_warning
|
||||
|
||||
|
||||
def parse_tq_rdc_gain(val):
|
||||
"""
|
||||
Returns the float value divided by 100 if val is not None, else returns None.
|
||||
"""
|
||||
if val is not None:
|
||||
return float(val) / 100
|
||||
return None
|
||||
|
||||
|
||||
def parse_scaled_value(val, scale=10):
|
||||
if val is not None:
|
||||
return float(val) / scale
|
||||
return None
|
||||
|
||||
|
||||
class CarController(CarControllerBase, EsccCarController, LeadDataCarController, LongitudinalController, MadsCarController,
|
||||
IntelligentCruiseButtonManagementInterface):
|
||||
def __init__(self, dbc_names, CP, CP_SP):
|
||||
@@ -110,12 +67,6 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
|
||||
self.params = CarControllerParams(CP)
|
||||
self.packer = CANPacker(dbc_names[Bus.pt])
|
||||
self.angle_limit_counter = 0
|
||||
self.angle_filter = FirstOrderFilter(0.0, 0.2, DT_CTRL)
|
||||
|
||||
# Vehicle model used for lateral limiting
|
||||
self.VM = VehicleModel(CP)
|
||||
self.BASELINE_VM = VehicleModel(get_baseline_safety_cp())
|
||||
self.apply_angle_last = 0
|
||||
|
||||
self.accel_last = 0
|
||||
self.apply_torque_last = 0
|
||||
@@ -123,8 +74,6 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
|
||||
self.last_button_frame = 0
|
||||
self.cancel_counter = 0
|
||||
|
||||
self.apply_angle_last = 0
|
||||
|
||||
def update(self, CC, CC_SP, CS, now_nanos):
|
||||
EsccCarController.update(self, CS)
|
||||
LeadDataCarController.update(self, CC_SP)
|
||||
@@ -136,43 +85,13 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
|
||||
hud_control = CC.hudControl
|
||||
|
||||
# steering torque
|
||||
if not self.CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING:
|
||||
self.angle_limit_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringAngleDeg) >= MAX_ANGLE, CC.latActive,
|
||||
self.angle_limit_counter, MAX_ANGLE_FRAMES,
|
||||
MAX_ANGLE_CONSECUTIVE_FRAMES)
|
||||
new_torque = int(round(actuators.torque * self.params.STEER_MAX))
|
||||
apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params)
|
||||
new_torque = int(round(actuators.torque * self.params.STEER_MAX))
|
||||
apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, self.params)
|
||||
|
||||
# angle control
|
||||
else:
|
||||
v_ego_raw = CS.out.vEgoRaw
|
||||
desired_angle = float(np.clip(actuators.steeringAngleDeg, -self.params.ANGLE_LIMITS.STEER_ANGLE_MAX, self.params.ANGLE_LIMITS.STEER_ANGLE_MAX))
|
||||
|
||||
self.angle_filter.update_alpha(float(np.interp(CS.out.vEgo, [5, 10, 20], [0.2, 0.1, 0.0])))
|
||||
desired_angle = self.angle_filter.update(desired_angle)
|
||||
|
||||
apply_angle = apply_steer_angle_limits_vm(desired_angle, self.apply_angle_last, v_ego_raw, CS.out.steeringAngleDeg, CC.latActive, self.params, self.VM)
|
||||
|
||||
# if we are not the baseline model, we use the baseline model for further limits to prevent a panda block since it is hardcoded for baseline model.
|
||||
if self.CP.carFingerprint != ANGLE_SAFETY_BASELINE_MODEL:
|
||||
apply_angle = apply_steer_angle_limits_vm(apply_angle or desired_angle, self.apply_angle_last, v_ego_raw, CS.out.steeringAngleDeg, CC.latActive,
|
||||
self.params, self.BASELINE_VM)
|
||||
|
||||
apply_torque = compute_torque_reduction_gain(CS.out.steeringTorque, v_ego_raw, CC.latActive, self.apply_torque_last)
|
||||
apply_steer_req = CC.latActive and apply_torque != 0
|
||||
|
||||
# Failsafe if we detected we'd violate safety
|
||||
if apply_angle is None:
|
||||
apply_torque = 0
|
||||
apply_angle = CS.out.steeringAngleDeg
|
||||
apply_steer_req = False
|
||||
|
||||
# After we've used the last angle wherever we needed it, we now update it.
|
||||
self.apply_angle_last = apply_angle
|
||||
|
||||
if not CC.latActive:
|
||||
self.apply_angle_last = float(np.clip(CS.out.steeringAngleDeg, -self.params.ANGLE_LIMITS.STEER_ANGLE_MAX, self.params.ANGLE_LIMITS.STEER_ANGLE_MAX))
|
||||
self.angle_filter.x = self.apply_angle_last
|
||||
# >90 degree steering fault prevention
|
||||
self.angle_limit_counter, apply_steer_req = common_fault_avoidance(abs(CS.out.steeringAngleDeg) >= MAX_ANGLE, CC.latActive,
|
||||
self.angle_limit_counter, MAX_ANGLE_FRAMES,
|
||||
MAX_ANGLE_CONSECUTIVE_FRAMES)
|
||||
|
||||
if not CC.latActive:
|
||||
apply_torque = 0
|
||||
@@ -223,7 +142,6 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
|
||||
new_actuators = actuators.as_builder()
|
||||
new_actuators.torque = apply_torque / self.params.STEER_MAX
|
||||
new_actuators.torqueOutputCan = apply_torque
|
||||
new_actuators.steeringAngleDeg = self.apply_angle_last
|
||||
new_actuators.accel = self.tuning.actual_accel
|
||||
|
||||
self.frame += 1
|
||||
@@ -284,8 +202,7 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
|
||||
lka_steering_long = lka_steering and self.CP.openpilotLongitudinalControl
|
||||
|
||||
# steering control
|
||||
can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque, self.apply_angle_last
|
||||
, self.lkas_icon))
|
||||
can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque, self.lkas_icon))
|
||||
|
||||
# prevent LFA from activating on LKA steering cars by sending "no lane lines detected" to ADAS ECU
|
||||
if self.frame % 5 == 0 and lka_steering:
|
||||
|
||||
@@ -70,9 +70,6 @@ class CarState(CarStateBase, EsccCarStateBase, MadsCarState, CarStateExt):
|
||||
self.cluster_speed_counter = CLUSTER_SAMPLE_RATE
|
||||
|
||||
self.params = CarControllerParams(CP)
|
||||
self.is_canfd_angle_steering = CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING
|
||||
self.imu_lateral_acceleration = 0.0 # used for CAN FD cars with angle steering
|
||||
self.hands_on_steering_grip = 0
|
||||
|
||||
def recent_button_interaction(self) -> bool:
|
||||
# On some newer model years, the CANCEL button acts as a pause/resume button based on the PCM state
|
||||
@@ -253,22 +250,15 @@ class CarState(CarStateBase, EsccCarStateBase, MadsCarState, CarStateExt):
|
||||
cp.vl["WHEEL_SPEEDS"]["WHL_SpdRLVal"] <= STANDSTILL_THRESHOLD and cp.vl["WHEEL_SPEEDS"]["WHL_SpdRRVal"] <= STANDSTILL_THRESHOLD
|
||||
|
||||
ret.steeringRateDeg = cp.vl["STEERING_SENSORS"]["STEERING_RATE"]
|
||||
ret.steeringAngleDeg = cp.vl["MDPS"]["MDPS_EstStrAnglVal"]
|
||||
ret.steeringAngleDeg = cp.vl["STEERING_SENSORS"]["STEERING_ANGLE"]
|
||||
ret.steeringTorque = cp.vl["MDPS"]["MDPS_StrTqSnsrVal"]
|
||||
ret.steeringTorqueEps = cp.vl["MDPS"]["MDPS_OutTqVal"]
|
||||
ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5)
|
||||
ret.steerFaultTemporary = cp.vl["MDPS"]["MDPS_LkaFailSta"] != 0
|
||||
if self.is_canfd_angle_steering:
|
||||
ret.steerFaultTemporary = ret.steerFaultTemporary or cp.vl["MDPS"]["MDPS_ADAS_AciFltSig_Lv2"] != 0
|
||||
self.hands_on_steering_grip = cp.vl["HOD_FD_01_100ms"]["HOD_Dir_Status"]
|
||||
torque_overriding = abs(ret.steeringTorque) > self.params.STEER_THRESHOLD
|
||||
ret.steeringPressed = self.update_steering_pressed(torque_overriding, 5)
|
||||
self.imu_lateral_acceleration = cp.vl["IMU_01_10ms"]["IMU_LatAccelVal"] * 9.81 # m/s^2
|
||||
else:
|
||||
ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > self.params.STEER_THRESHOLD, 5)
|
||||
|
||||
# TODO: alt signal usage may be described by cp.vl['BLINKERS']['USE_ALT_LAMP']
|
||||
left_blinker_sig, right_blinker_sig = "LEFT_LAMP", "RIGHT_LAMP"
|
||||
if self.CP.carFingerprint == CAR.HYUNDAI_KONA_EV_2ND_GEN or self.is_canfd_angle_steering:
|
||||
if self.CP.carFingerprint == CAR.HYUNDAI_KONA_EV_2ND_GEN:
|
||||
left_blinker_sig, right_blinker_sig = "LEFT_LAMP_ALT", "RIGHT_LAMP_ALT"
|
||||
ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["BLINKERS"][left_blinker_sig],
|
||||
cp.vl["BLINKERS"][right_blinker_sig])
|
||||
|
||||
@@ -41,14 +41,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00IGhe SCC FHCUP 1.00 1.02 99110-M9000 ',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_AZERA_HEV_7TH_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00GN7HMFC AT KOR LHD 1.00 1.01 99211-N1110 240423',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00GN7_ RDR ----- 1.00 1.00 99110-N1100 ',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_GENESIS: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00DH LKAS 1.1 -150210',
|
||||
@@ -362,16 +354,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00TMP MFC AT USA LHD 1.00 1.06 99211-S1500 220727',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_SANTA_FE_HEV_5TH_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00MX5HMFC AT KOR LHD 1.00 1.07 99211-P6000 231218',
|
||||
b'\xf1\x00MX5HMFC AT USA LHD 1.00 1.06 99211-R6000 231218',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00MX5_ RDR ----- 1.00 1.01 99110-P6000 ',
|
||||
b'\xf1\x00MX5_ RDR ----- 1.00 1.01 99110-R6000 ',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_CUSTIN_1ST_GEN: {
|
||||
(Ecu.abs, 0x7d1, None): [
|
||||
b'\xf1\x00KU ESC \x01 101!\x02\x03 58910-O3200',
|
||||
@@ -1056,34 +1038,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00CV1 MFC AT USA LHD 1.00 1.06 99210-CV000 220328',
|
||||
],
|
||||
},
|
||||
CAR.KIA_EV6_2025: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00CV__ RDR ----- 1.00 1.00 99110-XG500 ',
|
||||
b'\xf1\x00CV__ RDR ----- 1.00 1.01 99110-CV500 ',
|
||||
],
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00CV MFC AT KOR LHD 1.00 1.01 99210-CV500 240405',
|
||||
b'\xf1\x00CV MFC AT USA LHD 1.00 1.02 99210-XG500 241223',
|
||||
],
|
||||
},
|
||||
CAR.KIA_EV9: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO000 ',
|
||||
b'\xf1\x00MV__ RDR ----- 1.00 1.03 99110-DO000 ',
|
||||
b'\xf1\x00MV__ RDR ----- 1.00 1.04 99110-DO000 ',
|
||||
b'\xf1\x00MV__ RDR ----- 1.00 1.02 99110-DO700 ',
|
||||
b'\xf1\x00MV__ RDR ----- 1.00 1.04 99110-DO700 ',
|
||||
],
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00MV MFC AT KOR LHD 1.00 1.01 99211-DO000 230419',
|
||||
b'\xf1\x00MV MFC AT USA LHD 1.00 1.02 99211-DO000 230616',
|
||||
b'\xf1\x00MV MFC AT EUR LHD 1.00 1.02 99211-DO000 230616',
|
||||
b'\xf1\x00MV MFC AT CAN LHD 1.00 1.00 99211-DO100 240403',
|
||||
b'\xf1\x00MV MFC AT USA LHD 1.00 1.01 99211-XA000 241023',
|
||||
b'\xf1\x00MV MFC AT CAN LHD 1.00 1.01 99211-DO100 241023',
|
||||
b'\xf1\x00MV MFC AT CAN LHD 1.00 1.02 99211-DO100 241223',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_IONIQ_5: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00NE1_ RDR ----- 1.00 1.00 99110-GI000 ',
|
||||
@@ -1115,18 +1069,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_IONIQ_5_PE: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00NE__ RDR ----- 1.00 1.00 99110-PI000 ',
|
||||
b'\xf1\x00NE__ RDR ----- 1.00 1.01 99110-GI500 '
|
||||
],
|
||||
(Ecu.fwdCamera, 0x7C4, None): [
|
||||
b'\xf1\x00NE MFC AT USA LHD 1.00 1.01 99211-PI000 240905',
|
||||
b'\xf1\x00NE MFC AT EUR LHD 1.00 1.03 99211-GI500 240809',
|
||||
b'\xf1\x00NE MFC AT USA LHD 1.00 1.00 99211-PI010 250407',
|
||||
b'\xf1\x00NE MFC AT EUR LHD 1.00 1.00 99211-GI510 250513',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_IONIQ_6: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ',
|
||||
@@ -1141,16 +1083,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00CE MFC AT CAN LHD 1.00 1.06 99211-KL000 230915',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_IONIQ_9: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00MEev RDR ----- 1.00 1.00 99110-GO000 ',
|
||||
],
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00ME MFC AT KOR LHD 1.00 1.00 99211-GO000 241007',
|
||||
b'\xf1\x00ME MFC AT KOR LHD 1.00 1.01 99211-GO000 250103',
|
||||
b'\xf1\x00ME MFC AT USA LHD 1.00 1.00 99211-TD000 241007',
|
||||
],
|
||||
},
|
||||
CAR.HYUNDAI_TUCSON_4TH_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.00 99211-N9220 14K',
|
||||
@@ -1206,14 +1138,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00NQ5__ 1.01 1.03 99110-P1000 ',
|
||||
],
|
||||
},
|
||||
CAR.KIA_SPORTAGE_HEV_2026: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00NQ51.011.021.012551000HKP_NQ524_50509099211P1110',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00NQ5__ 1.00 1.04 99110CH100 ',
|
||||
],
|
||||
},
|
||||
CAR.GENESIS_GV70_1ST_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00JK1 MFC AT CAN LHD 1.00 1.02 99211-IY000 230627',
|
||||
@@ -1241,14 +1165,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00JKev SCC ----- 1.00 1.01 99110-DS000 ',
|
||||
],
|
||||
},
|
||||
CAR.GENESIS_GV70_ELECTRIFIED_2ND_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00JK MFC AT USA LHD 1.00 1.03 99211-DS600 241125',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00JK__ RDR ----- 1.00 1.01 99110-DS500 ',
|
||||
],
|
||||
},
|
||||
CAR.GENESIS_GV60_EV_1ST_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00JW1 MFC AT AUS RHD 1.00 1.03 99211-CU100 221118',
|
||||
@@ -1288,14 +1204,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00MQhe SCC FHCUP 1.00 1.07 99110-P4000 ',
|
||||
],
|
||||
},
|
||||
CAR.KIA_SORENTO_HEV_4TH_GEN_LFA2: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00MQ4HMFC AT USA LHD 1.00 1.00 99210-P2600 250617',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00MQ4_ RDR ----- 1.00 1.01 99110-P2500 ',
|
||||
],
|
||||
},
|
||||
CAR.KIA_NIRO_HEV_2ND_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00SG2HMFC AT USA LHD 1.01 1.08 99211-AT000 220531',
|
||||
@@ -1314,14 +1222,6 @@ FW_VERSIONS = {
|
||||
b'\xf1\x00JX1_ SCC FHCUP 1.00 1.01 99110-T6100 ',
|
||||
],
|
||||
},
|
||||
CAR.GENESIS_GV80_2025: {
|
||||
(Ecu.fwdRadar, 0x7d0, None): [
|
||||
b'\xf1\x00JX__ RDR ----- 1.00 1.03 99110-T6500 ',
|
||||
],
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00JX MFC AT USA LHD 1.00 1.03 99211-T6510 240124',
|
||||
],
|
||||
},
|
||||
CAR.KIA_CARNIVAL_4TH_GEN: {
|
||||
(Ecu.fwdCamera, 0x7c4, None): [
|
||||
b'\xf1\x00KA4 MFC AT EUR LHD 1.00 1.06 99210-R0000 220221',
|
||||
|
||||
@@ -36,31 +36,18 @@ class CanBus(CanBusBase):
|
||||
return self._cam
|
||||
|
||||
|
||||
def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_torque, apply_angle, lkas_icon):
|
||||
def create_steering_messages(packer, CP, CAN, enabled, lat_active, apply_torque, lkas_icon):
|
||||
values = {
|
||||
"LKA_OptUsmSta": 2,
|
||||
"LKA_SysIndReq": 2 if enabled else 1,
|
||||
"LKA_SysIndReq": lkas_icon,
|
||||
"StrTqReqVal": apply_torque,
|
||||
"LKA_SysWrn": 0,
|
||||
"ActToiSta": 1 if lat_active else 0,
|
||||
"LKA_UsmMod": 0, # hide LKAS settings
|
||||
"LKA_RcgSta": 0, # lane recognition status (0 for "not recognized")
|
||||
"LKA_RcgSta": 0,
|
||||
"Damping_Gain": 100, # can potentially tuned for better perf [3, 200]
|
||||
}
|
||||
|
||||
# Angle control doesn't support using LFA yet
|
||||
if CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING:
|
||||
# LKAS messages take priority over LFA messages on HDA2.
|
||||
values |= {
|
||||
"LKA_OptUsmSta": 0, # TODO: not used by the stock system
|
||||
"StrTqReqVal": 0, # we don't use torque
|
||||
"ActToiSta": 0, # we don't use torque
|
||||
"LKA_RcgSta": 3 if lat_active else 0,
|
||||
"ADAS_StrAnglReqVal": apply_angle,
|
||||
"LKAS_ANGLE_ACTIVE": 2 if lat_active else 1,
|
||||
"ADAS_ACIAnglTqRedcGainVal": apply_torque if lat_active else 0,
|
||||
}
|
||||
|
||||
ret = []
|
||||
if CP.flags & HyundaiFlags.CANFD_LKA_STEER_MSG:
|
||||
lkas_msg = "LKAS_ALT" if CP.flags & HyundaiFlags.CANFD_LKA_STEER_MSG_ALT else "LKAS"
|
||||
|
||||
@@ -46,10 +46,6 @@ class CarInterface(CarInterfaceBase):
|
||||
# this needs to be figured out for cars without an ADAS ECU
|
||||
ret.alphaLongitudinalAvailable = False
|
||||
|
||||
# no longitudinal for all lka_steering angle steering
|
||||
if lka_steering and ret.flags & HyundaiFlags.CANFD_ANGLE_STEERING:
|
||||
ret.alphaLongitudinalAvailable = False
|
||||
|
||||
ret.enableBsm = 0x1ba in fingerprint[CAN.ECAN]
|
||||
|
||||
# Check if the car is hybrid. Only HEV/PHEV cars have 0xFA on E-CAN.
|
||||
@@ -89,9 +85,6 @@ class CarInterface(CarInterfaceBase):
|
||||
ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_ALT_BUTTONS.value
|
||||
if ret.flags & HyundaiFlags.CANFD_CAMERA_SCC:
|
||||
ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CAMERA_SCC.value
|
||||
if ret.flags & HyundaiFlags.CANFD_ANGLE_STEERING:
|
||||
ret.steerControlType = structs.CarParams.SteerControlType.angle
|
||||
ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CANFD_ANGLE_STEERING.value
|
||||
|
||||
else:
|
||||
# Shared configuration for non CAN-FD cars
|
||||
@@ -124,9 +117,7 @@ class CarInterface(CarInterfaceBase):
|
||||
ret.centerToFront = ret.wheelbase * 0.4
|
||||
ret.steerActuatorDelay = 0.1
|
||||
ret.steerLimitTimer = 0.4
|
||||
|
||||
if not (ret.flags & HyundaiFlags.CANFD_ANGLE_STEERING):
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
|
||||
if ret.flags & HyundaiFlags.ALT_LIMITS:
|
||||
ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.ALT_LIMITS.value
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
# CarController Debug Replay Guide
|
||||
|
||||
This guide outlines the steps needed to replay a drive and debug `carcontroller.py` using breakpoints in the `card.py` process.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Step 1: Set Environment Variables
|
||||
|
||||
`card.py` requires environment variables to simulate the target vehicle. Set them before launching the process.
|
||||
|
||||
Example for KIA EV9:
|
||||
|
||||
```sh
|
||||
export FINGERPRINT=KIA_EV9
|
||||
export SKIP_FW_QUERY=1
|
||||
```
|
||||
|
||||
You can add these to your shell session or prefix the command launching `card.py`.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Step 2: Launch `card.py` Manually
|
||||
|
||||
Start `card.py` as a standalone process so you can attach a debugger or use breakpoints.
|
||||
|
||||
```sh
|
||||
cd selfdrive/car
|
||||
python card.py
|
||||
```
|
||||
|
||||
> 🔑 Make sure your breakpoints are set **in this process**, not in the replay one.
|
||||
|
||||
---
|
||||
|
||||
## 🔁 Step 3: Run the Replay
|
||||
|
||||
Use the `replay` tool to play back a segment, blocking certain publishers to avoid conflicts with the live `card.py`.
|
||||
|
||||
### Example:
|
||||
|
||||
```sh
|
||||
./tools/replay/replay "cb6aec3054a67f94/00000273--dae50621b9" \
|
||||
--block "sendcan,carState,carParams,carOutput,liveTracks,carParamsSP,carStateSP"
|
||||
```
|
||||
|
||||
This prevents `replay` from publishing messages that `card.py` is responsible for generating.
|
||||
|
||||
---
|
||||
|
||||
|
||||
## 🔧 Common Issues
|
||||
|
||||
| Symptom | Likely Cause |
|
||||
| ---------------------------------------- | ----------------------------------------------------------------------------------- |
|
||||
| No breakpoints hit in `carcontroller.py` | Replay is blocking too much or not enough. Confirm `card.py` is running standalone. |
|
||||
| No CAN output | `sendcan` not blocked in replay; conflict with replay publisher. |
|
||||
| No data in replay | Incorrect segment path or segment not downloaded properly. |
|
||||
|
||||
---
|
||||
|
||||
## 📝 Segment Path Format
|
||||
|
||||
The path used in `replay` follows this format:
|
||||
|
||||
```
|
||||
<route_prefix>/<segment_name>
|
||||
```
|
||||
|
||||
Example:
|
||||
|
||||
```sh
|
||||
cb6aec3054a67f94/00000273--dae50621b9
|
||||
```
|
||||
|
||||
@@ -21,7 +21,6 @@ Ecu = CarParams.Ecu
|
||||
NO_DATES_PLATFORMS = {
|
||||
# CAN FD
|
||||
CAR.KIA_SPORTAGE_5TH_GEN,
|
||||
CAR.KIA_SPORTAGE_HEV_2026, # no date on camera
|
||||
CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN,
|
||||
CAR.HYUNDAI_TUCSON_4TH_GEN,
|
||||
# CAN
|
||||
@@ -201,7 +200,7 @@ class TestHyundaiFingerprint(unittest.TestCase):
|
||||
else:
|
||||
assert all(date is not None for _, date in codes)
|
||||
|
||||
if car_model in (CAR.HYUNDAI_GENESIS, CAR.KIA_SPORTAGE_HEV_2026):
|
||||
if car_model == CAR.HYUNDAI_GENESIS:
|
||||
raise unittest.SkipTest("No part numbers for car model")
|
||||
|
||||
# Hyundai places the ECU part number in their FW versions, assert all parsable
|
||||
|
||||
@@ -3,7 +3,6 @@ from dataclasses import dataclass, field
|
||||
from enum import IntFlag
|
||||
|
||||
from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms, uds
|
||||
from opendbc.car.lateral import AngleSteeringLimitsVM
|
||||
from opendbc.car.common.conversions import Conversions as CV
|
||||
from opendbc.car.structs import CarParams
|
||||
from opendbc.car.docs_definitions import CarHarness, CarDocs, CarParts, SupportType
|
||||
@@ -18,22 +17,6 @@ class CarControllerParams:
|
||||
ACCEL_MIN = -3.5 # m/s^2
|
||||
ACCEL_MAX = 2.0 # m/s^2
|
||||
|
||||
ANGLE_LIMITS: AngleSteeringLimitsVM = AngleSteeringLimitsVM(
|
||||
# Steering angle limits based on observed stock ADAS behavior:
|
||||
# - LKAS max requested angle is 176.7°, but no fault occurs if higher values are requested.
|
||||
# - LFA max stock value is 119.9°.
|
||||
# The ADAS ECU clamps LKAS commands above 176.7° down to 176.7°,
|
||||
# and clamps LFA commands above 119.9° down to 119.9°.
|
||||
360, # degrees (safe upper bound for command, allowing some margin)
|
||||
MAX_ANGLE_RATE=5 # comfort rate limit for angle commands, in degrees per frame.
|
||||
)
|
||||
|
||||
# More torque optimization
|
||||
# The torque is calculated based on the curvature of the road and the speed of the car and it's a percentage of the maximum torque.
|
||||
SMOOTHING_ANGLE_VEGO_MATRIX = [0, 8.5, 11, 13.8, 18]
|
||||
SMOOTHING_ANGLE_ALPHA_MATRIX = [0.05, 0.1, 0.3, 0.6, 1]
|
||||
SMOOTHING_ANGLE_MAX_VEGO = SMOOTHING_ANGLE_VEGO_MATRIX[-1]
|
||||
|
||||
def __init__(self, CP):
|
||||
self.STEER_DELTA_UP = 3
|
||||
self.STEER_DELTA_DOWN = 7
|
||||
@@ -51,9 +34,6 @@ class CarControllerParams:
|
||||
self.STEER_DELTA_UP = 2
|
||||
self.STEER_DELTA_DOWN = 3
|
||||
|
||||
if CP.flags & HyundaiFlags.CANFD_ANGLE_STEERING:
|
||||
self.STEER_THRESHOLD = 175
|
||||
|
||||
# To determine the limit for your car, find the maximum value that the stock LKAS will request.
|
||||
# If the max stock LKAS request is <384, add your car to this list.
|
||||
elif CP.carFingerprint in (CAR.GENESIS_G80, CAR.HYUNDAI_ELANTRA, CAR.HYUNDAI_ELANTRA_GT_I30, CAR.HYUNDAI_IONIQ,
|
||||
@@ -88,7 +68,6 @@ class HyundaiSafetyFlags(IntFlag):
|
||||
CANFD_LKA_STEER_MSG_ALT = 128
|
||||
FCEV_GAS = 256
|
||||
ALT_LIMITS_2 = 512
|
||||
CANFD_ANGLE_STEERING = 1024
|
||||
|
||||
|
||||
# Hyundai/Kia/Genesis SCC (Smart Cruise Control) and steering architecture:
|
||||
@@ -170,8 +149,6 @@ class HyundaiFlags(IntFlag):
|
||||
|
||||
ALT_LIMITS_2 = 2 ** 26
|
||||
|
||||
CANFD_ANGLE_STEERING = 2 ** 27
|
||||
|
||||
|
||||
@dataclass
|
||||
class HyundaiCarDocs(CarDocs):
|
||||
@@ -230,14 +207,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=1675, wheelbase=2.885, steerRatio=14.5),
|
||||
flags=HyundaiFlags.HYBRID,
|
||||
)
|
||||
HYUNDAI_AZERA_HEV_7TH_GEN = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai AZERA Hybrid (with HDA II & LFA2) 2025", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_s])),
|
||||
],
|
||||
CarSpecs(mass=1720, wheelbase=2.895, steerRatio=13.5),
|
||||
flags=HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
HYUNDAI_ELANTRA = HyundaiPlatformConfig(
|
||||
[
|
||||
# TODO: 2017-18 could be Hyundai G
|
||||
@@ -364,14 +333,6 @@ class CAR(Platforms):
|
||||
HYUNDAI_SANTA_FE.specs,
|
||||
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
|
||||
)
|
||||
HYUNDAI_SANTA_FE_HEV_5TH_GEN = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai Santa Fe Hybrid (with HDA II & LFA2) 2024-25", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_p])),
|
||||
],
|
||||
CarSpecs(mass=2035, wheelbase=2.81, steerRatio=13.72),
|
||||
flags=HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
HYUNDAI_SONATA = HyundaiPlatformConfig(
|
||||
[HyundaiCarDocs("Hyundai Sonata 2020-23", "All", video="https://www.youtube.com/watch?v=ix63r9kE3Fw",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_a]))],
|
||||
@@ -422,14 +383,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65),
|
||||
flags=HyundaiFlags.EV,
|
||||
)
|
||||
HYUNDAI_IONIQ_5_PE = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai Ioniq 5 PE (with HDA II & LFA2) 2025-26", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_q]))
|
||||
],
|
||||
HYUNDAI_IONIQ_5.specs,
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai Ioniq 6 (without HDA II) 2023-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])),
|
||||
@@ -438,14 +391,6 @@ class CAR(Platforms):
|
||||
HYUNDAI_IONIQ_5.specs,
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
|
||||
)
|
||||
HYUNDAI_IONIQ_9 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai Ioniq 9 (with HDA II & LFA2) 2025-26", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_m]))
|
||||
],
|
||||
CarSpecs(mass=2700, wheelbase=3.13, steerRatio=16.02),
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
HYUNDAI_TUCSON_4TH_GEN = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Hyundai Tucson 2022", car_parts=CarParts.common([CarHarness.hyundai_n])),
|
||||
@@ -575,13 +520,6 @@ class CAR(Platforms):
|
||||
# weight from SX and above trims, average of FWD and AWD version, steering ratio according to Kia News https://www.kiamedia.com/us/en/models/sportage/2023/specifications
|
||||
CarSpecs(mass=1725, wheelbase=2.756, steerRatio=13.6),
|
||||
)
|
||||
KIA_SPORTAGE_HEV_2026 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia Sportage Hybrid 2026", car_parts=CarParts.common([CarHarness.hyundai_n])),
|
||||
],
|
||||
CarSpecs(mass=1812, wheelbase=2.756, steerRatio=13.7),
|
||||
flags=HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
KIA_SORENTO = HyundaiPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia Sorento 2018", "Advanced Smart Cruise Control & LKAS", video="https://www.youtube.com/watch?v=Fkh3s6WHJz8",
|
||||
@@ -604,13 +542,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=4395 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
|
||||
flags=HyundaiFlags.CANFD_RADAR_SCC,
|
||||
)
|
||||
KIA_SORENTO_HEV_4TH_GEN_LFA2 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia Sorento Hybrid 2026", "All", car_parts=CarParts.common([CarHarness.hyundai_q])),
|
||||
],
|
||||
CarSpecs(mass=1970, wheelbase=2.814, steerRatio=13.27, tireStiffnessFactor=0.65),
|
||||
flags=HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
KIA_STINGER = HyundaiPlatformConfig(
|
||||
[HyundaiCarDocs("Kia Stinger 2018-20", video="https://www.youtube.com/watch?v=MJ94qoofYw0",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_c]))],
|
||||
@@ -634,20 +565,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
|
||||
flags=HyundaiFlags.EV,
|
||||
)
|
||||
KIA_EV6_2025 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia EV6 (with HDA I) 2025", "Highway Driving Assist I", car_parts=CarParts.common([CarHarness.hyundai_p]))
|
||||
],
|
||||
CarSpecs(mass=2055, wheelbase=2.9, steerRatio=16, tireStiffnessFactor=0.65),
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
KIA_EV9 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia EV9 2025-26", car_parts=CarParts.common([CarHarness.hyundai_r]))
|
||||
],
|
||||
CarSpecs(mass=2664, wheelbase=3.1, steerRatio=16),
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
KIA_CARNIVAL_4TH_GEN = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Kia Carnival 2022-24", car_parts=CarParts.common([CarHarness.hyundai_a])),
|
||||
@@ -698,13 +615,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=2260, wheelbase=2.87, steerRatio=17.1),
|
||||
flags=HyundaiFlags.EV,
|
||||
)
|
||||
GENESIS_GV70_ELECTRIFIED_2ND_GEN = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Genesis GV70 Electrified 2026", "All", car_parts=CarParts.common([CarHarness.hyundai_m])),
|
||||
],
|
||||
GENESIS_GV70_ELECTRIFIED_1ST_GEN.specs,
|
||||
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
GENESIS_G80 = HyundaiPlatformConfig(
|
||||
[HyundaiCarDocs("Genesis G80 2018-19", "All", car_parts=CarParts.common([CarHarness.hyundai_h]))],
|
||||
CarSpecs(mass=2060, wheelbase=3.01, steerRatio=16.5),
|
||||
@@ -723,16 +633,6 @@ class CAR(Platforms):
|
||||
CarSpecs(mass=2258, wheelbase=2.95, steerRatio=14.14),
|
||||
flags=HyundaiFlags.CANFD_RADAR_SCC,
|
||||
)
|
||||
GENESIS_GV80_2025 = HyundaiCanFDPlatformConfig(
|
||||
[
|
||||
HyundaiCarDocs("Genesis GV80 (3.5T Prestige Trim, with HDA II & LFA2) 2025", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_q])),
|
||||
HyundaiCarDocs("Genesis GV80 Coupe (with HDA II & LFA2) 2025", "Highway Driving Assist II & Lane Follow Assist 2",
|
||||
car_parts=CarParts.common([CarHarness.hyundai_q])),
|
||||
],
|
||||
GENESIS_GV80.specs,
|
||||
flags=HyundaiFlags.CANFD_ANGLE_STEERING,
|
||||
)
|
||||
|
||||
# port extensions
|
||||
HYUNDAI_BAYON_1ST_GEN_NON_SCC = HyundaiNonSccPlatformConfig(
|
||||
@@ -882,7 +782,7 @@ PART_NUMBER_FW_PATTERN = re.compile(b'(?<=[0-9][.,][0-9]{2} )([0-9]{5}[-/]?[A-Z]
|
||||
CANFD_FUZZY_WHITELIST = {CAR.KIA_SORENTO_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN, CAR.KIA_K8_HEV_1ST_GEN,
|
||||
CAR.KIA_SPORTAGE_5TH_GEN,
|
||||
# TODO: the hybrid variant is not out yet
|
||||
CAR.KIA_CARNIVAL_4TH_GEN, CAR.KIA_SORENTO_HEV_4TH_GEN_LFA2}
|
||||
CAR.KIA_CARNIVAL_4TH_GEN}
|
||||
|
||||
# List of ECUs expected to have platform codes, camera and radar should exist on all cars
|
||||
# TODO: use abs, it has the platform code and part number on many platforms
|
||||
|
||||
@@ -246,8 +246,6 @@ class CarInterfaceBase(ABC, CarInterfaceBaseSP):
|
||||
ret.steerRatioRear = 0. # no rear steering, at least on the listed cars aboveA
|
||||
ret.openpilotLongitudinalControl = False
|
||||
ret.stopAccel = -2.0
|
||||
ret.longitudinalTuning.kpBP = [0.]
|
||||
ret.longitudinalTuning.kpV = [0.]
|
||||
ret.longitudinalTuning.kiBP = [0.]
|
||||
ret.longitudinalTuning.kiV = [0.]
|
||||
# TODO estimate car specific lag, use .15s for now
|
||||
|
||||
@@ -148,7 +148,7 @@ def get_max_angle_vm(v_ego_raw: float, VM: VehicleModel, limits):
|
||||
|
||||
|
||||
def apply_steer_angle_limits_vm(apply_angle: float, apply_angle_last: float, v_ego_raw: float, steering_angle: float,
|
||||
lat_active: bool, limits, VM: VehicleModel) -> float | None:
|
||||
lat_active: bool, limits, VM: VehicleModel) -> float:
|
||||
"""Apply jerk, accel, and safety limit constraints to steering angle."""
|
||||
v_ego_raw = max(v_ego_raw, 1)
|
||||
|
||||
@@ -163,13 +163,6 @@ def apply_steer_angle_limits_vm(apply_angle: float, apply_angle_last: float, v_e
|
||||
max_angle = get_max_angle_vm(v_ego_raw, VM, limits)
|
||||
new_apply_angle = np.clip(new_apply_angle, -max_angle, max_angle)
|
||||
|
||||
# Check if lateral acceleration limits comply with max delta limits
|
||||
safety_violation = lat_active and new_apply_angle != rate_limit(new_apply_angle, apply_angle_last, -max_angle_delta, max_angle_delta)
|
||||
|
||||
# Shouldn't give any angle, since there's no good choice. We are vatiolating either way.
|
||||
if safety_violation:
|
||||
return None
|
||||
|
||||
# angle is current angle when inactive
|
||||
if not lat_active:
|
||||
new_apply_angle = steering_angle
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
from opendbc.can.packer import CANPacker
|
||||
from opendbc.car import Bus
|
||||
from opendbc.car.lateral import apply_driver_steer_torque_limits
|
||||
from opendbc.car.interfaces import CarControllerBase
|
||||
from opendbc.car.mg.mgcan import create_lka_steering
|
||||
from opendbc.car.mg.values import CarControllerParams
|
||||
|
||||
|
||||
class CarController(CarControllerBase):
|
||||
def __init__(self, dbc_names, CP, CP_SP):
|
||||
super().__init__(dbc_names, CP, CP_SP)
|
||||
self.packer = CANPacker(dbc_names[Bus.pt])
|
||||
|
||||
self.apply_torque_last = 0
|
||||
|
||||
def update(self, CC, CC_SP, CS, now_nanos):
|
||||
actuators = CC.actuators
|
||||
can_sends = []
|
||||
|
||||
# steering command
|
||||
if self.frame % CarControllerParams.STEER_STEP == 0:
|
||||
if CC.latActive:
|
||||
new_torque = int(round(actuators.torque * CarControllerParams.STEER_MAX))
|
||||
apply_torque = apply_driver_steer_torque_limits(new_torque, self.apply_torque_last, CS.out.steeringTorque, CarControllerParams)
|
||||
else:
|
||||
apply_torque = 0
|
||||
|
||||
self.apply_torque_last = apply_torque
|
||||
can_sends.append(create_lka_steering(self.packer, (self.frame // CarControllerParams.STEER_STEP) % 16, apply_torque, CC.latActive))
|
||||
|
||||
new_actuators = actuators.as_builder()
|
||||
new_actuators.torque = self.apply_torque_last / CarControllerParams.STEER_MAX
|
||||
new_actuators.torqueOutputCan = self.apply_torque_last
|
||||
|
||||
self.frame += 1
|
||||
return new_actuators, can_sends
|
||||
@@ -0,0 +1,76 @@
|
||||
from opendbc.can.parser import CANParser
|
||||
from opendbc.car import Bus, structs
|
||||
from opendbc.car.interfaces import CarStateBase
|
||||
from opendbc.car.mg.values import DBC
|
||||
from opendbc.car.common.conversions import Conversions as CV
|
||||
|
||||
GearShifter = structs.CarState.GearShifter
|
||||
|
||||
GEAR_MAP = {
|
||||
0: GearShifter.unknown,
|
||||
15: GearShifter.park,
|
||||
14: GearShifter.reverse,
|
||||
13: GearShifter.neutral,
|
||||
**{i: GearShifter.drive for i in range(1, 9)},
|
||||
}
|
||||
|
||||
|
||||
class CarState(CarStateBase):
|
||||
def update(self, can_parsers) -> structs.CarState:
|
||||
cp = can_parsers[Bus.pt]
|
||||
cp_cam = can_parsers[Bus.cam]
|
||||
ret = structs.CarState()
|
||||
ret_sp = structs.CarStateSP()
|
||||
|
||||
# Vehicle speed
|
||||
ret.vEgoRaw = cp.vl["SCS_HSC2_FrP19"]["VehSpdAvgHSC2"] * CV.KPH_TO_MS
|
||||
ret.vEgo, ret.aEgo = self.update_speed_kf(ret.vEgoRaw)
|
||||
ret.standstill = cp.vl["SCS_HSC2_FrP24"]["VehSdslStsHSC2"] == 1
|
||||
|
||||
# Gas pedal
|
||||
ret.gasPressed = cp.vl["GW_HSC2_HCU_FrP00"]["EPTAccelActuPosHSC2"] > 0
|
||||
|
||||
# Brake pedal
|
||||
ret.brakePressed = cp.vl["EHBS_HSC2_FrP00"]["BrkPdlAppdHSC2"] == 1
|
||||
|
||||
# Steering wheel
|
||||
ret.steeringAngleDeg = cp.vl["SAS_HSC2_FrP00"]["StrgWhlAngHSC2"]
|
||||
ret.steeringRateDeg = cp.vl["SAS_HSC2_FrP00"]["StrgWhlAngGrdHSC2"]
|
||||
ret.steeringTorque = cp.vl["EPS_HSC2_FrP03"]["DrvrStrgDlvrdToqHSC2"]
|
||||
ret.steeringTorqueEps = cp.vl["EPS_HSC2_FrP03"]["ChLKARespToqHSC2"]
|
||||
ret.steeringPressed = self.update_steering_pressed(abs(ret.steeringTorque) > 1.0, 5)
|
||||
|
||||
ret.steerFaultTemporary = cp_cam.vl["FVCM_HSC2_FrP02"]["LDWSysFltStsHSC2"] != 0
|
||||
|
||||
# Cruise state
|
||||
ret.cruiseState.enabled = cp.vl["RADAR_HSC2_FrP00"]["ACCSysSts_RadarHSC2"] in (2, 3) # Active, Override
|
||||
ret.cruiseState.available = cp.vl["RADAR_HSC2_FrP00"]["ACCSysSts_RadarHSC2"] != 0
|
||||
ret.cruiseState.standstill = False
|
||||
ret.cruiseState.speed = cp.vl["RADAR_HSC2_FrP02"]["ACCDrvrSelTrgtSpd_RadarHSC2"] * CV.KPH_TO_MS
|
||||
|
||||
ret.accFaulted = cp.vl["RADAR_HSC2_FrP00"]["ACCSysFltSts_SCSHSC2"] != 0
|
||||
|
||||
# Gear
|
||||
ret.gearShifter = GEAR_MAP.get(int(cp.vl["GW_HSC2_ECM_FrP04"]["TrEstdGearHSC2"]), GearShifter.unknown)
|
||||
|
||||
# Doors
|
||||
ret.doorOpen = any([cp.vl["GW_HSC2_BCM_FrP04"]["DrvrDoorOpenStsHSC2"],
|
||||
cp.vl["GW_HSC2_BCM_FrP04"]["FrtPsngDoorOpenStsHSC2"],
|
||||
cp.vl["GW_HSC2_BCM_FrP04"]["RLDoorOpenStsHSC2"],
|
||||
cp.vl["GW_HSC2_BCM_FrP04"]["RRDoorOpenStsHSC2"]])
|
||||
|
||||
# Blinkers
|
||||
ret.leftBlinker = cp.vl["GW_HSC2_BCM_FrP04"]["DircnIndLampSwStsHSC2"] == 1
|
||||
ret.rightBlinker = cp.vl["GW_HSC2_BCM_FrP04"]["DircnIndLampSwStsHSC2"] == 2
|
||||
|
||||
# Seatbelt
|
||||
ret.seatbeltUnlatched = cp.vl["GW_HSC2_SDM_FrP00"]["DrvrSbltAtcHSC2"] != 1
|
||||
|
||||
return ret, ret_sp
|
||||
|
||||
@staticmethod
|
||||
def get_can_parsers(CP, CP_SP):
|
||||
return {
|
||||
Bus.pt: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 0),
|
||||
Bus.cam: CANParser(DBC[CP.carFingerprint][Bus.pt], [], 2),
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
from opendbc.car.structs import CarParams
|
||||
from opendbc.car.mg.values import CAR
|
||||
|
||||
Ecu = CarParams.Ecu
|
||||
|
||||
FW_VERSIONS = {
|
||||
CAR.MG_5_EV: {
|
||||
(Ecu.eps, 0x721, None): [
|
||||
b'\x10gs\x16\x01',
|
||||
],
|
||||
(Ecu.fwdCamera, 0x733, None): [
|
||||
b'\x10y\x00 \x01',
|
||||
],
|
||||
(Ecu.fwdRadar, 0x734, None): [
|
||||
b'\x10y\x000\x01',
|
||||
],
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
from opendbc.car import get_safety_config, structs
|
||||
from opendbc.car.interfaces import CarInterfaceBase
|
||||
from opendbc.car.mg.carcontroller import CarController
|
||||
from opendbc.car.mg.carstate import CarState
|
||||
|
||||
|
||||
class CarInterface(CarInterfaceBase):
|
||||
CarState = CarState
|
||||
CarController = CarController
|
||||
|
||||
@staticmethod
|
||||
def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, alpha_long, is_release, docs) -> structs.CarParams:
|
||||
ret.brand = "mg"
|
||||
ret.dashcamOnly = True
|
||||
|
||||
ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.mg)]
|
||||
|
||||
ret.steerActuatorDelay = 0.3
|
||||
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning)
|
||||
|
||||
ret.steerControlType = structs.CarParams.SteerControlType.torque
|
||||
ret.radarUnavailable = True
|
||||
ret.alphaLongitudinalAvailable = False
|
||||
|
||||
return ret
|
||||
@@ -0,0 +1,28 @@
|
||||
def calc_checksum(values):
|
||||
lka_req_toq = values['LKAReqToqHSC2'] + 0x400
|
||||
lka_req_toq_sts = values['LKAReqToqStsHSC2']
|
||||
lka_req_toq_v = values['LKAReqToqVHSC2']
|
||||
lka_alv_rc = values['LKAAlvRCHSC2']
|
||||
|
||||
combined = ((lka_req_toq << 1) | (lka_req_toq_sts << 12) | lka_req_toq_v) & 0x3FFF
|
||||
with_counter = (combined + lka_alv_rc) & 0x3FFF
|
||||
checksum = ((~with_counter) + 1) & 0x3FFF
|
||||
|
||||
return checksum
|
||||
|
||||
|
||||
def create_lka_steering(packer, counter, apply_torque, active):
|
||||
values = {
|
||||
"LKAReqToqHSC2": apply_torque,
|
||||
"LKAReqToqVHSC2": 0,
|
||||
"LKAAlvRCHSC2": counter,
|
||||
"LDWLKAVbnLvlReqHSC2": 0, # TODO: vibration level?
|
||||
"LKASysStsHSC2": 0,
|
||||
"LKAReqToqStsHSC2": active,
|
||||
"LKASysFltStsHSC2": 0,
|
||||
"LKADrvrTkovReqHSC2": 0,
|
||||
"LKAReqToqPVHSC2": 0
|
||||
}
|
||||
|
||||
values["LKAReqToqPVHSC2"] = calc_checksum(values)
|
||||
return packer.make_can_msg("FVCM_HSC2_FrP03", 0, values)
|
||||
@@ -0,0 +1,47 @@
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
from opendbc.car import Bus, CarSpecs, DbcDict, PlatformConfig, Platforms
|
||||
from opendbc.car.docs_definitions import CarHarness, CarDocs, CarParts
|
||||
from opendbc.car.fw_query_definitions import FwQueryConfig, Request, StdQueries
|
||||
|
||||
|
||||
@dataclass
|
||||
class MgCarDocs(CarDocs):
|
||||
package: str = "All"
|
||||
car_parts: CarParts = field(default_factory=CarParts.common([CarHarness.vw_a]))
|
||||
|
||||
|
||||
@dataclass
|
||||
class MgPlatformConfig(PlatformConfig):
|
||||
dbc_dict: DbcDict = field(default_factory=lambda: {Bus.pt: 'mg'})
|
||||
|
||||
|
||||
class CAR(Platforms):
|
||||
MG_5_EV = MgPlatformConfig([MgCarDocs("MG 5 EV 2021")], CarSpecs(mass=1640., wheelbase=2.66, steerRatio=15.8))
|
||||
|
||||
|
||||
FW_QUERY_CONFIG = FwQueryConfig(
|
||||
fw_version_regex=br"\x10[\x00-\xff]{3}\x01",
|
||||
requests=[
|
||||
Request(
|
||||
[StdQueries.TESTER_PRESENT_REQUEST, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_REQUEST],
|
||||
[StdQueries.TESTER_PRESENT_RESPONSE, StdQueries.MANUFACTURER_ECU_HARDWARE_NUMBER_RESPONSE],
|
||||
bus=1,
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
class CarControllerParams:
|
||||
STEER_STEP = 2 # FVCM_HSC2_FrP03 message frequency 50Hz
|
||||
STEER_MAX = 300
|
||||
STEER_DELTA_UP = 6 # Max torque reached in 1.00s (STEER_MAX / (50Hz * 1.00))
|
||||
STEER_DELTA_DOWN = 10 # Min torque reached in 0.60s (STEER_MAX / (50Hz * 0.60))
|
||||
STEER_DRIVER_ALLOWANCE = 100 # allowed driver torque before start limiting
|
||||
STEER_DRIVER_MULTIPLIER = 2 # weight driver torque
|
||||
STEER_DRIVER_FACTOR = 100
|
||||
|
||||
def __init__(self, CP):
|
||||
pass
|
||||
|
||||
|
||||
DBC = CAR.create_dbc_map()
|
||||
@@ -87,8 +87,9 @@ class CarInterface(CarInterfaceBase):
|
||||
else:
|
||||
raise ValueError(f"unknown car: {candidate}")
|
||||
|
||||
ret.alphaLongitudinalAvailable = not (ret.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL |
|
||||
SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID))
|
||||
# TODO: the longitudinal limits need to be speed-dependent, so alpha long is disabled for now
|
||||
# revert this in the PR that re-enables Subaru longitudinal: https://github.com/commaai/opendbc/pull/3689
|
||||
ret.alphaLongitudinalAvailable = False
|
||||
ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable
|
||||
|
||||
if ret.flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl:
|
||||
|
||||
@@ -16,6 +16,7 @@ from opendbc.car.values import Platform
|
||||
from opendbc.car.volkswagen.values import CAR as VOLKSWAGEN
|
||||
from opendbc.car.body.values import CAR as COMMA
|
||||
from opendbc.car.psa.values import CAR as PSA
|
||||
from opendbc.car.mg.values import CAR as MG
|
||||
|
||||
# FIXME: add routes for these cars
|
||||
non_tested_cars = [
|
||||
@@ -55,20 +56,6 @@ non_tested_cars = [
|
||||
GM.CADILLAC_XT5_NON_ACC_1ST_GEN,
|
||||
]
|
||||
|
||||
# HKG Angle Steering (LFA2) (Still WIP, hence why ignored)
|
||||
non_tested_cars += [
|
||||
HYUNDAI.GENESIS_GV80_2025,
|
||||
HYUNDAI.HYUNDAI_IONIQ_5_PE,
|
||||
HYUNDAI.HYUNDAI_IONIQ_9,
|
||||
HYUNDAI.KIA_EV6_2025,
|
||||
HYUNDAI.KIA_EV9,
|
||||
HYUNDAI.GENESIS_GV70_ELECTRIFIED_2ND_GEN,
|
||||
HYUNDAI.HYUNDAI_SANTA_FE_HEV_5TH_GEN,
|
||||
HYUNDAI.KIA_SPORTAGE_HEV_2026,
|
||||
HYUNDAI.KIA_SORENTO_HEV_4TH_GEN_LFA2,
|
||||
HYUNDAI.HYUNDAI_AZERA_HEV_7TH_GEN,
|
||||
]
|
||||
|
||||
|
||||
class CarTestRoute(NamedTuple):
|
||||
route: str
|
||||
@@ -175,7 +162,6 @@ routes = [
|
||||
CarTestRoute("ca4de5b12321bd98/2022-10-18--21-15-59", HYUNDAI.GENESIS_GV70_1ST_GEN),
|
||||
CarTestRoute("afe09b9f5d3f3548/00000011--15fefe1c50", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN),
|
||||
CarTestRoute("afe09b9f5d3f3548/0000001b--a1129a4a15", HYUNDAI.GENESIS_GV70_ELECTRIFIED_1ST_GEN), # openpilot longitudinal enabled
|
||||
#CarTestRoute("afe09b9f5d3f3548/0000000b--0ac07f9835", HYUNDAI.GENESIS_GV70_ELECTRIFIED_2ND_GEN), # openpilot longitudinal enabled
|
||||
CarTestRoute("6b301bf83f10aa90/2020-11-22--16-45-07", HYUNDAI.GENESIS_G80),
|
||||
CarTestRoute("66eaa6c3b6b2afc6/00000009--3a5199aabe", HYUNDAI.GENESIS_G80_2ND_GEN_FL), # LKA steering
|
||||
CarTestRoute("0bbe367c98fa1538/2023-09-16--00-16-49", HYUNDAI.HYUNDAI_CUSTIN_1ST_GEN),
|
||||
@@ -184,7 +170,6 @@ routes = [
|
||||
CarTestRoute("bf43d9df2b660eb0/2021-09-23--14-16-37", HYUNDAI.HYUNDAI_SANTA_FE_2022),
|
||||
CarTestRoute("37398f32561a23ad/2021-11-18--00-11-35", HYUNDAI.HYUNDAI_SANTA_FE_HEV_2022),
|
||||
CarTestRoute("656ac0d830792fcc/2021-12-28--14-45-56", HYUNDAI.HYUNDAI_SANTA_FE_PHEV_2022, segment=1),
|
||||
#CarTestRoute("51489459ad31cccc/00000001--642891d0af", HYUNDAI.HYUNDAI_SANTA_FE_HEV_5TH_GEN), # 2025 HDA2 Angle Control
|
||||
CarTestRoute("de59124955b921d8/2023-06-24--00-12-50", HYUNDAI.KIA_CARNIVAL_4TH_GEN),
|
||||
CarTestRoute("409c9409979a8abc/2023-07-11--09-06-44", HYUNDAI.KIA_CARNIVAL_4TH_GEN), # Chinese model
|
||||
CarTestRoute("e0e98335f3ebc58f/2021-03-07--16-38-29", HYUNDAI.KIA_CEED),
|
||||
@@ -205,9 +190,7 @@ routes = [
|
||||
CarTestRoute("628935d7d3e5f4f7/2022-11-30--01-12-46", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN), # plug-in hybrid
|
||||
CarTestRoute("9c917ba0d42ffe78/2020-04-17--12-43-19", HYUNDAI.HYUNDAI_PALISADE),
|
||||
CarTestRoute("05a8f0197fdac372/2022-10-19--14-14-09", HYUNDAI.HYUNDAI_IONIQ_5), # LKA steering
|
||||
#CarTestRoute("e1107f9d04dfb1e2/00000455--9b2328ec73", HYUNDAI.HYUNDAI_IONIQ_5_PE), # LKA steering HDA2 LFA2
|
||||
CarTestRoute("eb4eae1476647463/2023-08-26--18-07-04", HYUNDAI.HYUNDAI_IONIQ_6, segment=6), # LKA steering
|
||||
# CarTestRoute("71e4e67d29034771/0000001b--b7b4774ec4", HYUNDAI.HYUNDAI_IONIQ_9), # LKA steering # Angle steering
|
||||
CarTestRoute("3f29334d6134fcd4/2022-03-30--22-00-50", HYUNDAI.HYUNDAI_IONIQ_PHEV_2019),
|
||||
CarTestRoute("fa8db5869167f821/2021-06-10--22-50-10", HYUNDAI.HYUNDAI_IONIQ_PHEV),
|
||||
CarTestRoute("e1107f9d04dfb1e2/2023-09-05--22-32-12", HYUNDAI.HYUNDAI_IONIQ_PHEV), # openpilot longitudinal enabled
|
||||
@@ -230,9 +213,6 @@ routes = [
|
||||
CarTestRoute("d624b3d19adce635/2020-08-01--14-59-12", HYUNDAI.HYUNDAI_VELOSTER),
|
||||
CarTestRoute("d545129f3ca90f28/2022-10-19--09-22-54", HYUNDAI.KIA_EV6), # LKA steering
|
||||
CarTestRoute("68d6a96e703c00c9/2022-09-10--16-09-39", HYUNDAI.KIA_EV6), # LFA steering
|
||||
#CarTestRoute("84711a8268bf3b9a|2024-11-27--00-04-53", HYUNDAI.KIA_EV6_2025), # 2025 HDA1 Angle Control
|
||||
#CarTestRoute("fab807792f63fea6/00000283--e3d8c65d78", HYUNDAI.KIA_EV6_2025), # 2025 Angle Control
|
||||
#CarTestRoute("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", HYUNDAI.KIA_EV9), # 2025 HDA1 Angle Control
|
||||
CarTestRoute("9b25e8c1484a1b67/2023-04-13--10-41-45", HYUNDAI.KIA_EV6),
|
||||
CarTestRoute("007d5e4ad9f86d13/2021-09-30--15-09-23", HYUNDAI.KIA_K5_2021),
|
||||
CarTestRoute("c58dfc9fc16590e0/2023-01-14--13-51-48", HYUNDAI.KIA_K5_HEV_2020),
|
||||
@@ -248,7 +228,6 @@ routes = [
|
||||
CarTestRoute("192283cdbb7a58c2/2022-10-15--01-43-18", HYUNDAI.KIA_SPORTAGE_5TH_GEN),
|
||||
CarTestRoute("09559f1fcaed4704/2023-11-16--02-24-57", HYUNDAI.KIA_SPORTAGE_5TH_GEN, segment=0), # openpilot longitudinal
|
||||
CarTestRoute("b3537035ffe6a7d6/2022-10-17--15-23-49", HYUNDAI.KIA_SPORTAGE_5TH_GEN), # hybrid
|
||||
#CarTestRoute("1635e7fee82dec3b/00000000--aa7efe7199", HYUNDAI.KIA_SPORTAGE_HEV_2026), # 2025 Angle Control
|
||||
CarTestRoute("c5ac319aa9583f83/2021-06-01--18-18-31", HYUNDAI.HYUNDAI_ELANTRA),
|
||||
CarTestRoute("734ef96182ddf940/2022-10-02--16-41-44", HYUNDAI.HYUNDAI_ELANTRA_GT_I30),
|
||||
CarTestRoute("82e9cdd3f43bf83e/2021-05-15--02-42-51", HYUNDAI.HYUNDAI_ELANTRA_2021),
|
||||
@@ -256,7 +235,6 @@ routes = [
|
||||
CarTestRoute("7120aa90bbc3add7/2021-08-02--07-12-31", HYUNDAI.HYUNDAI_SONATA_HYBRID),
|
||||
CarTestRoute("715ac05b594e9c59/2021-10-27--23-24-56", HYUNDAI.GENESIS_G70_2020),
|
||||
CarTestRoute("6b0d44d22df18134/2023-05-06--10-36-55", HYUNDAI.GENESIS_GV80),
|
||||
#CarTestRoute("bf5d5a62cc79a28e/00000002--4d370e2bc2", HYUNDAI.GENESIS_GV80_2025),
|
||||
|
||||
CarTestRoute("00c829b1b7613dea/2021-06-24--09-10-10", TOYOTA.TOYOTA_ALPHARD_TSS2),
|
||||
CarTestRoute("912119ebd02c7a42/2022-03-19--07-24-50", TOYOTA.TOYOTA_ALPHARD_TSS2), # hybrid
|
||||
@@ -395,6 +373,8 @@ routes = [
|
||||
CarTestRoute("2c912ca5de3b1ee9/0000025d--6eb6bcbca4", TESLA.TESLA_MODEL_Y, segment=4),
|
||||
CarTestRoute("bdda168c0c35fad7/00000001--5c5a36ec06", TESLA.TESLA_MODEL_X), # openpilot longitudinal
|
||||
|
||||
CarTestRoute("5d61e2f6e1f247f3/00000054--d3dfb01b34", MG.MG_5_EV),
|
||||
|
||||
# Segments that test specific issues
|
||||
# Controls mismatch due to standstill threshold
|
||||
CarTestRoute("bec2dcfde6a64235/2022-04-08--14-21-32", HONDA.HONDA_CRV_HYBRID, segment=22),
|
||||
|
||||
@@ -53,7 +53,6 @@ def _make_car_test(car_name):
|
||||
assert car_params.maxLateralAccel > 0
|
||||
|
||||
# Longitudinal sanity checks
|
||||
assert len(car_params.longitudinalTuning.kpV) == len(car_params.longitudinalTuning.kpBP)
|
||||
assert len(car_params.longitudinalTuning.kiV) == len(car_params.longitudinalTuning.kiBP)
|
||||
|
||||
# If we're using the interceptor for gasPressed, we should be commanding gas with it
|
||||
|
||||
@@ -271,7 +271,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
||||
print(f'get_vin {name} case, query time={self.total_time / self.N} seconds')
|
||||
|
||||
def test_fw_query_timing(self):
|
||||
total_ref_time = 8.2
|
||||
total_ref_time = 8.3
|
||||
brand_ref_times = {
|
||||
'gm': 1.0,
|
||||
'body': 0.1,
|
||||
@@ -287,6 +287,7 @@ class TestFwFingerprintTiming(unittest.TestCase):
|
||||
'volkswagen': 0.65,
|
||||
'rivian': 0.3,
|
||||
'psa': 0.1,
|
||||
'mg': 0.1,
|
||||
}
|
||||
|
||||
total_times = 0.0
|
||||
|
||||
@@ -79,6 +79,7 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
|
||||
"KIA_K8_HEV_1ST_GEN" = [2.5, 2.5, 0.1]
|
||||
"HYUNDAI_CUSTIN_1ST_GEN" = [2.5, 2.5, 0.1]
|
||||
"LEXUS_GS_F" = [2.5, 2.5, 0.08]
|
||||
"MG_5_EV" = [1.2, 2.5, 0.18]
|
||||
"HYUNDAI_STARIA_4TH_GEN" = [1.8, 2.0, 0.15]
|
||||
"GENESIS_GV70_ELECTRIFIED_1ST_GEN" = [1.9, 1.9, 0.09]
|
||||
"GENESIS_G80_2ND_GEN_FL" = [2.5819356441497803, 2.5, 0.11244568973779678]
|
||||
@@ -115,15 +116,3 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
|
||||
# port extensions
|
||||
"HONDA_CLARITY" = [0.96, 0.4018518740819229, 0.19]
|
||||
"CHEVROLET_MALIBU_NON_ACC_9TH_GEN" = [1.85, 1.85, 0.075]
|
||||
|
||||
# Hyundai/Kia/Genesis angle control
|
||||
"HYUNDAI_IONIQ_5_PE" = [3.172929, 3.5, 0.096019]
|
||||
"HYUNDAI_IONIQ_9" = [2.5, 2.0, 0.05]
|
||||
"GENESIS_GV80_2025" = [2.5, 2.5, 0.1]
|
||||
"HYUNDAI_SANTA_FE_HEV_5TH_GEN" = [2.5, 2.5, 0.1]
|
||||
"KIA_EV6_2025" = [3.2, 2.093457, 0.005]
|
||||
"KIA_EV9" = [3.2, 2.093457, 0.005]
|
||||
"GENESIS_GV70_ELECTRIFIED_2ND_GEN" = [1.9, 1.9, 0.09]
|
||||
"KIA_SPORTAGE_HEV_2026" = [nan, 2.5, nan]
|
||||
"KIA_SORENTO_HEV_4TH_GEN_LFA2" = [nan, 2.5, nan]
|
||||
"HYUNDAI_AZERA_HEV_7TH_GEN" = [nan, 2.5, nan]
|
||||
|
||||
@@ -11,7 +11,8 @@ from opendbc.car.toyota import toyotacan
|
||||
from opendbc.car.toyota.values import CAR, NO_STOP_TIMER_CAR, TSS2_CAR, \
|
||||
CarControllerParams, ToyotaFlags
|
||||
from opendbc.can import CANPacker
|
||||
|
||||
from opendbc.sunnypilot.car.toyota.auto_brake_hold import AutoBrakeHoldCarController
|
||||
from opendbc.sunnypilot.car.toyota.enhanced_bsm import EnhancedBsmCarController
|
||||
from opendbc.sunnypilot.car.toyota.gas_interceptor import GasInterceptorCarController
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP
|
||||
|
||||
@@ -19,6 +20,7 @@ Ecu = structs.CarParams.Ecu
|
||||
LongCtrlState = structs.CarControl.Actuators.LongControlState
|
||||
SteerControlType = structs.CarParams.SteerControlType
|
||||
VisualAlert = structs.CarControl.HUDControl.VisualAlert
|
||||
GearShifter = structs.CarState.GearShifter
|
||||
|
||||
# The up limit allows the brakes/gas to unwind quickly leaving a stop,
|
||||
# the down limit roughly matches the rate of ACCEL_NET, reducing PCM compensation windup
|
||||
@@ -36,11 +38,20 @@ MAX_STEER_RATE_FRAMES = 17 # tx control frames needed before torque can be cut
|
||||
# EPS allows user torque above threshold for 50 frames before permanently faulting
|
||||
MAX_USER_TORQUE = 500
|
||||
|
||||
CRUISE_CANCEL_DELAY_FRAMES = 10
|
||||
|
||||
def get_long_tune(CP, params):
|
||||
def get_long_tune(CP, CP_SP, params):
|
||||
if CP.flags & ToyotaFlags.TSS2:
|
||||
kiBP = [2., 5.]
|
||||
kiV = [0.5, 0.25]
|
||||
if CP_SP.flags & ToyotaFlagsSP.TSS2_LONG_TUNING:
|
||||
#kiBP = [0., 2.0, 9.0, 14., 20., 27.]
|
||||
#kiV = [0.25, 0.25, 0.15, 0.12, 0.12, 0.12]
|
||||
#kiBP= [0., 1.0, 2.0, 3.0, 4.0, 5.0, 7., 20., 27., 36.]
|
||||
#kiV = [0.31, 0.32, 0.301, 0.280, 0.259, 0.226, 0.15, 0.15, 0.101, 0.10]
|
||||
kiBP = [0.0, 1.0, 3.0, 5.0, 12., 36.]
|
||||
kiV = [0.30, 0.35, 0.32, 0.28, 0.24, 0.20]
|
||||
else:
|
||||
kiBP = [2., 5.]
|
||||
kiV = [0.5, 0.25]
|
||||
else:
|
||||
kiBP = [0., 5., 35.]
|
||||
kiV = [3.6, 2.4, 1.5]
|
||||
@@ -63,9 +74,10 @@ class CarController(CarControllerBase, GasInterceptorCarController):
|
||||
self.permit_braking = True
|
||||
self.steer_rate_counter = 0
|
||||
self.distance_button = 0
|
||||
self.cancel_counter = 0
|
||||
|
||||
# *** start long control state ***
|
||||
self.long_pid = get_long_tune(self.CP, self.params)
|
||||
self.long_pid = get_long_tune(self.CP, self.CP_SP, self.params)
|
||||
self.aego = FirstOrderFilter(0.0, 0.25, DT_CTRL * 3)
|
||||
self.pitch = FirstOrderFilter(0, 0.5, DT_CTRL)
|
||||
self.pitch_hp = HighPassFilter(0.0, 0.25, 1.5, DT_CTRL)
|
||||
@@ -81,11 +93,20 @@ class CarController(CarControllerBase, GasInterceptorCarController):
|
||||
self.secoc_acc_message_counter = 0
|
||||
self.secoc_prev_reset_counter = 0
|
||||
|
||||
self.enhanced_bsm = EnhancedBsmCarController(CP, CP_SP)
|
||||
self.auto_brake_hold = AutoBrakeHoldCarController(CP, CP_SP)
|
||||
|
||||
self._auto_lock_speed = 0.0
|
||||
|
||||
self._auto_lock_once = False
|
||||
self._gear_prev = GearShifter.park
|
||||
|
||||
def update(self, CC, CC_SP, CS, now_nanos):
|
||||
actuators = CC.actuators
|
||||
stopping = actuators.longControlState == LongCtrlState.stopping
|
||||
hud_control = CC.hudControl
|
||||
pcm_cancel_cmd = CC.cruiseControl.cancel
|
||||
self.cancel_counter = self.cancel_counter + 1 if CC.cruiseControl.cancel else 0
|
||||
pcm_cancel_cmd = self.cancel_counter > CRUISE_CANCEL_DELAY_FRAMES
|
||||
lat_active = CC.latActive and abs(CS.out.steeringTorque) < MAX_USER_TORQUE
|
||||
|
||||
if len(CC.orientationNED) == 3:
|
||||
@@ -196,6 +217,9 @@ class CarController(CarControllerBase, GasInterceptorCarController):
|
||||
|
||||
self.last_standstill = CS.out.standstill
|
||||
|
||||
if self.auto_brake_hold.enabled:
|
||||
can_sends.extend(self.auto_brake_hold.update(CS, self.frame, self.packer))
|
||||
|
||||
# handle UI messages
|
||||
fcw_alert = hud_control.visualAlert == VisualAlert.fcw
|
||||
steer_alert = hud_control.visualAlert in (VisualAlert.steerRequired, VisualAlert.ldw)
|
||||
@@ -319,6 +343,9 @@ class CarController(CarControllerBase, GasInterceptorCarController):
|
||||
if self.frame % 20 == 0 and self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
|
||||
can_sends.append(make_tester_present_msg(0x750, 0, 0xF))
|
||||
|
||||
if self.enhanced_bsm.enabled:
|
||||
can_sends.extend(self.enhanced_bsm.update(CS, self.frame))
|
||||
|
||||
new_actuators = actuators.as_builder()
|
||||
new_actuators.torque = apply_torque / self.params.STEER_MAX
|
||||
new_actuators.torqueOutputCan = apply_torque
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import copy
|
||||
from enum import IntEnum
|
||||
import importlib
|
||||
|
||||
from opendbc.can import CANDefine, CANParser
|
||||
from opendbc.car import Bus, DT_CTRL, create_button_events, structs
|
||||
@@ -8,11 +10,34 @@ from opendbc.car.interfaces import CarStateBase
|
||||
from opendbc.car.toyota.values import ToyotaFlags, CAR, DBC, STEER_THRESHOLD, NO_STOP_TIMER_CAR, \
|
||||
TSS2_CAR, EPS_SCALE
|
||||
from opendbc.sunnypilot.car.toyota.carstate_ext import CarStateExt
|
||||
from opendbc.sunnypilot.car.toyota.enhanced_bsm import EnhancedBsmCarState
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP
|
||||
|
||||
ButtonType = structs.CarState.ButtonEvent.Type
|
||||
SteerControlType = structs.CarParams.SteerControlType
|
||||
|
||||
|
||||
class AccelPersonality(IntEnum):
|
||||
eco = 0
|
||||
normal = 1
|
||||
sport = 2
|
||||
|
||||
|
||||
def get_accel_personality(sport_mode: int, eco_mode: int) -> AccelPersonality:
|
||||
if sport_mode == 1:
|
||||
return AccelPersonality.sport
|
||||
if eco_mode == 1:
|
||||
return AccelPersonality.eco
|
||||
return AccelPersonality.normal
|
||||
|
||||
|
||||
def get_host_params():
|
||||
"""Return sunnypilot's Params store when opendbc is embedded in openpilot."""
|
||||
try:
|
||||
return importlib.import_module("openpilot.common.params").Params()
|
||||
except ModuleNotFoundError:
|
||||
return None
|
||||
|
||||
# These steering fault definitions seem to be common across LKA (torque) and LTA (angle):
|
||||
# - high steer rate fault: goes to 21 or 25 for 1 frame, then 9 for 2 seconds
|
||||
# - lka/lta msg drop out: goes to 9 then 11 for a combined total of 2 seconds, then 3.
|
||||
@@ -55,6 +80,21 @@ class CarState(CarStateBase, CarStateExt):
|
||||
self.gvc = 0.0
|
||||
self.secoc_synchronization = None
|
||||
|
||||
self.enhanced_bsm = EnhancedBsmCarState(CP, CP_SP)
|
||||
|
||||
if CP_SP.flags & ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD:
|
||||
self.pre_collision_2 = {}
|
||||
|
||||
self._host_params = get_host_params()
|
||||
self.toyota_drive_mode = self._host_params is not None and self._host_params.get_bool('ToyotaDriveMode')
|
||||
self._drive_mode_signals_checked = False
|
||||
self._sport_signal_available = False
|
||||
self._eco_signal_available = False
|
||||
self._prev_accel_profile = None
|
||||
self._accel_profile_init = False
|
||||
|
||||
self.frame = 0
|
||||
|
||||
def update(self, can_parsers) -> tuple[structs.CarState, structs.CarStateSP]:
|
||||
cp = can_parsers[Bus.pt]
|
||||
cp_cam = can_parsers[Bus.cam]
|
||||
@@ -72,18 +112,47 @@ class CarState(CarStateBase, CarStateExt):
|
||||
ret.parkingBrake = cp.vl["BODY_CONTROL_STATE"]["PARKING_BRAKE"] == 1
|
||||
|
||||
ret.brakePressed = cp.vl["BRAKE_MODULE"]["BRAKE_PRESSED"] != 0
|
||||
ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1
|
||||
#ret.brakeHoldActive = cp.vl["ESP_CONTROL"]["BRAKE_HOLD_ACTIVE"] == 1
|
||||
|
||||
if self.CP.flags & ToyotaFlags.SECOC.value:
|
||||
self.secoc_synchronization = copy.copy(cp.vl["SECOC_SYNCHRONIZATION"])
|
||||
ret.gasPressed = cp.vl["GAS_PEDAL"]["GAS_PEDAL_USER"] > 0
|
||||
can_gear = int(cp.vl["GEAR_PACKET_HYBRID"]["GEAR"])
|
||||
else:
|
||||
ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0
|
||||
ret.gasPressed = cp.vl["PCM_CRUISE"]["GAS_RELEASED"] == 0 # TODO: these also have GAS_PEDAL, come back and unify
|
||||
can_gear = int(cp.vl["GEAR_PACKET"]["GEAR"])
|
||||
if not self.CP.flags & ToyotaFlags.DISABLE_RADAR.value:
|
||||
ret.stockAeb = bool(cp_acc.vl["PRE_COLLISION"]["PRECOLLISION_ACTIVE"] and cp_acc.vl["PRE_COLLISION"]["FORCE"] < -1e-5)
|
||||
|
||||
if self.toyota_drive_mode: # and not self.CP.flags & ToyotaFlags.SECOC.value:
|
||||
sport_signal = 'SPORT_ON_2' if self.CP.carFingerprint in (CAR.TOYOTA_RAV4_TSS2, CAR.LEXUS_ES_TSS2,
|
||||
CAR.TOYOTA_HIGHLANDER_TSS2) else 'SPORT_ON'
|
||||
|
||||
if not self._drive_mode_signals_checked:
|
||||
self._drive_mode_signals_checked = True
|
||||
try:
|
||||
sport_mode = cp.vl["GEAR_PACKET"][sport_signal]
|
||||
self._sport_signal_available = True
|
||||
except KeyError:
|
||||
sport_mode = 0
|
||||
self._sport_signal_available = False
|
||||
try:
|
||||
eco_mode = cp.vl["GEAR_PACKET"]['ECON_ON']
|
||||
self._eco_signal_available = True
|
||||
except KeyError:
|
||||
eco_mode = 0
|
||||
self._eco_signal_available = False
|
||||
else:
|
||||
sport_mode = cp.vl["GEAR_PACKET"][sport_signal] if self._sport_signal_available else 0
|
||||
eco_mode = cp.vl["GEAR_PACKET"]['ECON_ON'] if self._eco_signal_available else 0
|
||||
|
||||
accel_profile = get_accel_personality(sport_mode, eco_mode)
|
||||
|
||||
if not self._accel_profile_init or accel_profile != self._prev_accel_profile:
|
||||
self._host_params.put('AccelPersonality', int(accel_profile))
|
||||
self._accel_profile_init = True
|
||||
self._prev_accel_profile = accel_profile
|
||||
|
||||
self.parse_wheel_speeds(ret,
|
||||
cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FL"],
|
||||
cp.vl["WHEEL_SPEEDS"]["WHEEL_SPEED_FR"],
|
||||
@@ -212,6 +281,14 @@ class CarState(CarStateBase, CarStateExt):
|
||||
|
||||
ret.buttonEvents = buttonEvents
|
||||
|
||||
if self.enhanced_bsm.enabled and self.frame > 199:
|
||||
ret.leftBlindspot, ret.rightBlindspot = self.enhanced_bsm.update(cp, self.frame)
|
||||
|
||||
if self.CP_SP.flags & ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD:
|
||||
self.pre_collision_2 = copy.copy(cp_cam.vl["PRE_COLLISION_2"])
|
||||
|
||||
self.frame += 1
|
||||
|
||||
CarStateExt.update(self, ret, ret_sp, can_parsers)
|
||||
|
||||
return ret, ret_sp
|
||||
|
||||
@@ -3,7 +3,7 @@ from opendbc.car.toyota.carstate import CarState
|
||||
from opendbc.car.toyota.carcontroller import CarController
|
||||
from opendbc.car.toyota.radar_interface import RadarInterface
|
||||
from opendbc.car.toyota.values import Ecu, CAR, DBC, ToyotaFlags, CarControllerParams, TSS2_CAR, RADAR_ACC_CAR, NO_DSU_CAR, \
|
||||
MIN_ACC_SPEED, EPS_SCALE, NO_STOP_TIMER_CAR, ToyotaSafetyFlags, UNSUPPORTED_DSU_CAR
|
||||
MIN_ACC_SPEED, EPS_SCALE, NO_STOP_TIMER_CAR, ToyotaSafetyFlags, UNSUPPORTED_DSU_CAR, SECOC_CAR
|
||||
from opendbc.car.disable_ecu import disable_ecu
|
||||
from opendbc.car.interfaces import CarInterfaceBase
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP, ToyotaSafetyFlagsSP
|
||||
@@ -133,6 +133,9 @@ class CarInterface(CarInterfaceBase):
|
||||
if candidate in UNSUPPORTED_DSU_CAR:
|
||||
ret.safetyParam |= ToyotaSafetyFlagsSP.UNSUPPORTED_DSU
|
||||
|
||||
if candidate == CAR.TOYOTA_PRIUS_TSS2:
|
||||
ret.flags |= ToyotaFlagsSP.SP_NEED_DEBUG_BSM.value
|
||||
|
||||
# Detect smartDSU, which intercepts ACC_CMD from the DSU (or radar) allowing openpilot to send it
|
||||
# 0x2AA is sent by a similar device which intercepts the radar instead of DSU on NO_DSU_CARs
|
||||
if 0x2FF in fingerprint[0] or (0x2AA in fingerprint[0] and candidate in NO_DSU_CAR):
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
from opendbc.car.structs import CarParams
|
||||
from opendbc.car.can_definitions import CanData
|
||||
|
||||
SteerControlType = CarParams.SteerControlType
|
||||
|
||||
@@ -164,3 +165,47 @@ def toyota_checksum(address: int, sig, d: bytearray) -> int:
|
||||
for i in range(len(d) - 1):
|
||||
s += d[i]
|
||||
return s & 0xFF
|
||||
|
||||
def create_set_bsm_debug_mode(lr_blindspot, enabled):
|
||||
dat = b"\x02\x10\x60\x00\x00\x00\x00" if enabled else b"\x02\x10\x01\x00\x00\x00\x00"
|
||||
dat = lr_blindspot + dat
|
||||
|
||||
return CanData(0x750, dat, 0)
|
||||
|
||||
|
||||
def create_bsm_polling_status(lr_blindspot):
|
||||
return CanData(0x750, lr_blindspot + b"\x02\x21\x69\x00\x00\x00\x00", 0)
|
||||
|
||||
|
||||
# auto brake hold
|
||||
def create_brake_hold_command(packer, frame, pre_collision_2, brake_hold_active):
|
||||
# forward PRE_COLLISION_2 when auto brake hold is not active
|
||||
values = {s: pre_collision_2[s] for s in [
|
||||
"DSS1GDRV",
|
||||
"DS1STAT2",
|
||||
"DS1STBK2",
|
||||
"PCSWAR",
|
||||
"PCSALM",
|
||||
"PCSOPR",
|
||||
"PCSABK",
|
||||
"PBATRGR",
|
||||
"PPTRGR",
|
||||
"IBTRGR",
|
||||
"CLEXTRGR",
|
||||
"IRLT_REQ",
|
||||
"BRKHLD",
|
||||
"AVSTRGR",
|
||||
"VGRSTRGR",
|
||||
"PREFILL",
|
||||
"PBRTRGR",
|
||||
"PCSDIS",
|
||||
"PBPREPMP",
|
||||
]}
|
||||
|
||||
if brake_hold_active:
|
||||
values = {
|
||||
"DSS1GDRV": 0x3FF,
|
||||
"PBRTRGR": frame % 730 < 727, # cut actuation for 3 frames
|
||||
}
|
||||
|
||||
return packer.make_can_msg("PRE_COLLISION_2", 0, values)
|
||||
|
||||
@@ -10,12 +10,13 @@ from opendbc.car.mock.values import CAR as MOCK
|
||||
from opendbc.car.nissan.values import CAR as NISSAN
|
||||
from opendbc.car.psa.values import CAR as PSA
|
||||
from opendbc.car.rivian.values import CAR as RIVIAN
|
||||
from opendbc.car.mg.values import CAR as MG
|
||||
from opendbc.car.subaru.values import CAR as SUBARU
|
||||
from opendbc.car.tesla.values import CAR as TESLA
|
||||
from opendbc.car.toyota.values import CAR as TOYOTA
|
||||
from opendbc.car.volkswagen.values import CAR as VOLKSWAGEN
|
||||
|
||||
Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | NISSAN | PSA | RIVIAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN
|
||||
Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | MG | NISSAN | PSA | RIVIAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN
|
||||
BRANDS = get_args(Platform)
|
||||
|
||||
PLATFORMS: dict[str, Platform] = {str(platform): platform for brand in BRANDS for platform in brand}
|
||||
|
||||
@@ -118,8 +118,6 @@ class CarInterface(CarInterfaceBase):
|
||||
if ret.flags & VolkswagenFlags.MEB:
|
||||
ret.openpilotLongitudinalControl = True
|
||||
ret.longitudinalActuatorDelay = 0.3
|
||||
ret.longitudinalTuning.kiBP = [0., 30.]
|
||||
ret.longitudinalTuning.kiV = [0.4, 0.]
|
||||
else:
|
||||
ret.alphaLongitudinalAvailable = ret.networkLocation == NetworkLocation.gateway or docs
|
||||
if alpha_long:
|
||||
|
||||
@@ -34,8 +34,8 @@ CM_ SG_ 419 REGEN_STAGE_SELECTION "Driver-selected regenerative braking threshol
|
||||
CM_ SG_ 419 REGEN_MEMORY "Driver-selected persistence setting, M shown in instrument cluster";
|
||||
CM_ SG_ 419 REGEN_UNKNOWN "Both bits set when user enables regen, otherwise zero";
|
||||
|
||||
VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
|
||||
VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S";
|
||||
VAL_ 401 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S" 11 "B";
|
||||
VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S" 11 "B";
|
||||
VAL_ 419 TRANS_TARGET_GEAR 0 "None / Neutral / Park" 1 "1st" 2 "2nd" 3 "3rd" 4 "4th" 5 "5th" 6 "6th" 7 "7th" 8 "8th" 9 "9th" 10 "10th" 13 "Reverse";
|
||||
VAL_ 419 REGEN_STAGE_SELECTION 0 "disabled" 1 "stage_1" 2 "stage_2" 3 "stage_3" 4 "stage_4" 5 "stage_5" 6 "stage_6";
|
||||
VAL_ 419 REGEN_MEMORY 0 "disabled" 1 "persistent";
|
||||
|
||||
-6501
File diff suppressed because it is too large
Load Diff
@@ -1,125 +0,0 @@
|
||||
BO_ 203 ADAS_CMD_35_10ms: 24 CGW_CCU
|
||||
SG_ ADAS_CMD_Crc35Val : 0|16@1+ (1,0) [0|0] "0" FCU_C,GW_RGW,MDPS,SFA
|
||||
SG_ ADAS_CMD_AlvCnt35Val : 16|8@1+ (1,0) [0|0] "0" FCU_C,GW_RGW,MDPS,SFA
|
||||
SG_ ADAS_ActvACISta : 24|4@1+ (1,0) [0|0] "" GW_RGW,MDPS,SFA
|
||||
SG_ ADAS_ActvACILvl2Sta : 28|4@1+ (1,0) [0|0] "" ESC,FCU_C,GW_RGW,MDPS,SFA,VPC_C
|
||||
SG_ ADAS_StrAnglReqVal : 32|14@1- (0.1,0) [0|0] "Deg" GW_RGW,MDPS,SFA
|
||||
SG_ ADAS_ACIAnglTqRedcGainVal : 48|8@1+ (0.004,0) [0|0] "" GW_RGW,MDPS,SFA
|
||||
SG_ FCA_ESA_ActvSta : 56|2@1+ (1,0) [0|0] "" GW_RGW,MDPS,SFA
|
||||
SG_ FCA_ESA_TqBstGainVal : 64|8@1+ (0.004,0) [0|0] "" GW_RGW,MDPS,SFA
|
||||
|
||||
BO_ 272 ESC_06_200ms: 32 XXX
|
||||
SG_ ESC_Crc6Val : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ ESC_AlvCnt6Val : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ IEB_BrkMod_Sta : 24|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ IEB_BrkMod_Type : 27|2@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LFA2_USING_LEAD_MAYBE : 30|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LKA_WARNING : 32|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ LKA_SysIndReq : 38|3@1+ (1,0) [0|7] "" CLU,RR_C_RDR,CGW
|
||||
SG_ ADAS_StrTqReqVal : 41|11@1+ (0.0078125,-8) [-8|7.9921875] "Nm" CGW
|
||||
SG_ ADAS_ActToiSta : 52|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ADAS_ToiFltSta : 54|2@1+ (1,0) [0|3] "" CGW
|
||||
SG_ LFA_BUTTON : 56|1@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LKA_ASSIST : 62|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 70|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_3_LDW_UNK : 72|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ HAS_LANE_SAFETY : 80|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LKAS_ANGLE_CMD : 82|14@1- (0.1,0) [0|511] "" XXX
|
||||
SG_ LKAS_ANGLE_MAX_TORQUE : 96|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LDW_SHAKE_STEERING : 105|2@0+ (1,0) [0|255] "" XXX
|
||||
SG_ FCA_ESA_CtrlSta : 107|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CAR_IN_DRIVE_MAYBE : 232|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 298 ADAS_CMD_30_10ms: 16 FR_CMR
|
||||
SG_ ADAS_CMD_Crc30Val : 0|16@1+ (1,0) [0|65535] "" CLU,CGW
|
||||
SG_ ADAS_CMD_AlvCnt30Val : 16|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ LKA_OptUsmSta : 24|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ LKA_RcgSta : 27|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ LKA_LHLnWrnSta : 30|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ LKA_RHLnWrnSta : 32|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ LKA_HndsoffSnd : 34|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ LKA_StrSnd : 36|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ LKA_SysIndReq : 38|3@1+ (1,0) [0|7] "" CLU,RR_C_RDR,CGW
|
||||
SG_ ADAS_StrTqReqVal : 41|11@1+ (0.0078125,-8) [-8|7.9921875] "Nm" CGW
|
||||
SG_ ADAS_ActToiSta : 52|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ADAS_ToiFltSta : 54|2@1+ (1,0) [0|3] "" CGW
|
||||
SG_ LFA_BUTTON : 56|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BCA_Rear_WrnSta : 57|3@1+ (1,0) [0|255] "" ADRV
|
||||
SG_ LKA_SysWrn : 60|4@1+ (1,0) [0|15] "" CLU,CGW
|
||||
SG_ FCA_LO_WrnSta : 64|1@1+ (1,0) [0|1] "" ADRV
|
||||
SG_ STEER_MODE : 65|3@1+ (1,0) [0|1] "" ADRV
|
||||
SG_ FCA_LS_WrnSta : 68|2@1+ (1,0) [0|3] "" ADRV
|
||||
SG_ NEW_SIGNAL_2 : 70|1@0+ (1,0) [0|3] "" ADRV
|
||||
SG_ SCC_TakeoverReq_CLU_AMP_PE_02_Warn_Sound : 72|2@1+ (1,0) [0|255] "" ADRV
|
||||
SG_ NEW_SIGNAL_1 : 79|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LKA_UsmMod : 80|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ LDW_SHAKE_STEERING : 82|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ELK_SysFlrSta : 85|5@1+ (1,0) [0|31] "" ADRV
|
||||
SG_ ELK_SymbDisp : 90|3@1+ (1,0) [0|7] "" ADRV
|
||||
SG_ FCA_ESA_CtrlSta : 98|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ADAS_Damping_Gain : 104|8@1+ (1,0) [0|255] "" CGW
|
||||
|
||||
CM_ BO_ 203 "[P] Periodic";
|
||||
CM_ SG_ 203 ADAS_CMD_Crc35Val "ADAS_CMD_CyclicRedundancyCheck35Value";
|
||||
CM_ SG_ 203 ADAS_CMD_AlvCnt35Val "ADAS_CMD_AliveCounter35Value";
|
||||
CM_ SG_ 203 ADAS_ActvACISta "ADAS Active AngleControlInterface State";
|
||||
CM_ SG_ 203 ADAS_ActvACILvl2Sta "ADAS Active AngleControlInterface Level 2 State";
|
||||
CM_ SG_ 203 ADAS_StrAnglReqVal "ADAS Steering Angle Request Value";
|
||||
CM_ SG_ 203 ADAS_ACIAnglTqRedcGainVal "ADAS AngleControlInterface Angle Torque Reduction Gain Value";
|
||||
CM_ SG_ 203 FCA_ESA_ActvSta "State for FCA w/ESA";
|
||||
CM_ SG_ 203 FCA_ESA_TqBstGainVal "FCA w/ESA Torque boost Gain";
|
||||
CM_ SG_ 272 IEB_BrkMod_Sta "Brake Mode State";
|
||||
CM_ SG_ 272 IEB_BrkMod_Type "Brake Mode Type";
|
||||
CM_ SG_ 272 LFA2_USING_LEAD_MAYBE "I don't know about this signal much. But I noticed that it flipped to 1 when the lane was dubious but we had a lead in front";
|
||||
CM_ SG_ 272 LKA_SysIndReq "LKA_SystemIndicatorRequest ##2G##LDW_LKA - LKA11 - CF_LKA_SymbolState";
|
||||
CM_ SG_ 272 NEW_SIGNAL_3_LDW_UNK "I don't know what this signal is meant to do or convery. I just know it the 2 bits changed together when I manually disabled LKAS. ";
|
||||
CM_ SG_ 272 LDW_SHAKE_STEERING "I am not 100% sure on this signal. I believe that when this happens, the steering vibrates. Same as ADAS_CMD_30_10ms";
|
||||
CM_ SG_ 272 FCA_ESA_CtrlSta "Signal is a best guess. It went \"off\" when I disabled LKAS on a route. Same as ADAS_CMD_30_10ms";
|
||||
CM_ SG_ 272 CAR_IN_DRIVE_MAYBE "This seems to indicate when the car is on D maybe. I am not sure. I saw it twice on a route on hoth times I do remember stopping completely and in one instance I remember putting park. ";
|
||||
CM_ BO_ 298 "[P] Periodic";
|
||||
CM_ SG_ 298 ADAS_CMD_Crc30Val "ADAS_CMD_CyclicRedundancyCheck30Value";
|
||||
CM_ SG_ 298 ADAS_CMD_AlvCnt30Val "ADAS_CMD_AliveCounter30Value";
|
||||
CM_ SG_ 298 LKA_OptUsmSta "LKA_OptionUsmStatus ##2G##LDW_LKA - LKA11 - CF_LKA_Opt_USM";
|
||||
CM_ SG_ 298 LKA_RcgSta "LKA_RecognitionStatus ##2G##LDW_LKA - LKA11 - CF_LKA_LaneRecogState";
|
||||
CM_ SG_ 298 LKA_LHLnWrnSta "LKA_LHLaneWarningStatus ##2G##LDW_LKA - LKA11 - CF_LKA_LHWarning";
|
||||
CM_ SG_ 298 LKA_RHLnWrnSta "LKA_RHLaneWarningStatus ##2G##LDW_LKA - LKA11 - CF_LKA_RHWarning";
|
||||
CM_ SG_ 298 LKA_HndsoffSnd "LKA_HandsoffSound ##2G##LDW_LKA - LKA11 - CF_LKA_HandsOff_Snd";
|
||||
CM_ SG_ 298 LKA_StrSnd "LKA_SteeringSound ##2G##LDW_LKA - LKA11 - CF_LKA_Steer_Snd";
|
||||
CM_ SG_ 298 LKA_SysIndReq "LKA_SystemIndicatorRequest ##2G##LDW_LKA - LKA11 - CF_LKA_SymbolState";
|
||||
CM_ SG_ 298 ADAS_StrTqReqVal "LKA_SteeringTorqueRequestValue ##2G##LDW_LKA - LKA11 - CR_LKA_StrToqReq";
|
||||
CM_ SG_ 298 ADAS_ActToiSta "ADAS_ActiveTorqueOverlayInterfaceStatus ##2G##LDW_LKA - LKA11 - CF_LKA_ActToi";
|
||||
CM_ SG_ 298 ADAS_ToiFltSta "ADAS_TorqueOverlayInterfaceFaultStatus ##2G##LDW_LKA - LKA11 - CF_LKA_ToiFlt";
|
||||
CM_ SG_ 298 BCA_Rear_WrnSta "best-guess";
|
||||
CM_ SG_ 298 LKA_SysWrn "LKA_Additional_Info";
|
||||
CM_ SG_ 298 LKA_UsmMod "LKA_USM Mode ##2G##LDW_LKA-LKA11-CF_LKA_USM_Mode";
|
||||
CM_ SG_ 298 LDW_SHAKE_STEERING "I am not 100% sure on this signal. I believe that when this happens, the steering vibrates. Same as ESC_06_200ms";
|
||||
CM_ SG_ 298 FCA_ESA_CtrlSta "Signal is a best guess. It went \"off\" when I disabled LKAS on a route. Same as ESC_06_200ms";
|
||||
CM_ SG_ 298 ADAS_Damping_Gain "ADAS_Damping_Gain";
|
||||
VAL_ 203 ADAS_CMD_Crc35Val 0 "0x0x0~0xFFFF:CRCValue" 65535 "0x0x0~0xFFFF:CRCValue";
|
||||
VAL_ 203 ADAS_CMD_AlvCnt35Val 0 "0x0x0~0xFF:AlvCntValue" 255 "0x0x0~0xFF:AlvCntValue";
|
||||
VAL_ 203 ADAS_ActvACISta 0 "INIT" 1 "INACTIVE" 2 "ACTIVE35(ACTIVE)" 3 "ACTIVE33(Redundancy)" 4 "RESERVED" 5 "RESERVED" 6 "RESERVED" 7 "RESERVED" 8 "RESERVED" 9 "RESERVED" 10 "RESERVED" 11 "RESERVED" 12 "RESERVED" 13 "RESERVED" 14 "RESERVED" 15 "RESERVED";
|
||||
VAL_ 203 ADAS_ActvACILvl2Sta 0 "INIT" 1 "INACTIVE" 2 "ACTIVE35(ACTIVE)" 3 "RESERVED" 4 "RESERVED" 5 "RESERVED" 6 "RESERVED" 7 "RESERVED" 8 "RESERVED" 9 "RESERVED" 10 "RESERVED" 11 "RESERVED" 12 "RESERVED" 13 "RESERVED" 14 "RESERVED" 15 "RESERVED";
|
||||
VAL_ 203 ADAS_StrAnglReqVal 0 "0x0x000~0x3FFF:Real Values" 16383 "0x0x000~0x3FFF:Real Values";
|
||||
VAL_ 203 ADAS_ACIAnglTqRedcGainVal 0 "0x0x00~0xFA:Real Values" 250 "0x0x00~0xFA:Real Values" 251 "RESERVED" 252 "RESERVED" 253 "RESERVED" 254 "RESERVED" 255 "RESERVED";
|
||||
VAL_ 203 FCA_ESA_ActvSta 0 "Inactive" 1 "Active" 2 "RESERVED" 3 "RESERVED";
|
||||
VAL_ 203 FCA_ESA_TqBstGainVal 0 "0x0x00~0xFA:Real Values" 250 "0x0x00~0xFA:Real Values" 251 "RESERVED" 252 "RESERVED" 253 "RESERVED" 254 "RESERVED" 255 "RESERVED";
|
||||
VAL_ 272 IEB_BrkMod_Sta 0 "0x0: Not Applied" 1 "Normal" 2 "Sport" 3 "Chauffeur" 7 "Failure";
|
||||
VAL_ 272 IEB_BrkMod_Type 0 "type1 (Normal/Sport)" 1 "type2 (Normal/Sport/Chauffeur)";
|
||||
VAL_ 272 LKA_SysIndReq 0 "Off" 1 "Unavailable_(Grey On)" 2 "Lane Recognized_(Green On)" 3 "Lane Departure_(Green Blink)" 4 "System Fail_(Orange On)" 5 "Not Calibrated_(Orange Blink)" 6 "Regulation_(Orange On)" 7 "Reserved";
|
||||
VAL_ 272 FCA_ESA_CtrlSta 0 "Off" 1 "On";
|
||||
VAL_ 298 LKA_OptUsmSta 0 "None LKA/LDW Option (Default)" 1 "LDW" 2 "LKA" 3 "Reserved" 4 "LDW Only (None LKA)" 5 "LDW only OFF (None LKA)" 6 "LDW/LKA OFF" 7 "Invalid";
|
||||
VAL_ 298 LKA_RcgSta 0 "Not Recognized" 1 "Left Lane Recognition" 2 "Right Lane Recognition" 3 "Full Lane Recognition" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Reserved";
|
||||
VAL_ 298 LKA_LHLnWrnSta 0 "No Warning" 1 "Lane Departure Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 298 LKA_RHLnWrnSta 0 "No Warning" 1 "Lane Departure Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 298 LKA_HndsoffSnd 0 "Off" 1 "Hands-off Sound Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 298 LKA_StrSnd 0 "Off" 1 "Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 298 LKA_SysIndReq 0 "Off" 1 "Unavailable_(Grey On)" 2 "Lane Recognized_(Green On)" 3 "Lane Departure_(Green Blink)" 4 "System Fail_(Orange On)" 5 "Not Calibrated_(Orange Blink)" 6 "Regulation_(Orange On)" 7 "Reserved";
|
||||
VAL_ 298 ADAS_StrTqReqVal 2046 "Reserved" 2047 "Invalid";
|
||||
VAL_ 298 ADAS_ActToiSta 0 "De-activate TOI" 1 "Activate TOI" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 298 ADAS_ToiFltSta 0 "No Fault" 1 "Fault" 2 "Reserved" 3 "Error indicatorr";
|
||||
VAL_ 298 LKA_SysWrn 0 "No Info" 1 "Reserved" 2 "Reserved" 3 "Reserved" 4 "Hands-Off Warning 1" 5 "Hands-Off Warning 2" 6 "Hands-Off Warning 3" 7 "Reserved" 8 "Reserved" 9 "System Automatic off" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Reserved" 15 "System Fail";
|
||||
VAL_ 298 LKA_UsmMod 0 "NONE" 1 "LKA 1 mode" 2 "Reserved" 3 "LDW";
|
||||
VAL_ 298 FCA_ESA_CtrlSta 0 "Off";
|
||||
VAL_ 298 ADAS_Damping_Gain 0 "Reserved" 1 "Reserved" 2 "Reserved" 0 "Reserved" 202 "Reserved" 203 "Reserved" 204 "Reserved" 205 "Reserved" 206 "Reserved" 207 "Reserved" 208 "Reserved" 209 "Reserved" 210 "Reserved" 211 "Reserved" 212 "Reserved" 213 "Reserved" 214 "Reserved" 215 "Reserved" 216 "Reserved" 217 "Reserved" 218 "Reserved" 219 "Reserved" 220 "Reserved" 221 "Reserved" 222 "Reserved" 223 "Reserved" 224 "Reserved" 225 "Reserved" 226 "Reserved" 227 "Reserved" 228 "Reserved" 229 "Reserved" 230 "Reserved" 231 "Reserved" 232 "Reserved" 233 "Reserved" 234 "Reserved" 235 "Reserved" 236 "Reserved" 237 "Reserved" 238 "Reserved" 239 "Reserved" 240 "Reserved" 241 "Reserved" 242 "Reserved" 243 "Reserved" 244 "Reserved" 245 "Reserved" 246 "Reserved" 247 "Reserved" 248 "Reserved" 249 "Reserved" 250 "Reserved" 251 "Reserved" 252 "Reserved" 253 "Reserved" 254 "Reserved" 255 "Reserved";
|
||||
@@ -1,271 +0,0 @@
|
||||
BO_ 560 NEW_MSG_230: 16 FR_CMR_OR_CAR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 565 NEW_MSG_235: 32 FR_CMR_OR_CAR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 566 NEW_MSG_236: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 567 NEW_MSG_237: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 568 NEW_MSG_238: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 569 NEW_MSG_239: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 570 NEW_MSG_23A: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 571 NEW_MSG_23B: 32 FR_CMR_OR_CAR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 572 NEW_MSG_23C: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 573 NEW_MSG_23D: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 574 NEW_MSG_23E: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 575 NEW_MSG_23F: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 577 NEW_MSG_241: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 578 NEW_MSG_242: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 579 NEW_MSG_243: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 580 NEW_MSG_244: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 581 NEW_MSG_245: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 582 NEW_MSG_246: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 583 NEW_MSG_247: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 584 NEW_MSG_248: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 864 NEW_MSG_360: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 865 NEW_MSG_361: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 867 NEW_MSG_363: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 868 NEW_MSG_364: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 869 NEW_MSG_365: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 870 NEW_MSG_366: 32 FR_CMR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 896 NEW_MSG_380: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 917 NEW_MSG_395: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|255] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|65535] "" FR_CMR
|
||||
|
||||
BO_ 928 NEW_MSG_3A0: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|255] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 933 NEW_MSG_3A5: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 934 NEW_MSG_3A6: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 935 NEW_MSG_3A7: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 936 NEW_MSG_3A8: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 937 NEW_MSG_3A9: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 938 NEW_MSG_3AA: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 939 NEW_MSG_3AB: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 940 NEW_MSG_3AC: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 941 NEW_MSG_3AD: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 942 NEW_MSG_3AE: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 943 NEW_MSG_3AF: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 944 NEW_MSG_3B0: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 945 NEW_MSG_3B1: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 946 NEW_MSG_3B2: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 947 NEW_MSG_3B3: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 948 NEW_MSG_3B4: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 949 NEW_MSG_3B5: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 950 NEW_MSG_3B6: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 951 NEW_MSG_3B7: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 952 NEW_MSG_3B8: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 953 NEW_MSG_3B9: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 954 NEW_MSG_3BA: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 955 NEW_MSG_3BB: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 956 NEW_MSG_3BC: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 957 NEW_MSG_3BD: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 958 NEW_MSG_3BE: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 959 NEW_MSG_3BF: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 960 NEW_MSG_3C0: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 962 NEW_MSG_3C2: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 963 NEW_MSG_3C3: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 964 NEW_MSG_3C4: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 976 NEW_MSG_3D0: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 977 NEW_MSG_3D1: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|127] "" FR_CMR
|
||||
|
||||
BO_ 978 NEW_MSG_3D2: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 979 NEW_MSG_3D3: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|32767] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 980 NEW_MSG_3D4: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ NEW_SIGNAL_1 : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
BO_ 1280 NEW_MSG_500: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" FR_CMR
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
SG_ NEW_SIGNAL_3_SPEED_DEPENDANT : 24|8@1+ (1,0) [0|255] "" FR_CMR
|
||||
|
||||
CM_ BO_ 976 "(all 0)";
|
||||
CM_ BO_ 977 "(all 0)";
|
||||
CM_ BO_ 978 "(all 0)";
|
||||
CM_ BO_ 979 "(all 0)";
|
||||
CM_ BO_ 980 "(all 0)";
|
||||
CM_ SG_ 1280 NEW_SIGNAL_3_SPEED_DEPENDANT "I dont know what this is but it IS speed dependant";
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
||||
CM_ "IMPORT _hyundai_canfd_common.dbc";
|
||||
CM_ "IMPORT _hyundai_canfd_hda2_cam_unknown.dbc";
|
||||
|
||||
BO_ 53 ACCELERATOR: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
@@ -210,9 +209,6 @@ BO_ 298 LFA: 16 ADRV
|
||||
SG_ ELK_SymbDisp : 90|3@1+ (1,0) [0|7] "" ADRV
|
||||
SG_ FCA_ESA_WrnSta : 93|1@1+ (1,0) [0|7] "" ADRV
|
||||
SG_ FCA_ESA_CtrlSta : 101|1@1+ (1,0) [0|7] "" ADRV
|
||||
SG_ LKAS_ANGLE_ACTIVE : 77|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ADAS_StrAnglReqVal : 82|14@1- (0.1,0) [0|176.7] "Deg" GW_RGW,MDPS,SFA
|
||||
SG_ ADAS_ACIAnglTqRedcGainVal : 96|8@1+ (0.004,0) [0|1] "" GW_RGW,MDPS,SFA
|
||||
SG_ Damping_Gain : 104|8@1+ (1,0) [0|255] "" CGW
|
||||
|
||||
BO_ 304 GEAR_SHIFTER: 16 XXX
|
||||
@@ -838,9 +834,7 @@ CM_ SG_ 282 FR_CMR_SCCEquipSta "This signal indicates equipment for SCC";
|
||||
CM_ SG_ 282 FR_CMR_ReqADASMapMsgVal "This signal indicates an ADAS map message request from FR_CMR to H_U. Each bit indicates the request messages as follows. - Bit 0 : H_U_NAVI_V2_STUB_E - Bit 1 : HU_NAVI_V2_PROSHORT_E_00 (곡률) - Bit 2 : HU_NAVI_V2_PROSHORT_E_00 (곡률 외 정보)";
|
||||
CM_ SG_ 282 FR_CMR_SwVer1Val "This signal indicates a major version of FR_CMR software. If FR_CMR software version is A.00, 'A' and '00' mean major and minor version respectively.";
|
||||
CM_ SG_ 282 FR_CMR_SwVer2Val "This signal indicates a minor version of FR_CMR software. If FR_CMR software version is A.00, 'A' and '00' mean major and minor version respectively.";
|
||||
CM_ BO_ 298 "This message controls steering and alerts regarding lateral control. Formerly known as LFA.
|
||||
|
||||
Node is flagged as ADRV, but in reality this signal can be seen from either the FR_CMR (front camera) or the ADRV (adas ecu) for some trims.";
|
||||
CM_ BO_ 298 "This message controls steering and alerts regarding lateral control. Formerly known as LFA. Node is flagged as ADRV, but in reality this signal can be seen from either the FR_CMR (front camera) or the ADRV (adas ecu) for some trims.";
|
||||
CM_ SG_ 298 LKA_OptUsmSta "LKA_OptionUsmStatus ##2G##LDW_LKA - LKA11 - CF_LKA_Opt_USM";
|
||||
CM_ SG_ 298 LKA_RcgSta "LKA_RecognitionStatus ##2G##LDW_LKA - LKA11 - CF_LKA_LaneRecogState";
|
||||
CM_ SG_ 298 LKA_LHLnWrnSta "LKA_LHLaneWarningStatus ##2G##LDW_LKA - LKA11 - CF_LKA_LHWarning";
|
||||
|
||||
@@ -1,855 +0,0 @@
|
||||
CM_ "IMPORT _hyundai_canfd_common.dbc";
|
||||
CM_ "IMPORT _hyundai_canfd_ccnc_og.dbc";
|
||||
|
||||
BO_ 74 IMU_01_10ms: 32 CGW_CCU
|
||||
SG_ IMU_Crc1Val : 0|16@1+ (1,0) [0|0] "" ECS,ESC,FCU_C,GW_RGW,ICSC,MDPS,RCU,RWS,SFA,VPC_C
|
||||
SG_ IMU_AlvCnt1Val : 16|8@1+ (1,0) [0|0] "" ECS,ESC,FCU_C,GW_RGW,ICSC,MDPS,RCU,RWS,SFA,VPC_C
|
||||
SG_ IMU_YawSigSta : 24|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_LatAccelSigSta : 28|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_LongAccelSigSta : 32|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_VerAccelSigSta : 36|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ IMU_McuVoltSta : 40|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ IMU_AcuRstSta : 44|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ IMU_SnsrTyp : 48|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ IMU_RollSigSta : 56|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ IMU_YawRtVal : 64|16@1+ (0.005,-163.84) [-163.84|163.835] "Deg/s" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_LatAccelVal : 80|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.176645655] "g" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_LongAccelVal : 96|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.176645655] "g" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ IMU_SnsrTempVal : 112|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ IMU_SeralNumVal : 128|64@1+ (1,0) [0|1.84467440737096e+19] "" XXX
|
||||
SG_ IMU_RollRtVal : 192|16@1+ (0.005,-163.84) [0|0] "º/s" XXX
|
||||
SG_ IMU_VerAccelVal : 208|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 229 ESC_02_10ms: 32 CGW
|
||||
SG_ ESC_YawSigSta : 24|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ ESC_LatAccelSigSta : 28|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ ESC_LongAccelSigSta : 32|4@1+ (1,0) [0|15] "" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ ESC_YawRtVal : 64|16@1+ (0.005,-163.84) [-163.84|163.835] "Deg/s" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ ESC_LatAccelVal : 80|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.176645655] "g" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
SG_ ESC_LongAccelVal : 96|16@1+ (0.000127465,-4.17677312) [-4.17677312|4.176645655] "g" CLU,ADAS_PRK,FR_CMR,RR_C_RDR
|
||||
|
||||
|
||||
BO_ 53 ACCELERATOR: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ ACCELERATOR_PEDAL : 40|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ GEAR : 192|3@1+ (1,0) [0|7] "" XXX
|
||||
|
||||
BO_ 64 GEAR_ALT: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ GEAR : 32|3@1+ (1,0) [0|7] "" XXX
|
||||
|
||||
BO_ 69 GEAR: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ GEAR : 44|3@1+ (1,0) [0|7] "" XXX
|
||||
|
||||
BO_ 96 ESP_STATUS: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ TRACTION_AND_STABILITY_CONTROL : 42|3@1+ (1,0) [0|63] "" XXX
|
||||
SG_ BRAKE_PRESSURE : 128|10@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ BRAKE_PRESSED : 148|1@1+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 101 BRAKE: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_POSITION : 40|16@1- (1,0) [0|65535] "" XXX
|
||||
SG_ BRAKE_PRESSED : 57|1@1+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 112 GEAR_ALT_2: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ GEAR : 60|3@1+ (1,0) [0|7] "" XXX
|
||||
|
||||
BO_ 160 WHEEL_SPEEDS: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ MOVING_FORWARD : 56|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ MOVING_BACKWARD : 57|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ MOVING_FORWARD2 : 58|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ MOVING_BACKWARD2 : 59|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ WHL_SpdFLVal : 64|14@1+ (0.03125,0) [0|0] "km^h" XXX
|
||||
SG_ WHL_SpdFRVal : 80|14@1+ (0.03125,0) [0|0] "km^h" XXX
|
||||
SG_ WHL_SpdRLVal : 96|14@1+ (0.03125,0) [0|0] "km^h" XXX
|
||||
SG_ WHL_SpdRRVal : 112|14@1+ (0.03125,0) [0|0] "km^h" XXX
|
||||
|
||||
BO_ 234 MDPS: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LKA_ACTIVE : 48|1@0+ (1,0) [0|16777215] "" XXX
|
||||
SG_ LKA_FAULT : 54|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ STEERING_OUT_TORQUE : 64|12@1+ (0.1,-204.8) [0|65535] "" XXX
|
||||
SG_ STEERING_COL_TORQUE : 80|13@1+ (1,-4095) [0|4095] "" XXX
|
||||
SG_ STEERING_ANGLE : 96|16@1- (0.1,0) [0|255] "deg" XXX
|
||||
SG_ STEERING_ANGLE_2 : 128|16@1- (0.1,0) [0|65535] "deg" XXX
|
||||
SG_ LKA_ANGLE_ACTIVE : 145|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ LKA_ANGLE_FAULT : 149|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 256 ACCELERATOR_BRAKE_ALT: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_PRESSED : 32|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ ACCELERATOR_PEDAL_PRESSED : 176|1@1+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 261 ACCELERATOR_ALT: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ ACCELERATOR_PEDAL : 103|10@1+ (0.25,0) [0|1022] "" XXX
|
||||
|
||||
BO_ 282 FR_CMR_01_10ms: 16 FR_CMR
|
||||
SG_ FR_CMR_Crc1Val : 0|16@1+ (1,0) [0|0] "" Dummy,IBU_HS,vBDM
|
||||
SG_ FR_CMR_AlvCnt1Val : 16|8@1+ (1,0) [0|0] "" CLU,IBU_HS,vBDM
|
||||
SG_ HBA_SysOptSta : 24|2@1+ (1,0) [0|3] "" CLU,IBU_HS,vBDM
|
||||
SG_ HBA_SysSta : 26|3@1+ (1,0) [0|7] "" CLU,IBU_HS,vBDM
|
||||
SG_ HBA_IndLmpReq : 29|2@1+ (1,0) [0|3] "" CLU,vBDM
|
||||
SG_ iHBAref_VehLftSta : 31|2@1+ (1,0) [0|3] "" IBU_HS,ICU,vBDM
|
||||
SG_ iHBAref_VehCtrSta : 33|2@1+ (1,0) [0|3] "" IBU_HS,ICU,vBDM
|
||||
SG_ iHBAref_VehRtSta : 35|2@1+ (1,0) [0|3] "" IBU_HS,ICU,vBDM
|
||||
SG_ iHBAref_ILLAmbtSta : 37|2@1+ (1,0) [0|3] "" IBU_HS,ICU,vBDM
|
||||
SG_ FCA_Equip_MFC : 39|3@1+ (1,0) [0|0] "" ADAS_DRV,RR_C_RDR,vBDM
|
||||
SG_ HBA_OptUsmSta : 42|2@1+ (1,0) [0|3] "" CLU,H_U_MM
|
||||
SG_ FCAref_FusSta : 45|3@1+ (1,0) [0|0] "" vBDM
|
||||
SG_ DAW_LVDA_PUDis : 48|2@1+ (1,0) [0|0] "" CLU,vBDM
|
||||
SG_ DAW_LVDA_OptUsmSta : 50|2@1+ (1,0) [0|3] "" CLU,H_U_MM,vBDM
|
||||
SG_ DAW_OptUsmSta : 52|3@1+ (1,0) [0|0] "" CLU,H_U_MM
|
||||
SG_ DAW_SysSta : 55|4@1+ (1,0) [0|0] "" CLU
|
||||
SG_ DAW_WrnMsgSta : 59|3@1+ (1,0) [0|0] "" CLU
|
||||
SG_ DAW_TimeRstReq : 62|2@1+ (1,0) [0|0] "" CLU
|
||||
SG_ DAW_SnstvtyModRetVal : 64|3@1+ (1,0) [0|0] "" CLU,H_U_MMz
|
||||
|
||||
BO_ 293 STEERING_SENSORS: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ STEERING_ANGLE : 24|16@1- (0.1,0) [0|255] "deg" XXX
|
||||
SG_ STEERING_RATE : 40|8@1+ (4,0) [0|1016] "deg/s" XXX
|
||||
|
||||
BO_ 304 GEAR_SHIFTER: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ PARK_BUTTON : 32|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ KNOB_POSITION : 40|3@1+ (1,0) [0|3] "" XXX
|
||||
SG_ GEAR : 64|3@1+ (1,0) [0|7] "" XXX
|
||||
|
||||
BO_ 352 ADRV_0x160: 16 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ AEB_SETTING : 24|2@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_2 : 56|8@1+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_FF : 64|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_FC : 72|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_9 : 80|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 353 CCNC_0x161: 32 CCNC
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ FCA_ICON : 24|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FCA_ALT_ICON : 27|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LKA_ICON : 30|3@1+ (1,0) [0|3] "" XXX
|
||||
SG_ HBA_ICON : 33|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_1 : 36|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ ZEROS_2 : 40|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ FCA_IMAGE : 42|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_3 : 45|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_4 : 48|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ BCA_LEFT : 51|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ BCA_RIGHT : 54|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LCA_LEFT_ARROW : 57|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LCA_RIGHT_ARROW : 60|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_5 : 63|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ CENTERLINE : 64|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ TARGET : 66|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ TARGET_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LANELINE_LEFT : 80|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ LANELINE_LEFT_POSITION : 84|6@1+ (1,0) [0|15] "" XXX
|
||||
SG_ LANELINE_RIGHT : 90|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ LANELINE_RIGHT_POSITION : 94|6@1+ (1,0) [0|3] "" XXX
|
||||
SG_ LANELINE_CURVATURE : 100|5@1- (1,15) [0|31] "" XXX
|
||||
SG_ LANE_HIGHLIGHT : 105|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ LANE_HIGHLIGHT_DISTANCE : 109|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LANE_LEFT : 120|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LANE_RIGHT : 123|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LANE_ZOOM : 126|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ALERTS_1 : 128|6@1+ (1,0) [0|63] "" XXX
|
||||
SG_ ALERTS_2 : 134|5@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ALERTS_3 : 139|5@1+ (1,0) [0|15] "" XXX
|
||||
SG_ ALERTS_4 : 144|8@1+ (1,0) [0|511] "" XXX
|
||||
SG_ ALERTS_5 : 152|5@1+ (1,0) [0|7] "" XXX
|
||||
SG_ MUTE : 157|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ SOUNDS_1 : 160|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SOUNDS_2 : 164|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SOUNDS_3 : 168|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ SOUNDS_4 : 172|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_6 : 175|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_7 : 176|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ SETSPEED_HUD : 181|3@1+ (1,0) [0|3] "" XXX
|
||||
SG_ DISTANCE_LEAD : 184|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ DISTANCE_CAR : 189|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ DISTANCE_SPACING : 192|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ DISTANCE : 196|4@1+ (1,0) [0|7] "" XXX
|
||||
SG_ SETSPEED_SPEED : 200|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SETSPEED : 208|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ HDA_ICON : 212|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SLA_ICON : 216|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ NAV_ICON : 220|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ LFA_ICON : 224|4@1+ (1,0) [0|3] "" XXX
|
||||
SG_ LCA_LEFT_ICON : 228|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ LCA_RIGHT_ICON : 232|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ BACKGROUND : 236|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ DAW_ICON : 240|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ CAR_CIRCLE : 243|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_8 : 246|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ZEROS_9 : 248|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 354 CCNC_0x162: 32 CCNC
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ COUNTRY : 24|4@1+ (1,0) [0|7] "" XXX
|
||||
SG_ SPEEDLIMIT_FLASH : 28|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ SPEEDLIMIT : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SIGNS : 40|8@1+ (1,0) [0|15] "" XXX
|
||||
SG_ SPEEDLIMIT_WEATHER : 48|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ VIBRATE : 52|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_1 : 55|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_2 : 56|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LEAD : 64|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_DISTANCE : 69|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LEAD_LATERAL : 80|7@1+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_3 : 87|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEAD_ALT : 88|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_ALT_DISTANCE : 93|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LEAD_ALT_LATERAL : 104|7@1+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_4 : 111|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEAD_LEFT : 112|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_LEFT_DISTANCE : 117|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LEAD_LEFT_LATERAL : 128|7@1+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_5 : 135|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEAD_RIGHT : 136|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_RIGHT_DISTANCE : 141|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ LEAD_RIGHT_LATERAL : 152|7@1+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_6 : 159|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_7 : 162|3@0+ (1,0) [0|7] "" XXX
|
||||
SG_ LEAD_LEFT_REAR_STATUS : 167|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_LEFT_REAR_DISTANCE : 175|8@0+ (0.1,0) [0|255] "m" XXX
|
||||
SG_ LEAD_LEFT_REAR_LATERAL : 182|7@0+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_8 : 183|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_9 : 191|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ LEAD_RIGHT_REAR_STATUS : 196|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ LEAD_RIGHT_REAR_DISTANCE : 197|8@1+ (0.1,0) [0|255] "m" XXX
|
||||
SG_ LEAD_RIGHT_REAR_LATERAL : 205|7@1+ (0.1,0) [0|127] "m" XXX
|
||||
SG_ ZEROS_10 : 212|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FAULT_FSS : 213|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_FCA : 216|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_LSS : 219|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_SLA : 222|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_DAW : 225|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_HBA : 228|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_SCC : 231|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_LFA : 234|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_HDA : 237|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_LCA : 240|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_HDP : 243|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_DAS : 246|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ FAULT_ESS : 249|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_11 : 252|4@1+ (1,0) [0|15] "" XXX
|
||||
|
||||
BO_ 357 SPAS1: 24 APRK
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 90|3@1+ (1,0) [0|0] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 96|16@1- (0.1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 362 SPAS2: 32 APRK
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|0] "" XXX
|
||||
SG_ BLINKER_CONTROL : 133|3@1+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 373 TCS: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 24|7@1+ (1,0) [0|127] "" XXX
|
||||
SG_ aBasis : 32|11@1+ (0.01,-10.23) [0|7] "m/s^2" XXX
|
||||
SG_ ACCEL_REF_ACC : 48|11@1- (1,0) [0|1023] "" XXX
|
||||
SG_ EQUIP_MAYBE : 64|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ACCEnable : 67|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ACC_REQ : 68|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 72|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 74|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 76|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 80|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DriverBraking : 81|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DriverBrakingLowSens : 84|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ AEB_EQUIP_MAYBE : 96|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_6 : 128|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ NEW_SIGNAL_7 : 135|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ PROBABLY_EQUIP : 136|2@1+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 416 SCC_CONTROL: 32 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ ACC_ObjDist : 24|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ ACC_ObjRelSpd : 35|9@1+ (0.1,-16.4) [-16.4|34.7] "m/s" XXX
|
||||
SG_ SET_ME_3 : 45|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ObjValid : 46|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_TMP_64 : 55|8@0+ (1,0) [0|63] "" XXX
|
||||
SG_ ZEROS_7 : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 64|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ MainMode_ACC : 66|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ ACCMode : 68|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_9 : 71|5@1+ (1,0) [0|15] "" XXX
|
||||
SG_ CRUISE_STANDSTILL : 76|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_5 : 77|11@1+ (1,0) [0|2047] "" XXX
|
||||
SG_ DISTANCE_SETTING : 88|3@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ZEROS_8 : 95|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ VSetDis : 103|8@0+ (1,0) [0|255] "km/h or mph" XXX
|
||||
SG_ NEW_SIGNAL_6 : 104|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_2 : 105|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 109|2@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_10 : 111|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ ZEROS_6 : 119|16@0+ (1,0) [0|65535] "" XXX
|
||||
SG_ aReqValue : 128|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
|
||||
SG_ aReqRaw : 140|11@1+ (0.01,-10.23) [-10.23|10.24] "m/s^2" XXX
|
||||
SG_ JerkUpperLimit : 158|7@0+ (0.1,0) [0|0] "" XXX
|
||||
SG_ JerkLowerLimit : 166|7@0+ (0.1,0) [0|12.7] "m/s^3" XXX
|
||||
SG_ NEW_SIGNAL_2 : 168|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_8 : 170|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ OBJ_STATUS : 176|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ZEROS_4 : 183|4@0+ (1,0) [0|63] "" XXX
|
||||
SG_ StopReq : 184|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ ZEROS_3 : 191|7@0+ (1,0) [0|127] "" XXX
|
||||
SG_ NEW_SIGNAL_15 : 192|11@1+ (0.1,0) [0|204.7] "m" XXX
|
||||
SG_ ZEROS_2 : 207|5@0+ (1,0) [0|63] "" XXX
|
||||
SG_ ZEROS : 215|48@0+ (1,0) [0|281474976710655] "" XXX
|
||||
|
||||
BO_ 426 CRUISE_BUTTONS_ALT: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 24|4@1+ (1,0) [0|15] "" XXX
|
||||
SG_ SET_ME_1 : 28|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ DISTANCE_UNIT : 30|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 31|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ ADAPTIVE_CRUISE_MAIN_BTN : 34|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 35|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ CRUISE_BUTTONS : 36|3@1+ (1,0) [0|4] "" XXX
|
||||
SG_ LDA_BTN : 39|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 40|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NORMAL_CRUISE_MAIN_BTN : 41|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 42|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_2 : 44|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_6 : 47|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE7 : 56|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 437 FR_CMR_03_50ms: 32 FR_CMR
|
||||
SG_ FR_CMR_Crc3Val : 0|16@1+ (1,0) [0|65535] "" RR_C_RDR,CGW
|
||||
SG_ FR_CMR_AlvCnt3Val : 16|8@1+ (1,0) [0|255] "" RR_C_RDR,CGW
|
||||
SG_ Info_LftLnQualSta : 24|3@1+ (1,0) [0|7] "" RR_C_RDR,CGW
|
||||
SG_ Info_LftLnDptSta : 27|2@1+ (1,0) [0|3] "" RR_C_RDR,CGW
|
||||
SG_ Info_LftLnPosVal : 29|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" RR_C_RDR,CGW
|
||||
SG_ Info_LftLnHdingAnglVal : 43|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" RR_C_RDR,CGW
|
||||
SG_ Info_LftLnCvtrVal : 64|16@1- (1e-06,0) [-0.032768|0.032767] "1/m" CGW
|
||||
SG_ Info_LftLnCrvtrDrvtvVal : 80|16@1- (4e-09,0) [-0.000131072|0.000131068] "1/m2" CGW
|
||||
SG_ Info_RtLnQualSta : 96|3@1+ (1,0) [0|7] "" RR_C_RDR,CGW
|
||||
SG_ Info_RtLnDptSta : 99|2@1+ (1,0) [0|3] "" RR_C_RDR,CGW
|
||||
SG_ Info_RtLnPosVal : 101|14@1- (0.0039625,0) [-32.4608|32.4568375] "m" RR_C_RDR,CGW
|
||||
SG_ Info_RtLnHdingAnglVal : 115|10@1- (0.000976563,0) [-0.500000256|0.499023693] "rad" RR_C_RDR,CGW
|
||||
SG_ Info_RtLnCvtrVal : 128|16@1- (1,0) [0|65535] "" CGW
|
||||
SG_ Info_RtLnCrvtrDrvtvVal : 144|16@1- (1,0) [0|65535] "" CGW
|
||||
SG_ ID_CIPV : 192|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ Relative_Velocity : 200|12@1+ (0.05,-100) [-100|104.75] "m/s" Dummy
|
||||
SG_ Longitudinal_Distance : 212|12@1+ (0.05,0) [0|204.75] "m" Dummy
|
||||
|
||||
BO_ 442 BLINDSPOTS_REAR_CORNERS: 24 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LEFT_BLOCKED : 24|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEFT_MB : 30|1@0+ (1,0) [0|3] "" XXX
|
||||
SG_ MORE_LEFT_PROB : 32|1@1+ (1,0) [0|3] "" XXX
|
||||
SG_ FL_INDICATOR : 46|6@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FR_INDICATOR : 54|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ RIGHT_BLOCKED : 64|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ COLLISION_AVOIDANCE_ACTIVE : 68|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FL_INDICATOR_ALT : 138|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FR_INDICATOR_ALT : 141|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 463 CRUISE_BUTTONS: 8 XXX
|
||||
SG_ _CHECKSUM : 0|8@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 12|4@1+ (1,0) [0|255] "" XXX
|
||||
SG_ CRUISE_BUTTONS : 16|3@1+ (1,0) [0|3] "" XXX
|
||||
SG_ ADAPTIVE_CRUISE_MAIN_BTN : 19|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NORMAL_CRUISE_MAIN_BTN : 21|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ LDA_BTN : 23|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ RIGHT_PADDLE : 25|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ LEFT_PADDLE : 27|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_1 : 29|1@1+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 474 ADRV_0x1da: 32 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_22 : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_41 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 480 LFAHDA_CLUSTER: 16 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 24|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 25|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 30|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ HDA_ICON : 31|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 32|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ LFA_ICON : 47|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 49|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 485 BLINDSPOTS_FRONT_CORNER_1: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ REVERSING : 24|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 31|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_7 : 32|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_8 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_9 : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 80|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 88|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 96|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 108|2@0+ (1,0) [0|3] "" XXX
|
||||
|
||||
BO_ 490 ADRV_0x1ea: 32 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_1C : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_1 : 32|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 47|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_4 : 64|6@1+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_5 : 72|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_6 : 75|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_7 : 80|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_8 : 88|7@1+ (1,0) [0|127] "" XXX
|
||||
SG_ NEW_SIGNAL_9 : 96|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_FF : 120|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_10 : 143|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_11 : 144|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_12 : 152|6@1+ (1,0) [0|63] "" XXX
|
||||
SG_ NEW_SIGNAL_13 : 160|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_14 : 163|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ NEW_SIGNAL_16 : 168|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_15 : 175|4@0+ (1,0) [0|63] "" XXX
|
||||
SG_ NEW_SIGNAL_17 : 176|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ NEW_SIGNAL_18 : 184|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ NEW_SIGNAL_19 : 208|3@1+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_20 : 212|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SET_ME_TMP_F : 232|5@1+ (1,0) [0|31] "" XXX
|
||||
SG_ SET_ME_TMP_F_2 : 240|5@1+ (1,0) [0|31] "" XXX
|
||||
|
||||
BO_ 506 FR_CMR_02_100ms: 32 FR_CMR
|
||||
SG_ FR_CMR_Crc2Val : 0|16@1+ (1,0) [0|65535] "" CGW
|
||||
SG_ FR_CMR_AlvCnt2Val : 16|8@1+ (1,0) [0|255] "" CGW
|
||||
SG_ ISLW_OptUsmSta : 24|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLW_SysSta : 26|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLW_NoPassingInfoDis : 28|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ ISLW_OvrlpSignDis : 31|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLW_SpdCluMainDis : 33|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLW_SpdNaviMainDis : 41|8@1+ (1,0) [0|255] "" CGW
|
||||
SG_ ISLW_SubCondinfoSta1 : 49|4@1+ (1,0) [0|15] "" CLU,CGW
|
||||
SG_ ISLW_SubCondinfoSta2 : 53|4@1+ (1,0) [0|15] "" CLU,CGW
|
||||
SG_ ISLW_SpdCluSubMainDis : 64|8@1+ (1,0) [0|255] "" CLU
|
||||
SG_ ISLW_SpdCluDisSubCond1 : 72|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLW_SpdCluDisSubCond2 : 80|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLW_SpdNaviSubMainDis : 88|8@1+ (1,0) [0|255] "" CLU
|
||||
SG_ ISLW_SpdNaviDisSubCond1 : 96|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLW_SpdNaviDisSubCond2 : 104|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLA_SpdwOffst : 112|8@1+ (1,0) [0|255] "" CLU,CGW
|
||||
SG_ ISLA_SwIgnoreReq : 120|2@1+ (1,0) [0|3] "" CGW
|
||||
SG_ ISLA_SpdChgReq : 122|2@1+ (1,0) [0|3] "" CGW
|
||||
SG_ ISLA_SpdWrn : 124|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLA_IcyWrn : 126|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLA_SymFlashMod : 128|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ ISLA_Popup : 131|3@1+ (1,0) [0|7] "" CLU
|
||||
SG_ ISLA_OptUsmSta : 136|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ ISLA_OffstUsmSta : 139|3@1+ (1,0) [0|7] "" CLU,CGW
|
||||
SG_ ISLA_AutoUsmSta : 142|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
SG_ ISLA_Cntry : 144|4@1+ (1,0) [0|15] "" CLU,CGW
|
||||
SG_ ISLA_AddtnlSign : 149|5@1+ (1,0) [0|31] "" CLU,CGW
|
||||
SG_ ISLA_SchoolZone : 154|2@1+ (1,0) [0|3] "" CLU,CGW
|
||||
|
||||
BO_ 507 CAM_0x1fb: 32 CAMERA
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 512 ADRV_0x200: 8 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_E1 : 24|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_3A : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 593 RADAR_0x251: 16 FRONT_RADAR
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 687 HOD_FD_01_100ms: 8 XXX
|
||||
SG_ HOD_Dir_Status : 18|3@0+ (1,0) [0|7] "" XXX
|
||||
SG_ NEW_SIGNAL_2 : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 40|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ HOD_Option : 48|2@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 698 FR_CMR_04_40ms: 32 FR_CMR
|
||||
SG_ FR_CMR_Crc4Val : 0|16@1+ (1,0) [0|65535] "" Dummy
|
||||
SG_ FR_CMR_AlvCnt4Val : 16|8@1+ (1,0) [0|255] "" Dummy
|
||||
SG_ IFSref_FR_CMR_Sta : 24|2@1+ (1,0) [0|3] "" CGW
|
||||
SG_ IFSref_VehNumVal : 26|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_ILLAmbtSta : 30|2@1+ (0.1,0) [0|0.3] "" CGW
|
||||
SG_ IFSref_VehLftAngl1Val : 32|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl1Val : 41|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl2Val : 50|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehDst1Val : 59|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehRtAngl2Val : 64|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl3Val : 73|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl3Val : 82|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl4Val : 91|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl4Val : 100|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl5Val : 109|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl5Val : 118|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl6Val : 128|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl6Val : 137|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl7Val : 146|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl7Val : 155|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl8Val : 164|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl8Val : 173|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl9Val : 182|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl9Val : 192|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehLftAngl10Val : 201|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehRtAngl10Val : 210|9@1+ (0.1,-25) [-25|26.1] "Deg" CGW
|
||||
SG_ IFSref_VehDst2Val : 219|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst3Val : 223|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst4Val : 227|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst5Val : 231|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst6Val : 235|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst7Val : 239|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst8Val : 243|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst9Val : 247|4@1+ (1,0) [0|15] "" CGW
|
||||
SG_ IFSref_VehDst10Val : 251|4@1+ (1,0) [0|15] "" CGW
|
||||
|
||||
BO_ 736 MANUAL_SPEED_LIMIT_ASSIST: 32 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ MSLA_STATUS : 26|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ MSLA_ENABLED : 38|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ MAX_SPEED : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ MAX_SPEED_COPY : 144|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 837 ADRV_0x345: 8 ADRV
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ SET_ME_15 : 24|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 866 CAM_0x362: 32 CAMERA
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE3 : 24|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE4 : 32|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE5 : 40|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE6 : 48|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ LEFT_LANE_LINE : 56|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_0 : 58|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ RIGHT_LANE_LINE : 60|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ SET_ME_0_2 : 62|2@1+ (1,0) [0|3] "" XXX
|
||||
SG_ BYTE8 : 64|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE9 : 72|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE10 : 80|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE11 : 88|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE12 : 96|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE13 : 104|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE14 : 112|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE15 : 120|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE16 : 128|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE17 : 136|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE18 : 144|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE19 : 152|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE20 : 160|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE21 : 168|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE22 : 176|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE23 : 184|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE24 : 192|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE25 : 200|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE26 : 208|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE27 : 216|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE28 : 224|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE29 : 232|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE30 : 240|8@1+ (1,0) [0|255] "" XXX
|
||||
SG_ BYTE31 : 248|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 874 BLINDSPOTS_FRONT_CORNER_2: 16 XXX
|
||||
SG_ CHECKSUM : 0|16@1+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER : 16|8@1+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 961 BLINKER_STALKS: 8 XXX
|
||||
SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ HIGHBEAM_FORWARD : 18|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LIGHT_KNOB_POSITION : 21|2@0+ (1,0) [0|3] "" XXX
|
||||
SG_ HIGHBEAM_BACKWARD : 26|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEFT_BLINKER : 30|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RIGHT_BLINKER : 32|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1041 DOORS_SEATBELTS: 8 XXX
|
||||
SG_ CHECKSUM_MAYBE : 7|8@0+ (1,0) [0|65535] "" XXX
|
||||
SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ DRIVER_DOOR : 24|1@1+ (1,0) [0|1] "" XXX
|
||||
SG_ PASSENGER_DOOR : 34|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ PASSENGER_SEATBELT : 36|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DRIVER_SEATBELT : 42|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DRIVER_REAR_DOOR : 52|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ PASSENGER_REAR_DOOR : 56|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1043 BLINKERS: 8 XXX
|
||||
SG_ LEFT_STALK : 8|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RIGHT_STALK : 10|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ COUNTER_ALT : 15|4@0+ (1,0) [0|15] "" XXX
|
||||
SG_ LEFT_LAMP : 20|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RIGHT_LAMP : 22|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ LEFT_LAMP_ALT : 59|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RIGHT_LAMP_ALT : 61|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ USE_ALT_LAMP : 62|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1144 DRIVE_MODE: 8 XXX
|
||||
SG_ DRIVE_MODE : 0|16@1+ (1,-61611) [0|61611] "" XXX
|
||||
SG_ DRIVE_MODE2 : 28|3@1+ (1,0) [1|3] "" XXX
|
||||
|
||||
BO_ 1151 HVAC_TOUCH_BUTTONS: 8 XXX
|
||||
SG_ AUTO_BUTTON : 8|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SYNC_BUTTON : 12|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FR_DEFROST_BUTTON : 20|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RR_DEFROST_BUTTON : 22|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FAN_SPEED_UP_BUTTON : 24|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ FAN_SPEED_DOWN_BUTTON : 26|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ AIR_DIRECTION_BUTTON : 28|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ AC_BUTTON : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DRIVER_ONLY_BUTTON : 44|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ RECIRC_BUTTON : 48|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ HEAT_BUTTON : 52|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1240 CLUSTER_INFO: 8 XXX
|
||||
SG_ DISTANCE_UNIT : 0|1@1+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1259 LOCAL_TIME2: 8 XXX
|
||||
SG_ HOURS : 15|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SECONDS : 24|6@1+ (1,0) [0|63] "" XXX
|
||||
SG_ NEW_SIGNAL_3 : 39|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 1264 LOCAL_TIME: 8 XXX
|
||||
SG_ HOURS : 12|5@0+ (1,0) [0|31] "" XXX
|
||||
SG_ MINUTES : 21|6@0+ (1,0) [0|63] "" XXX
|
||||
SG_ SECONDS : 31|8@0+ (1,0) [0|59] "" XXX
|
||||
|
||||
CM_ SG_ 96 BRAKE_PRESSURE "User applied brake pedal pressure. Ramps from computer applied pressure on falling edge of cruise. Cruise cancels if !=0";
|
||||
CM_ SG_ 101 BRAKE_POSITION "User applied brake pedal position, max is ~700. Signed on some vehicles";
|
||||
CM_ SG_ 352 SET_ME_9 "has something to do with AEB settings";
|
||||
CM_ SG_ 373 ACCEnable "Likely a copy of CAN's TCS13->ACCEnable";
|
||||
CM_ SG_ 373 DriverBraking "Likely derived from BRAKE->BRAKE_POSITION";
|
||||
CM_ SG_ 373 DriverBrakingLowSens "Higher threshold version of DriverBraking";
|
||||
CM_ SG_ 373 PROBABLY_EQUIP "aeb equip?";
|
||||
CM_ SG_ 416 VSetDis "set speed in display units";
|
||||
CM_ SG_ 480 NEW_SIGNAL_5 "todo: figure out why always set to 1";
|
||||
CM_ SG_ 687 HOD_Dir_Status "This signal indicates the status of hands on/off";
|
||||
CM_ SG_ 736 MAX_SPEED "Display units. Restricts car from driving above this speed unless accelerator pedal is depressed beyond pressure point";
|
||||
CM_ BO_ 866 "Contains signals with detailed lane line information. Used by ADAS ECU on HDA 2 vehicles to operate LFA. Used on cars that use message 272.";
|
||||
CM_ SG_ 866 LEFT_LANE_LINE "Left lane line confidence";
|
||||
CM_ SG_ 866 RIGHT_LANE_LINE "Right lane line confidence";
|
||||
CM_ SG_ 961 COUNTER_ALT "only increments on change";
|
||||
CM_ SG_ 1041 COUNTER_ALT "only increments on change";
|
||||
CM_ BO_ 1043 "Lamp signals do not seem universal on cars that use LKAS_ALT, but stalk signals do.";
|
||||
CM_ SG_ 1043 COUNTER_ALT "only increments on change";
|
||||
CM_ SG_ 1043 USE_ALT_LAMP "likely 1 on cars that use alt lamp signals";
|
||||
VAL_ 53 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
|
||||
VAL_ 64 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
|
||||
VAL_ 69 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
|
||||
VAL_ 96 TRACTION_AND_STABILITY_CONTROL 0 "On" 5 "Limited" 1 "Off";
|
||||
VAL_ 112 GEAR 0 "P" 5 "D" 6 "N" 7 "R";
|
||||
VAL_ 234 LKA_FAULT 0 "ok" 1 "lka fault";
|
||||
VAL_ 282 HBA_SysOptSta 0 "None HBA Option (Default)" 1 "HBA Option" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 282 HBA_SysSta 0 "HBA Disable" 1 "HBA Enable & High Beam Off" 2 "HBA Enable & High Beam On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "System Fail";
|
||||
VAL_ 282 HBA_IndLmpReq 0 "HBA Indicator Lamp Off" 1 "HBA Indicator Lamp On" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 282 FCA_Equip_MFC 0 "No Coding" 1 "Sensor Fusion FCA" 2 "Camera only FCA" 3 "No FCA Option" 4 "ADAS_DRV Option" 5 "Reserved" 6 "Not used" 7 "Error indicator";
|
||||
VAL_ 282 HBA_OptUsmSta 0 "None HBA Option (Default)" 1 "HBA Function Off" 2 "HBA Function On" 3 "Invalid (Fail)";
|
||||
VAL_ 282 DAW_LVDA_PUDis 0 "Default" 1 "Display “Leading vehicle departure alert”" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 282 DAW_LVDA_OptUsmSta 0 "No Option (default)" 1 "Off" 2 "On" 3 "Error Indicator";
|
||||
VAL_ 282 DAW_OptUsmSta 0 "None DAW Option (Default)" 1 "System Off" 2 "System On" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (Gray)";
|
||||
VAL_ 282 DAW_SysSta 0 "System Off" 1 "Attention Level 1" 2 "Attention Level 2" 3 "Attention Level 3" 4 "Attention Level 4" 5 "Attention Level 5" 6 "Reserved" 7 "Reserved" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "System Standby" 15 "System Fail";
|
||||
VAL_ 282 DAW_WrnMsgSta 0 "No Warning" 1 "Rest Recommend Warning" 2 "Hands-Off TMS call request" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Error indicator";
|
||||
VAL_ 282 DAW_TimeRstReq 0 "No signal" 1 "Time reset" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 282 DAW_SnstvtyModRetVal 0 "Default" 1 "Late" 2 "Normal" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid";
|
||||
VAL_ 304 PARK_BUTTON 1 "Pressed" 2 "Not Pressed";
|
||||
VAL_ 304 KNOB_POSITION 1 "R" 2 "N (on R side)" 3 "Centered" 4 "N (on D side)" 5 "D";
|
||||
VAL_ 304 GEAR 1 "P" 2 "R" 3 "N" 4 "D";
|
||||
VAL_ 352 AEB_SETTING 1 "off" 2 "warning only" 3 "active assist";
|
||||
VAL_ 353 FCA_ICON 0 "HIDDEN" 1 "ORANGE" 2 "RED";
|
||||
VAL_ 353 FCA_ALT_ICON 0 "HIDDEN" 1 "ORANGE" 3 "RED";
|
||||
VAL_ 353 LKA_ICON 0 "HIDDEN" 1 "ORANGE" 3 "GRAY" 4 "GREEN";
|
||||
VAL_ 353 HBA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN";
|
||||
VAL_ 353 FCA_IMAGE 0 "HIDDEN" 2 "VISIBLE";
|
||||
VAL_ 353 BCA_LEFT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON";
|
||||
VAL_ 353 BCA_RIGHT 0 "HIDDEN" 1 "VISIBLE" 2 "VISIBLE+ICON";
|
||||
VAL_ 353 LCA_LEFT_ARROW 0 "HIDDEN" 1 "VISIBLE";
|
||||
VAL_ 353 LCA_RIGHT_ARROW 0 "HIDDEN" 1 "VISIBLE";
|
||||
VAL_ 353 CENTERLINE 0 "HIDDEN" 1 "GREEN";
|
||||
VAL_ 353 TARGET 0 "HIDDEN" 1 "BLUE" 3 "WHITE";
|
||||
VAL_ 353 LANELINE_LEFT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN";
|
||||
VAL_ 353 LANELINE_RIGHT 0 "GRAY" 1 "HIDDEN" 2 "WHITE" 4 "ORANGE" 6 "GREEN";
|
||||
VAL_ 353 LANE_HIGHLIGHT 0 "HIDDEN" 1 "GREEN" 2 "WHITE" 3 "BLUE" 4 "ORANGE" 5 "RED";
|
||||
VAL_ 353 LANE_LEFT 0 "HIDDEN" 1 "GREEN";
|
||||
VAL_ 353 LANE_RIGHT 0 "HIDDEN" 1 "GREEN";
|
||||
VAL_ 353 LANE_ZOOM 0 "ZOOM" 1 "HIDDEN";
|
||||
VAL_ 353 ALERTS_1 0 "HIDDEN" 1 "WARNING_ONLY_CAR_CENTER" 2 "WARNING_ONLY_CAR_LEFT" 3 "WARNING_ONLY_CAR_RIGHT" 4 "WARNING_ONLY_LEFT" 5 "WARNING_ONLY_RIGHT" 11 "EMERGENCY_BRAKING_CAR_CENTER" 12 "EMERGENCY_BRAKING_CAR_LEFT" 13 "EMERGENCY_BRAKING_CAR_RIGHT" 14 "EMERGENCY_BRAKING_LEFT" 15 "EMERGENCY_BRAKING_RIGHT" 21 "EMERGENCY_STEERING_CAR_LEFT" 22 "EMERGENCY_STEERING_CAR_RIGHT" 23 "EMERGENCY_STEERING_CAR_LEFT_AWAY" 24 "EMERGENCY_STEERING_CAR_RIGHT_AWAY" 25 "EMERGENCY_STEERING_REAR_LEFT" 26 "EMERGENCY_STEERING_REAR_RIGHT" 33 "DRIVE_CAREFULLY";
|
||||
VAL_ 353 ALERTS_2 0 "HIDDEN" 1 "KEEP_HANDS_ON_STEERING_WHEEL" 2 "KEEP_HANDS_ON_STEERING_WHEEL_RED" 3 "LANE_FOLLOWING_ASSIST_DEACTIVATED" 4 "HIGHWAY_DRIVING_ASSIST_DEACTIVATED" 5 "CONSIDER_TAKING_A_BREAK" 6 "PRESS_OK_BUTTON_TO_ENABLE_LANE_CHANGE_ASSIST" 7 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 8 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 9 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY" 11 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_AUDIBLE" 12 "KEEP_YOUR_EYES_ON_THE_ROAD" 13 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_AUDIBLE" 14 "COLLISION_RISK_VEHICLE_TAKING_EMERGENCY_CONTROL" 15 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 16 "BE_PREPARED_TO_TAKE_CONTROL_OF_THE_VEHICLE_AT_ANY_TIME" 21 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY_VEHICLE_IS_STOPPING" 10 "TAKE_CONTROL_OF_THE_VEHICLE_IMMEDIATELY";
|
||||
VAL_ 353 ALERTS_3 1 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 2 "SET_SPEED_CHANGED" 3 "AUTOMATICALLY_ADJUSTING_TO_THE_POSTED_SPEED_LIMIT" 4 "SET_SPEED_CHANGED" 7 "DISTANCE_1" 8 "DISTANCE_2" 9 "DISTANCE_3" 10 "DISTANCE_4" 17 "DRIVE_CAREFULLY" 18 "CHECK_SURROUNDINGS" 19 "CONDITIONS_NOT_MET" 20 "LANES_NOT_DETECTED" 21 "CURVE_TOO_SHARP" 22 "LANE_TOO_NARROW" 23 "ROAD_TYPE_NOT_SUPPORTED" 24 "UNAVAILABLE_WITH_HAZARD_LIGHTS_ON" 25 "VEHICLE_SPEED_IS_TOO_LOW" 26 "KEEP_HANDS_ON_STEERING_WHEEL" 27 "LANE_TYPE_NOT_SUPPORTED" 28 "LANE_ASSIST_CANCELED_STEERING_INPUT_DETECTED" 0 "HIDDEN";
|
||||
VAL_ 353 ALERTS_4 0 "HIDDEN" 1 "TAKE_FOOT_OFF_THE_ACCELERATOR_PEDAL" 2 "TAKE_FOOT_OFF_THE_BRAKE_PEDAL" 3 "UNAVAILABLE_WHILE_HIGHWAY_DRIVING_PILOT_SYSTEM_IS_ACTIVE" 4 "TO_EXIT_HDP_GRASP_THE_STEERING_WHEEL_THEN_PRESS_AND_HOLD_THE_HDP_BUTTON" 5 "ACCELERATOR_PEDAL_OPERATION_LIMITED_FOR_SAFETY" 6 "TURN_OFF_HAZARD_WARNING_LIGHTS_AND_TURN_SIGNAL" 7 "KEEP_THE_DRIVERS_SEAT_IN_A_SAFE_DRIVING_POSITION" 16 "SET_SPEED_CHANGED" 17 "ACTIVATING_WINDSHIELD_DEFOG_TO_MAINTAIN_THE_DRIVERS_VIEW" 18 "SET_THE_WIPER_AND_LIGHT_CONTROLS_TO_AUTO" 19 "VEHICLE_SPEED_REDUCED_FOR_SAFETY_MERGING_LANES_AHEAD" 20 "SPEED_REDUCED_FOR_SAFETY_CONSTRUCTION_ZONE_DETECTED" 21 "VEHICLE_SPEED_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 22 "PREPARE_TO_TAKE_CONTROL_UNSUPPORTED_ROAD_TYPE_AHEAD" 23 "PREPARE_TO_TAKE_CONTROL_ENTRANCE_AND_EXIT_RAMPS_AHEAD" 24 "PREPARE_TO_TAKE_CONTROL_TOLLGATE_AHEAD" 25 "PREPARE_TO_TAKE_CONTROL_ROAD_EVENT_AHEAD" 26 "CLEARING_PATH_FOR_EMERGENCY_VEHICLE" 27 "VEHICLE_IS_TOO_SLOW_COMPARED_TO_TRAFFIC_FLOW" 28 "AFTER_SUNSET_HDP_IS_AVAILABLE_IN_AN_INSIDE_LANE_BEHIND_A_LEADING_VEHICLE" 29 "VEHICLE_SPEED_LIMITED_MERGING_LANES_AHEAD" 30 "VEHICLE_SPEED_LIMITED_CONSTRUCTION_ZONE_DETECTED" 31 "VEHICLE_SPEED_TEMPORARILY_LIMITED_FOR_SAFETY" 32 "PRESS_AND_HOLD_THE_BUTTON_TO_ACTIVATE_HIGHWAY_DRIVING_PILOT" 40 "HIGHWAY_DRIVING_PILOT_SYSTEM_IS_AVAILABLE" 64 "RESTART_VEHICLE_AFTER_EMERGENCY_STOP" 65 "CONNECTED_SERVICES_UNAVAILABLE" 66 "AVAILABLE_AFTER_VEHICLE_SOFTWARE_IS_UPDATED" 67 "ROAD_TYPE_NOT_SUPPORTED" 68 "ONLY_AVAILABLE_WHILE_DRIVING_ON_HIGHWAY_LANES" 69 "UNAVAILABLE_WHILE_OTHER_WARNINGS_ARE_ACTIVE" 70 "CANNOT_ACTIVATE_AT_ENTRANCE_EXIT_RAMPS" 71 "LANE_UNSUPPORTED" 72 "NOT_AVAILABLE_IN_THIS_COUNTRY" 79 "CHECKING_THE_DETECTION_RANGE_OF_THE_SENSOR" 80 "SHIFT_TO_D" 81 "ENGINE_STOPPED_BY_AUTO_STOP" 82 "INCREASE_DISTANCE_FROM_VEHICLE_AHEAD" 83 "VEHICLE_SPEED_IS_TOO_HIGH" 84 "CENTER_VEHICLE_IN_THE_LANE" 85 "PARKING_ASSIST_IS_ACTIVE" 86 "ESC_ACTIVIATION_REQUIRED" 87 "UNFOLD_SIDE_VIEW_MIRRORS" 88 "UNAVAILABLE_IN_THE_OUTER_LANE_AFTER_SUNSET" 89 "VEHICLE_SPEED_LIMITED_AFTER_SUNSET_FOR_SAFETY" 90 "LEADING_VEHICLE_NOT_DETECTED" 104 "AGGRESSIVE_BRAKING_OR_STEERING_DETECTED" 110 "SENSOR_AUTO_CALIBRATION_IN_PROGRESS_THIS_MAY_TAKE_SEVERAL_MINUTES" 111 "HIGHWAY_DRIVING_PILOT_WILL_BE_AVAILABLE_SHORTLY" 112 "IF_STEERING_WHEEL_IS_USED_HDP_WILL_BE_DEACTIVATED" 120 "IMPACT_DETECTED" 128 "UNSUITABLE_USE_OF_ACCELERATOR_PEDAL_DETECTED" 129 "GEAR_SHIFTER_USE_DETECTED" 130 "UNSUITABLE_BRAKE_PEDAL_USE_DETECTED" 131 "VEHICLE_START_BUTTON_PRESSED" 132 "VEHICLE_HAS_BEEN_STOPPED_FOR_TOO_LONG" 141 "TRAFFIC_CONGESTION_HAS_CLEARED" 142 "ENTRANCE_AND_EXIT_RAMPS_AHEAD" 143 "UNSUPPORTED_LANE_AHEAD" 144 "UNSUPPORTED_ROAD_TYPE_AHEAD" 145 "LANE_DEPARTURE_DETECTED" 146 "MAXIMUM_SPEED_EXCEEDED" 147 "HIGHWAY_DRIVING_PILOT_LIMITED_ABNORMAL_VEHICLE_CONTROLLER_STATUS" 148 "WIPER_LIGHT_CONTROL_SETTINGS_ARE_UNSUITABLE_FOR_USE_WITH_HDP" 149 "WINDSHIELD_DEFOG_SYSTEM_STATUS_IS_UNSUITABLE_FOR_USE_WITH_HDP" 150 "HAZARD_WARNING_LIGHTS_OR_TURN_SIGNAL_OPERATION_DETECTED" 151 "PERFORMING_EVASIVE_STEERING_OBSTACLES_DETECTED_AHEAD" 152 "HIGHWAY_DRIVING_PILOT_LIMITED_SENSOR_DETECTION_RANGE_LIMITED" 160 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 161 "SAFETY_FUNCTION_ACTIVATED" 176 "CAMERA_OBSCURED" 177 "RADAR_BLOCKED" 178 "LIDAR_BLOCKED" 179 "AIRBAG_WARNING_LIGHT_IS_ON" 180 "ATTACHED_TRAILED_DETECTED" 181 "HIGH_OUTSIDE_TEMPERATURE" 182 "LOW_OUTSIDE_TEMPERATURE" 190 "UNAVAILABLE_DUE_TO_THE_ROAD_EVENT_INFORMATION_RECEIVED" 191 "UNAVAILABLE_NEAR_TOLLGATES" 192 "DRIVERS_SEAT_IS_NOT_IN_A_SAFE_DRIVING_POSITION" 193 "VEHICLE_DRIVING_THE_WRONG_WAY_DETECTED_AHEAD" 194 "EMERGENCY_VEHICLE_DETECTED" 195 "OBSTACLE_DETECTED_AHEAD" 196 "SENSOR_BLOCKED_DUE_TO_RAIN_SNOW_OR_ROAD_DEBRIS" 197 "SLIPPERY_ROAD_SURFACE_DETECTED" 198 "CONSTRUCTION_ZONE_DETECTED_AHEAD" 199 "PEDESTRIAN_DETECTED_AHEAD" 200 "UNSUITABLE_DRIVERS_SEAT_POSITION_DETECTED" 201 "FOLDED_SIDE_VIEW_MIRRORS_DETECTED" 208 "VEHICLE_POSITION_NOT_DETECTED" 209 "LANE_NOT_DETECTED" 210 "DRIVER_NOT_DETECTED" 211 "KEEP_YOUR_EYES_ON_THE_ROAD" 212 "LEADING_VEHICLE_REQUIRED_AFTER_SUNSET" 213 "TBD" 240 "LOW_FUEL" 241 "LOW_TIRE_PRESSURE" 242 "DOOR_OPEN" 243 "TRUNK_OPEN" 244 "HOOD_OPEN" 245 "SEAT_BELT_NOT_FASTENED" 246 "PARKING_BRAKE_ACTIVATED" 247 "LOW_EV_BATTERY" 248 "HDP_DEACTIVATION_DELAYED_RISK_OF_COLLISION_DETECTED" 249 "LIFTGATE_OPENED";
|
||||
VAL_ 353 ALERTS_5 0 "HIDDEN" 1 "DRIVERS_GRASP_NOT_DETECTED_DRIVING_SPEED_WILL_BE_LIMITED" 2 "WATCH_FOR_SURROUNDING_VEHICLES" 3 "SMART_CRUISE_CONTROL_DEACTIVATED" 4 "SMART_CRUISE_CONTROL_CONDITIONS_NOT_MET" 5 "USE_SWITCH_OR_PEDAL_TO_ACCELERATE" 6 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_TRAILER_ATTACHED" 7 "DRIVER_ASSISTNCE_SYSTEM_LIMITED_DRIVER_FULL_FACE_NOT_VISIBLE" 11 "LEADING_VEHICLE_IS_DRIVING_AWAY" 12 "STOP_VEHICLE_THEN_TRY_AGAIN" 19 "ACTIVATING_HIGHWAY_DRIVING_PILOT_SYSTEM" 20 "CONTINUING_USE_OF_HIGHWAY_DRIVING_PILOT_WILL_RESULT_IN_DEVIATION_FROM_THE_NAVIGATION_ROUTE" 21 "HIGHWAY_DRIVING_PILOT_SYSTEM_DEACTIVATED_SILENT" 22 "HIGHWAY_DRIVING_PILOT_SYSTEM_NOT_APPLIED" 23 "HIGHWAY_DRIVING_PILOT_CONDITIONS_NOT_MET_SILENT";
|
||||
VAL_ 353 MUTE 0 "NONE" 1 "MUTED";
|
||||
VAL_ 353 SOUNDS_1 0 "NONE" 3 "FAST BEEP" 6 "CONSTANT BEEP";
|
||||
VAL_ 353 SOUNDS_2 0 "NONE" 2 "SINGLE CHIME" 3 "CONSTANT CHIME" 6 "FAST BEEP";
|
||||
VAL_ 353 SOUNDS_3 0 "NONE" 3 "SOFT CHIME" 5 "SINGLE CHIME";
|
||||
VAL_ 353 SOUNDS_4 0 "NONE" 2 "DOUBLE CHIME";
|
||||
VAL_ 353 SETSPEED_HUD 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN";
|
||||
VAL_ 353 DISTANCE_LEAD 0 "HIDDEN" 1 "GRAY" 2 "WHITE";
|
||||
VAL_ 353 DISTANCE_CAR 0 "HIDDEN" 1 "GRAY" 2 "WHITE" 3 "CYAN A";
|
||||
VAL_ 353 DISTANCE_SPACING 0 "HIDDEN" 1 "BLUE" 3 "WHITE" 5 "CYAN";
|
||||
VAL_ 353 SETSPEED 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 6 "CYAN";
|
||||
VAL_ 353 HDA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN HDP";
|
||||
VAL_ 353 SLA_ICON 0 "HIDDEN" 1 "WHITE UP" 2 "WHITE DOWN" 3 "GREEN UP" 4 "GREEN DOWN";
|
||||
VAL_ 353 NAV_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE";
|
||||
VAL_ 353 LFA_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 3 "WHITE" 5 "CYAN";
|
||||
VAL_ 353 LCA_LEFT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE";
|
||||
VAL_ 353 LCA_RIGHT_ICON 0 "HIDDEN" 1 "GRAY" 2 "GREEN" 4 "WHITE";
|
||||
VAL_ 353 BACKGROUND 0 "HIDDEN" 1 "BLUE" 3 "ORANGE" 4 "FLASHING ORANGE" 6 "FLASHING RED" 7 "GRAY";
|
||||
VAL_ 353 DAW_ICON 0 "HIDDEN" 1 "ORANGE";
|
||||
VAL_ 353 CAR_CIRCLE 0 "HIDDEN" 1 "GRAY" 2 "CYAN";
|
||||
VAL_ 354 COUNTRY 0 "HIDDEN" 1 "SOUTH_KOREA" 4 "INTL" 5 "JAPAN" 6 "CANADA" 7 "USA" 8 "CHINA" 9 "INTL";
|
||||
VAL_ 354 SPEEDLIMIT_FLASH 0 "HIDDEN" 1 "ERROR" 2 "NORMAL" 4 "RED";
|
||||
VAL_ 354 SIGNS 0 "HIDDEN" 1 "PEDESTRIAN_CROSSING" 2 "SCHOOL_CROSSWALK" 8 "STOP" 9 "YIELD" 16 "DO_NOT_PASS" 19 "DO_NOT_ENTER" 24 "ROUNDABOUT" 26 "RIGHT_CURVE_AHEAD" 27 "LEFT_CURVE_AHEAD" 28 "SLIGHT_RIGHT_CURVE_AHEAD" 29 "SLIGHT_LEFT_CURVE_AHEAD";
|
||||
VAL_ 354 SPEEDLIMIT_WEATHER 0 "HIDDEN" 1 "RAIN" 2 "SNOW" 3 "RAIN+SNOW" 4 "TRAILER";
|
||||
VAL_ 354 VIBRATE 0 "NONE" 1 "VIBRATE";
|
||||
VAL_ 354 LEAD 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE";
|
||||
VAL_ 354 LEAD_ALT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "DIM CONE" 4 "ORANGE CONE";
|
||||
VAL_ 354 LEAD_LEFT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE";
|
||||
VAL_ 354 LEAD_RIGHT 0 "HIDDEN" 1 "GRAY BOX" 2 "WHITE BOX" 3 "GRAY CAR" 4 "WHITE CAR" 5 "GRAY TRUCK" 6 "WHITE TRUCK" 7 "GRAY PERSON" 8 "WHITE PERSON" 9 "GRAY BICYCLE" 10 "WHITE BICYCLE" 11 "GRAY MOTORCYCLE" 12 "WHITE MOTORCYCLE" 13 "DARK CONE" 14 "ORANGE CONE";
|
||||
VAL_ 354 FAULT_FSS 0 "HIDDEN" 1 "CHECK_FORWARD_SAFETY_SYSTEM" 2 "FORWARD_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
|
||||
VAL_ 354 FAULT_FCA 0 "HIDDEN" 1 "CHECK_FORWARD_SIDE_SAFETY_SYSTEM" 2 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "FORWARD_SIDE_SAFETY_SYSTEM_LIMITED_RADAR_BLOCKED";
|
||||
VAL_ 354 FAULT_LSS 0 "HIDDEN" 1 "CHECK_LANE_SAFETY_SYSTEM" 2 "LANE_SAFETY_SYSTEM_DISABLED_CAMERA_OBSCURED";
|
||||
VAL_ 354 FAULT_SLA 0 "HIDDEN" 1 "CHECK_SPEED_LIMIT_SYSTEM" 2 "SPEED_LIMIT_SYSTEM_DISABLED_CAMERA_OBSCURED";
|
||||
VAL_ 354 FAULT_DAW 0 "HIDDEN" 1 "CHECK_INATTENTIVE_DRIVING_WARNING_SYSTEM" 2 "INATTENTIVE_DRIVING_WARNING_SYSTEM_DISABLED_CAMERA_OBSCURED";
|
||||
VAL_ 354 FAULT_HBA 0 "HIDDEN" 1 "CHECK_HIGH_BEAM_ASSIST_SYSTEM";
|
||||
VAL_ 354 FAULT_SCC 0 "HIDDEN" 1 "CHECK_SMART_CRUISE_CONTROL_SYSTEM" 2 "SMART_CRUISE_CONTROL_DISABLED_RADAR_BLOCKED";
|
||||
VAL_ 354 FAULT_LFA 0 "HIDDEN" 1 "CHECK_LANE_FOLLOWING_SYSTEM_ASSIST_SYSTEM";
|
||||
VAL_ 354 FAULT_HDA 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_ASSIST_SYSTEM";
|
||||
VAL_ 354 FAULT_LCA 0 "HIDDEN" 1 "CHECK_LANE_CHANGE_ASSIST_FUNCTION" 2 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "LANE_CHANGE_ASSIST_FUNCTION_DISABLED_RADAR_BLOCKED";
|
||||
VAL_ 354 FAULT_HDP 0 "HIDDEN" 1 "CHECK_HIGHWAY_DRIVING_PILOT_SYSTEM" 2 "HIGHWAY_DRIVING_PILOT_DISABLED_CAMERA_OBSCURED" 3 "HIGHWAY_DRIVING_PILOT_DISABLED_RADAR_BLOCKED" 4 "HIGHWAY_DRIVING_PILOT_DISABLED_LIDAR_BLOCKED";
|
||||
VAL_ 354 FAULT_DAS 0 "HIDDEN" 1 "CHECK_DRIVER_ASSISTANCE_SYSTEM" 2 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED" 3 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_RADAR_BLOCKED" 4 "DRIVER_ASSISTANCE_SYSTEM_LIMITED_CAMERA_OBSCURED_AND_RADAR_BLOCKED";
|
||||
VAL_ 354 FAULT_ESS 0 "HIDDEN" 1 "CHECK_EMERGENCY_STOPPING_FUNCTION" 2 "EMERGENCY_STOPPING_FUNCTION_DISABLED_CAMERA_OBSCURED" 3 "EMERGENCY_STOPPING_FUNCTION_DISABLED_RADAR_BLOCKED";
|
||||
VAL_ 362 BLINKER_CONTROL 1 "hazards" 2 "hazards button backlight" 3 "left blinkers" 4 "right blinkers";
|
||||
VAL_ 373 ACCEnable 0 "SCC ready" 1 "SCC temp fault" 2 "SCC permanent fault" 3 "SCC permanent fault, communication issue";
|
||||
VAL_ 416 ACCMode 0 "off" 1 "enabled" 2 "driver_override" 3 "off_maybe_fault" 4 "cancelled";
|
||||
VAL_ 426 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume";
|
||||
VAL_ 437 Info_RtLnCvtrVal 65534 "Reserved" 65535 "Error indicator";
|
||||
VAL_ 463 CRUISE_BUTTONS 0 "none" 1 "res_accel" 2 "set_decel" 3 "gap_distance" 4 "pause_resume";
|
||||
VAL_ 463 RIGHT_PADDLE 0 "Not Pulled" 1 "Pulled";
|
||||
VAL_ 463 LEFT_PADDLE 0 "Not Pulled" 1 "Pulled";
|
||||
VAL_ 506 ISLW_OptUsmSta 0 "None ISLW Option (Default)" 1 "System Disabled by USM" 2 "System Enable by USM" 3 "Invalid";
|
||||
VAL_ 506 ISLW_SysSta 0 "Normal (Default)" 1 "System Fail" 2 "ISLW Temporary Unavailable" 3 "Reserved";
|
||||
VAL_ 506 ISLW_NoPassingInfoDis 0 "None Display (Default)" 1 "LHD No Passing Zone Display" 2 "RHD No Passing Zone Display" 3 "Reserved" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid";
|
||||
VAL_ 506 ISLW_OvrlpSignDis 0 "None (Default)" 1 "Overlap Sign" 2 "Reserved" 3 "Error indicator";
|
||||
VAL_ 506 ISLW_SpdCluMainDis 0 "No Recognition (Default)" 253 "Unlimited Speed" 254 "Reserved" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdNaviMainDis 0 "No Recognition (Default)" 253 "Unlimited Speed" 254 "Reserved" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SubCondinfoSta1 0 "None (Default)" 1 "Rain" 2 "Snow" 3 "Snow&Rain" 4 "Trailer" 5 "Reserved" 6 "Reserved" 7 "Reserved" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Generic" 15 "Invalid";
|
||||
VAL_ 506 ISLW_SubCondinfoSta2 0 "None (Default)" 1 "Rain" 2 "Snow" 3 "Snow&Rain" 4 "Trailer" 5 "Reserved" 6 "Reserved" 7 "Reserved" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Generic" 15 "Invalid";
|
||||
VAL_ 506 ISLW_SpdCluSubMainDis 0 "No Recognition (Default)" 253 "Unlimited Speed" 254 "Reserved" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdCluDisSubCond1 0 "No Recognition (Default)" 253 "LHD Conditional No Passing ZONE" 254 "RHD Conditional No Passing ZONE" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdCluDisSubCond2 0 "No Recognition (Default)" 253 "LHD Conditional No Passing ZONE" 254 "RHD Conditional No Passing ZONE" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdNaviSubMainDis 0 "No Recognition (Default)" 253 "Unlimited Speed" 254 "Reserved" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdNaviDisSubCond1 0 "No Recognition (Default)" 253 "LHD Conditional No Passing ZONE" 254 "RHD Conditional No Passing ZONE" 255 "Invalid";
|
||||
VAL_ 506 ISLW_SpdNaviDisSubCond2 0 "No Recognition (Default)" 253 "LHD Conditional No Passing ZONE" 254 "RHD Conditional No Passing ZONE" 255 "Invalid";
|
||||
VAL_ 506 ISLA_SpdwOffst 0 "No Recognition" 253 "Unlimited Speed" 254 "Reserved" 255 "Invalid";
|
||||
VAL_ 506 ISLA_SwIgnoreReq 0 "Allow All Switch Inputs (default)" 1 "-(SET) Switch Input Ignore" 2 "+(SET) Switch Input Ignore" 3 "-(SET) & +(SET) Switch Inputs Ignore";
|
||||
VAL_ 506 ISLA_SpdChgReq 0 "Default" 1 "Speed Change Request" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 506 ISLA_SpdWrn 0 "No Warning" 1 "Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 506 ISLA_IcyWrn 0 "No Warning" 1 "Warning" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 506 ISLA_SymFlashMod 0 "No Flasing" 1 "Flashing Sign" 2 "Flashing - Arrow Symbol" 3 "Flashing + Arrow Symbol" 4 "Flashing Auto Symbol" 5 "Reserved" 6 "Reserved" 7 "Reserved";
|
||||
VAL_ 506 ISLA_Popup 0 "No Popup" 1 "MSLA Speed will Change" 2 "MSLA Speed has Changed" 3 "CC_SCC Speed will Change" 4 "CC_SCC Speed has Changed" 5 "Reserved" 6 "Reserved" 7 "Reserved";
|
||||
VAL_ 506 ISLA_OptUsmSta 0 "None ISLA Option (속도 제한 메뉴 삭제)" 1 "Off" 2 "Warning" 3 "Assist" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Invalid (GRAY)";
|
||||
VAL_ 506 ISLA_OffstUsmSta 0 "None Offset Function" 1 "-10kph or -5mph" 2 "-5kph or -3mph" 3 "0kph or 0mph" 4 "+5kph or +3mph" 5 "+10kph or +5mph" 6 "Reserved" 7 "Invalid (GRAY)";
|
||||
VAL_ 506 ISLA_AutoUsmSta 0 "None Auto Function (Delete Menu)" 1 "Auto Off" 2 "Auto On" 3 "Invalid (GRAY)";
|
||||
VAL_ 506 ISLA_Cntry 0 "Europe/Russia/Australia" 1 "Domestic" 2 "China" 3 "USA" 4 "Canada" 5 "Australia" 6 "Reserved" 7 "Reserved" 8 "Reserved" 9 "Reserved" 10 "Reserved" 11 "Reserved" 12 "Reserved" 13 "Reserved" 14 "Reserved" 15 "Initial Value (default)";
|
||||
VAL_ 506 ISLA_AddtnlSign 0 "No Recognition (default)" 1 "School Crossing" 16 "Do Not Pass" 17 "Reserved" 18 "Reserved" 19 "Reserved" 20 "Reserved" 21 "Reserved" 22 "Reserved" 23 "Reserved" 24 "Exit" 25 "Roundabout" 26 "Right Curve" 27 "Left Curve" 28 "Winding Road" 29 "Reserved" 30 "Reserved" 31 "Reserved" 2 "Pedestrian Crossing" 3 "Bicycle Crossing" 4 "Reserved" 5 "Reserved" 6 "Reserved" 7 "Reserved" 8 "Stop" 9 "Yield" 10 "Stop Ahead" 11 "Yield Ahead" 12 "Road Construction Ahead" 13 "Lane Reduction" 14 "Reserved" 15 "Reserved";
|
||||
VAL_ 506 ISLA_SchoolZone 0 "No School Zone" 1 "School Zone" 2 "Reserved" 3 "Reserved";
|
||||
VAL_ 687 HOD_Dir_Status 0 "HANDS OFF" 1 "HAND TOUCH (SOFT)" 2 "HAND TOUCH (STRONG)" 3 "HAND GRIP (SOFT)" 4 "HAND GRIP (STRONG)" 5 "RESERVED" 6 "RESERVED";
|
||||
VAL_ 698 IFSref_FR_CMR_Sta 0 "None Option (Default)" 1 "Normal" 2 "Blockage Status" 3 "Error Indicator";
|
||||
VAL_ 698 IFSref_VehNumVal 0 "No vehicle" 1 "Number of vehicles" 2 "Number of vehicles" 3 "Number of vehicles" 4 "Number of vehicles" 5 "Number of vehicles" 6 "Number of vehicles" 7 "Number of vehicles" 8 "Number of vehicles" 9 "Number of vehicles" 10 "Number of vehicles" 11 "Over than 10 vehicles" 12 "Reserved" 13 "Reserved" 14 "Default" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_ILLAmbtSta 0 "Bright" 1 "Dark" 2 "Not used" 3 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl1Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl1Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl2Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst1Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl2Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl3Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl3Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl4Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl4Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl5Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl5Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl6Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl6Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl7Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl7Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl8Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl8Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl9Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl9Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehLftAngl10Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehRtAngl10Val 501 "Not used" 502 "Not used" 503 "Not used" 504 "Not used" 505 "Not used" 506 "Not used" 507 "Not used" 508 "Not used" 509 "Not used" 510 "Default" 511 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst2Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst3Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst4Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst5Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst6Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst7Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst8Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst9Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 698 IFSref_VehDst10Val 0 "No Value" 1 "1~10m" 2 "11~20m" 3 "21~30m" 4 "31~40m" 5 "41~50m" 6 "51~60m" 7 "61~70m" 8 "71~80m" 9 "81~90m" 10 "91~100m" 11 "101~200m" 12 "201~300m" 13 "301~400m" 14 "401m~" 15 "Error indicator";
|
||||
VAL_ 736 MSLA_STATUS 0 "disabled" 1 "active" 2 "paused";
|
||||
VAL_ 866 LEFT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence";
|
||||
VAL_ 866 RIGHT_LANE_LINE 0 "Not Detected" 1 "Low Confidence" 2 "Medium Confidence" 3 "High Confidence";
|
||||
VAL_ 1041 DRIVER_DOOR 0 "Closed" 1 "Opened";
|
||||
VAL_ 1041 PASSENGER_DOOR 0 "Closed" 1 "Opened";
|
||||
VAL_ 1041 PASSENGER_SEATBELT 0 "Unlatched" 1 "Latched";
|
||||
VAL_ 1041 DRIVER_SEATBELT 0 "Unlatched" 1 "Latched";
|
||||
VAL_ 1041 DRIVER_REAR_DOOR 0 "Closed" 1 "Opened";
|
||||
VAL_ 1041 PASSENGER_REAR_DOOR 0 "Closed" 1 "Opened";
|
||||
VAL_ 1144 DRIVE_MODE2 3 "Set Sport" 1 "Set Normal" 2 "Set Eco";
|
||||
VAL_ 1240 DISTANCE_UNIT 1 "Miles" 0 "Kilometers";
|
||||
|
||||
CM_ BO_ 74 "[P] Periodic";
|
||||
CM_ SG_ 74 IMU_Crc1Val "The data area for CRC calculation is based on the data length (DLC) of the message DB.The CRC shall be calculated over the entire data block (excluding the CRC bytes) including the user data, alive counter and Data ID- CRC Polynomial (0x1021) , Ini";
|
||||
CM_ SG_ 74 IMU_AlvCnt1Val "For the first transmission request for a data element the counter shall be initialized with 0 and shall be incremented by 1 for every subsequent send request. When the counter reaches the maximum value(0xFF), then it shall restart with 0 for the next s";
|
||||
CM_ SG_ 74 IMU_YawSigSta "This signal indicates failure status of yaw rate signal and yaw rate sensing element.0000B : No failure xxx1B : IMU_Yawrate_failurexx1xB : Initialization is runningx1xxB : Reserved1xxxB : ReservedThis signal represents the physica";
|
||||
CM_ SG_ 74 IMU_LatAccelSigSta "This signal indicates failure status of lateral acceleration signal and sensing element.0000B : No failurexxx1B : IMU_Lateral acceleration failurexx1xB : Initialization is runningx1xxB : Reserved1xxxB : ReservedThis signal represe";
|
||||
CM_ SG_ 74 IMU_AcuRstSta "This signal indicates the status of IMU.0000B : Normal mode xxx1B : IMU Reset modexx1xB : Reservedx1xxB : Reserved1xxxB : ReservedIf ACU reset is required, ACU will send IMU RESET bit(XXX1B) up to 30 times and perform a reset. If ";
|
||||
CM_ SG_ 74 IMU_YawRtVal "This signal indicates Information regarding yaw rate.physical range : -163.84..163.83 ˚/s = 0000H..FFFEhConversion : (PH) = ((HEX)-8000H)*0.005[˚/s/digit] = (HEX)*0.005[˚/s/digit] - 163.84[˚/s] ";
|
||||
CM_ SG_ 74 IMU_LatAccelVal "This signal indicates Information regarding lateral acceleration.physical range : -4.1768g..4.1765g = 0000H..FFFEhConversion : (PH) = ((HEX)-8000H)*0.000127465[g/digit] = (HEX)*0.000127465[g/digit] - 4.17677312[g]";
|
||||
|
||||
CM_ BO_ 229 "[P] Periodic";
|
||||
CM_ SG_ 229 ESC_YawSigSta "ESC_YawSigSta";
|
||||
CM_ SG_ 229 ESC_LatAccelSigSta "ESC_LatAccelSigSta";
|
||||
CM_ SG_ 229 ESC_LongAccelSigSta "ESC_LongAccelSigSta";
|
||||
CM_ SG_ 229 ESC_YawRtVal "ESC_YawRtVal";
|
||||
CM_ SG_ 229 ESC_LatAccelVal "ESC_LatAccelVal";
|
||||
CM_ SG_ 229 ESC_LongAccelVal "ESC_LongAccelVal";
|
||||
@@ -0,0 +1,79 @@
|
||||
BO_ 1880 DEBUG: 8 XXX
|
||||
SG_ BLINDSPOTSIDE : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BLINDSPOT : 38|1@0+ (1,0) [0|15] "" XXX
|
||||
SG_ BLINDSPOTD1 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BLINDSPOTD2 : 55|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 836 PRE_COLLISION_2: 8 DSU
|
||||
SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
|
||||
SG_ DS1STAT2 : 13|3@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ DS1STBK2 : 10|3@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PCSWAR : 18|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ PCSOPR : 16|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PCSABK : 31|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PPTRGR : 28|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ CLEXTRGR : 26|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ IRLT_REQ : 25|2@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ BRKHLD : 37|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
|
||||
SG_ VGRSTRGR : 35|2@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PBRTRGR : 32|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PCSDIS : 43|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PBPREPMP : 40|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
BO_ 713 HYBRID_POWERTRAIN: 8 XXX
|
||||
SG_ COAST_FUEL_CUT : 5|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ HYBRID_DRIVE_STATE : 11|4@0+ (1,0) [0|15] "" XXX
|
||||
|
||||
BO_ 814 BRAKE_HYDRAULIC: 8 XXX
|
||||
SG_ BRAKE_PRESSURE : 15|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_PRESSURE_COPY1 : 31|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ BRAKE_PRESSURE_COPY2 : 47|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 971 MOTOR_SPEED_CLUSTER: 7 XXX
|
||||
SG_ CLUSTER_SPEED : 55|8@0+ (1,-21) [0|255] "km/h" XXX
|
||||
|
||||
BO_ 896 HYBRID_BATTERY: 8 XXX
|
||||
SG_ HV_SOC_PCT : 55|8@0+ (1,0) [0|100] "%" XXX
|
||||
|
||||
BO_ 1654 HV_POWER_INTEGRATOR: 8 XXX
|
||||
SG_ HV_POWER_ACCUM : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 975 HV_INVERTER: 5 XXX
|
||||
SG_ HV_VOLTAGE_LO : 23|8@0+ (1,0) [0|255] "" XXX
|
||||
SG_ HV_CURRENT_LO : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 955 BRAKE_REDUNDANT: 8 XXX
|
||||
SG_ BRAKE_PRESSED_REDUNDANT : 0|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
BO_ 918 VEHICLE_DRIVE_MODE: 8 XXX
|
||||
SG_ DRIVE_MODE_STATE : 7|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
CM_ "Sunnypilot Prius TSS2 reverse-engineered signals — route 550a71ee4c7a7fbe/0000038f--6b48497966, 2026-05-19. Confidence: high unless noted.";
|
||||
CM_ BO_ 713 "Hybrid powertrain status. 100Hz on bus 0.";
|
||||
CM_ SG_ 713 COAST_FUEL_CUT "byte0 bit5. 1 when accelerator lifted at speed -> ICE fuel cut / decel-fuel-cut active. P(=1|coast)=0.95, P(=1|accel)=0.008, P(=1|brake)=0.0. Use: lift detection for accel feedforward, EV-only mode hint.";
|
||||
CM_ SG_ 713 HYBRID_DRIVE_STATE "byte1 lower-nibble (bits 8-11). Enum (validated): 4=brake/regen-active, 5-8=coast/cruise levels, 10/12=ICE running active, 11=idle-stop. Not a scalar magnitude. Use: distinguish ICE-on vs EV for accel command shaping.";
|
||||
CM_ BO_ 814 "Brake hydraulic. 5Hz on bus 0. Bytes 0,2,4,6 are status/flag bytes (not yet decoded). Saturates 255 under hard brake.";
|
||||
CM_ SG_ 814 BRAKE_PRESSURE "byte1. Master cylinder pressure proxy. 0 during coast, 33-45 mean during brake, 254-255 max. NOT same as BRAKE_MODULE.BRAKE_PRESSURE.";
|
||||
CM_ SG_ 814 BRAKE_PRESSURE_COPY1 "byte3. Identical to BRAKE_PRESSURE 90% of brake samples. Redundant copy (CRC/safety).";
|
||||
CM_ SG_ 814 BRAKE_PRESSURE_COPY2 "byte5. Identical to BRAKE_PRESSURE 90% of brake samples. Redundant copy.";
|
||||
CM_ BO_ 971 "Cluster speedometer feed. 10Hz on bus 0.";
|
||||
CM_ SG_ 971 CLUSTER_SPEED "byte6. Encoded as raw_byte = v_kph + 21. After (1,-21) factor/offset: km/h matching dashboard speedometer. Corr 0.998 w/ WHEEL_SPEEDS. ~5km/h higher than wheel mean = cluster display bias.";
|
||||
CM_ BO_ 896 "HV battery status. 5Hz on bus 0.";
|
||||
CM_ SG_ 896 HV_SOC_PCT "byte6. HV battery state-of-charge percent. Validated range 53-62% on route 0000038f (Prius hybrid SoC normal band 40-80%). Use: energy-aware planner — reduce regen demand at high SoC (>70%), lift accel demand at low SoC (<50%).";
|
||||
CM_ BO_ 1654 "HV power integrator. 1Hz on bus 0. Slow drift signal, semantic not fully confirmed.";
|
||||
CM_ SG_ 1654 HV_POWER_ACCUM "byte4. Slow-drifting integer 0-59, independent of HV_SOC_PCT. Hypothesis: HV power flow accumulator or charging-cycle counter. Needs more routes.";
|
||||
CM_ BO_ 975 "HV inverter telemetry. 10Hz on bus 0. 5-byte message.";
|
||||
CM_ SG_ 975 HV_VOLTAGE_LO "byte2. Sequential integer 40-53 range. Hypothesis: HV bus voltage low-byte scaled. Moderate corr w/ brake (regen-loaded voltage).";
|
||||
CM_ SG_ 975 HV_CURRENT_LO "byte4. Sequential integer 17-36 range. JUMPS -16 at brake-release (regen current cutoff signature). Use: real-time regen current readback for brake-blend tuning.";
|
||||
CM_ BO_ 955 "Brake redundant signal. 10Hz on bus 0.";
|
||||
CM_ SG_ 955 BRAKE_PRESSED_REDUNDANT "byte0 bit0. 99.9% agreement with BRAKE_MODULE.BRAKE_PRESSED. Safety-redundant copy. Use: cross-check brake state for fault detection.";
|
||||
CM_ BO_ 918 "Vehicle drive mode state. 5Hz on bus 0.";
|
||||
CM_ SG_ 918 DRIVE_MODE_STATE "byte0. 3 states observed: 185=parked-with-brake, 189=ready-to-drive, 191=ready-no-brake. Transitions on GEAR shifts + brake. Use: more reliable drive-state machine than gear+brake combo.";
|
||||
VAL_ 713 HYBRID_DRIVE_STATE 4 "brake_regen_active" 5 "coast_5" 6 "coast_6" 7 "coast_7" 8 "coast_cruise" 10 "ice_active_10" 11 "idle_stop" 12 "ice_active_12";
|
||||
VAL_ 918 DRIVE_MODE_STATE 185 "parked_brake" 189 "ready" 191 "ready_no_brake";
|
||||
@@ -234,6 +234,7 @@ BO_ 956 GEAR_PACKET: 8 XXX
|
||||
SG_ SPORT_GEAR_ON : 33|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SPORT_GEAR : 38|3@0+ (1,0) [0|7] "" XXX
|
||||
SG_ ECON_ON : 40|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SPORT_ON_2 : 55|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ B_GEAR_ENGAGED : 41|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ DRIVE_ENGAGED : 47|1@0+ (1,0) [0|1] "" XXX
|
||||
|
||||
@@ -545,6 +546,7 @@ VAL_ 956 GEAR 0 "D" 1 "S" 8 "N" 16 "R" 32 "P";
|
||||
VAL_ 956 SPORT_GEAR_ON 0 "off" 1 "on";
|
||||
VAL_ 956 SPORT_GEAR 1 "S1" 2 "S2" 3 "S3" 4 "S4" 5 "S5" 6 "S6";
|
||||
VAL_ 956 ECON_ON 0 "off" 1 "on";
|
||||
VAL_ 956 SPORT_ON_2 0 "off" 1 "on";
|
||||
VAL_ 956 B_GEAR_ENGAGED 0 "off" 1 "on";
|
||||
VAL_ 956 DRIVE_ENGAGED 0 "off" 1 "on";
|
||||
VAL_ 1005 REVERSE_CAMERA_GUIDELINES 3 "No guidelines" 2 "Static guidelines" 1 "Active guidelines";
|
||||
|
||||
@@ -35,14 +35,6 @@ BO_ 740 STEERING_LKA: 5 XXX
|
||||
SG_ STEER_TORQUE_CMD : 15|16@0- (1,0) [0|65535] "" XXX
|
||||
SG_ CHECKSUM : 39|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
BO_ 836 PRE_COLLISION_2: 8 DSU
|
||||
SG_ DSS1GDRV : 7|10@0- (0.1,0) [0|0] "m/s^2" Vector__XXX
|
||||
SG_ PCSALM : 17|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ IBTRGR : 27|1@0+ (1,0) [0|0] "" FCM
|
||||
SG_ PBATRGR : 30|2@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ PREFILL : 33|1@0+ (1,0) [0|0] "" Vector__XXX
|
||||
SG_ AVSTRGR : 36|1@0+ (1,0) [0|0] "" SCS
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|0] "" XXX
|
||||
|
||||
CM_ SG_ 466 NEUTRAL_FORCE "force in newtons the engine/electric motors are applying without any acceleration commands or user input";
|
||||
CM_ SG_ 466 ACC_BRAKING "whether brakes are being actuated from ACC command";
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
CM_ "IMPORT _community.dbc";
|
||||
CM_ "IMPORT _toyota_2017.dbc";
|
||||
CM_ "IMPORT _toyota_adas_standard.dbc";
|
||||
CM_ "IMPORT _sp_debug_toyota.dbc";
|
||||
|
||||
BO_ 548 BRAKE_MODULE: 8 XXX
|
||||
SG_ BRAKE_PRESSURE : 43|12@0+ (1,0) [0|4047] "" XXX
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
CM_ "IMPORT _community.dbc";
|
||||
CM_ "IMPORT _toyota_2017.dbc";
|
||||
CM_ "IMPORT _toyota_adas_standard.dbc";
|
||||
CM_ "IMPORT _sp_debug_toyota.dbc";
|
||||
|
||||
BO_ 401 STEERING_LTA: 8 XXX
|
||||
SG_ CHECKSUM : 63|8@0+ (1,0) [0|255] "" XXX
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
CM_ "IMPORT _community.dbc";
|
||||
CM_ "IMPORT _toyota_2017.dbc";
|
||||
CM_ "IMPORT _toyota_adas_standard.dbc";
|
||||
CM_ "IMPORT _sp_debug_toyota.dbc";
|
||||
|
||||
BO_ 550 BRAKE_MODULE: 8 XXX
|
||||
SG_ BRAKE_PRESSURE : 0|9@0+ (1,0) [0|511] "" XXX
|
||||
|
||||
@@ -0,0 +1,327 @@
|
||||
VERSION "HSCAN2"
|
||||
|
||||
|
||||
NS_ :
|
||||
NS_DESC_
|
||||
CM_
|
||||
BA_DEF_
|
||||
BA_
|
||||
VAL_
|
||||
CAT_DEF_
|
||||
CAT_
|
||||
FILTER
|
||||
BA_DEF_DEF_
|
||||
EV_DATA_
|
||||
ENVVAR_DATA_
|
||||
SGTYPE_
|
||||
SGTYPE_VAL_
|
||||
BA_DEF_SGTYPE_
|
||||
BA_SGTYPE_
|
||||
SIG_TYPE_REF_
|
||||
VAL_TABLE_
|
||||
SIG_GROUP_
|
||||
SIG_VALTYPE_
|
||||
SIGTYPE_VALTYPE_
|
||||
BO_TX_BU_
|
||||
BA_DEF_REL_
|
||||
BA_REL_
|
||||
BA_DEF_DEF_REL_
|
||||
BU_SG_REL_
|
||||
BU_EV_REL_
|
||||
BU_BO_REL_
|
||||
SG_MUL_VAL_
|
||||
|
||||
BS_:
|
||||
|
||||
BU_: FVCM GW Diagnostics EPS SCSABS Tester
|
||||
|
||||
BO_ 175 GW_HSC2_HCU_FrP00: 8 GW
|
||||
SG_ EPTAccelActuPosHSC2 : 7|8@0+ (0.392157,0) [0|100] "%" FVCM
|
||||
SG_ EPTAccelActuPosVHSC2 : 43|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ EPTBrkPdlDscrtInptStsHSC2 : 31|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ EPTBrkPdlDscrtInptStsVHSC2 : 16|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ EPTStCmdOn_h1HSC2 : 17|1@0+ (1,0) [0|1] "" FVCM
|
||||
|
||||
BO_ 251 GW_HSC2_ECM_FrP27: 8 GW
|
||||
SG_ ACCStsHSC2 : 2|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ SpdAstMdECMHSC2 : 52|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ SpdAstSysStsECMHSC2 : 18|3@0+ (1,0) [0|7] "" FVCM
|
||||
SG_ SpdAstSysTrgtSpdHSC2 : 30|15@0+ (0.015625,0) [0|511.984] "" FVCM
|
||||
SG_ TrgtSpdSrcStsHSC2 : 23|2@0+ (1,0) [0|3] "" FVCM
|
||||
|
||||
BO_ 355 GW_HSC2_SDM_FrP00: 8 GW
|
||||
SG_ AirbagDplHSC2 : 11|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ AirbagDplInvsnHSC2 : 10|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ DrvrSbltAtcHSC2 : 12|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ DrvrSbltAtcVHSC2 : 13|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ SDMRCHSC2 : 1|2@0+ (1,0) [0|3] "" FVCM
|
||||
|
||||
BO_ 359 FVCM_HSC2_FrP02: 8 FVCM
|
||||
SG_ AutoMainBeamLghtReqHSC2 : 15|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ DistSinceTrgtCamrHSC2 : 7|8@0+ (8.235,-100) [-100|1999.92] "m" GW
|
||||
SG_ FVCMCalPrgsReqHSC2 : 36|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ HandOffStrgWhlDetnStaHSC2 : 44|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ HandOffStrgWhlDetnStaVHSC2 : 45|1@0+ (1,0) [0|1] "" GW
|
||||
SG_ LDWLKADspCmdHSC2 : 50|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ LDWLKAHapticWrnngDspCmdHSC2 : 63|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ LDWLKALVsulznReqHSC2 : 53|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ LDWLKARVsulznReqHSC2 : 42|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ LDWSysFltStsHSC2 : 39|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ SpdAstReqStsCamrHSC2 : 13|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ TJAICADspCmdHSC2 : 55|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ TJAICASysFltStsHSC2 : 61|3@0+ (1,0) [0|7] "" GW,EPS
|
||||
SG_ TJAICASysStsHSC2 : 58|3@0+ (1,0) [0|7] "" GW,EPS
|
||||
SG_ TrgtSpdReqCamrHSC2 : 22|15@0+ (0.015625,0) [0|511.984] "" GW
|
||||
|
||||
BO_ 404 GW_HSC2_ECM_FrP04: 8 GW
|
||||
SG_ TrEstdGearHSC2 : 3|4@0+ (1,0) [0|15] "" FVCM
|
||||
SG_ TrEstdGearVHSC2 : 4|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ TrShftLvrPosV_h1HSC2 : 28|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ TrShftLvrPos_h1HSC2 : 27|4@0+ (1,0) [0|15] "" FVCM
|
||||
|
||||
BO_ 438 EHBS_HSC2_FrP00: 8 EHBS
|
||||
SG_ BrkPdlAppdChksmHSC2 : 63|8@0+ (1,0) [0|255] "" FVCM
|
||||
SG_ IbstrDiagMdAHSC2 : 55|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ RnotPrsStsHSC2 : 53|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ HydBstrCmpstnReqHSC2 : 54|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ BrkPdlAppdRCHSC2 : 51|4@0+ (1,0) [0|15] "" FVCM
|
||||
SG_ RnotPrsHSC2 : 47|8@0+ (1,0) [0|250] "bar" FVCM
|
||||
SG_ BrkPdlAppdHSC2 : 10|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ BrkPdlAppdVHSC2 : 9|2@0+ (1,0) [0|3] "" FVCM
|
||||
|
||||
BO_ 485 SAS_HSC2_FrP00: 8 EPS
|
||||
SG_ StrgWhlAngHSC2 : 15|16@0+ (0.0625,-2048) [-2048|2047.88] "degree" FVCM
|
||||
SG_ StrgWhlAngAlvRCHSC2 : 31|4@0+ (1,0) [0|15] "" FVCM
|
||||
SG_ StrgWhlAngExtdPVHSC2 : 47|16@0+ (1,0) [0|65535] "" FVCM
|
||||
SG_ StrgWhlAngGrdHSC2 : 27|12@0+ (1,-2048) [-2048|2046] "degree/s" FVCM
|
||||
SG_ StrgWhlAngSnsrCalStsHSC2 : 6|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ StrgWhlAngSnsrChksmHSC2 : 63|8@0+ (1,0) [0|255] "" FVCM
|
||||
SG_ StrgWhlAngSnsrFltHSC2 : 0|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ StrgWhlAngSnsrInidHSC2 : 2|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ StrgWhlAngSnsrMultCapbHSC2 : 1|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ StrgWhlAngVHSC2 : 7|1@0+ (1,0) [0|1] "" FVCM
|
||||
|
||||
BO_ 481 GW_HSC2_FrP04: 7 GW
|
||||
SG_ CCSwStsSwDataIntgty_h2HSC2 : 1|2@0+ (1,0) [0|3] "" FDR
|
||||
SG_ CCSwStsSpdDecSwA_h2HSC2 : 2|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsSpdIncSwA_h2HSC2 : 3|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsSetSwA_h2HSC2 : 4|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsRsmSwA_h2HSC2 : 5|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsOnSwA_h2HSC2 : 6|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsCanclSwA_h2HSC2 : 7|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsPV_h2HSC2 : 15|8@0+ (1,0) [0|255] "" FDR
|
||||
SG_ CCSwStsAlvRC_h2HSC2 : 17|2@0+ (1,0) [0|3] "" FDR
|
||||
SG_ CCSwStsDistDecSwA_h2HSC2 : 18|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ CCSwStsDistIncSwA_h2HSC2 : 19|1@0+ (1,0) [0|1] "" FDR
|
||||
|
||||
BO_ 492 EPS_HSC2_FrP03: 8 EPS
|
||||
SG_ ChLKAAlvRCHSC2 : 7|4@0+ (1,0) [0|15] "" FVCM
|
||||
SG_ ChLKACtrlStsHSC2 : 54|3@0+ (1,0) [0|7] "" FVCM
|
||||
SG_ ChLKARespToqHSC2 : 2|11@0+ (0.01,-10.24) [-10.24|10.23] "Nm" FVCM
|
||||
SG_ ChLKARespToqPVHSC2 : 22|15@0+ (1,0) [0|32767] "" FVCM
|
||||
SG_ ChLKARespToqVHSC2 : 3|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ DrvrStrgDlvrdToqHSC2 : 34|11@0+ (0.01,-10.24) [-10.24|10.23] "Nm" FVCM
|
||||
SG_ DrvrStrgDlvrdToqVHSC2 : 55|1@0+ (1,0) [0|1] "" FVCM
|
||||
|
||||
BO_ 509 FVCM_HSC2_FrP03: 8 FVCM
|
||||
SG_ LDWLKAVbnLvlReqHSC2 : 23|2@0+ (1,0) [0|3] "" GW,EPS
|
||||
SG_ LKAAlvRCHSC2 : 7|4@0+ (1,0) [0|15] "" EPS
|
||||
SG_ LKADrvrTkovReqHSC2 : 46|1@0+ (1,0) [0|1] "" GW,EPS
|
||||
SG_ LKAReqToqHSC2 : 2|11@0+ (1,-1024) [-1024|1023] "Nm" EPS
|
||||
SG_ LKAReqToqPVHSC2 : 21|14@0+ (1,0) [0|16383] "" EPS
|
||||
SG_ LKAReqToqStsHSC2 : 36|2@0+ (1,0) [0|3] "" EPS
|
||||
SG_ LKAReqToqVHSC2 : 3|1@0+ (1,0) [0|1] "" EPS
|
||||
SG_ LKASysFltStsHSC2 : 39|3@0+ (1,0) [0|7] "" GW,EPS
|
||||
SG_ LKASysStsHSC2 : 34|3@0+ (1,0) [0|7] "" GW,EPS
|
||||
|
||||
BO_ 532 SCS_HSC2_FrP09: 6 SCSABS
|
||||
SG_ BrkPdlDrvrAppdPrsHSC2 : 15|8@0+ (75,0) [0|19125] "kPa" FVCM
|
||||
SG_ BrkPdlDrvrAppdPrsAlvRCHSC2 : 2|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ BrkPdlDrvrAppdPrsVHSC2 : 0|1@0+ (1,0) [0|1] "" FVCM
|
||||
|
||||
BO_ 572 SCS_HSC2_FrP19: 8 SCSABS
|
||||
SG_ VehSpdAvgHSC2 : 22|15@0+ (0.015625,0) [0|511.984] "km/h" FVCM,FDR
|
||||
SG_ VehSpdAvgAlvRCHSC2 : 39|4@0+ (1,0) [0|15] "" FVCM,FDR
|
||||
SG_ VehSpdAvgPVHSC2 : 7|16@0+ (1,0) [0|65535] "" FVCM,FDR
|
||||
SG_ VehSpdAvgVHSC2 : 23|1@0+ (1,0) [0|1] "" FVCM,FDR
|
||||
|
||||
BO_ 578 RADAR_HSC2_FrP00: 8 FDR
|
||||
SG_ ACCAccReqValHSC2 : 2|11@0+ (0.005,-7.22) [-7.22|3.015] "" SCSABS
|
||||
SG_ ACCSysAlvRlngCtr_SCSHSC2 : 6|4@0+ (1,0) [0|15] "" SCSABS
|
||||
SG_ ACCMinBrkReqStsHSC2 : 7|1@0+ (1,0) [0|1] "" SCSABS
|
||||
SG_ ACCAccReqValTolMaxHSC2 : 22|7@0+ (0.025,0) [0|3.175] "" SCSABS
|
||||
SG_ ACCReqBrkPrfrdHSC2 : 23|1@0+ (1,0) [0|1] "" SCSABS
|
||||
SG_ ACCAccReqStsHSC2 : 29|2@0+ (1,0) [0|3] "" GW,SCSABS
|
||||
SG_ ACCGoReqHSC2 : 30|1@0+ (1,0) [0|1] "" SCSABS
|
||||
SG_ ACCSysFltSts_SCSHSC2 : 42|3@0+ (1,0) [0|7] "" SCSABS
|
||||
SG_ ACCSysSts_RadarHSC2 : 45|3@0+ (1,0) [0|7] "" GW,SCSABS
|
||||
SG_ ChACCShtdwnMdHSC2 : 47|2@0+ (1,0) [0|3] "" SCSABS
|
||||
SG_ ACCAccReqValTolMinHSC2 : 54|7@0+ (0.025,0) [0|3.175] "" SCSABS
|
||||
SG_ ACCSdslReq_RadarHSC2 : 55|1@0+ (1,0) [0|1] "" SCSABS
|
||||
SG_ ACCSysChksm_SCSHSC2 : 63|8@0+ (1,0) [0|255] "" SCSABS
|
||||
|
||||
BO_ 582 RADAR_HSC2_FrP02: 8 FDR
|
||||
SG_ ACCDrvrSelTrgtSpd_RadarHSC2 : 6|15@0+ (0.015625,0) [0|511.984] "" GW
|
||||
SG_ ACCObjDet_RadarHSC2 : 7|1@0+ (1,0) [0|1] "" GW
|
||||
SG_ AEBMsgReqHSC2 : 19|4@0+ (1,0) [0|15] "" GW
|
||||
SG_ ACCMsgReqHSC2 : 23|4@0+ (1,0) [0|15] "" GW
|
||||
SG_ ACCDetObjDistLvl_RadarHSC2 : 26|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ ACCDrvrSeldTrgtDistLvl_RadarHSC2 : 29|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ ACCSysCanclReq_RadarHSC2 : 31|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ RdrCalPrgsReqHSC2 : 34|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ ACCGoNotfr_RadarHSC2 : 35|1@0+ (1,0) [0|1] "" GW
|
||||
SG_ ACCSysFltSts_RadarHSC2 : 38|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ ACCDrvrTkovReqHSC2 : 39|1@0+ (1,0) [0|1] "" GW
|
||||
SG_ FCWSysFltSts_RadarHSC2 : 42|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ FCWSnstvtLvl_RadarHSC2 : 45|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ AEBPedtrnDspCmdHSC2 : 47|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ FCWrnngSts_RadarHSC2 : 51|3@0+ (1,0) [0|7] "" GW
|
||||
SG_ FCWDspCmd_RadarHSC2 : 53|2@0+ (1,0) [0|3] "" GW
|
||||
SG_ AEBDspCmd_RadarHSC2 : 55|2@0+ (1,0) [0|3] "" GW
|
||||
|
||||
BO_ 588 SCS_HSC2_FrP22: 8 SCSABS
|
||||
SG_ BrkDiscTemStsHSC2 : 6|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ BrkPdlDrvrAppdPrsAlvRC_RadarHSC2 : 13|2@0+ (1,0) [0|3] "" FDR
|
||||
SG_ BrkPdlDrvrAppdPrsV_RadarHSC2 : 7|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ BrkPdlDrvrAppdPrs_RadarHSC2 : 23|8@0+ (75,0) [0|19125] "kPa" FDR
|
||||
SG_ LDrvnWhlRotlDircnHSC2 : 15|2@0+ (1,0) [0|3] "" FDR,FVCM
|
||||
SG_ RDrvnWhlRotlDircnHSC2 : 2|2@0+ (1,0) [0|3] "" FDR,FVCM
|
||||
SG_ WhlBrkPrsStsHSC2 : 5|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ WhlGndVelDrvnChksm_RadarHSC2 : 63|8@0+ (1,0) [0|255] "" FDR
|
||||
SG_ WhlGndVelDrvnRC_RadarHSC2 : 11|4@0+ (1,0) [0|15] "" FDR
|
||||
SG_ WhlGndVelLDrvnV_RadarHSC2 : 3|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ WhlGndVelLDrvn_RadarHSC2 : 45|14@0+ (0.03125,0) [0|511.969] "km/h" FDR
|
||||
SG_ WhlGndVelRDrvnV_RadarHSC2 : 4|1@0+ (1,0) [0|1] "" FDR
|
||||
SG_ WhlGndVelRDrvn_RadarHSC2 : 29|14@0+ (0.03125,0) [0|511.969] "km/h" FDR
|
||||
|
||||
BO_ 593 SCS_HSC2_FrP24: 8 SCSABS
|
||||
SG_ ChACCAccReqRespHSC2 : 5|3@0+ (1,0) [0|7] "" FDR
|
||||
SG_ ChACCAEBAlvRlngCtr_RadarHSC2 : 20|4@0+ (1,0) [0|15] "" FDR
|
||||
SG_ ChACCAEBBrkJerkReqRespHSC2 : 10|3@0+ (1,0) [0|7] "" FDR
|
||||
SG_ ChACCAEBChksm_RadarHSC2 : 63|8@0+ (1,0) [0|255] "" FDR
|
||||
SG_ ChACCReqFlrStsHSC2 : 15|2@0+ (1,0) [0|3] "" FDR
|
||||
SG_ ChAEBDclReqRespHSC2 : 23|3@0+ (1,0) [0|7] "" FDR
|
||||
SG_ ChAEBHydBrkAstReqRespHSC2 : 2|3@0+ (1,0) [0|7] "" FDR
|
||||
SG_ ChAEBPrflReqRespHSC2 : 13|3@0+ (1,0) [0|7] "" FDR
|
||||
SG_ VehSdslStsHSC2 : 7|2@0+ (1,0) [0|3] "" FDR
|
||||
SG_ VehTrgtLongtAccHSC2 : 31|8@0+ (0.05,-7) [-7|5.75] "" FDR
|
||||
|
||||
BO_ 851 SCS_HSC2_FrP15: 8 SCSABS
|
||||
SG_ VehSpdAvgDrvnHSC2 : 6|15@0+ (0.015625,0) [0|511.984] "km/h" FVCM
|
||||
SG_ VehSpdAvgDrvnVHSC2 : 7|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ VehSpdAvgNonDrvnHSC2 : 38|15@0+ (0.015625,0) [0|511.984] "km/h" FVCM
|
||||
SG_ VehSpdAvgNonDrvnVHSC2 : 39|1@0+ (1,0) [0|1] "" FVCM
|
||||
|
||||
BO_ 1130 GW_HSC2_BCM_FrP04: 8 GW
|
||||
SG_ BlinkerBulbLeft : 37|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BlinkerBulbRight : 38|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BlinkerLeft : 59|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BlinkerRight : 60|1@0+ (1,0) [0|1] "" XXX
|
||||
SG_ BntOpenStsHSC2 : 47|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ DipdBeamLghtOnHSC2 : 13|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ DircnIndLampSwStsHSC2 : 3|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ DrvrDoorOpenStsHSC2 : 1|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ DspMeasSysHSC2 : 44|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ FrtFogLghtOnHSC2 : 14|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ FrtPsngDoorOpenStsHSC2 : 43|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ FrtWiperParkPosAHSC2 : 52|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ FrtWshrPumpAHSC2 : 55|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ KeyDetIndxHSC2 : 51|3@0+ (1,0) [0|7] "" FVCM
|
||||
SG_ LDircnIndLghtFHSC2 : 10|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ LDircnIOHSC2 : 11|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ LdspcOpenStsHSC2 : 7|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ MainBeamLghtOnHSC2 : 15|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ RDircnIndLghtFHSC2 : 48|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ RDircnIOHSC2 : 9|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ RLDoorOpenStsHSC2 : 41|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ RRDoorOpenStsHSC2 : 5|2@0+ (1,0) [0|3] "" FVCM
|
||||
SG_ RrFogLghtOnHSC2 : 8|1@0+ (1,0) [0|1] "" FVCM
|
||||
SG_ VehSideLghtStsHSC2 : 57|2@0+ (1,0) [0|3] "" FVCM
|
||||
|
||||
VAL_ 355 AirbagDplInvsnHSC2 1 "No Airbag Deployed" 0 "Airbag Deployed";
|
||||
VAL_ 355 AirbagDplHSC2 1 "True" 0 "False";
|
||||
VAL_ 355 DrvrSbltAtcHSC2 1 "True" 0 "False";
|
||||
VAL_ 355 DrvrSbltAtcVHSC2 1 "Invalid" 0 "Valid";
|
||||
VAL_ 404 TrEstdGearHSC2 15 "Park Gear" 14 "Reverse Gear" 13 "Neutral Gear" 8 "Eighth Gear" 7 "Seventh Gear" 6 "Sixth Gear" 5 "Fifth Gear" 4 "Fourth Gear" 3 "Third Gear" 2 "Second Gear" 1 "First Gear" 0 "Not Supported";
|
||||
VAL_ 404 TrEstdGearVHSC2 1 "Invalid" 0 "Valid";
|
||||
VAL_ 404 TrShftLvrPos_h1HSC2 15 "Lever Position Unknown" 11 "Forward Range H" 10 "Forward Range G" 9 "Forward Range F" 8 "Forward Range E" 7 "Forward Range D" 6 "Forward Range C" 5 "Forward Range B" 4 "Forward Range A" 3 "Neutral Range" 2 "Reverse Range" 1 "Park Range" 0 "Between Ranges";
|
||||
VAL_ 404 TrShftLvrPosV_h1HSC2 1 "Invalid" 0 "Valid";
|
||||
VAL_ 438 RnotPrsStsHSC2 2 "Faulty" 1 "Normal" 0 "Init" ;
|
||||
VAL_ 438 HydBstrCmpstnReqHSC2 1 "HBC active" 0 "HBC inactive" ;
|
||||
VAL_ 438 BrkPdlAppdHSC2 1 "brake pedal applied" 0 "brake pedal not applied" ;
|
||||
VAL_ 438 BrkPdlAppdVHSC2 2 "Faulty" 1 "Normal" 0 "Init" ;
|
||||
VAL_ 481 CCSwStsSwDataIntgty_h2HSC2 3 "Illegal Range" 2 "Failure Detected" 1 "Data Invalid" 0 "Data Valid";
|
||||
VAL_ 481 CCSwStsSpdDecSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsSpdIncSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsSetSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsRsmSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsOnSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsCanclSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsDistDecSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 481 CCSwStsDistIncSwA_h2HSC2 1 "True" 0 "False";
|
||||
VAL_ 509 LKAReqToqVHSC2 1 "Invalid" 0 "Valid";
|
||||
VAL_ 509 LDWLKAVbnLvlReqHSC2 3 "Level 3" 2 "Level 2" 1 "Level 1" 0 "no request";
|
||||
VAL_ 509 LKASysStsHSC2 3 "Override" 2 "Active" 1 "Stand by" 0 "Off";
|
||||
VAL_ 509 LKAReqToqStsHSC2 3 "reserved" 2 "reserved" 1 "torque request" 0 "no request";
|
||||
VAL_ 509 LKASysFltStsHSC2 3 "service required" 2 "system temporary unavailable" 1 "performance degradation" 0 "no error";
|
||||
VAL_ 509 LKADrvrTkovReqHSC2 1 "True" 0 "False";
|
||||
VAL_ 578 ACCMinBrkReqStsHSC2 1 "no demand" 0 "demand";
|
||||
VAL_ 578 ACCReqBrkPrfrdHSC2 1 "no demand" 0 "demand";
|
||||
VAL_ 578 ACCAccReqStsHSC2 1 "ACC Acceleration Request" 0 "No Request";
|
||||
VAL_ 578 ACCGoReqHSC2 1 "Request" 0 "No Request";
|
||||
VAL_ 578 ACCSysFltSts_SCSHSC2 7 "Reserved" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "Service Required" 2 "System Temporary Unvailable" 1 "Performance Degradation" 0 "No Error";
|
||||
VAL_ 578 ACCSysSts_RadarHSC2 7 "Reserved" 6 "Standstill Wait" 5 "Standstill Active" 4 "Brake Only" 3 "Override" 2 "Active" 1 "Stand By" 0 "Off";
|
||||
VAL_ 578 ChACCShtdwnMdHSC2 3 "immediate off" 2 "initial" 1 "fast off" 0 "soft off";
|
||||
VAL_ 578 ACCSdslReq_RadarHSC2 1 "request" 0 "no request";
|
||||
VAL_ 582 ACCObjDet_RadarHSC2 1 "TRUE" 0 "FALSE";
|
||||
VAL_ 582 AEBMsgReqHSC2 7 "reserved" 6 "Radar Error" 5 "AEB is switched off" 4 "AEB is switched on" 3 "AEB is in error mode" 2 "Active" 1 "unable to active AEB" 0 "No display";
|
||||
VAL_ 582 ACCMsgReqHSC2 15 "Reserved" 14 "Reserved" 13 "Reserved" 12 "Reserved" 11 "Reserved" 10 "Reserved" 9 "Radar Error" 8 "depress acceleration pedal or press resume switch to go" 7 "Driver Takeover Request" 6 "ACC is switched off" 5 "ACC is switched on" 4 "ACC is in error mode" 3 "Active" 2 "ACC is cancelled" 1 "unable to active ACC" 0 "No display";
|
||||
VAL_ 582 ACCDetObjDistLvl_RadarHSC2 7 "reserved" 6 "reserved" 5 "distance level5" 4 "distance level4" 3 "distance level3" 2 "distance level2" 1 "distance level1" 0 "no gap set";
|
||||
VAL_ 582 ACCDrvrSeldTrgtDistLvl_RadarHSC2 7 "reserved" 6 "reserved" 5 "distance level5" 4 "distance level4" 3 "distance level3" 2 "distance level2" 1 "distance level1" 0 "no gap set";
|
||||
VAL_ 582 ACCSysCanclReq_RadarHSC2 3 "Reserved" 2 "ACC Condition Dissatisfy" 1 "Manual Cancel" 0 "No Cancel";
|
||||
VAL_ 582 RdrCalPrgsReqHSC2 5 "calibration failure" 4 "Calibration Finished, need Adjust" 3 "Calibration Finished, Succesful" 2 "Calibration in progress" 1 "Calibration Started" 0 "no request";
|
||||
VAL_ 582 ACCGoNotfr_RadarHSC2 1 "TRUE" 0 "FALSE";
|
||||
VAL_ 582 ACCSysFltSts_RadarHSC2 7 "Reserved" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "Service Required" 2 "System Temporary Unvailable" 1 "Performance Degradation" 0 "No Error";
|
||||
VAL_ 582 ACCDrvrTkovReqHSC2 1 "True" 0 "False";
|
||||
VAL_ 582 FCWSysFltSts_RadarHSC2 7 "Reserved" 6 "Reserved" 5 "Reserved" 4 "Reserved" 3 "Service required" 2 "System temporary unvailable" 1 "Performance degradation" 0 "No error";
|
||||
VAL_ 582 FCWSnstvtLvl_RadarHSC2 7 "reserved" 6 "reserved" 5 "reserved" 4 "reserved" 3 "level3" 2 "level2" 1 "level1" 0 "Unavailable";
|
||||
VAL_ 582 AEBPedtrnDspCmdHSC2 3 "reserved" 2 "on" 1 "off" 0 "unavailable";
|
||||
VAL_ 582 FCWrnngSts_RadarHSC2 7 "reserved" 6 "reserved" 5 "reserved" 4 "reserved" 3 "level 3" 2 "level 2" 1 "level 1" 0 "no request";
|
||||
VAL_ 582 FCWDspCmd_RadarHSC2 3 "reserved" 2 "on" 1 "off" 0 "unavailable";
|
||||
VAL_ 582 AEBDspCmd_RadarHSC2 3 "reserved" 2 "on" 1 "off" 0 "unavailable";
|
||||
VAL_ 588 BrkDiscTemStsHSC2 1 "Temperature too high" 0 "Not high" ;
|
||||
VAL_ 588 BrkPdlDrvrAppdPrsV_RadarHSC2 1 "Invalid" 0 "Valid" ;
|
||||
VAL_ 588 LDrvnWhlRotlDircnHSC2 3 "Initial/Invalid" 2 "Backward" 1 "Forward" 0 "Unknown" ;
|
||||
VAL_ 588 RDrvnWhlRotlDircnHSC2 3 "Initial/Invalid" 2 "Backward" 1 "Forward" 0 "Unknown" ;
|
||||
VAL_ 588 WhlBrkPrsStsHSC2 1 "No brake force" 0 "Exist brake force" ;
|
||||
VAL_ 588 WhlGndVelLDrvnV_RadarHSC2 1 "Invalid" 0 "Valid" ;
|
||||
VAL_ 588 WhlGndVelRDrvnV_RadarHSC2 1 "Invalid" 0 "Valid" ;
|
||||
VAL_ 593 ChACCAccReqRespHSC2 7 "reserved" 6 "reserved" 4 "pre-condition not satisfied" 3 "control not allowed for error" 2 "lost arbitration" 1 "request honored" 0 "no request" ;
|
||||
VAL_ 593 ChACCAEBBrkJerkReqRespHSC2 7 "reserve" 6 "reserve" 4 "pre-condition not satisfied" 3 "control not allowed for error" 2 "lost arbitration" 1 "request honored" 0 "no request" ;
|
||||
VAL_ 593 ChACCReqFlrStsHSC2 3 "not defined" 2 "irreversible error" 1 "reversible error" 0 "No error" ;
|
||||
VAL_ 593 ChAEBDclReqRespHSC2 7 "reserved" 6 "reserved" 4 "pre-condition not satisfied" 3 "control not allowed for error" 2 "lost arbitration" 1 "request honored" 0 "no request" ;
|
||||
VAL_ 593 ChAEBHydBrkAstReqRespHSC2 7 "reserve" 6 "reserve" 4 "pre-condition not satisfied" 3 "control not allowed for error" 2 "lost arbitration" 1 "request honored" 0 "no request" ;
|
||||
VAL_ 593 ChAEBPrflReqRespHSC2 7 "reserve" 6 "reserve" 4 "pre-condition not satisfied" 3 "control not allowed for error" 2 "lost arbitration" 1 "request honored" 0 "no request" ;
|
||||
VAL_ 593 VehSdslStsHSC2 3 "reserved" 2 "invalid (short unavailability, max 3s)" 1 "standstill" 0 "not standstill" ;
|
||||
VAL_ 851 VehSpdAvgDrvnVHSC2 1 "Invalid" 0 "Valid" ;
|
||||
VAL_ 851 VehSpdAvgNonDrvnVHSC2 1 "Invalid" 0 "Valid" ;
|
||||
VAL_ 1130 BntOpenStsHSC2 3 "Reserved" 2 "Bonnet Switch Disconnect" 1 "Bonnet Open" 0 "Bonnet Closed" ;
|
||||
VAL_ 1130 DipdBeamLghtOnHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 DircnIndLampSwStsHSC2 3 "reserve" 2 "Right on" 1 "Left on" 0 "off" ;
|
||||
VAL_ 1130 DrvrDoorOpenStsHSC2 3 "Driver Door Full Open" 2 "Driver Door Ajar" 1 "Driver Door Open" 0 "Driver Door Closed" ;
|
||||
VAL_ 1130 DspMeasSysHSC2 1 "mph" 0 "kph" ;
|
||||
VAL_ 1130 FrtFogLghtOnHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 FrtPsngDoorOpenStsHSC2 3 "Front Passenger Door Full Open" 2 "Front Passenger Door Ajar" 1 "Front Passenger Door Open" 0 "Front Passenger Door Closed" ;
|
||||
VAL_ 1130 FrtWiperParkPosAHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 FrtWshrPumpAHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 KeyDetIndxHSC2 7 "error" 6 "key 6 is detected" 5 "key 5 is detected" 4 "key 4 is detected" 3 "key 3 is detected" 2 "key 2 is detected" 1 "key 1 is detected" 0 "non key is detected" ;
|
||||
VAL_ 1130 LDircnIndLghtFHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 LDircnIOHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 LdspcOpenStsHSC2 3 "Reserved" 2 "Reserved" 1 "Load Space Open" 0 "Load Space Closed" ;
|
||||
VAL_ 1130 MainBeamLghtOnHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 RDircnIndLghtFHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 RDircnIOHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 RLDoorOpenStsHSC2 3 "Rear Left Door Full Open" 2 "Rear Left Door Ajar" 1 "Rear Left Door Open" 0 "Rear Left Door Closed" ;
|
||||
VAL_ 1130 RRDoorOpenStsHSC2 3 "Rear Right Door Full Open" 2 "Rear Right Door Ajar" 1 "Rear Right Door Open" 0 "Rear Right Door Closed" ;
|
||||
VAL_ 1130 RrFogLghtOnHSC2 1 "True" 0 "False" ;
|
||||
VAL_ 1130 VehSideLghtStsHSC2 3 "All side light and license plate light on" 2 "Right side light on only" 1 "Left side light on only" 0 "No side light on " ;
|
||||
@@ -34,6 +34,7 @@
|
||||
#define SAFETY_PSA 31U
|
||||
#define SAFETY_RIVIAN 33U
|
||||
#define SAFETY_VOLKSWAGEN_MEB 34U
|
||||
#define SAFETY_MG 38U
|
||||
|
||||
#define GET_BIT(msg, b) ((bool)!!(((msg)->data[((b) / 8U)] >> ((b) % 8U)) & 0x1U))
|
||||
#define GET_FLAG(value, mask) (((value) & (mask)) == (mask))
|
||||
@@ -247,7 +248,6 @@ bool steer_curvature_cmd_checks(int desired_curvature, int steer_power, bool ste
|
||||
bool longitudinal_accel_checks(int desired_accel, const LongitudinalLimits limits);
|
||||
bool longitudinal_speed_checks(int desired_speed, const LongitudinalLimits limits);
|
||||
bool longitudinal_gas_checks(int desired_gas, const LongitudinalLimits limits);
|
||||
bool longitudinal_transmission_rpm_checks(int desired_transmission_rpm, const LongitudinalLimits limits);
|
||||
bool longitudinal_brake_checks(int desired_brake, const LongitudinalLimits limits);
|
||||
bool longitudinal_interceptor_checks(const CANPacket_t *msg); // gas interceptor
|
||||
void pcm_cruise_check(bool cruise_engaged);
|
||||
@@ -368,3 +368,4 @@ extern const safety_hooks volkswagen_meb_hooks;
|
||||
extern const safety_hooks volkswagen_pq_hooks;
|
||||
extern const safety_hooks rivian_hooks;
|
||||
extern const safety_hooks psa_hooks;
|
||||
extern const safety_hooks mg_hooks;
|
||||
|
||||
@@ -15,12 +15,6 @@ bool longitudinal_speed_checks(int desired_speed, const LongitudinalLimits limit
|
||||
return !get_longitudinal_allowed() && (desired_speed != limits.inactive_speed);
|
||||
}
|
||||
|
||||
bool longitudinal_transmission_rpm_checks(int desired_transmission_rpm, const LongitudinalLimits limits) {
|
||||
bool transmission_rpm_valid = get_longitudinal_allowed() && !safety_max_limit_check(desired_transmission_rpm, limits.max_transmission_rpm, limits.min_transmission_rpm);
|
||||
bool transmission_rpm_inactive = desired_transmission_rpm == limits.inactive_transmission_rpm;
|
||||
return !(transmission_rpm_valid || transmission_rpm_inactive);
|
||||
}
|
||||
|
||||
bool longitudinal_gas_checks(int desired_gas, const LongitudinalLimits limits) {
|
||||
bool gas_valid = get_longitudinal_allowed() && !safety_max_limit_check(desired_gas, limits.max_gas, limits.min_gas);
|
||||
bool gas_inactive = desired_gas == limits.inactive_gas;
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
{.msg = {{0x1a0, (scc_bus), 32, 50U, .max_counter = 0xffU, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
|
||||
|
||||
static bool hyundai_canfd_alt_buttons = false;
|
||||
static bool hyundai_canfd_angle_steering = false;
|
||||
static bool hyundai_canfd_lka_steer_msg_alt = false;
|
||||
|
||||
static unsigned int hyundai_canfd_get_lka_addr(void) {
|
||||
@@ -79,10 +78,6 @@ static void hyundai_canfd_rx_hook(const CANPacket_t *msg) {
|
||||
int torque_driver_new = ((msg->data[11] & 0x1fU) << 8U) | msg->data[10];
|
||||
torque_driver_new -= 4095;
|
||||
update_sample(&torque_driver, torque_driver_new);
|
||||
|
||||
int angle_meas_new = (msg->data[17] << 8) | msg->data[16];
|
||||
angle_meas_new = to_signed(angle_meas_new, 16);
|
||||
update_sample(&angle_meas, angle_meas_new);
|
||||
}
|
||||
|
||||
// cruise buttons
|
||||
@@ -146,7 +141,7 @@ static void hyundai_canfd_rx_hook(const CANPacket_t *msg) {
|
||||
}
|
||||
|
||||
static bool hyundai_canfd_tx_hook(const CANPacket_t *msg) {
|
||||
const TorqueSteeringLimits HYUNDAI_CANFD_TORQUE_STEERING_LIMITS = {
|
||||
const TorqueSteeringLimits HYUNDAI_CANFD_STEERING_LIMITS = {
|
||||
.max_torque = 270,
|
||||
.max_rt_delta = 112,
|
||||
.max_rate_up = 2,
|
||||
@@ -163,77 +158,16 @@ static bool hyundai_canfd_tx_hook(const CANPacket_t *msg) {
|
||||
.has_steer_req_tolerance = true,
|
||||
};
|
||||
|
||||
const AngleSteeringLimits HYUNDAI_CANFD_ANGLE_STEERING_LIMITS = {
|
||||
.max_angle = 3600,
|
||||
.angle_deg_to_can = 10,
|
||||
.frequency = 100U,
|
||||
};
|
||||
|
||||
// We need to find a middle ground between all the possible params or find a way to properly fingerprint.
|
||||
// HYUNDAI_IONIQ_5_PE: -0.0008688329819908074
|
||||
// KIA_EV6_2025: -0.000889804937754786
|
||||
// KIA_EV9: -0.0005410588125765342
|
||||
// GENESIS_GV80_2025: -0.0005685702046115589
|
||||
// HYUNDAI_SANTA_FE_HEV_5TH_GEN: -0.00059689759884299
|
||||
|
||||
// IONIQ 5 PE values.
|
||||
// const AngleSteeringParams HYUNDAI_STEERING_PARAMS = {
|
||||
// .slip_factor = -0.0008688329819908074, // calc_slip_factor(VM)
|
||||
// .steer_ratio = 14.26,
|
||||
// .wheelbase = 2.97,
|
||||
// };
|
||||
|
||||
// // GENESIS_GV80_2025 values. (values can be found on values.py)
|
||||
// const AngleSteeringParams HYUNDAI_STEERING_PARAMS = {
|
||||
// .slip_factor = -0.0005685702046115589, // calc_slip_factor(VM)
|
||||
// .steer_ratio = 14.14,
|
||||
// .wheelbase = 2.95,
|
||||
// };
|
||||
|
||||
// HYUNDAI_SANTA_FE_HEV_5TH_GEN values. (values can be found on values.py)
|
||||
// const AngleSteeringParams HYUNDAI_STEERING_PARAMS = {
|
||||
// .slip_factor = -0.00059689759884299, // calc_slip_factor(VM)
|
||||
// .steer_ratio = 13.72,
|
||||
// .wheelbase = 2.81,
|
||||
// };
|
||||
|
||||
// KIA_SPORTAGE_HEV_2026 values. (most conservative for now) (values can be found on values.py)
|
||||
const AngleSteeringParams HYUNDAI_STEERING_PARAMS = {
|
||||
.slip_factor = -0.0006085930193026732, // calc_slip_factor(VM)
|
||||
.steer_ratio = 13.7,
|
||||
.wheelbase = 2.756,
|
||||
};
|
||||
|
||||
|
||||
bool tx = true;
|
||||
|
||||
// steering
|
||||
const unsigned int steer_addr = (hyundai_canfd_lka_steer_msg && !hyundai_longitudinal) ? hyundai_canfd_get_lka_addr() : 0x12aU;
|
||||
if (msg->addr == steer_addr) {
|
||||
if (hyundai_canfd_angle_steering) {
|
||||
const int lkas_angle_active = (msg->data[9] >> 4U) & 0x3U;
|
||||
const bool steer_angle_req = lkas_angle_active != 1;
|
||||
int desired_torque = (((msg->data[6] & 0xFU) << 7U) | (msg->data[5] >> 1U)) - 1024U;
|
||||
bool steer_req = GET_BIT(msg, 52U);
|
||||
|
||||
int desired_angle = (msg->data[11] << 6U) | (msg->data[10] >> 2U);
|
||||
desired_angle = to_signed(desired_angle, 14);
|
||||
|
||||
// ADAS_ACIAnglTqRedcGainVal: bit 96, 8 bits, unsigned. Raw 0-250 valid, 251-255 reserved.
|
||||
const uint8_t gain_raw = msg->data[12];
|
||||
bool gain_violation = gain_raw > 250U;
|
||||
if (!steer_angle_req && (gain_raw != 0U)) {
|
||||
gain_violation = true;
|
||||
}
|
||||
|
||||
if (steer_angle_cmd_checks_vm(desired_angle, steer_angle_req, HYUNDAI_CANFD_ANGLE_STEERING_LIMITS, HYUNDAI_STEERING_PARAMS) || gain_violation) {
|
||||
tx = false;
|
||||
}
|
||||
} else {
|
||||
int desired_torque = (((msg->data[6] & 0xFU) << 7U) | (msg->data[5] >> 1U)) - 1024U;
|
||||
bool steer_req = GET_BIT(msg, 52U);
|
||||
|
||||
if (steer_torque_cmd_checks(desired_torque, steer_req, HYUNDAI_CANFD_TORQUE_STEERING_LIMITS)) {
|
||||
tx = false;
|
||||
}
|
||||
if (steer_torque_cmd_checks(desired_torque, steer_req, HYUNDAI_CANFD_STEERING_LIMITS)) {
|
||||
tx = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -293,7 +227,6 @@ static bool hyundai_canfd_tx_hook(const CANPacket_t *msg) {
|
||||
static safety_config hyundai_canfd_init(uint16_t param) {
|
||||
const uint16_t HYUNDAI_PARAM_CANFD_LKA_STEER_MSG_ALT = 128;
|
||||
const uint16_t HYUNDAI_PARAM_CANFD_ALT_BUTTONS = 32;
|
||||
const uint16_t HYUNDAI_PARAM_CANFD_ANGLE_STEERING = 1024;
|
||||
|
||||
static const CanMsg HYUNDAI_CANFD_LKA_STEER_MSG_TX_MSGS[] = {
|
||||
HYUNDAI_CANFD_LKA_STEER_MSG_COMMON_TX_MSGS(0, 1)
|
||||
@@ -342,8 +275,6 @@ static safety_config hyundai_canfd_init(uint16_t param) {
|
||||
|
||||
gen_crc_lookup_table_16(0x1021, hyundai_canfd_crc_lut);
|
||||
hyundai_canfd_alt_buttons = GET_FLAG(param, HYUNDAI_PARAM_CANFD_ALT_BUTTONS);
|
||||
hyundai_canfd_angle_steering = GET_FLAG(param, HYUNDAI_PARAM_CANFD_ANGLE_STEERING);
|
||||
// TODO: test this restriction
|
||||
hyundai_canfd_lka_steer_msg_alt = GET_FLAG(param, HYUNDAI_PARAM_CANFD_LKA_STEER_MSG_ALT);
|
||||
|
||||
safety_config ret;
|
||||
|
||||
@@ -0,0 +1,128 @@
|
||||
#pragma once
|
||||
|
||||
#include "opendbc/safety/declarations.h"
|
||||
|
||||
static uint8_t mg_crc_lut[256];
|
||||
|
||||
static uint32_t mg_get_checksum(const CANPacket_t *msg) {
|
||||
return msg->data[7];
|
||||
}
|
||||
|
||||
static uint32_t mg_compute_checksum(const CANPacket_t *msg) {
|
||||
uint8_t checksum = 0xFFU;
|
||||
for (int i = 0; i < 7; i++) {
|
||||
checksum ^= msg->data[i];
|
||||
checksum = mg_crc_lut[checksum];
|
||||
}
|
||||
return checksum ^ 0xFFU;
|
||||
}
|
||||
|
||||
static uint8_t mg_get_counter(const CANPacket_t *msg) {
|
||||
uint8_t counter = 0U;
|
||||
if (msg->addr == 0x23cU) {
|
||||
counter = (msg->data[4] >> 4) & 0xFU;
|
||||
} else if (msg->addr == 0x1ecU) {
|
||||
counter = (msg->data[0] >> 4) & 0xFU;
|
||||
} else if (msg->addr == 0x242U) {
|
||||
counter = (msg->data[0] >> 3) & 0xFU;
|
||||
} else if (msg->addr == 0x1b6U) {
|
||||
counter = msg->data[6] & 0xFU;
|
||||
} else {
|
||||
// No counter for this message
|
||||
}
|
||||
return counter;
|
||||
}
|
||||
|
||||
static void mg_rx_hook(const CANPacket_t *msg) {
|
||||
if (msg->bus == 0U) {
|
||||
// Vehicle speed
|
||||
if (msg->addr == 0x23cU) {
|
||||
float speed = (((msg->data[2] & 0x7FU) << 8) | msg->data[3]) * 0.015625;
|
||||
vehicle_moving = speed > 0.0;
|
||||
UPDATE_VEHICLE_SPEED(speed * KPH_TO_MS);
|
||||
}
|
||||
|
||||
// Gas pressed
|
||||
if (msg->addr == 0xafU) {
|
||||
gas_pressed = msg->data[0] != 0U;
|
||||
}
|
||||
|
||||
// Driver torque
|
||||
if (msg->addr == 0x1ecU) {
|
||||
int torque_driver_new = (((msg->data[4] & 0x7U) << 8) | msg->data[5]) - 1024U;
|
||||
update_sample(&torque_driver, torque_driver_new);
|
||||
}
|
||||
|
||||
// Brake pressed
|
||||
if (msg->addr == 0x1b6U) {
|
||||
brake_pressed = GET_BIT(msg, 10U);
|
||||
}
|
||||
|
||||
// Cruise state
|
||||
if (msg->addr == 0x242U) {
|
||||
int cruise_state = (msg->data[5] & 0x38U) >> 3;
|
||||
bool cruise_engaged = (cruise_state == 2) || // Active
|
||||
(cruise_state == 3); // Override
|
||||
pcm_cruise_check(cruise_engaged);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool mg_tx_hook(const CANPacket_t *msg) {
|
||||
const TorqueSteeringLimits MG_STEERING_LIMITS = {
|
||||
.max_torque = 300,
|
||||
.max_rate_up = 6,
|
||||
.max_rate_down = 10,
|
||||
.max_rt_delta = 125,
|
||||
.driver_torque_multiplier = 2,
|
||||
.driver_torque_allowance = 100,
|
||||
.type = TorqueDriverLimited,
|
||||
};
|
||||
|
||||
bool tx = true;
|
||||
bool violation = false;
|
||||
|
||||
// Steering control
|
||||
if (msg->addr == 0x1fdU) {
|
||||
int desired_torque = (((msg->data[0] & 0x7U) << 8) | msg->data[1]) - 1024U;
|
||||
bool steer_req = GET_BIT(msg, 35U);
|
||||
|
||||
violation |= steer_torque_cmd_checks(desired_torque, steer_req, MG_STEERING_LIMITS);
|
||||
}
|
||||
|
||||
if (violation) {
|
||||
tx = false;
|
||||
}
|
||||
|
||||
return tx;
|
||||
}
|
||||
|
||||
static safety_config mg_init(uint16_t param) {
|
||||
SAFETY_UNUSED(param);
|
||||
|
||||
gen_crc_lookup_table_8(0x1DU, mg_crc_lut);
|
||||
|
||||
static const CanMsg MG_TX_MSGS[] = {{0x1fd, 0, 8, .check_relay = true}};
|
||||
|
||||
static RxCheck mg_rx_checks[] = {
|
||||
{.msg = {{0x23c, 0, 8, .frequency = 50U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // SCS_HSC2_FrP19 (speed)
|
||||
{.msg = {{0xaf, 0, 8, .frequency = 100U, .ignore_checksum = true, .ignore_counter = true, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // GW_HSC2_HCU_FrP00 (gas pedal)
|
||||
{.msg = {{0x1ec, 0, 8, .frequency = 50U, .ignore_checksum = true, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // EPS_HSC2_FrP03 (driver torque)
|
||||
{.msg = {{0x242, 0, 8, .frequency = 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // RADAR_HSC2_FrP00 (cruise state)
|
||||
{.msg = {{0x1b6, 0, 8, .frequency = 50U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, // EHBS_HSC2_FrP00 (brake pedal)
|
||||
};
|
||||
|
||||
safety_config ret;
|
||||
SET_RX_CHECKS(mg_rx_checks, ret);
|
||||
SET_TX_MSGS(MG_TX_MSGS, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
const safety_hooks mg_hooks = {
|
||||
.init = mg_init,
|
||||
.rx = mg_rx_hook,
|
||||
.tx = mg_tx_hook,
|
||||
.get_checksum = mg_get_checksum,
|
||||
.compute_checksum = mg_compute_checksum,
|
||||
.get_counter = mg_get_counter,
|
||||
};
|
||||
@@ -28,19 +28,11 @@
|
||||
#define MSG_SUBARU_Brake_Pedal 0x139U
|
||||
|
||||
#define MSG_SUBARU_ES_LKAS 0x122U
|
||||
#define MSG_SUBARU_ES_Brake 0x220U
|
||||
#define MSG_SUBARU_ES_Distance 0x221U
|
||||
#define MSG_SUBARU_ES_Status 0x222U
|
||||
#define MSG_SUBARU_ES_DashStatus 0x321U
|
||||
#define MSG_SUBARU_ES_LKAS_State 0x322U
|
||||
#define MSG_SUBARU_ES_Infotainment 0x323U
|
||||
|
||||
#define MSG_SUBARU_ES_UDS_Request 0x787U
|
||||
|
||||
#define MSG_SUBARU_ES_HighBeamAssist 0x22AU
|
||||
#define MSG_SUBARU_ES_STATIC_1 0x325U
|
||||
#define MSG_SUBARU_ES_STATIC_2 0x121U
|
||||
|
||||
#define SUBARU_MAIN_BUS 0U
|
||||
#define SUBARU_ALT_BUS 1U
|
||||
#define SUBARU_CAM_BUS 2U
|
||||
@@ -54,17 +46,6 @@
|
||||
#define SUBARU_COMMON_TX_MSGS(alt_bus) \
|
||||
{MSG_SUBARU_ES_Distance, alt_bus, 8, .check_relay = false}, \
|
||||
|
||||
#define SUBARU_COMMON_LONG_TX_MSGS(alt_bus) \
|
||||
{MSG_SUBARU_ES_Distance, alt_bus, 8, .check_relay = true}, \
|
||||
{MSG_SUBARU_ES_Brake, alt_bus, 8, .check_relay = true}, \
|
||||
{MSG_SUBARU_ES_Status, alt_bus, 8, .check_relay = true}, \
|
||||
|
||||
#define SUBARU_GEN2_LONG_ADDITIONAL_TX_MSGS() \
|
||||
{MSG_SUBARU_ES_UDS_Request, SUBARU_CAM_BUS, 8, .check_relay = false}, \
|
||||
{MSG_SUBARU_ES_HighBeamAssist, SUBARU_MAIN_BUS, 8, .check_relay = false}, \
|
||||
{MSG_SUBARU_ES_STATIC_1, SUBARU_MAIN_BUS, 8, .check_relay = false}, \
|
||||
{MSG_SUBARU_ES_STATIC_2, SUBARU_MAIN_BUS, 8, .check_relay = false}, \
|
||||
|
||||
#define SUBARU_STOP_AND_GO_TX_MSGS \
|
||||
{MSG_SUBARU_Throttle, SUBARU_CAM_BUS, 8, .check_relay = true}, \
|
||||
{MSG_SUBARU_Brake_Pedal, SUBARU_CAM_BUS, 8, .check_relay = true}, \
|
||||
@@ -78,7 +59,6 @@
|
||||
{.msg = {{MSG_SUBARU_ES_LKAS_State, SUBARU_CAM_BUS, 8, 10U, .max_counter = 15U, .ignore_quality_flag = true}, { 0 }, { 0 }}}, \
|
||||
|
||||
static bool subaru_gen2 = false;
|
||||
static bool subaru_longitudinal = false;
|
||||
|
||||
static uint32_t subaru_get_checksum(const CANPacket_t *msg) {
|
||||
return (uint8_t)msg->data[0];
|
||||
@@ -170,41 +150,15 @@ static bool subaru_tx_hook(const CANPacket_t *msg) {
|
||||
violation |= steer_torque_cmd_checks(desired_torque, steer_req, limits);
|
||||
}
|
||||
|
||||
// check es_brake brake_pressure limits
|
||||
if (msg->addr == MSG_SUBARU_ES_Brake) {
|
||||
int es_brake_pressure = GET_BYTES(msg, 2, 2);
|
||||
violation |= longitudinal_brake_checks(es_brake_pressure, SUBARU_LONG_LIMITS);
|
||||
}
|
||||
|
||||
// check es_distance cruise_throttle limits
|
||||
if (msg->addr == MSG_SUBARU_ES_Distance) {
|
||||
int cruise_throttle = (GET_BYTES(msg, 2, 2) & 0x1FFFU);
|
||||
bool cruise_cancel = (msg->data[7] >> 0) & 1U;
|
||||
|
||||
if (subaru_longitudinal) {
|
||||
violation |= longitudinal_gas_checks(cruise_throttle, SUBARU_LONG_LIMITS);
|
||||
} else {
|
||||
// If openpilot is not controlling long, only allow ES_Distance for cruise cancel requests,
|
||||
// (when Cruise_Cancel is true, and Cruise_Throttle is inactive)
|
||||
violation |= (cruise_throttle != SUBARU_LONG_LIMITS.inactive_gas);
|
||||
violation |= (!cruise_cancel);
|
||||
}
|
||||
}
|
||||
|
||||
// check es_status transmission_rpm limits
|
||||
if (msg->addr == MSG_SUBARU_ES_Status) {
|
||||
int transmission_rpm = (GET_BYTES(msg, 2, 2) & 0x1FFFU);
|
||||
violation |= longitudinal_transmission_rpm_checks(transmission_rpm, SUBARU_LONG_LIMITS);
|
||||
}
|
||||
|
||||
if (msg->addr == MSG_SUBARU_ES_UDS_Request) {
|
||||
// tester present ('\x02\x3E\x80\x00\x00\x00\x00\x00') is allowed for gen2 longitudinal to keep eyesight disabled
|
||||
bool is_tester_present = (GET_BYTES(msg, 0, 4) == 0x00803E02U) && (GET_BYTES(msg, 4, 4) == 0x0U);
|
||||
|
||||
// reading ES button data by identifier (b'\x03\x22\x11\x30\x00\x00\x00\x00') is also allowed (DID 0x1130)
|
||||
bool is_button_rdbi = (GET_BYTES(msg, 0, 4) == 0x30112203U) && (GET_BYTES(msg, 4, 4) == 0x0U);
|
||||
|
||||
violation |= !(is_tester_present || is_button_rdbi);
|
||||
// If openpilot is not controlling long, only allow ES_Distance for cruise cancel requests,
|
||||
// (when Cruise_Cancel is true, and Cruise_Throttle is inactive)
|
||||
violation |= (cruise_throttle != SUBARU_LONG_LIMITS.inactive_gas);
|
||||
violation |= (!cruise_cancel);
|
||||
}
|
||||
|
||||
if (violation){
|
||||
@@ -219,55 +173,38 @@ static safety_config subaru_init(uint16_t param) {
|
||||
SUBARU_COMMON_TX_MSGS(SUBARU_MAIN_BUS)
|
||||
};
|
||||
|
||||
static const CanMsg SUBARU_LONG_TX_MSGS[] = {
|
||||
SUBARU_BASE_TX_MSGS(SUBARU_MAIN_BUS, MSG_SUBARU_ES_LKAS)
|
||||
SUBARU_COMMON_LONG_TX_MSGS(SUBARU_MAIN_BUS)
|
||||
};
|
||||
|
||||
static const CanMsg SUBARU_GEN2_TX_MSGS[] = {
|
||||
SUBARU_BASE_TX_MSGS(SUBARU_ALT_BUS, MSG_SUBARU_ES_LKAS)
|
||||
SUBARU_COMMON_TX_MSGS(SUBARU_ALT_BUS)
|
||||
};
|
||||
|
||||
static const CanMsg SUBARU_GEN2_LONG_TX_MSGS[] = {
|
||||
SUBARU_BASE_TX_MSGS(SUBARU_ALT_BUS, MSG_SUBARU_ES_LKAS)
|
||||
SUBARU_COMMON_LONG_TX_MSGS(SUBARU_ALT_BUS)
|
||||
SUBARU_GEN2_LONG_ADDITIONAL_TX_MSGS()
|
||||
};
|
||||
|
||||
static const CanMsg subaru_stop_and_go_tx_msgs[] = {
|
||||
SUBARU_BASE_TX_MSGS(SUBARU_MAIN_BUS, MSG_SUBARU_ES_LKAS)
|
||||
SUBARU_COMMON_TX_MSGS(SUBARU_MAIN_BUS)
|
||||
SUBARU_STOP_AND_GO_TX_MSGS
|
||||
};
|
||||
|
||||
static RxCheck subaru_rx_checks[] = {
|
||||
SUBARU_COMMON_RX_CHECKS(SUBARU_MAIN_BUS)
|
||||
};
|
||||
|
||||
static RxCheck subaru_gen2_rx_checks[] = {
|
||||
SUBARU_COMMON_RX_CHECKS(SUBARU_ALT_BUS)
|
||||
};
|
||||
|
||||
const uint16_t SUBARU_PARAM_GEN2 = 1;
|
||||
|
||||
subaru_gen2 = GET_FLAG(param, SUBARU_PARAM_GEN2);
|
||||
|
||||
subaru_common_init();
|
||||
|
||||
#ifdef ALLOW_DEBUG
|
||||
const uint16_t SUBARU_PARAM_LONGITUDINAL = 2;
|
||||
subaru_longitudinal = GET_FLAG(param, SUBARU_PARAM_LONGITUDINAL);
|
||||
#endif
|
||||
// TODO: re-enable once more work is done on the limits
|
||||
// revert this in the PR that re-enables Subaru longitudinal: https://github.com/commaai/opendbc/pull/3689
|
||||
|
||||
safety_config ret;
|
||||
if (subaru_gen2) {
|
||||
ret = subaru_longitudinal ? BUILD_SAFETY_CFG(subaru_gen2_rx_checks, SUBARU_GEN2_LONG_TX_MSGS) : \
|
||||
BUILD_SAFETY_CFG(subaru_gen2_rx_checks, SUBARU_GEN2_TX_MSGS);
|
||||
static RxCheck subaru_gen2_rx_checks[] = {
|
||||
SUBARU_COMMON_RX_CHECKS(SUBARU_ALT_BUS)
|
||||
};
|
||||
ret = BUILD_SAFETY_CFG(subaru_gen2_rx_checks, SUBARU_GEN2_TX_MSGS);
|
||||
} else {
|
||||
ret = subaru_longitudinal ? BUILD_SAFETY_CFG(subaru_rx_checks, SUBARU_LONG_TX_MSGS) : \
|
||||
subaru_stop_and_go ? BUILD_SAFETY_CFG(subaru_rx_checks, subaru_stop_and_go_tx_msgs) : \
|
||||
BUILD_SAFETY_CFG(subaru_rx_checks, SUBARU_TX_MSGS);
|
||||
static RxCheck subaru_rx_checks[] = {
|
||||
SUBARU_COMMON_RX_CHECKS(SUBARU_MAIN_BUS)
|
||||
};
|
||||
ret = subaru_stop_and_go ? BUILD_SAFETY_CFG(subaru_rx_checks, subaru_stop_and_go_tx_msgs) : \
|
||||
BUILD_SAFETY_CFG(subaru_rx_checks, SUBARU_TX_MSGS);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
// Stock longitudinal
|
||||
#define TOYOTA_BASE_TX_MSGS \
|
||||
{0x191, 0, 8, .check_relay = true}, {0x412, 0, 8, .check_relay = true}, {0x1D2, 0, 8, .check_relay = false}, /* LKAS + LTA + PCM cancel cmd */ \
|
||||
{0x191, 0, 8, .check_relay = true}, {0x412, 0, 8, .check_relay = true}, {0x1D2, 0, 8, .check_relay = false}, {0x750, 0, 8, .check_relay = false}, /* LKAS + LTA + PCM cancel cmd */ \
|
||||
|
||||
#define TOYOTA_COMMON_TX_MSGS \
|
||||
TOYOTA_BASE_TX_MSGS \
|
||||
@@ -69,6 +69,7 @@ static bool toyota_secoc = false;
|
||||
static bool toyota_alt_brake = false;
|
||||
static bool toyota_stock_longitudinal = false;
|
||||
static bool toyota_lta = false;
|
||||
static bool toyota_cruise_engaged = false; // SP: PCM_CRUISE.CRUISE_ACTIVE, narrows the auto brake hold AEB window below
|
||||
static int toyota_dbc_eps_torque_factor = 100; // conversion factor for STEER_TORQUE_EPS in %: see dbc file
|
||||
|
||||
static uint32_t toyota_compute_checksum(const CANPacket_t *msg) {
|
||||
@@ -151,6 +152,7 @@ static void toyota_rx_hook(const CANPacket_t *msg) {
|
||||
if (msg->addr == 0x176U) {
|
||||
bool cruise_engaged = GET_BIT(msg, 5U); // PCM_CRUISE.CRUISE_ACTIVE
|
||||
pcm_cruise_check(cruise_engaged);
|
||||
toyota_cruise_engaged = cruise_engaged;
|
||||
}
|
||||
if (msg->addr == 0x116U) {
|
||||
gas_pressed = msg->data[1] != 0U; // GAS_PEDAL.GAS_PEDAL_USER
|
||||
@@ -162,6 +164,7 @@ static void toyota_rx_hook(const CANPacket_t *msg) {
|
||||
if (msg->addr == 0x1D2U) {
|
||||
bool cruise_engaged = GET_BIT(msg, 5U); // PCM_CRUISE.CRUISE_ACTIVE
|
||||
pcm_cruise_check(cruise_engaged);
|
||||
toyota_cruise_engaged = cruise_engaged;
|
||||
|
||||
if (!enable_gas_interceptor) {
|
||||
gas_pressed = !GET_BIT(msg, 4U); // PCM_CRUISE.GAS_RELEASED
|
||||
@@ -386,13 +389,35 @@ static bool toyota_tx_hook(const CANPacket_t *msg) {
|
||||
tx = false;
|
||||
}
|
||||
}
|
||||
|
||||
// SP: auto brake hold https://github.com/AlexandreSato
|
||||
if ((msg->addr == 0x344U) && (alternative_experience & ALT_EXP_ALLOW_AEB)) {
|
||||
if (vehicle_moving || gas_pressed || !acc_main_on || toyota_cruise_engaged) {
|
||||
tx = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// UDS: Only tester present ("\x0F\x02\x3E\x00\x00\x00\x00\x00") allowed on diagnostics address
|
||||
if (msg->addr == 0x750U) {
|
||||
// this address is sub-addressed. only allow tester present to radar (0xF)
|
||||
bool invalid_uds_msg = (GET_BYTES(msg, 0, 4) != 0x003E020FU) || (GET_BYTES(msg, 4, 4) != 0x0U);
|
||||
if (invalid_uds_msg) {
|
||||
// SP: Secret sauce from dp. (ask @rav4kumar prior to modifying)
|
||||
// Enhanced BSM
|
||||
bool sp_valid_uds_msgs = ((GET_BYTES(msg, 0, 4) == 0x01100241U) || // disable left BSM debug
|
||||
(GET_BYTES(msg, 0, 4) == 0x60100241U) || // enable left BSM debug
|
||||
(GET_BYTES(msg, 0, 4) == 0x69210241U) || // poll left BSM status
|
||||
(GET_BYTES(msg, 0, 4) == 0x01100242U) || // disable right BSM debug
|
||||
(GET_BYTES(msg, 0, 4) == 0x60100242U) || // enable right BSM debug
|
||||
(GET_BYTES(msg, 0, 4) == 0x69210242U)) // poll right BSM status
|
||||
&& (GET_BYTES(msg, 4, 4) == 0x0U);
|
||||
|
||||
sp_valid_uds_msgs |= (GET_BYTES(msg, 0, 4) == 0x11300540U) && // automatic door locking and unlocking
|
||||
((GET_BYTES(msg, 4, 4) == 0x00004000U) || // unlock
|
||||
(GET_BYTES(msg, 4, 4) == 0x00008000U)); // lock
|
||||
|
||||
bool valid_tester_present = !invalid_uds_msg && !toyota_stock_longitudinal && !toyota_secoc;
|
||||
if (!valid_tester_present && !sp_valid_uds_msgs) {
|
||||
tx = false;
|
||||
}
|
||||
}
|
||||
@@ -566,10 +591,27 @@ static safety_config toyota_init(uint16_t param) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool toyota_fwd_hook(int bus_num, int addr) {
|
||||
bool block_msg = false;
|
||||
if (bus_num == 2) {
|
||||
// SP: block AEB when auto brake hold is active, unblock AEB when auto brake hold is not active.
|
||||
// Narrowed to match auto brake hold's own precondition (cruise must be off) - previously this
|
||||
// blocked native AEB forwarding, forcing a slower software relay, any time the car was simply
|
||||
// stopped with the gas released and ACC main on, even while cruise was actively engaged and
|
||||
// auto brake hold couldn't be active at all.
|
||||
bool is_aeb_msg = (addr == 0x344);
|
||||
block_msg = (is_aeb_msg && (alternative_experience & ALT_EXP_ALLOW_AEB) && !vehicle_moving && !gas_pressed && acc_main_on &&
|
||||
!toyota_cruise_engaged);
|
||||
}
|
||||
|
||||
return block_msg;
|
||||
}
|
||||
|
||||
const safety_hooks toyota_hooks = {
|
||||
.init = toyota_init,
|
||||
.rx = toyota_rx_hook,
|
||||
.tx = toyota_tx_hook,
|
||||
.fwd = toyota_fwd_hook,
|
||||
.get_checksum = toyota_get_checksum,
|
||||
.compute_checksum = toyota_compute_checksum,
|
||||
.get_quality_flag_valid = toyota_get_quality_flag_valid,
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "opendbc/safety/modes/chrysler.h"
|
||||
#include "opendbc/safety/modes/chrysler_cusw.h"
|
||||
#include "opendbc/safety/modes/rivian.h"
|
||||
#include "opendbc/safety/modes/mg.h"
|
||||
#include "opendbc/safety/modes/subaru.h"
|
||||
#include "opendbc/safety/modes/subaru_preglobal.h"
|
||||
#include "opendbc/safety/modes/mazda.h"
|
||||
@@ -420,6 +421,7 @@ int set_safety_hooks(uint16_t mode, uint16_t param) {
|
||||
{SAFETY_TESLA, &tesla_hooks},
|
||||
{SAFETY_HYUNDAI_CANFD, &hyundai_canfd_hooks},
|
||||
#ifdef ALLOW_DEBUG
|
||||
{SAFETY_MG, &mg_hooks},
|
||||
{SAFETY_CHRYSLER_CUSW, &chrysler_cusw_hooks},
|
||||
{SAFETY_PSA, &psa_hooks},
|
||||
{SAFETY_SUBARU_PREGLOBAL, &subaru_preglobal_hooks},
|
||||
|
||||
@@ -260,11 +260,11 @@ def enumerate_sites(input_source, preprocessed_file):
|
||||
def _build_core_tests(catalog):
|
||||
"""Build test ordering for core (non-mode) files.
|
||||
|
||||
One test per unique method name from evenly-spaced modules,
|
||||
ordered by how widely each method is shared. Methods inherited by many
|
||||
classes exercise the most fundamental safety logic and run first.
|
||||
Tests are ordered by how widely each method is shared. Methods inherited by
|
||||
many classes exercise the most fundamental safety logic and run first.
|
||||
|
||||
Keep every implementation of each method.
|
||||
"""
|
||||
MAX_PER_METHOD = 5
|
||||
method_freq = {}
|
||||
method_by_module = {}
|
||||
for name in sorted(catalog.keys()):
|
||||
@@ -275,23 +275,14 @@ def _build_core_tests(catalog):
|
||||
method_by_module[method] = {}
|
||||
if name not in method_by_module[method]:
|
||||
method_by_module[method][name] = test_id
|
||||
# Pick evenly-spaced modules for each method to maximize configuration diversity
|
||||
method_ids = {}
|
||||
for method, module_map in method_by_module.items():
|
||||
modules = sorted(module_map.keys())
|
||||
n = len(modules)
|
||||
if n <= MAX_PER_METHOD:
|
||||
method_ids[method] = [module_map[m] for m in modules]
|
||||
else:
|
||||
step = n / MAX_PER_METHOD
|
||||
method_ids[method] = [module_map[modules[int(i * step)]] for i in range(MAX_PER_METHOD)]
|
||||
# Round-robin: first instance of each method (by freq), then second, etc.
|
||||
# This ensures diverse early coverage with failfast.
|
||||
sorted_methods = sorted(method_freq, key=lambda m: -method_freq[m])
|
||||
ordered = []
|
||||
for round_idx in range(MAX_PER_METHOD):
|
||||
max_implementations = max(len(module_map) for module_map in method_by_module.values())
|
||||
for round_idx in range(max_implementations):
|
||||
for m in sorted_methods:
|
||||
ids = method_ids.get(m, [])
|
||||
ids = [method_by_module[m][module] for module in sorted(method_by_module[m])]
|
||||
if round_idx < len(ids):
|
||||
ordered.append(ids[round_idx])
|
||||
return ordered
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -60,11 +60,7 @@ def get_steer_value(mode, param, msg):
|
||||
elif mode in (CarParams.SafetyModel.hyundai, CarParams.SafetyModel.hyundaiLegacy):
|
||||
torque = (((msg.data[3] & 0x7) << 8) | msg.data[2]) - 1024
|
||||
elif mode == CarParams.SafetyModel.hyundaiCanfd:
|
||||
if param & HyundaiSafetyFlags.CANFD_ANGLE_STEERING:
|
||||
angle = (msg.data[11] << 6) | (msg.data[10] >> 2)
|
||||
angle = to_signed(angle, 14)
|
||||
else:
|
||||
torque = ((msg.data[5] >> 1) | (msg.data[6] & 0xF) << 7) - 1024
|
||||
torque = ((msg.data[5] >> 1) | (msg.data[6] & 0xF) << 7) - 1024
|
||||
elif mode == CarParams.SafetyModel.chrysler:
|
||||
torque = (((msg.data[0] & 0x7) << 8) | msg.data[1]) - 1024
|
||||
elif mode == CarParams.SafetyModel.subaru:
|
||||
|
||||
@@ -18,9 +18,6 @@ DEBUG_VARS = {
|
||||
'current_disengage_reason': lambda safety: safety.mads_get_current_disengage_reason(),
|
||||
'stock_acc_main': lambda safety: safety.get_acc_main_on(),
|
||||
'mads_acc_main': lambda safety: safety.get_mads_acc_main(),
|
||||
'desired_angle_last': lambda safety: safety.get_desired_angle_last(),
|
||||
'angle_meas_min': lambda safety: safety.get_angle_meas_min(),
|
||||
'angle_meas_max': lambda safety: safety.get_angle_meas_max(),
|
||||
}
|
||||
|
||||
|
||||
@@ -92,27 +89,17 @@ def replay_drive(msgs, safety_mode, param, alternative_experience, param_sp):
|
||||
last_good = last_good_states[canmsg.address]
|
||||
print(f"\nBlocked message at {(msg.logMonoTime - start_t) / 1e9:.3f}s:")
|
||||
print(f"Address: {hex(canmsg.address)} (bus {canmsg.src})")
|
||||
|
||||
# Header with tab-separated columns
|
||||
print("\nVariable\t\tLast Good State\t\tCurrent State")
|
||||
print("-" * 80)
|
||||
|
||||
print("Current state:")
|
||||
for var, getter in DEBUG_VARS.items():
|
||||
current_val = getter(safety)
|
||||
last_val = last_good[var] if last_good['timestamp'] is not None else "N/A"
|
||||
|
||||
# Align columns based on variable name length
|
||||
tab_count = 1 if len(var) >= 16 else 2 # crude spacing control
|
||||
tabs = '\t' * tab_count
|
||||
print(f"{var}{tabs}\t{last_val}\t\t{current_val}")
|
||||
print(f" {var}: {getter(safety)}")
|
||||
|
||||
if last_good['timestamp'] is not None:
|
||||
print(f"\nLast good timestamp: {last_good['timestamp']:.3f}s")
|
||||
print(f"\nLast good state ({last_good['timestamp']:.3f}s):")
|
||||
for var in DEBUG_VARS:
|
||||
print(f" {var}: {last_good[var]}")
|
||||
else:
|
||||
print("\nNo previous good state found for this address")
|
||||
|
||||
print("-" * 80)
|
||||
|
||||
else: # Update last good state if message is allowed
|
||||
last_good_states[canmsg.address].update({
|
||||
'timestamp': (msg.logMonoTime - start_t) / 1e9,
|
||||
|
||||
@@ -1,18 +1,13 @@
|
||||
#!/usr/bin/env python3
|
||||
from opendbc.testing import parameterized_class, parameterized
|
||||
from opendbc.testing import parameterized_class
|
||||
import unittest
|
||||
import numpy as np
|
||||
|
||||
from opendbc.car.hyundai.carcontroller import ANGLE_SAFETY_BASELINE_MODEL
|
||||
from opendbc.car.hyundai.values import HyundaiSafetyFlags, CAR, HyundaiFlags, CarControllerParams
|
||||
from opendbc.car.hyundai.values import HyundaiSafetyFlags
|
||||
from opendbc.car.structs import CarParams
|
||||
from opendbc.car.vehicle_model import VehicleModel, calc_slip_factor
|
||||
from opendbc.safety.tests.libsafety import libsafety_py
|
||||
import opendbc.safety.tests.common as common
|
||||
from opendbc.safety.tests.common import CANPackerSafety, away_round, round_speed
|
||||
from opendbc.safety.tests.common import CANPackerSafety
|
||||
from opendbc.safety.tests.hyundai_common import HyundaiButtonBase, HyundaiLongitudinalBase
|
||||
from opendbc.car.lateral import get_max_angle_delta_vm, get_max_angle_vm, AngleSteeringLimitsVM
|
||||
from opendbc.car.hyundai.interface import CarInterface
|
||||
|
||||
# All combinations of radar/camera-SCC and gas/hybrid/EV cars
|
||||
ALL_GAS_EV_HYBRID_COMBOS = [
|
||||
@@ -27,16 +22,10 @@ ALL_GAS_EV_HYBRID_COMBOS = [
|
||||
]
|
||||
|
||||
|
||||
def round_angle(angle_deg: float, can_offset=0):
|
||||
scaled = angle_deg / 0.1
|
||||
scaled += can_offset
|
||||
return int(scaled) * 0.1
|
||||
|
||||
|
||||
class TestHyundaiCanfdBase(HyundaiButtonBase, common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
|
||||
|
||||
TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0]]
|
||||
STANDSTILL_THRESHOLD = 0.375 * 0.03125 # 0.375 kph
|
||||
STANDSTILL_THRESHOLD = 12 # 0.375 kph
|
||||
FWD_BLACKLISTED_ADDRS = {2: [0x50, 0x2a4]}
|
||||
|
||||
MAX_RATE_UP = 2
|
||||
@@ -68,7 +57,7 @@ class TestHyundaiCanfdBase(HyundaiButtonBase, common.CarSafetyTest, common.Drive
|
||||
return self.packer.make_can_msg_safety(self.STEER_MSG, self.STEER_BUS, values)
|
||||
|
||||
def _speed_msg(self, speed):
|
||||
values = {f"WHL_Spd{pos}Val": speed * 3.6 for pos in ["FL", "FR", "RL", "RR"]}
|
||||
values = {f"WHL_Spd{pos}Val": speed * 0.03125 for pos in ["FL", "FR", "RL", "RR"]}
|
||||
return self.packer.make_can_msg_safety("WHEEL_SPEEDS", self.PT_BUS, values)
|
||||
|
||||
def _user_brake_msg(self, brake):
|
||||
@@ -104,285 +93,7 @@ class TestHyundaiCanfdBase(HyundaiButtonBase, common.CarSafetyTest, common.Drive
|
||||
return self._button_msg(0, enabled)
|
||||
|
||||
|
||||
class TestHyundaiCanfdTorqueSteering(TestHyundaiCanfdBase, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
|
||||
|
||||
MAX_RATE_UP = 2
|
||||
MAX_RATE_DOWN = 3
|
||||
MAX_TORQUE = 270
|
||||
|
||||
MAX_RT_DELTA = 112
|
||||
RT_INTERVAL = 250000
|
||||
|
||||
DRIVER_TORQUE_ALLOWANCE = 250
|
||||
DRIVER_TORQUE_FACTOR = 2
|
||||
|
||||
# Safety around steering req bit
|
||||
MIN_VALID_STEERING_FRAMES = 89
|
||||
MAX_INVALID_STEERING_FRAMES = 2
|
||||
MIN_VALID_STEERING_RT_INTERVAL = 810000 # a ~10% buffer, can send steer up to 110Hz
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
if cls.__name__ == "TestHyundaiCanfdTorqueSteering":
|
||||
cls.packer = None
|
||||
cls.safety = None
|
||||
raise unittest.SkipTest
|
||||
|
||||
def setUp(self):
|
||||
self.packer = CANPackerSafety("hyundai_canfd_generated")
|
||||
self.safety = libsafety_py.libsafety
|
||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, 0)
|
||||
self.safety.init_tests()
|
||||
|
||||
|
||||
class TestHyundaiCanfdAngleSteering(TestHyundaiCanfdBase, common.AngleSteeringSafetyTest):
|
||||
PLATFORMS = {str(platform): platform for platform in CAR if
|
||||
platform.config.flags & HyundaiFlags.CANFD_ANGLE_STEERING and not CarInterface.get_non_essential_params(str(platform)).dashcamOnly}
|
||||
|
||||
# Angle control limits
|
||||
BASELINE_PANDA_ANGLE_LIMITS: AngleSteeringLimitsVM = AngleSteeringLimitsVM(
|
||||
360, # degrees (safe upper bound for command, allowing some margin)
|
||||
MAX_ANGLE_RATE=5 # comfort rate limit for angle commands, in degrees per frame.
|
||||
)
|
||||
|
||||
STEER_ANGLE_MAX = 360 # deg
|
||||
DEG_TO_CAN = 10
|
||||
ANGLE_SAFETY_THRESHOLD_PCT = -2.0 # Fail if difference is less than -2%
|
||||
|
||||
# Hyundai uses get_max_angle_delta and get_max_angle for real lateral accel and jerk limits
|
||||
# TODO: integrate this into AngleSteeringSafetyTest
|
||||
ANGLE_RATE_BP = None
|
||||
ANGLE_RATE_UP = None
|
||||
ANGLE_RATE_DOWN = None
|
||||
|
||||
# Real time limits
|
||||
LATERAL_FREQUENCY = 100 # Hz
|
||||
|
||||
cnt_angle_cmd = 0
|
||||
|
||||
def get_baseline_limits(self):
|
||||
limits = CarControllerParams(CarInterface.get_non_essential_params(ANGLE_SAFETY_BASELINE_MODEL))
|
||||
limits.ANGLE_LIMITS = self.BASELINE_PANDA_ANGLE_LIMITS
|
||||
return limits
|
||||
|
||||
def _angle_cmd_msg(self, angle: float, enabled: bool, increment_timer: bool = True, gain: float = 0.0):
|
||||
if increment_timer:
|
||||
self.safety.set_timer(self.cnt_angle_cmd * int(1e6 / self.LATERAL_FREQUENCY))
|
||||
self.__class__.cnt_angle_cmd += 1
|
||||
values = {"ADAS_StrAnglReqVal": angle, "LKAS_ANGLE_ACTIVE": 2 if enabled else 1,
|
||||
"ADAS_ACIAnglTqRedcGainVal": gain}
|
||||
return self.packer.make_can_msg_safety(self.STEER_MSG, self.STEER_BUS, values)
|
||||
|
||||
def _angle_meas_msg(self, angle: float):
|
||||
values = {"MDPS_EstStrAnglVal": angle}
|
||||
return self.packer.make_can_msg_safety("MDPS", self.PT_BUS, values)
|
||||
|
||||
def _get_steer_cmd_angle_max(self, speed):
|
||||
baseline_vm = self.get_vm(ANGLE_SAFETY_BASELINE_MODEL)
|
||||
return get_max_angle_vm(max(speed, 1), baseline_vm, self.get_baseline_limits())
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
if cls.__name__ == "TestHyundaiCanfdAngleSteering":
|
||||
cls.packer = None
|
||||
cls.safety = None
|
||||
raise unittest.SkipTest
|
||||
|
||||
def get_vm(self, car_name):
|
||||
return VehicleModel(CarInterface.get_non_essential_params(car_name))
|
||||
|
||||
def setUp(self):
|
||||
self.packer = CANPackerSafety("hyundai_canfd_generated")
|
||||
self.safety = libsafety_py.libsafety
|
||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_ANGLE_STEERING)
|
||||
self.safety.init_tests()
|
||||
|
||||
def test_angle_cmd_when_enabled(self):
|
||||
# We properly test lateral acceleration and jerk below
|
||||
pass
|
||||
|
||||
def test_lateral_accel_limit(self):
|
||||
car_name = ANGLE_SAFETY_BASELINE_MODEL
|
||||
for speed in np.linspace(0, 40, 100):
|
||||
speed = round_speed(away_round(speed / 0.03125 * 3.6) * 0.03125 / 3.6)
|
||||
speed = max(speed, 1)
|
||||
for sign in (-1, 1):
|
||||
self.safety.set_controls_allowed(True)
|
||||
self._reset_speed_measurement(speed + 1) # safety fudges the speed
|
||||
|
||||
# at limit (safety tolerance adds 1)
|
||||
angl = get_max_angle_vm(speed, self.get_vm(car_name), self.get_baseline_limits())
|
||||
max_angle = round_angle(get_max_angle_vm(speed, self.get_vm(car_name), self.get_baseline_limits()), 1) * sign
|
||||
max_angle = np.clip(max_angle, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX)
|
||||
self.safety.set_desired_angle_last(round(max_angle * self.DEG_TO_CAN))
|
||||
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(max_angle, True)), f"{angl} -- {max_angle}")
|
||||
|
||||
# above limit (offset 6 to reliably exceed C float tolerance)
|
||||
max_angle_raw = round_angle(get_max_angle_vm(speed, self.get_vm(car_name), self.get_baseline_limits()), 6) * sign
|
||||
max_angle = np.clip(max_angle_raw, -self.STEER_ANGLE_MAX, self.STEER_ANGLE_MAX)
|
||||
self._tx(self._angle_cmd_msg(max_angle, True))
|
||||
|
||||
# at low speeds max angle is above 360, so adding 1 has no effect
|
||||
should_tx = abs(max_angle_raw) >= self.STEER_ANGLE_MAX
|
||||
self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(max_angle, True)), f"should_tx: {should_tx}, max_angle: {max_angle}, speed: {speed}")
|
||||
|
||||
def test_lateral_jerk_limit(self):
|
||||
car_name = ANGLE_SAFETY_BASELINE_MODEL
|
||||
for speed in np.linspace(0, 40, 100):
|
||||
speed = round_speed(away_round(speed / 0.03125 * 3.6) * 0.03125 / 3.6)
|
||||
speed = max(speed, 1)
|
||||
for sign in (-1, 1): # (-1, 1):
|
||||
self.safety.set_controls_allowed(True)
|
||||
self._reset_speed_measurement(speed + 1) # safety fudges the speed
|
||||
self._tx(self._angle_cmd_msg(0, True))
|
||||
|
||||
# Stay within limits
|
||||
# Up
|
||||
max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.get_vm(car_name), self.get_baseline_limits())) * sign
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
|
||||
|
||||
# Don't change
|
||||
self.safety.set_desired_angle_last(round(max_angle_delta * self.DEG_TO_CAN))
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
|
||||
|
||||
# Down
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
|
||||
|
||||
# Inject too high rates
|
||||
# Up
|
||||
# TODO-SP: Why do I need to set a can_offset so high to pass the tests and why tesla only does +1? and why does it seem to differ based on the baseline?
|
||||
max_angle_delta = round_angle(get_max_angle_delta_vm(speed, self.get_vm(car_name), self.get_baseline_limits()), 6) * sign
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(max_angle_delta, True)), vars(self.get_baseline_limits()))
|
||||
|
||||
# Don't change
|
||||
self.safety.set_desired_angle_last(round(max_angle_delta * self.DEG_TO_CAN))
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(max_angle_delta, True)))
|
||||
|
||||
# Down
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(0, True)))
|
||||
|
||||
# Recover
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(0, True)))
|
||||
|
||||
def test_rt_limits(self):
|
||||
# TODO: remove and check all safety modes
|
||||
if self.LATERAL_FREQUENCY == -1:
|
||||
raise unittest.SkipTest("No real time limits")
|
||||
|
||||
# Angle safety enforces real time limits by checking the message send frequency in a 250ms time window
|
||||
self.safety.set_timer(0)
|
||||
self.safety.set_controls_allowed(True)
|
||||
max_rt_msgs = int(self.LATERAL_FREQUENCY * common.RT_INTERVAL / 1e6 * 1.2 + 1) # 1.2x buffer
|
||||
|
||||
for i in range(max_rt_msgs * 2):
|
||||
should_tx = i <= max_rt_msgs
|
||||
self.assertEqual(should_tx, self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
|
||||
|
||||
# One under RT interval should do nothing
|
||||
self.safety.set_timer(common.RT_INTERVAL - 1)
|
||||
for _ in range(5):
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
|
||||
|
||||
# Increment timer and send 1 message to reset RT window
|
||||
self.safety.set_timer(common.RT_INTERVAL)
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
|
||||
for _ in range(5):
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(0, True, increment_timer=False)))
|
||||
|
||||
def test_torque_reduction_gain(self):
|
||||
# Valid gains when enabled
|
||||
for gain in [0.0, 0.5, 1.0]:
|
||||
self.safety.set_controls_allowed(True)
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(0, True, gain=gain)),
|
||||
f"gain={gain} should be allowed when enabled")
|
||||
|
||||
# Reserved values (raw 251+) must fail even when enabled
|
||||
for gain in [1.004, 1.008, 1.02]:
|
||||
self.safety.set_controls_allowed(True)
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(0, True, gain=gain)),
|
||||
f"gain={gain} (reserved) should be blocked")
|
||||
|
||||
# Non-zero gain when disabled must fail
|
||||
for gain in [0.004, 0.5, 1.0]:
|
||||
self.safety.set_controls_allowed(True)
|
||||
self.assertFalse(self._tx(self._angle_cmd_msg(0, False, gain=gain)),
|
||||
f"gain={gain} should be blocked when disabled")
|
||||
|
||||
# Zero gain when disabled must pass
|
||||
self.safety.set_controls_allowed(True)
|
||||
self.assertTrue(self._tx(self._angle_cmd_msg(0, False, gain=0.0)))
|
||||
|
||||
@parameterized("car_name", sorted(PLATFORMS))
|
||||
def test_max_steering_angle_safety(self, car_name):
|
||||
"""
|
||||
Test that ensures the current car's max steering angles are never more than 2%
|
||||
lower than the baseline car across all test speeds.
|
||||
"""
|
||||
baseline_car = ANGLE_SAFETY_BASELINE_MODEL
|
||||
baseline_vm = self.get_vm(baseline_car)
|
||||
current_vm = self.get_vm(car_name)
|
||||
|
||||
for speed in np.linspace(1, 40, 10):
|
||||
baseline_max_angle = get_max_angle_vm(speed, baseline_vm, self.get_baseline_limits())
|
||||
current_max_angle = get_max_angle_vm(speed, current_vm, self.get_baseline_limits())
|
||||
|
||||
# Skip if both exceed STEER_ANGLE_MAX (only_relevant_angles logic)
|
||||
if current_max_angle > self.STEER_ANGLE_MAX and baseline_max_angle > self.STEER_ANGLE_MAX:
|
||||
continue
|
||||
|
||||
# Calculate percentage difference
|
||||
if baseline_max_angle != 0:
|
||||
angle_diff_pct = ((current_max_angle - baseline_max_angle) / baseline_max_angle) * 100
|
||||
else:
|
||||
angle_diff_pct = 0
|
||||
|
||||
# Assert that difference is not dangerously low
|
||||
self.assertTrue(
|
||||
angle_diff_pct >= self.ANGLE_SAFETY_THRESHOLD_PCT,
|
||||
f"{car_name} max steering angle at {speed:.1f} m/s [{current_max_angle:.2f}°] is {angle_diff_pct:.2f}% " +
|
||||
f"lower than baseline {baseline_car} ({current_max_angle:.2f}° vs {baseline_max_angle:.2f}°). " +
|
||||
f"Must be >= {self.ANGLE_SAFETY_THRESHOLD_PCT}% to ensure safety." +
|
||||
f"Consider updating the baseline model to be {car_name} (which will lower the threshold for ALL models). " +
|
||||
f"Slip Factor: {repr(calc_slip_factor(current_vm))}"
|
||||
)
|
||||
|
||||
@parameterized("car_name", sorted(PLATFORMS))
|
||||
def test_max_steering_angle_delta_safety(self, car_name):
|
||||
"""
|
||||
Test that ensures the current car's max steering angle deltas are never more than 2%
|
||||
lower than the baseline car across all test speeds.
|
||||
"""
|
||||
baseline_car = ANGLE_SAFETY_BASELINE_MODEL
|
||||
baseline_vm = self.get_vm(baseline_car)
|
||||
baseline_limits = CarControllerParams(CarInterface.get_non_essential_params(baseline_car))
|
||||
current_vm = self.get_vm(car_name)
|
||||
current_limits = CarControllerParams(CarInterface.get_non_essential_params(car_name))
|
||||
|
||||
for speed in np.linspace(1, 40, 10):
|
||||
baseline_max_delta = get_max_angle_delta_vm(speed, baseline_vm, baseline_limits)
|
||||
current_max_delta = get_max_angle_delta_vm(speed, current_vm, current_limits)
|
||||
|
||||
# Calculate percentage difference
|
||||
if baseline_max_delta != 0:
|
||||
delta_diff_pct = ((current_max_delta - baseline_max_delta) / baseline_max_delta) * 100
|
||||
else:
|
||||
delta_diff_pct = 0
|
||||
|
||||
# Assert that difference is not dangerously low
|
||||
self.assertTrue(
|
||||
delta_diff_pct >= self.ANGLE_SAFETY_THRESHOLD_PCT,
|
||||
f"{car_name} max steering angle delta at {speed:.1f} m/s is {delta_diff_pct:.2f}% " +
|
||||
f"lower than {baseline_car} ({current_max_delta:.4f} vs {baseline_max_delta:.4f} deg/frame). " +
|
||||
f"Must be >= {self.ANGLE_SAFETY_THRESHOLD_PCT}% to ensure safety." +
|
||||
f"Consider updating the baseline model to be {car_name} (which will lower the threshold for ALL models)." +
|
||||
f"Slip Factor: {repr(calc_slip_factor(current_vm))}"
|
||||
)
|
||||
|
||||
|
||||
class TestHyundaiCanfdLFASteeringBase(TestHyundaiCanfdTorqueSteering):
|
||||
class TestHyundaiCanfdLFASteeringBase(TestHyundaiCanfdBase):
|
||||
|
||||
TX_MSGS = [[0x12A, 0], [0x1A0, 1], [0x1CF, 0], [0x1E0, 0]]
|
||||
RELAY_MALFUNCTION_ADDRS = {0: (0x12A, 0x1E0)} # LFA, LFAHDA_CLUSTER
|
||||
@@ -460,7 +171,7 @@ class TestHyundaiCanfdLFASteeringAltButtons(TestHyundaiCanfdLFASteeringAltButton
|
||||
pass
|
||||
|
||||
|
||||
class TestHyundaiCanfdLKASteeringEV(TestHyundaiCanfdTorqueSteering):
|
||||
class TestHyundaiCanfdLKASteeringEV(TestHyundaiCanfdBase):
|
||||
|
||||
TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0]]
|
||||
RELAY_MALFUNCTION_ADDRS = {0: (0x50, 0x2a4)} # LKAS, CAM_0x2A4
|
||||
@@ -479,7 +190,7 @@ class TestHyundaiCanfdLKASteeringEV(TestHyundaiCanfdTorqueSteering):
|
||||
|
||||
|
||||
# TODO: Handle ICE and HEV configurations once we see cars that use the new messages
|
||||
class TestHyundaiCanfdLKASteeringAltEVBase(TestHyundaiCanfdBase):
|
||||
class TestHyundaiCanfdLKASteeringAltEV(TestHyundaiCanfdBase):
|
||||
|
||||
TX_MSGS = [[0x110, 0], [0x1CF, 1], [0x362, 0]]
|
||||
RELAY_MALFUNCTION_ADDRS = {0: (0x110, 0x362)} # LKAS_ALT, CAM_0x362
|
||||
@@ -498,60 +209,6 @@ class TestHyundaiCanfdLKASteeringAltEVBase(TestHyundaiCanfdBase):
|
||||
self.safety.init_tests()
|
||||
|
||||
|
||||
class TestHyundaiCanfdLKASteeringAltEVTorque(TestHyundaiCanfdLKASteeringAltEVBase, TestHyundaiCanfdTorqueSteering):
|
||||
|
||||
def setUp(self):
|
||||
self.packer = CANPackerSafety("hyundai_canfd_generated")
|
||||
self.safety = libsafety_py.libsafety
|
||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEER_MSG | HyundaiSafetyFlags.EV_GAS |
|
||||
HyundaiSafetyFlags.CANFD_LKA_STEER_MSG_ALT)
|
||||
self.safety.init_tests()
|
||||
|
||||
|
||||
class TestHyundaiCanfdLKASteeringAltAngle(TestHyundaiCanfdAngleSteering):
|
||||
|
||||
TX_MSGS = [[0x110, 0], [0x1CF, 1], [0x362, 0]]
|
||||
RELAY_MALFUNCTION_ADDRS = {0: (0x110, 0x362)}
|
||||
FWD_BLACKLISTED_ADDRS = {2: [0x110, 0x362]}
|
||||
|
||||
PT_BUS = 1
|
||||
SCC_BUS = 1
|
||||
STEER_MSG = "LKAS_ALT"
|
||||
GAS_MSG = ("ACCELERATOR_BRAKE_ALT", "ACCELERATOR_PEDAL_PRESSED")
|
||||
|
||||
def setUp(self):
|
||||
self.packer = CANPackerSafety("hyundai_canfd_generated")
|
||||
self.safety = libsafety_py.libsafety
|
||||
self.safety.set_safety_hooks(CarParams.SafetyModel.hyundaiCanfd, HyundaiSafetyFlags.CANFD_LKA_STEER_MSG |
|
||||
HyundaiSafetyFlags.CANFD_LKA_STEER_MSG_ALT | HyundaiSafetyFlags.CANFD_ANGLE_STEERING)
|
||||
self.safety.init_tests()
|
||||
|
||||
# Angle steering does not use torque — override inherited torque tests
|
||||
def test_steer_safety_check(self):
|
||||
pass
|
||||
|
||||
def test_non_realtime_limit_up(self):
|
||||
pass
|
||||
|
||||
def test_steer_req_bit(self):
|
||||
pass
|
||||
|
||||
def test_steer_req_bit_frames(self):
|
||||
pass
|
||||
|
||||
def test_steer_req_bit_multi_invalid(self):
|
||||
pass
|
||||
|
||||
def test_steer_req_bit_realtime(self):
|
||||
pass
|
||||
|
||||
def test_against_torque_driver(self):
|
||||
pass
|
||||
|
||||
def test_realtime_limits(self):
|
||||
pass
|
||||
|
||||
|
||||
class TestHyundaiCanfdLKASteeringLongEV(HyundaiLongitudinalBase, TestHyundaiCanfdLKASteeringEV):
|
||||
|
||||
TX_MSGS = [[0x50, 0], [0x1CF, 1], [0x2A4, 0], [0x51, 0], [0x730, 1], [0x12a, 1], [0x160, 1],
|
||||
|
||||
Executable
+77
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env python3
|
||||
import unittest
|
||||
|
||||
from opendbc.car.structs import CarParams
|
||||
from opendbc.safety.tests.libsafety import libsafety_py
|
||||
import opendbc.safety.tests.common as common
|
||||
from opendbc.safety.tests.common import CANPackerSafety
|
||||
|
||||
|
||||
def checksum(msg):
|
||||
addr, dat, bus = msg
|
||||
ret = bytearray(dat)
|
||||
|
||||
if addr in (0x1b6, 0x242):
|
||||
crc = 0xFF
|
||||
for byte in ret[:-1]:
|
||||
crc ^= byte
|
||||
for _ in range(8):
|
||||
crc = ((crc << 1) ^ 0x1D) & 0xFF if crc & 0x80 else (crc << 1) & 0xFF
|
||||
ret[-1] = crc ^ 0xFF
|
||||
|
||||
return addr, ret, bus
|
||||
|
||||
|
||||
class TestMGSafety(common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest):
|
||||
|
||||
TX_MSGS = [[0x1fd, 0], ]
|
||||
RELAY_MALFUNCTION_ADDRS = {0: (0x1fd,)}
|
||||
FWD_BLACKLISTED_ADDRS = {2: [0x1fd,]}
|
||||
|
||||
MAX_RATE_UP = 6
|
||||
MAX_RATE_DOWN = 10
|
||||
MAX_TORQUE_LOOKUP = [0], [300]
|
||||
MAX_RT_DELTA = 125
|
||||
|
||||
DRIVER_TORQUE_ALLOWANCE = 100
|
||||
DRIVER_TORQUE_FACTOR = 2
|
||||
|
||||
def setUp(self):
|
||||
self.packer = CANPackerSafety("mg")
|
||||
self.safety = libsafety_py.libsafety
|
||||
self.safety.set_safety_hooks(CarParams.SafetyModel.mg, 0)
|
||||
self.safety.init_tests()
|
||||
self.counters = {addr: 0 for addr in (0x1b6, 0x1ec, 0x23c, 0x242)}
|
||||
|
||||
def _counter(self, addr):
|
||||
counter = self.counters[addr]
|
||||
self.counters[addr] = (counter + 1) % 16
|
||||
return counter
|
||||
|
||||
def _torque_cmd_msg(self, torque, steer_req=1):
|
||||
values = {"LKAReqToqHSC2": torque, "LKAReqToqStsHSC2": steer_req}
|
||||
return self.packer.make_can_msg_safety("FVCM_HSC2_FrP03", 0, values)
|
||||
|
||||
def _speed_msg(self, speed):
|
||||
values = {"VehSpdAvgHSC2": speed * 3.6, "VehSpdAvgAlvRCHSC2": self._counter(0x23c)}
|
||||
return self.packer.make_can_msg_safety("SCS_HSC2_FrP19", 0, values)
|
||||
|
||||
def _torque_driver_msg(self, torque):
|
||||
values = {"DrvrStrgDlvrdToqHSC2": torque * 0.01, "ChLKAAlvRCHSC2": self._counter(0x1ec)}
|
||||
return self.packer.make_can_msg_safety("EPS_HSC2_FrP03", 0, values)
|
||||
|
||||
def _user_brake_msg(self, brake):
|
||||
values = {"BrkPdlAppdHSC2": 1 if brake else 0, "BrkPdlAppdRCHSC2": self._counter(0x1b6)}
|
||||
return self.packer.make_can_msg_safety("EHBS_HSC2_FrP00", 0, values, fix_checksum=checksum)
|
||||
|
||||
def _user_gas_msg(self, gas):
|
||||
values = {"EPTAccelActuPosHSC2": 100 if gas else 0}
|
||||
return self.packer.make_can_msg_safety("GW_HSC2_HCU_FrP00", 0, values)
|
||||
|
||||
def _pcm_status_msg(self, enable):
|
||||
values = {"ACCSysSts_RadarHSC2": 2 if enable else 1, "ACCSysAlvRlngCtr_SCSHSC2": self._counter(0x242)}
|
||||
return self.packer.make_can_msg_safety("RADAR_HSC2_FrP00", 0, values, fix_checksum=checksum)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -18,16 +18,10 @@ class SubaruMsg(enum.IntEnum):
|
||||
Wheel_Speeds = 0x13a
|
||||
ES_LKAS = 0x122
|
||||
ES_LKAS_ANGLE = 0x124
|
||||
ES_Brake = 0x220
|
||||
ES_Distance = 0x221
|
||||
ES_Status = 0x222
|
||||
ES_DashStatus = 0x321
|
||||
ES_LKAS_State = 0x322
|
||||
ES_Infotainment = 0x323
|
||||
ES_UDS_Request = 0x787
|
||||
ES_HighBeamAssist = 0x22A
|
||||
ES_STATIC_1 = 0x325
|
||||
ES_STATIC_2 = 0x121
|
||||
|
||||
|
||||
SUBARU_MAIN_BUS = 0
|
||||
@@ -43,18 +37,6 @@ def lkas_tx_msgs(alt_bus, lkas_msg=SubaruMsg.ES_LKAS):
|
||||
[SubaruMsg.ES_Infotainment, SUBARU_MAIN_BUS]]
|
||||
|
||||
|
||||
def long_tx_msgs(alt_bus):
|
||||
return [[SubaruMsg.ES_Brake, alt_bus],
|
||||
[SubaruMsg.ES_Status, alt_bus]]
|
||||
|
||||
|
||||
def gen2_long_additional_tx_msgs():
|
||||
return [[SubaruMsg.ES_UDS_Request, SUBARU_CAM_BUS],
|
||||
[SubaruMsg.ES_HighBeamAssist, SUBARU_MAIN_BUS],
|
||||
[SubaruMsg.ES_STATIC_1, SUBARU_MAIN_BUS],
|
||||
[SubaruMsg.ES_STATIC_2, SUBARU_MAIN_BUS]]
|
||||
|
||||
|
||||
def fwd_blacklisted_addr(lkas_msg=SubaruMsg.ES_LKAS):
|
||||
return {SUBARU_CAM_BUS: [lkas_msg, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]}
|
||||
|
||||
@@ -134,40 +116,6 @@ class TestSubaruStockLongitudinalSafetyBase(TestSubaruSafetyBase):
|
||||
self._generic_limit_safety_check(partial(self._cancel_msg, cancel), self.INACTIVE_GAS, self.INACTIVE_GAS, 0, 2**12, 1, self.INACTIVE_GAS, cancel)
|
||||
|
||||
|
||||
class TestSubaruLongitudinalSafetyBase(TestSubaruSafetyBase, common.LongitudinalGasBrakeSafetyTest):
|
||||
MIN_GAS = 808
|
||||
MAX_GAS = 3400
|
||||
INACTIVE_GAS = 1818
|
||||
MAX_POSSIBLE_GAS = 2**13
|
||||
|
||||
MIN_BRAKE = 0
|
||||
MAX_BRAKE = 600
|
||||
MAX_POSSIBLE_BRAKE = 2**16
|
||||
|
||||
MIN_RPM = 0
|
||||
MAX_RPM = 3600
|
||||
MAX_POSSIBLE_RPM = 2**13
|
||||
|
||||
FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_Brake, SubaruMsg.ES_Distance,
|
||||
SubaruMsg.ES_Status, SubaruMsg.ES_DashStatus,
|
||||
SubaruMsg.ES_LKAS_State, SubaruMsg.ES_Infotainment]}
|
||||
|
||||
def test_rpm_safety_check(self):
|
||||
self._generic_limit_safety_check(self._send_rpm_msg, self.MIN_RPM, self.MAX_RPM, 0, self.MAX_POSSIBLE_RPM, 1)
|
||||
|
||||
def _send_brake_msg(self, brake):
|
||||
values = {"Brake_Pressure": brake}
|
||||
return self.packer.make_can_msg_safety("ES_Brake", self.ALT_MAIN_BUS, values)
|
||||
|
||||
def _send_gas_msg(self, gas):
|
||||
values = {"Cruise_Throttle": gas}
|
||||
return self.packer.make_can_msg_safety("ES_Distance", self.ALT_MAIN_BUS, values)
|
||||
|
||||
def _send_rpm_msg(self, rpm):
|
||||
values = {"Cruise_RPM": rpm}
|
||||
return self.packer.make_can_msg_safety("ES_Status", self.ALT_MAIN_BUS, values)
|
||||
|
||||
|
||||
class TestSubaruTorqueSafetyBase(TestSubaruSafetyBase, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
|
||||
MAX_RATE_UP = 50
|
||||
MAX_RATE_DOWN = 70
|
||||
@@ -202,51 +150,5 @@ class TestSubaruGen2TorqueStockLongitudinalSafety(TestSubaruStockLongitudinalSaf
|
||||
TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS)
|
||||
|
||||
|
||||
class TestSubaruGen1LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruTorqueSafetyBase):
|
||||
FLAGS = SubaruSafetyFlags.LONG
|
||||
TX_MSGS = lkas_tx_msgs(SUBARU_MAIN_BUS) + long_tx_msgs(SUBARU_MAIN_BUS)
|
||||
RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
|
||||
SubaruMsg.ES_Infotainment, SubaruMsg.ES_Brake, SubaruMsg.ES_Status,
|
||||
SubaruMsg.ES_Distance)}
|
||||
|
||||
|
||||
class TestSubaruGen2LongitudinalSafety(TestSubaruLongitudinalSafetyBase, TestSubaruGen2TorqueSafetyBase):
|
||||
FLAGS = SubaruSafetyFlags.LONG | SubaruSafetyFlags.GEN2
|
||||
TX_MSGS = lkas_tx_msgs(SUBARU_ALT_BUS) + long_tx_msgs(SUBARU_ALT_BUS) + gen2_long_additional_tx_msgs()
|
||||
FWD_BLACKLISTED_ADDRS = {2: [SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
|
||||
SubaruMsg.ES_Infotainment]}
|
||||
RELAY_MALFUNCTION_ADDRS = {SUBARU_MAIN_BUS: (SubaruMsg.ES_LKAS, SubaruMsg.ES_DashStatus, SubaruMsg.ES_LKAS_State,
|
||||
SubaruMsg.ES_Infotainment),
|
||||
SUBARU_ALT_BUS: (SubaruMsg.ES_Brake, SubaruMsg.ES_Status, SubaruMsg.ES_Distance)}
|
||||
|
||||
def _rdbi_msg(self, did: int):
|
||||
return b'\x03\x22' + did.to_bytes(2) + b'\x00\x00\x00\x00'
|
||||
|
||||
def _es_uds_msg(self, msg: bytes):
|
||||
return libsafety_py.make_CANPacket(SubaruMsg.ES_UDS_Request, 2, msg)
|
||||
|
||||
def test_es_uds_message(self):
|
||||
tester_present = b'\x02\x3E\x80\x00\x00\x00\x00\x00'
|
||||
not_tester_present = b"\x03\xAA\xAA\x00\x00\x00\x00\x00"
|
||||
|
||||
button_did = 0x1130
|
||||
|
||||
# Tester present is allowed for gen2 long to keep eyesight disabled
|
||||
self.assertTrue(self._tx(self._es_uds_msg(tester_present)))
|
||||
|
||||
# Non-Tester present is not allowed
|
||||
self.assertFalse(self._tx(self._es_uds_msg(not_tester_present)))
|
||||
|
||||
# Only button_did is allowed to be read via UDS
|
||||
for did in range(0xFFFF):
|
||||
should_tx = (did == button_did)
|
||||
self.assertEqual(self._tx(self._es_uds_msg(self._rdbi_msg(did))), should_tx)
|
||||
|
||||
# any other msg is not allowed
|
||||
for sid in range(0xFF):
|
||||
msg = b'\x03' + sid.to_bytes(1) + b'\x00' * 6
|
||||
self.assertFalse(self._tx(self._es_uds_msg(msg)))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
@@ -101,6 +101,29 @@ class TestToyotaSafetyBase(common.CarSafetyTest, common.LongitudinalAccelSafetyT
|
||||
tester_present = libsafety_py.make_CANPacket(0x750, 0, msg)
|
||||
self.assertEqual(should_tx and ecu_disabled and not stock_longitudinal, self._tx(tester_present))
|
||||
|
||||
def test_enhanced_bsm(self):
|
||||
# SP: enable/disable/poll left+right blind spot debug mode, sent to the radar diagnostic address
|
||||
valid_msgs = [
|
||||
b"\x41\x02\x10\x60\x00\x00\x00\x00", # enable left
|
||||
b"\x41\x02\x10\x01\x00\x00\x00\x00", # disable left
|
||||
b"\x41\x02\x21\x69\x00\x00\x00\x00", # poll left
|
||||
b"\x42\x02\x10\x60\x00\x00\x00\x00", # enable right
|
||||
b"\x42\x02\x10\x01\x00\x00\x00\x00", # disable right
|
||||
b"\x42\x02\x21\x69\x00\x00\x00\x00", # poll right
|
||||
]
|
||||
for msg in valid_msgs:
|
||||
pkt = libsafety_py.make_CANPacket(0x750, 0, msg)
|
||||
self.assertTrue(self._tx(pkt), msg.hex())
|
||||
|
||||
invalid_msgs = [
|
||||
b"\x41\x02\x10\x61\x00\x00\x00\x00", # wrong subfunction
|
||||
b"\x43\x02\x10\x60\x00\x00\x00\x00", # wrong sub-address (not left/right)
|
||||
b"\x41\x02\x10\x60\x01\x00\x00\x00", # non-zero trailing bytes
|
||||
]
|
||||
for msg in invalid_msgs:
|
||||
pkt = libsafety_py.make_CANPacket(0x750, 0, msg)
|
||||
self.assertFalse(self._tx(pkt), msg.hex())
|
||||
|
||||
def test_block_aeb(self, stock_longitudinal: bool = False):
|
||||
for controls_allowed in (True, False):
|
||||
for bad in (True, False):
|
||||
|
||||
@@ -941,16 +941,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Genesis GV70 Electrified 2026": {
|
||||
"platform": "GENESIS_GV70_ELECTRIFIED_2ND_GEN",
|
||||
"make": "Genesis",
|
||||
"brand": "hyundai",
|
||||
"model": "GV70 Electrified",
|
||||
"year": [
|
||||
"2026"
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Genesis GV70 Electrified (Australia Only) 2022": {
|
||||
"platform": "GENESIS_GV70_ELECTRIFIED_1ST_GEN",
|
||||
"make": "Genesis",
|
||||
@@ -982,26 +972,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Genesis GV80 (3.5T Prestige Trim, with HDA II & LFA2) 2025": {
|
||||
"platform": "GENESIS_GV80_2025",
|
||||
"make": "Genesis",
|
||||
"brand": "hyundai",
|
||||
"model": "GV80 (3.5T Prestige Trim, with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2025"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"Genesis GV80 Coupe (with HDA II & LFA2) 2025": {
|
||||
"platform": "GENESIS_GV80_2025",
|
||||
"make": "Genesis",
|
||||
"brand": "hyundai",
|
||||
"model": "GV80 Coupe (with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2025"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"GMC Acadia 2018": {
|
||||
"platform": "GMC_ACADIA",
|
||||
"make": "GMC",
|
||||
@@ -1513,16 +1483,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Hyundai AZERA Hybrid (with HDA II & LFA2) 2025": {
|
||||
"platform": "HYUNDAI_AZERA_HEV_7TH_GEN",
|
||||
"make": "Hyundai",
|
||||
"brand": "hyundai",
|
||||
"model": "AZERA Hybrid (with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2025"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"Hyundai Custin 2023": {
|
||||
"platform": "HYUNDAI_CUSTIN_1ST_GEN",
|
||||
"make": "Hyundai",
|
||||
@@ -1660,17 +1620,6 @@
|
||||
],
|
||||
"package": "Highway Driving Assist"
|
||||
},
|
||||
"Hyundai Ioniq 5 PE (with HDA II & LFA2) 2025-26": {
|
||||
"platform": "HYUNDAI_IONIQ_5_PE",
|
||||
"make": "Hyundai",
|
||||
"brand": "hyundai",
|
||||
"model": "Ioniq 5 PE (with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2025",
|
||||
"2026"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"Hyundai Ioniq 6 (with HDA II) 2023-24": {
|
||||
"platform": "HYUNDAI_IONIQ_6",
|
||||
"make": "Hyundai",
|
||||
@@ -1693,17 +1642,6 @@
|
||||
],
|
||||
"package": "Highway Driving Assist"
|
||||
},
|
||||
"Hyundai Ioniq 9 (with HDA II & LFA2) 2025-26": {
|
||||
"platform": "HYUNDAI_IONIQ_9",
|
||||
"make": "Hyundai",
|
||||
"brand": "hyundai",
|
||||
"model": "Ioniq 9 (with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2025",
|
||||
"2026"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"Hyundai Ioniq Electric 2019": {
|
||||
"platform": "HYUNDAI_IONIQ_EV_LTD",
|
||||
"make": "Hyundai",
|
||||
@@ -1923,17 +1861,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Hyundai Santa Fe Hybrid (with HDA II & LFA2) 2024-25": {
|
||||
"platform": "HYUNDAI_SANTA_FE_HEV_5TH_GEN",
|
||||
"make": "Hyundai",
|
||||
"brand": "hyundai",
|
||||
"model": "Santa Fe Hybrid (with HDA II & LFA2)",
|
||||
"year": [
|
||||
"2024",
|
||||
"2025"
|
||||
],
|
||||
"package": "Highway Driving Assist II & Lane Follow Assist 2"
|
||||
},
|
||||
"Hyundai Santa Fe Plug-in Hybrid 2022-23": {
|
||||
"platform": "HYUNDAI_SANTA_FE_PHEV_2022",
|
||||
"make": "Hyundai",
|
||||
@@ -2146,16 +2073,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Kia EV6 (with HDA I) 2025": {
|
||||
"platform": "KIA_EV6_2025",
|
||||
"make": "Kia",
|
||||
"brand": "hyundai",
|
||||
"model": "EV6 (with HDA I)",
|
||||
"year": [
|
||||
"2025"
|
||||
],
|
||||
"package": "Highway Driving Assist I"
|
||||
},
|
||||
"Kia EV6 (with HDA II) 2022-24": {
|
||||
"platform": "KIA_EV6",
|
||||
"make": "Kia",
|
||||
@@ -2180,17 +2097,6 @@
|
||||
],
|
||||
"package": "Highway Driving Assist"
|
||||
},
|
||||
"Kia EV9 2025-26": {
|
||||
"platform": "KIA_EV9",
|
||||
"make": "Kia",
|
||||
"brand": "hyundai",
|
||||
"model": "EV9",
|
||||
"year": [
|
||||
"2025",
|
||||
"2026"
|
||||
],
|
||||
"package": "Smart Cruise Control (SCC)"
|
||||
},
|
||||
"Kia Forte 2019-21": {
|
||||
"platform": "KIA_FORTE",
|
||||
"make": "Kia",
|
||||
@@ -2499,16 +2405,6 @@
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Kia Sorento Hybrid 2026": {
|
||||
"platform": "KIA_SORENTO_HEV_4TH_GEN_LFA2",
|
||||
"make": "Kia",
|
||||
"brand": "hyundai",
|
||||
"model": "Sorento Hybrid",
|
||||
"year": [
|
||||
"2026"
|
||||
],
|
||||
"package": "All"
|
||||
},
|
||||
"Kia Sorento Plug-in Hybrid 2022-23": {
|
||||
"platform": "KIA_SORENTO_HEV_4TH_GEN",
|
||||
"make": "Kia",
|
||||
@@ -2541,16 +2437,6 @@
|
||||
],
|
||||
"package": "Smart Cruise Control (SCC)"
|
||||
},
|
||||
"Kia Sportage Hybrid 2026": {
|
||||
"platform": "KIA_SPORTAGE_HEV_2026",
|
||||
"make": "Kia",
|
||||
"brand": "hyundai",
|
||||
"model": "Sportage Hybrid",
|
||||
"year": [
|
||||
"2026"
|
||||
],
|
||||
"package": "Smart Cruise Control (SCC)"
|
||||
},
|
||||
"Kia Stinger 2018-20": {
|
||||
"platform": "KIA_STINGER",
|
||||
"make": "Kia",
|
||||
|
||||
@@ -14,7 +14,7 @@ from opendbc.car import structs
|
||||
from opendbc.car.can_definitions import CanRecvCallable, CanSendCallable
|
||||
from opendbc.car.hyundai.values import HyundaiFlags
|
||||
from opendbc.car.subaru.values import SubaruFlags
|
||||
from opendbc.car.toyota.values import ToyotaSafetyFlags
|
||||
from opendbc.car.toyota.values import RADAR_ACC_CAR, SECOC_CAR, TSS2_CAR, ToyotaSafetyFlags
|
||||
from opendbc.sunnypilot.car.hyundai.enable_radar_tracks import enable_radar_tracks as hyundai_enable_radar_tracks
|
||||
from opendbc.sunnypilot.car.hyundai.longitudinal.helpers import LongitudinalTuningType
|
||||
from opendbc.sunnypilot.car.hyundai.values import HyundaiFlagsSP
|
||||
@@ -157,6 +157,9 @@ def _initialize_toyota(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params
|
||||
if CP.brand == 'toyota':
|
||||
toyota_stock_long = int(params_dict.get("ToyotaEnforceStockLongitudinal", 0)) == 1
|
||||
toyota_stop_and_go_hack = int(params_dict.get("ToyotaStopAndGoHack", 0)) == 1
|
||||
toyota_tss2_long_tuning = int(params_dict.get("ToyotaTSS2Long", 0)) == 1
|
||||
toyota_enhanced_bsm = int(params_dict.get("ToyotaEnhancedBsm", 0)) == 1
|
||||
toyota_auto_brake_hold = int(params_dict.get("ToyotaAutoHold", 0)) == 1
|
||||
|
||||
if toyota_stock_long:
|
||||
CP_SP.flags |= ToyotaFlagsSP.STOCK_LONGITUDINAL.value
|
||||
@@ -166,3 +169,12 @@ def _initialize_toyota(CP: structs.CarParams, CP_SP: structs.CarParamsSP, params
|
||||
|
||||
if toyota_stop_and_go_hack and CP.openpilotLongitudinalControl:
|
||||
CP_SP.flags |= ToyotaFlagsSP.STOP_AND_GO_HACK.value
|
||||
|
||||
if toyota_tss2_long_tuning:
|
||||
CP_SP.flags |= ToyotaFlagsSP.TSS2_LONG_TUNING.value
|
||||
|
||||
if toyota_enhanced_bsm and CP.carFingerprint in (TSS2_CAR - SECOC_CAR):
|
||||
CP_SP.flags |= ToyotaFlagsSP.SP_ENHANCED_BSM.value
|
||||
|
||||
if toyota_auto_brake_hold and CP.carFingerprint in (TSS2_CAR - RADAR_ACC_CAR - SECOC_CAR):
|
||||
CP_SP.flags |= ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD.value
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
"""
|
||||
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
|
||||
|
||||
This file is part of sunnypilot and is licensed under the MIT License.
|
||||
See the LICENSE.md file in the root directory for more details.
|
||||
"""
|
||||
|
||||
from opendbc.car import structs
|
||||
from opendbc.car.toyota import toyotacan
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP
|
||||
|
||||
GearShifter = structs.CarState.GearShifter
|
||||
|
||||
# frames of confirmed hold-eligible standstill required before engaging
|
||||
BRAKE_HOLD_ALLOWED_TIMER = 100
|
||||
|
||||
DISALLOWED_GEARS = (GearShifter.park, GearShifter.reverse)
|
||||
|
||||
# PRE_COLLISION_2 fields that go high when the camera's own PCS/AEB is genuinely intervening this
|
||||
# frame (PCSALM mirrors PRECOLLISION_ACTIVE; IBTRGR/PBATRGR/PREFILL/AVSTRGR/PBRTRGR/PPTRGR are its
|
||||
# actuation triggers - see create_pcs_commands for the same field set on the stock-DSU PCS path).
|
||||
# Deliberately over-inclusive: a false positive here just means we pass a quiescent frame through
|
||||
# instead of holding it, never the other way around, so err toward checking more fields, not fewer.
|
||||
PCS_TRIGGER_FIELDS = ("PCSALM", "IBTRGR", "PBATRGR", "PREFILL", "AVSTRGR", "PBRTRGR", "PPTRGR")
|
||||
|
||||
|
||||
def pcs_is_active(pre_collision_2: dict) -> bool:
|
||||
return any(pre_collision_2.get(field, 0) for field in PCS_TRIGGER_FIELDS) or pre_collision_2.get("DSS1GDRV", 0) != 0
|
||||
|
||||
|
||||
class AutoBrakeHold:
|
||||
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
|
||||
self.CP = CP
|
||||
self.CP_SP = CP_SP
|
||||
|
||||
@property
|
||||
def enabled(self):
|
||||
return bool(self.CP_SP.flags & ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD)
|
||||
|
||||
|
||||
# Auto Brake Hold (@AlexandreSato, @rav4kumar): holds the car at a stop with cruise off by
|
||||
# overriding PRE_COLLISION_2 - the only channel on this platform that can command the brake
|
||||
# independent of ACC engagement, since PCS/AEB is an always-on active safety system by design.
|
||||
# Yields to any genuine PCS activation this frame - the real message is only ever overridden while
|
||||
# it's quiescent - and releases for the rest of the current standstill episode on a brake press,
|
||||
# rather than for a single frame.
|
||||
class AutoBrakeHoldCarController(AutoBrakeHold):
|
||||
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
|
||||
super().__init__(CP, CP_SP)
|
||||
|
||||
self.active = False
|
||||
self._counter = 0
|
||||
self._released = False
|
||||
self._prev_brake_pressed = False
|
||||
|
||||
def update(self, CS: structs.CarState, frame: int, packer) -> list:
|
||||
relay_blocked = (CS.out.standstill and CS.out.cruiseState.available and not CS.out.cruiseState.enabled and
|
||||
not CS.out.gasPressed)
|
||||
hold_allowed = relay_blocked and CS.out.gearShifter not in DISALLOWED_GEARS
|
||||
|
||||
if hold_allowed:
|
||||
# only a fresh press releases hold - the press that caused the stop is already reflected in
|
||||
# _prev_brake_pressed by the time standstill is reached, so it doesn't count as a release
|
||||
if CS.out.brakePressed and not self._prev_brake_pressed:
|
||||
self._released = True
|
||||
self._counter += 1
|
||||
self.active = self._counter > BRAKE_HOLD_ALLOWED_TIMER and not self._released
|
||||
else:
|
||||
self._counter = 0
|
||||
self.active = False
|
||||
self._released = False
|
||||
|
||||
self._prev_brake_pressed = CS.out.brakePressed
|
||||
|
||||
can_sends = []
|
||||
if relay_blocked and frame % 2 == 0:
|
||||
override = self.active and not pcs_is_active(CS.pre_collision_2)
|
||||
can_sends.append(toyotacan.create_brake_hold_command(packer, frame, CS.pre_collision_2, override))
|
||||
|
||||
return can_sends
|
||||
@@ -0,0 +1,126 @@
|
||||
"""
|
||||
Copyright (c) 2021-, Haibin Wen, sunnypilot, and a number of other contributors.
|
||||
|
||||
This file is part of sunnypilot and is licensed under the MIT License.
|
||||
See the LICENSE.md file in the root directory for more details.
|
||||
"""
|
||||
|
||||
from opendbc.car import structs
|
||||
from opendbc.car.can_definitions import CanData
|
||||
from opendbc.car.toyota import toyotacan
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP
|
||||
|
||||
LEFT_BLINDSPOT = b"\x41"
|
||||
RIGHT_BLINDSPOT = b"\x42"
|
||||
LEFT_SIDE = LEFT_BLINDSPOT[0]
|
||||
RIGHT_SIDE = RIGHT_BLINDSPOT[0]
|
||||
|
||||
# BLINDSPOTD1/D2 aren't real distances despite the DBC name: verified against 3 real routes, values
|
||||
# fall into 3 clean bands - idle (0), a small transitional-noise band (seen 1-31, rare: single-digit
|
||||
# occurrence counts, present during side/state transitions), and two real zone codes (~46-47 and
|
||||
# ~50-53, consistent across routes and cars - likely mirroring stock BSM's own ADJACENT/APPROACHING
|
||||
# split). A plain nonzero check lets the noise band through as false "occupied" hits; gate on the
|
||||
# real-zone floor instead - comfortably above every noise value seen, comfortably below neither zone code.
|
||||
BLINDSPOT_NOISE_FLOOR = 35
|
||||
|
||||
# DEBUG also carries a 1-bit BLINDSPOT flag (byte 4) that isn't read here. Checked against the same
|
||||
# route: stayed 0 across all frames, including every confirmed real detection - not a usable signal.
|
||||
|
||||
|
||||
class EnhancedBsm:
|
||||
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
|
||||
self.CP = CP
|
||||
self.CP_SP = CP_SP
|
||||
|
||||
@property
|
||||
def enabled(self):
|
||||
return bool(self.CP_SP.flags & ToyotaFlagsSP.SP_ENHANCED_BSM)
|
||||
|
||||
|
||||
class _BsmSideState:
|
||||
def __init__(self):
|
||||
self.blindspot = False
|
||||
self.counter = 0
|
||||
|
||||
def update(self, distance_1, distance_2):
|
||||
# every fresh matching-side reading directly reflects the current occupancy check - this is not
|
||||
# a latch. A drop to an idle/noise reading on this exact side clears it immediately, same as the
|
||||
# original. The counter is purely a silence timeout for when this side stops responding entirely,
|
||||
# not a "hold the last detection for a while" mechanism.
|
||||
self.blindspot = distance_1 > BLINDSPOT_NOISE_FLOOR or distance_2 > BLINDSPOT_NOISE_FLOOR
|
||||
self.counter = 100
|
||||
|
||||
def decay(self):
|
||||
self.counter = max(0, self.counter - 1)
|
||||
if self.counter == 0:
|
||||
self.blindspot = False
|
||||
|
||||
|
||||
# Enhanced BSM (@arne182, @rav4kumar)
|
||||
class EnhancedBsmCarState(EnhancedBsm):
|
||||
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
|
||||
super().__init__(CP, CP_SP)
|
||||
|
||||
self._sides = {LEFT_SIDE: _BsmSideState(), RIGHT_SIDE: _BsmSideState()}
|
||||
|
||||
def update(self, cp, frame: int) -> tuple[bool, bool]:
|
||||
# Let's keep all the commented out code for easy debug purposes in the future.
|
||||
distance_1 = cp.vl["DEBUG"].get('BLINDSPOTD1')
|
||||
distance_2 = cp.vl["DEBUG"].get('BLINDSPOTD2')
|
||||
side = cp.vl["DEBUG"].get('BLINDSPOTSIDE')
|
||||
|
||||
if all(val is not None for val in [distance_1, distance_2, side]) and side in self._sides:
|
||||
self._sides[side].update(distance_1, distance_2)
|
||||
|
||||
for side_state in self._sides.values():
|
||||
side_state.decay()
|
||||
|
||||
return self._sides[LEFT_SIDE].blindspot, self._sides[RIGHT_SIDE].blindspot
|
||||
|
||||
|
||||
class _BsmSideController:
|
||||
def __init__(self, addr_byte: bytes):
|
||||
self.addr_byte = addr_byte
|
||||
self.debug_enabled = False
|
||||
self.last_poll_frame = 0
|
||||
|
||||
def update(self, frame: int, poll_phase: int, e_bsm_rate: int, always_on: bool, vego_ok: bool) -> list[CanData]:
|
||||
can_sends = []
|
||||
|
||||
if not self.debug_enabled:
|
||||
if always_on or vego_ok: # eagle eye camera will stop working if bsm is switched on under 6m/s
|
||||
can_sends.append(toyotacan.create_set_bsm_debug_mode(self.addr_byte, True))
|
||||
self.debug_enabled = True
|
||||
self.last_poll_frame = frame # give the poll loop a fresh baseline so the stale-poll disable check below can't fire before the first real poll
|
||||
else:
|
||||
# no periodic re-assert: re-sending DiagnosticSessionControl(extendedSession) while already in that
|
||||
# session appears to make the ECU intermittently drop its own detection state (confirmed against a
|
||||
# real route - two reasserts landed inside an 8s window where the ECU went silent on that side).
|
||||
# send it once and leave it alone, matching the original, proven-stable behavior.
|
||||
if not always_on and frame - self.last_poll_frame > 50:
|
||||
can_sends.append(toyotacan.create_set_bsm_debug_mode(self.addr_byte, False))
|
||||
self.debug_enabled = False
|
||||
|
||||
if frame % e_bsm_rate == poll_phase:
|
||||
can_sends.append(toyotacan.create_bsm_polling_status(self.addr_byte))
|
||||
self.last_poll_frame = frame
|
||||
|
||||
return can_sends
|
||||
|
||||
|
||||
# Enhanced BSM (@arne182, @rav4kumar)
|
||||
class EnhancedBsmCarController(EnhancedBsm):
|
||||
def __init__(self, CP: structs.CarParams, CP_SP: structs.CarParamsSP):
|
||||
super().__init__(CP, CP_SP)
|
||||
|
||||
self._left = _BsmSideController(LEFT_BLINDSPOT)
|
||||
self._right = _BsmSideController(RIGHT_BLINDSPOT)
|
||||
|
||||
def update(self, CS: structs.CarState, frame: int, e_bsm_rate: int = 20, always_on: bool = True) -> list[CanData]:
|
||||
if frame <= 200:
|
||||
return []
|
||||
|
||||
vego_ok = CS.out.vEgo > 6
|
||||
can_sends = self._left.update(frame, 0, e_bsm_rate, always_on, vego_ok)
|
||||
can_sends += self._right.update(frame, e_bsm_rate // 2, e_bsm_rate, always_on, vego_ok)
|
||||
return can_sends
|
||||
@@ -0,0 +1,231 @@
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from opendbc.car import structs
|
||||
from opendbc.sunnypilot.car.toyota.auto_brake_hold import AutoBrakeHoldCarController, BRAKE_HOLD_ALLOWED_TIMER, pcs_is_active
|
||||
from opendbc.sunnypilot.car.toyota.values import ToyotaFlagsSP
|
||||
|
||||
GearShifter = structs.CarState.GearShifter
|
||||
|
||||
|
||||
def make_car_params_sp(enabled: bool = True) -> structs.CarParamsSP:
|
||||
cp_sp = structs.CarParamsSP()
|
||||
cp_sp.flags = ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD if enabled else 0
|
||||
return cp_sp
|
||||
|
||||
|
||||
class FakeCarState:
|
||||
def __init__(self, standstill=True, cruise_enabled=False, cruise_available=True, gas_pressed=False,
|
||||
gear=GearShifter.drive, brake_pressed=False, pre_collision_2=None):
|
||||
self.out = structs.CarState()
|
||||
self.out.standstill = standstill
|
||||
self.out.cruiseState.enabled = cruise_enabled
|
||||
self.out.cruiseState.available = cruise_available
|
||||
self.out.gasPressed = gas_pressed
|
||||
self.out.gearShifter = gear
|
||||
self.out.brakePressed = brake_pressed
|
||||
self.pre_collision_2 = pre_collision_2 if pre_collision_2 is not None else {}
|
||||
|
||||
|
||||
@patch("opendbc.sunnypilot.car.toyota.auto_brake_hold.toyotacan.create_brake_hold_command")
|
||||
class TestAutoBrakeHoldCarController(unittest.TestCase):
|
||||
def _make(self):
|
||||
return AutoBrakeHoldCarController(structs.CarParams(), make_car_params_sp())
|
||||
|
||||
def test_enabled_reflects_flag(self, mock_create):
|
||||
for value in range(256):
|
||||
with self.subTest(flags=value):
|
||||
cp_sp = structs.CarParamsSP()
|
||||
cp_sp.flags = value
|
||||
ctrl = AutoBrakeHoldCarController(structs.CarParams(), cp_sp)
|
||||
self.assertEqual(ctrl.enabled, bool(value & ToyotaFlagsSP.SP_AUTO_BRAKE_HOLD))
|
||||
|
||||
def test_does_not_engage_before_timer(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active)
|
||||
|
||||
def test_engages_after_timer_once_brake_released(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertTrue(ctrl.active)
|
||||
|
||||
def test_brake_still_down_from_the_stop_does_not_block_engagement(self, mock_create):
|
||||
# the driver's foot is normally still on the brake on the very frame standstill is reached -
|
||||
# that must not count as a "fresh press" release, or the feature could never engage
|
||||
ctrl = self._make()
|
||||
# decelerating into the stop with the brake held continuously
|
||||
cs = FakeCarState(standstill=False, brake_pressed=True)
|
||||
for i in range(30):
|
||||
ctrl.update(cs, i, None)
|
||||
# reaches standstill, foot stays down for a while, then lifts
|
||||
cs.out.standstill = True
|
||||
for i in range(30, 50):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active, "must not engage while the original stopping press is still held")
|
||||
cs.out.brakePressed = False
|
||||
for i in range(50, 50 + BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertTrue(ctrl.active, "should engage once the stopping press is released and the timer elapses")
|
||||
|
||||
def test_fresh_brake_press_mid_hold_releases_and_stays_released(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
frame = 0
|
||||
for _ in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertTrue(ctrl.active)
|
||||
|
||||
cs.out.brakePressed = True
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertFalse(ctrl.active, "a fresh press should release immediately")
|
||||
|
||||
for _ in range(20):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertFalse(ctrl.active, "must stay released for the rest of the episode while continuously held")
|
||||
|
||||
cs.out.brakePressed = False
|
||||
for _ in range(20):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertFalse(ctrl.active, "must stay released for the rest of the episode even after lifting off again")
|
||||
|
||||
def test_drive_off_and_restop_rearms(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
frame = 0
|
||||
for _ in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
cs.out.brakePressed = True
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertFalse(ctrl.active)
|
||||
|
||||
# drives off - leaves the standstill episode entirely
|
||||
cs.out.standstill = False
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
|
||||
# stops again
|
||||
cs.out.standstill = True
|
||||
cs.out.brakePressed = False
|
||||
for _ in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertTrue(ctrl.active, "should re-arm and engage again at the next stop")
|
||||
|
||||
def test_cruise_engaged_blocks_hold(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(cruise_enabled=True, brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active, "must not hold while ACC is engaged - that's the point of the constraint")
|
||||
|
||||
def test_gas_pressed_blocks_hold(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(gas_pressed=True, brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active)
|
||||
|
||||
def test_park_and_reverse_block_hold(self, mock_create):
|
||||
for gear in (GearShifter.park, GearShifter.reverse):
|
||||
with self.subTest(gear=gear):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(gear=gear, brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active)
|
||||
|
||||
def test_yields_to_live_pcs_without_dropping_active_state(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
frame = 0
|
||||
for _ in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, frame, None)
|
||||
frame += 1
|
||||
self.assertTrue(ctrl.active)
|
||||
mock_create.reset_mock()
|
||||
|
||||
# a real PCS event shows up on the live signal
|
||||
cs.pre_collision_2 = {"PCSALM": 1}
|
||||
# advance to the next even frame the message is actually built on
|
||||
while frame % 2 != 0:
|
||||
frame += 1
|
||||
ctrl.update(cs, frame, None)
|
||||
override_arg = mock_create.call_args.args[-1]
|
||||
self.assertTrue(ctrl.active, "internal hold state should not be cleared by a live PCS event")
|
||||
self.assertFalse(override_arg, "must not override PRE_COLLISION_2 while PCS is genuinely active")
|
||||
|
||||
# once PCS goes quiet again, override resumes on our own signal, not stale PCS state
|
||||
frame += 2
|
||||
cs.pre_collision_2 = {}
|
||||
ctrl.update(cs, frame, None)
|
||||
override_arg = mock_create.call_args.args[-1]
|
||||
self.assertTrue(override_arg)
|
||||
|
||||
def test_message_only_built_every_other_frame(self, mock_create):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False)
|
||||
for i in range(10):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertEqual(mock_create.call_count, 5)
|
||||
|
||||
def test_no_message_sent_outside_relay_blocked_window(self, mock_create):
|
||||
# outside relay_blocked, toyota_fwd_hook lets the real PRE_COLLISION_2 relay through on its own -
|
||||
# our passthrough copy would just be redundant traffic panda rejects, so it must not be sent at all
|
||||
cases = [
|
||||
dict(cruise_enabled=True),
|
||||
dict(gas_pressed=True),
|
||||
dict(cruise_available=False),
|
||||
]
|
||||
for kwargs in cases:
|
||||
with self.subTest(kwargs=kwargs):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(brake_pressed=False, **kwargs)
|
||||
for i in range(10):
|
||||
ctrl.update(cs, i, None)
|
||||
mock_create.assert_not_called()
|
||||
|
||||
def test_message_still_sent_in_park_or_reverse(self, mock_create):
|
||||
# relay_blocked has no gear check, matching toyota_fwd_hook - park/reverse must not open a gap
|
||||
# in the PRE_COLLISION_2 relay even though hold can never engage there (this was a real
|
||||
# regression: gating the send on hold_allowed's gear check left bus 0 with nothing at this
|
||||
# address while parked, which is what tripped a genuine PCS dash fault on-road)
|
||||
for gear in (GearShifter.park, GearShifter.reverse):
|
||||
with self.subTest(gear=gear):
|
||||
ctrl = self._make()
|
||||
cs = FakeCarState(gear=gear, brake_pressed=False)
|
||||
for i in range(BRAKE_HOLD_ALLOWED_TIMER + 1):
|
||||
ctrl.update(cs, i, None)
|
||||
self.assertFalse(ctrl.active, "must never actually hold in park/reverse")
|
||||
self.assertGreater(mock_create.call_count, 0, "must still relay PRE_COLLISION_2 in park/reverse")
|
||||
override_arg = mock_create.call_args.args[-1]
|
||||
self.assertFalse(override_arg, "never override while gear disallows an actual hold")
|
||||
|
||||
|
||||
class TestPcsIsActive(unittest.TestCase):
|
||||
def test_all_zero_is_not_active(self):
|
||||
self.assertFalse(pcs_is_active({}))
|
||||
self.assertFalse(pcs_is_active({"PCSALM": 0, "DSS1GDRV": 0}))
|
||||
|
||||
def test_any_trigger_field_is_active(self):
|
||||
for field in ("PCSALM", "IBTRGR", "PBATRGR", "PREFILL", "AVSTRGR", "PBRTRGR", "PPTRGR"):
|
||||
with self.subTest(field=field):
|
||||
self.assertTrue(pcs_is_active({field: 1}))
|
||||
|
||||
def test_nonzero_force_signal_is_active(self):
|
||||
self.assertTrue(pcs_is_active({"DSS1GDRV": -5}))
|
||||
self.assertFalse(pcs_is_active({"DSS1GDRV": 0}))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user