Compare commits

..

1 Commits

Author SHA1 Message Date
github-actions[bot] 93659e93b0 sunnypilot v2026.08.15-4649
version: sunnypilot v2026.003.000 (feature-branch)
date: 2026-08-15T06:15:22
master commit: d48cfa730b
2026-08-15 06:15:22 +00:00
767 changed files with 37848 additions and 83565 deletions
-11
View File
@@ -1,11 +0,0 @@
* @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
-47
View File
@@ -1,47 +0,0 @@
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
-14
View File
@@ -1,14 +0,0 @@
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
-42
View File
@@ -1,42 +0,0 @@
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
-31
View File
@@ -1,31 +0,0 @@
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/**}"
-43
View File
@@ -1,43 +0,0 @@
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
+11 -14
View File
@@ -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.
# 345 Supported Cars
# 342 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>&nbsp;|Video|Setup Video|
|---|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
@@ -34,7 +34,6 @@ 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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>|||
@@ -83,7 +82,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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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-26|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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 2022-24|All|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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 Hatchback 2017-18|Honda Sensing|openpilot available[<sup>1,5</sup>](#footnotes)|0 mph|12 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>||
@@ -159,7 +158,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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>|||
|Jeep|Grand Cherokee 2019-21|Adaptive Cruise Control (ACC)|Stock|0 mph|39 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 FCA connector<br>- 1 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>||
|Kia|Carnival 2022-24|Smart Cruise Control (SCC)|openpilot available[<sup>1</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<details><summary>Parts</summary><sub>- 1 Hyundai A connector<br>- 1 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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>|||
@@ -243,20 +242,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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|Stock|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-empty.svg)](##)|<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)|Stock|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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)|openpilot available[<sup>1,8</sup>](#footnotes)|0 mph|0 mph|[![star](assets/icon-star-empty.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>|||
@@ -335,8 +334,6 @@ 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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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|[![star](assets/icon-star-full.svg)](##)|[![star](assets/icon-star-full.svg)](##)|<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>|||
Symlink
+1
View File
@@ -0,0 +1 @@
msgq_repo/msgq
+76
View File
@@ -0,0 +1,76 @@
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.
+17
View File
@@ -0,0 +1,17 @@
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
@@ -0,0 +1 @@
+11
View File
@@ -0,0 +1,11 @@
[dev]
setuptools
Cython
scons
ruff
cppcheck
cpplint
codespell
ty
lefthook
+1
View File
@@ -0,0 +1 @@
msgq
+192 -345
View File
@@ -1,9 +1,12 @@
/* Generated by Cython 3.2.9 */
/* Generated by Cython 3.2.4 */
/* BEGIN: Cython Metadata
{
"distutils": {
"depends": [],
"depends": [
"msgq/impl_fake.h",
"msgq/ipc.h"
],
"language": "c++",
"name": "msgq.ipc_pyx",
"sources": [
@@ -36,8 +39,8 @@ END: Cython Metadata */
#elif PY_VERSION_HEX < 0x03080000
#error Cython requires Python 3.8+.
#else
#define __PYX_ABI_VERSION "3_2_9"
#define CYTHON_HEX_VERSION 0x030209F0
#define __PYX_ABI_VERSION "3_2_4"
#define CYTHON_HEX_VERSION 0x030204F0
#define CYTHON_FUTURE_DIVISION 1
/* CModulePreamble */
#include <stddef.h>
@@ -919,39 +922,28 @@ enum __Pyx_ReferenceSharing {
#else
#define __Pyx_IS_UNIQUELY_REFERENCED(o, sharing) (((void)o), ((void)sharing), 0)
#endif
#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
#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
#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 && CYTHON_ASSUME_SAFE_SIZE)
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_XNewRef(PyList_GetItem(o, i))
#else
#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_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))
#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_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))
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_XNewRef(PyList_GetItem(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_GET_ITEM_REF(o, i, unsafe_shared) ((void)(unsafe_shared),\
__Pyx_XNewRef(PyList_GetItem(o, i)))
#define __Pyx_PyList_GetItemRef(o, i) __Pyx_NewRef(PyList_GET_ITEM(o, i))
#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))
#else
#define __Pyx_PyList_GetItemRefFast(o, i, unsafe_shared) __Pyx_PyList_GetItemRef(o, i)
#endif
#if __PYX_LIMITED_VERSION_HEX >= 0x030d0000
#define __Pyx_PyDict_GetItemRef(dict, key, result) PyDict_GetItemRef(dict, key, result)
@@ -1873,10 +1865,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
#if CYTHON_METH_FASTCALL || (CYTHON_COMPILING_IN_CPYTHON && CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS)
#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) __Pyx_PyTuple_FromArray(args + start, stop - start)
#else
#define __Pyx_ArgsSlice_FASTCALL __Pyx_ArgsSlice_VARARGS
#define __Pyx_ArgsSlice_FASTCALL(args, start, stop) PyTuple_GetSlice(args, start, stop)
#endif
/* py_dict_items.proto (used by OwnedDictNext) */
@@ -2176,20 +2168,6 @@ 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
@@ -2766,7 +2744,7 @@ typedef struct {
std::string __pyx_k__3;
PyObject *__pyx_tuple[5];
PyObject *__pyx_codeobj_tab[32];
PyObject *__pyx_string_tab[158];
PyObject *__pyx_string_tab[157];
PyObject *__pyx_number_tab[4];
/* #### Code section: module_state_contents ### */
/* CommonTypesMetaclass.module_state_decls */
@@ -2864,108 +2842,107 @@ 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_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_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_float_1_0 __pyx_number_tab[0]
#define __pyx_float_0_001 __pyx_number_tab[1]
#define __pyx_int_0 __pyx_number_tab[2]
@@ -2998,7 +2975,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<158; ++i) { Py_CLEAR(clear_module_state->__pyx_string_tab[i]); }
for (int i=0; i<157; ++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 */
@@ -3036,7 +3013,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<158; ++i) { __Pyx_VISIT_CONST(traverse_module_state->__pyx_string_tab[i]); }
for (int i=0; i<157; ++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 */
@@ -3480,7 +3457,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:
@@ -3726,7 +3703,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:
@@ -3848,7 +3825,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:
@@ -4100,7 +4077,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:
@@ -4208,7 +4185,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_GET_ITEM_REF(__pyx_t_1, __pyx_t_2, __Pyx_ReferenceSharing_OwnStrongReference);
__pyx_t_3 = __Pyx_PyList_GetItemRefFast(__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);
@@ -4539,7 +4516,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:
@@ -4980,7 +4957,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:
@@ -5090,7 +5067,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:
@@ -5666,7 +5643,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:
@@ -6042,7 +6019,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:
@@ -6296,7 +6273,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:
@@ -6450,7 +6427,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:
@@ -6798,7 +6775,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:
@@ -7271,7 +7248,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:
@@ -7616,7 +7593,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:
@@ -7769,7 +7746,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:
@@ -8124,7 +8101,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:
@@ -8398,7 +8375,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:
@@ -8686,7 +8663,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:
@@ -9011,7 +8988,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:
@@ -9418,7 +9395,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:
@@ -9668,9 +9645,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_SocketEventHandle(PyObject *o) {
{
PyObject *etype, *eval, *etb;
PyErr_Fetch(&etype, &eval, &etb);
__Pyx_DeallocKeepAliveBegin(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
__pyx_pw_4msgq_7ipc_pyx_17SocketEventHandle_3__dealloc__(o);
__Pyx_DeallocKeepAliveEnd(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
PyErr_Restore(etype, eval, etb);
}
PyTypeObject *tp = Py_TYPE(o);
@@ -9833,9 +9810,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_Context(PyObject *o) {
{
PyObject *etype, *eval, *etb;
PyErr_Fetch(&etype, &eval, &etb);
__Pyx_DeallocKeepAliveBegin(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
__pyx_pw_4msgq_7ipc_pyx_7Context_5__dealloc__(o);
__Pyx_DeallocKeepAliveEnd(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
PyErr_Restore(etype, eval, etb);
}
PyTypeObject *tp = Py_TYPE(o);
@@ -9974,9 +9951,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_Poller(PyObject *o) {
{
PyObject *etype, *eval, *etb;
PyErr_Fetch(&etype, &eval, &etb);
__Pyx_DeallocKeepAliveBegin(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
__pyx_pw_4msgq_7ipc_pyx_6Poller_3__dealloc__(o);
__Pyx_DeallocKeepAliveEnd(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
PyErr_Restore(etype, eval, etb);
}
Py_CLEAR(p->sub_sockets);
@@ -10140,9 +10117,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_SubSocket(PyObject *o) {
{
PyObject *etype, *eval, *etb;
PyErr_Fetch(&etype, &eval, &etb);
__Pyx_DeallocKeepAliveBegin(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
__pyx_pw_4msgq_7ipc_pyx_9SubSocket_3__dealloc__(o);
__Pyx_DeallocKeepAliveEnd(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
PyErr_Restore(etype, eval, etb);
}
PyTypeObject *tp = Py_TYPE(o);
@@ -10278,9 +10255,9 @@ static void __pyx_tp_dealloc_4msgq_7ipc_pyx_PubSocket(PyObject *o) {
{
PyObject *etype, *eval, *etb;
PyErr_Fetch(&etype, &eval, &etb);
__Pyx_DeallocKeepAliveBegin(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1);
__pyx_pw_4msgq_7ipc_pyx_9PubSocket_3__dealloc__(o);
__Pyx_DeallocKeepAliveEnd(o);
__Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1);
PyErr_Restore(etype, eval, etb);
}
PyTypeObject *tp = Py_TYPE(o);
@@ -11588,20 +11565,16 @@ static int __Pyx_InitCachedConstants(__pyx_mstatetype *__pyx_mstate) {
{
PyObject **table = __pyx_mstate->__pyx_tuple;
for (Py_ssize_t i=0; i<5; ++i) {
#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 CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
#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_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
}
#else
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
#endif
}
@@ -11618,31 +11591,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},{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);
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);
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 (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);
#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);
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 (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!";
#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!";
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 < 136; i++) {
for (int i = 0; i < 135; 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);
@@ -11653,7 +11626,7 @@ const char* const bytes = "Messaging failure NoneNote that Cython is deliberatel
stringtab[i] = string;
pos += bytes_length;
}
for (int i = 136; i < 158; i++) {
for (int i = 135; i < 157; i++) {
Py_ssize_t bytes_length = index[i].length;
PyObject *string = PyBytes_FromStringAndSize(bytes + pos, bytes_length);
stringtab[i] = string;
@@ -11664,29 +11637,25 @@ const char* const bytes = "Messaging failure NoneNote that Cython is deliberatel
}
}
Py_XDECREF(data);
for (Py_ssize_t i = 0; i < 158; i++) {
for (Py_ssize_t i = 0; i < 157; i++) {
if (unlikely(PyObject_Hash(stringtab[i]) == -1)) {
__PYX_ERR(0, 1, __pyx_L1_error)
}
}
#if CYTHON_IMMORTAL_CONSTANTS
{
PyObject **table = stringtab + 136;
PyObject **table = stringtab + 135;
for (Py_ssize_t i=0; i<22; ++i) {
#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 CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
#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_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
}
#else
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
#endif
}
@@ -11713,20 +11682,16 @@ 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 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 CYTHON_COMPILING_IN_CPYTHON_FREETHREADING
#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_ssize_t)_Py_IMMORTAL_REFCNT_LOCAL + 1));
Py_SET_REFCNT(table[i], _Py_IMMORTAL_REFCNT_LOCAL);
}
#else
if ((PY_SSIZE_T_MAX < _Py_IMMORTAL_INITIAL_REFCNT)) break;
Py_SET_REFCNT(table[i], _Py_IMMORTAL_INITIAL_REFCNT);
#endif
}
@@ -12158,11 +12123,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;
}
@@ -12448,7 +12413,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) && CYTHON_METH_FASTCALL
#if defined(__Pyx_CyFunction_USED)
if (__Pyx_CyFunction_CheckExact(callable)) {
return __Pyx_CyFunction_func_vectorcall(callable);
}
@@ -13295,8 +13260,8 @@ bad:
CYTHON_UNUSED_VAR(max_char);
CYTHON_UNUSED_VAR(result_ulength);
for (i=0; i<value_count; i++) {
Py_INCREF(values[i]);
if (__Pyx_PyTuple_SET_ITEM(value_tuple, i, values[i]) != (0)) goto bad;
Py_INCREF(values[i]);
}
result = PyUnicode_Join(__pyx_mstate_global->__pyx_empty_unicode, value_tuple);
bad:
@@ -15212,7 +15177,6 @@ __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);
@@ -15227,54 +15191,8 @@ __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;
@@ -15287,88 +15205,14 @@ __Pyx_CyFunction_get_annotations_locked(__pyx_CyFunctionObject *op) {
return result;
}
static PyObject *
__Pyx_CyFunction_get_annotations(PyObject *op_in, void *context) {
PyObject *annotate = NULL;
PyObject *result = NULL;
__pyx_CyFunctionObject *op = (__pyx_CyFunctionObject*) op_in;
__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op, void *context) {
PyObject *result;
CYTHON_UNUSED_VAR(context);
__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_BEGIN_CRITICAL_SECTION(op);
result = __Pyx_CyFunction_get_annotations_locked(op);
__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;
@@ -15381,6 +15225,7 @@ __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;
}
@@ -15483,7 +15328,6 @@ 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},
@@ -15622,7 +15466,8 @@ __Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
Py_CLEAR(m->func_doc);
Py_CLEAR(m->func_globals);
Py_CLEAR(m->func_code);
#if PY_VERSION_HEX < 0x030900B1 || CYTHON_COMPILING_IN_LIMITED_API
#if !CYTHON_COMPILING_IN_LIMITED_API
#if PY_VERSION_HEX < 0x030900B1
Py_CLEAR(__Pyx_CyFunction_GetClassObj(m));
#else
{
@@ -15630,6 +15475,7 @@ __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);
@@ -15681,10 +15527,11 @@ 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;
@@ -16734,8 +16581,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;
Py_INCREF(key);
if (__Pyx_PyTuple_SET_ITEM(builder, n, key) != (0)) return -1;
Py_INCREF(key);
args[n] = value;
return 0;
}
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
Symlink
+1
View File
@@ -0,0 +1 @@
opendbc_repo/opendbc
-49
View File
@@ -1,49 +0,0 @@
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
View File
@@ -1,14 +0,0 @@
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
View File
@@ -1,36 +0,0 @@
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
-80
View File
@@ -1,80 +0,0 @@
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
View File
@@ -1,11 +0,0 @@
<!--
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:
+1 -2
View File
@@ -1,6 +1,6 @@
<!--- AUTOGENERATED FROM selfdrive/car/CARS_template.md, DO NOT EDIT. --->
# Support Information for 402 Known Cars
# Support Information for 401 Known Cars
|Make|Model|Package|Support Level|
|---|---|---|:---:|
@@ -257,7 +257,6 @@
|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)|
+240
View File
@@ -0,0 +1,240 @@
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: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![X Follow](https://img.shields.io/twitter/follow/comma_ai)](https://x.com/comma_ai)
[![Discord](https://img.shields.io/discord/469524606043160576)](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.
+487
View File
@@ -0,0 +1,487 @@
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/_hyundai_canfd_common.dbc
opendbc/dbc/generator/hyundai/hyundai_can.dbc
opendbc/dbc/generator/hyundai/hyundai_canfd.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
@@ -0,0 +1 @@
@@ -0,0 +1,20 @@
numpy
tqdm
pycapnp
pycryptodome
[examples]
inputs
[testing]
cffi
tree-sitter
tree-sitter-c
gcovr
unittest-parallel
zstandard
ruff
ty
lefthook
cpplint
codespell
@@ -0,0 +1 @@
opendbc
+2 -6
View File
@@ -568,6 +568,8 @@ struct CarParams {
}
struct LongitudinalPIDTuning {
kpBP @0 :List(Float32);
kpV @1 :List(Float32);
kiBP @2 :List(Float32);
kiV @3 :List(Float32);
@@ -575,8 +577,6 @@ struct CarParams {
kf @6 :Float32;
deadzoneBP @4 :List(Float32);
deadzoneV @5 :List(Float32);
kpBP @0 :List(Float32);
kpV @1 :List(Float32);
}
}
@@ -648,10 +648,6 @@ struct CarParams {
fcaGiorgio @32;
rivian @33;
volkswagenMeb @34;
byd @35;
volvo @36;
bmw @37;
mg @38;
}
enum SteerControlType {
+1 -1
View File
@@ -78,7 +78,7 @@ class CAR(Platforms):
)
JEEP_GRAND_CHEROKEE_2019 = ChryslerPlatformConfig( # includes 2020 Trailhawk
[ChryslerCarDocs("Jeep Grand Cherokee 2019-21")],
[ChryslerCarDocs("Jeep Grand Cherokee 2019-21", video="https://www.youtube.com/watch?v=jBe4lWnRSu4")],
JEEP_GRAND_CHEROKEE.specs,
)
@@ -130,6 +130,7 @@ 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])
@@ -200,6 +200,7 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
lka_steering = self.CP.flags & HyundaiFlags.CANFD_LKA_STEER_MSG
lka_steering_long = lka_steering and self.CP.openpilotLongitudinalControl
ccnc_non_hda2 = self.CP.flags & HyundaiFlags.CCNC and not lka_steering
# steering control
can_sends.extend(hyundaicanfd.create_steering_messages(self.packer, self.CP, self.CAN, CC.enabled, apply_steer_req, apply_torque, self.lkas_icon))
@@ -211,7 +212,12 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
# LFA and HDA icons
if self.frame % 5 == 0 and (not lka_steering or lka_steering_long):
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled, self.lfa_icon))
if ccnc_non_hda2:
can_sends.extend(hyundaicanfd.create_ccnc(self.packer, self.CAN, self.CP.openpilotLongitudinalControl, CC.enabled, CC.hudControl, CC.leftBlinker,
CC.rightBlinker, CS.msg_161, CS.msg_162, CS.msg_1b5, CS.is_metric, CS.out, CS.main_cruise_enabled,
self.lfa_icon))
else:
can_sends.append(hyundaicanfd.create_lfahda_cluster(self.packer, self.CAN, CC.enabled, self.lfa_icon))
# blinkers
if lka_steering and self.CP.flags & HyundaiFlags.CANFD_ENABLE_BLINKERS:
@@ -220,11 +226,12 @@ class CarController(CarControllerBase, EsccCarController, LeadDataCarController,
if self.CP.openpilotLongitudinalControl:
if lka_steering:
can_sends.extend(hyundaicanfd.create_adrv_messages(self.packer, self.CAN, self.frame))
else:
elif not ccnc_non_hda2:
can_sends.extend(hyundaicanfd.create_fca_warning_light(self.packer, self.CAN, self.frame))
if self.frame % 2 == 0:
can_sends.append(hyundaicanfd.create_acc_control(self.packer, self.CAN, CC.enabled, self.accel_last, accel, stopping, CC.cruiseControl.override,
set_speed_in_units, hud_control, self.lead_data, CS.main_cruise_enabled, self.tuning))
set_speed_in_units, hud_control, self.lead_data, CS.main_cruise_enabled, self.tuning,
CS.cruise_info if ccnc_non_hda2 else None))
self.accel_last = accel
else:
# button presses
+5 -1
View File
@@ -64,6 +64,7 @@ class CarState(CarStateBase, EsccCarStateBase, MadsCarState, CarStateExt):
self.buttons_counter = 0
self.cruise_info = {}
self.msg_161, self.msg_162, self.msg_1b5 = {}, {}, {}
# On some cars, CLU15->CF_Clu_VehicleSpeed can oscillate faster than the dash updates. Sample at 5 Hz
self.cluster_speed = 0
@@ -258,8 +259,11 @@ class CarState(CarStateBase, EsccCarStateBase, MadsCarState, CarStateExt):
# 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:
if self.CP.flags & HyundaiFlags.CCNC:
left_blinker_sig, right_blinker_sig = "LEFT_LAMP_ALT", "RIGHT_LAMP_ALT"
if not self.CP.flags & HyundaiFlags.CANFD_LKA_STEER_MSG:
self.msg_161, self.msg_162, self.msg_1b5 = map(copy.copy, (cp_cam.vl["CCNC_0x161"], cp_cam.vl["CCNC_0x162"], cp_cam.vl["FR_CMR_03_50ms"]))
self.cruise_info = copy.copy((cp_cam if self.CP.flags & HyundaiFlags.CANFD_CAMERA_SCC else cp).vl["SCC_CONTROL"])
ret.leftBlinker, ret.rightBlinker = self.update_blinker_from_lamp(50, cp.vl["BLINKERS"][left_blinker_sig],
cp.vl["BLINKERS"][right_blinker_sig])
if self.CP.enableBsm:
@@ -220,6 +220,16 @@ FW_VERSIONS = {
b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.07 99211-L1000 211223',
],
},
CAR.HYUNDAI_SONATA_2024: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00DN8 MFC AT KOR LHD 1.00 1.01 99211-L1800 230512',
b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.01 99211-L1800 230512',
b'\xf1\x00DN8 MFC AT USA LHD 1.00 1.02 99211-L1800 250613',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DN8_ RDR ----- 1.00 1.00 99110-L1800 ',
],
},
CAR.HYUNDAI_SONATA_LF: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00LF__ SCC F-CUP 1.00 1.00 96401-C2200 ',
@@ -570,6 +580,16 @@ FW_VERSIONS = {
b'\xf1\x00OS9 LKAS AT USA LHD 1.00 1.00 95740-J9300 g21',
],
},
CAR.HYUNDAI_KONA_2ND_GEN: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00SX2 MFC AT USA LHD 1.00 1.03 99211-BE000 230517',
b'\xf1\x00SX2 MFC AT USA LHD 1.00 1.07 99211-BE000 240611',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE000 ',
b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE500 ',
],
},
CAR.KIA_CEED: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00CD__ SCC F-CUP 1.00 1.00 99110-J7500 ',
@@ -605,6 +625,17 @@ FW_VERSIONS = {
b'\xf1\x00BD__ SCC H-CUP 1.00 1.02 99110-M6000 ',
],
},
CAR.KIA_K4_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00CL4 MFC AT CAN LHD 1.00 1.02 99210-GG000 240708',
b'\xf1\x00CL4 MFC AT USA LHD 1.00 1.02 99210-GG000 240708',
b'\xf1\x00CL4 MFC AT USA LHD 1.00 1.04 99210-GG100 251205',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00CL4_ RDR ----- 1.00 1.01 99110-GG000 ',
b'\xf1\x00CL4_ RDR ----- 1.00 1.01 99110-GG100 ',
],
},
CAR.KIA_K5_2021: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DL3_ SCC F-CUP 1.00 1.03 99110-L2100 ',
@@ -637,6 +668,14 @@ FW_VERSIONS = {
b'\xf1\x00DL ESC \t 102"\x08\x10 58910-L3800',
],
},
CAR.KIA_K5_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00DL3 MFC AT USA LHD 1.00 1.04 99210-L2500 240117',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DL3_ RDR ----- 1.00 1.01 99110-L2500 ',
],
},
CAR.KIA_K5_HEV_2020: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DLhe SCC FHCUP 1.00 1.02 99110-L7000 ',
@@ -723,6 +762,7 @@ FW_VERSIONS = {
],
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00SX2EMFC AT KOR LHD 1.00 1.00 99211-BF000 230410',
b'\xf1\x00SX2EMFC AT USA LHD 1.00 1.02 99211-BF000 230823',
],
},
CAR.KIA_NIRO_EV: {
@@ -981,6 +1021,18 @@ FW_VERSIONS = {
b'\xf1\x00OSH LKAS AT KOR LHD 1.00 1.01 95740-CM000 l31',
],
},
CAR.HYUNDAI_KONA_HEV_2ND_GEN: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00SX2HMFC AT AUS RHD 1.00 1.00 99211-BE001 241015',
b'\xf1\x00SX2HMFC AT AUS RHD 1.00 1.01 99211-BE001 250117',
b'\xf1\x00SX2HMFC AT EUR LHD 1.00 1.01 99211-BE001 250117',
b'\xf1\x00SX2HMFC AT EUR RHD 1.00 1.04 99211-BE000 231010',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE000 ',
b'\xf1\x00SX2_ RDR ----- 1.00 1.02 99110-BE500 ',
],
},
CAR.HYUNDAI_SONATA_HYBRID: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DNhe SCC F-CUP 1.00 1.02 99110-L5000 ',
@@ -1002,6 +1054,15 @@ FW_VERSIONS = {
b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.07 99211-L1000 211223',
],
},
CAR.HYUNDAI_SONATA_HEV_2024: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00DN8HMFC AT KOR LHD 1.00 1.01 99211-L1800 230512',
b'\xf1\x00DN8HMFC AT USA LHD 1.00 1.01 99211-L1800 230512',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00DN8_ RDR ----- 1.00 1.00 99110-L1800 ',
],
},
CAR.KIA_SORENTO: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00UMP LKAS AT AUS RHD 1.00 1.00 96400-C6550 S30',
@@ -1069,6 +1130,16 @@ FW_VERSIONS = {
b'\xf1\x00NE1 MFC AT USA LHD 1.00 1.06 99211-GI010 230110',
],
},
CAR.HYUNDAI_IONIQ_5_N: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00NE1N RDR ----- 1.00 1.00 99110-NI000 ',
],
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NE1NMFC AT KOR LHD 1.00 1.04 99211-NI000 231219',
b'\xf1\x00NE1NMFC AT KOR LHD 1.00 1.00 99211-NI010 240712',
b'\xf1\x00NE1NMFC AT USA LHD 1.00 1.04 99211-NI000 231219',
],
},
CAR.HYUNDAI_IONIQ_6: {
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00CE__ RDR ----- 1.00 1.01 99110-KL000 ',
@@ -1107,6 +1178,38 @@ FW_VERSIONS = {
b'\xf1\x00NX4__ 1.01 1.02 99110-N9000 ',
],
},
CAR.HYUNDAI_TUCSON_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NX4 FR_CMR AT GEN LHD 1.00 1.00 99211-N7030 C55',
b'\xf1\x00NX4 FR_CMR AT GEN LHD 1.00 1.00 99211-N7035 C5C',
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.01 99211-N7050 C5A',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00NX4__ 1.00 1.02 99110N7000 ',
b'\xf1\x00NX4__ 1.00 1.03 99110N7100 ',
],
},
CAR.HYUNDAI_TUCSON_HEV_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NX4 FR_CMR AT EUR LHD 1.00 1.00 99211-N7030 C55',
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N7030 C55',
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N7035 C5C',
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N7060 C5B',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00NX4__ 1.00 1.02 99110N7000 ',
b'\xf1\x00NX4__ 1.00 1.02 99110N7100 ',
b'\xf1\x00NX4__ 1.00 1.03 99110N7100 ',
],
},
CAR.HYUNDAI_TUCSON_PHEV_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NX4 FR_CMR AT CAN LHD 1.00 1.00 99211-N7030 C55',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00NX4__ 1.00 1.02 99110N7100 ',
],
},
CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-CW000 14M',
@@ -1118,6 +1221,14 @@ FW_VERSIONS = {
b'\xf1\x00NX4__ 1.01 1.00 99110-K5000 ',
],
},
CAR.HYUNDAI_SANTA_CRUZ_2025: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NX4 FR_CMR AT USA LHD 1.00 1.00 99211-N7030 C55',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00NX4__ 1.00 1.00 99110K5500 ',
],
},
CAR.KIA_SPORTAGE_5TH_GEN: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00NQ5 FR_CMR AT AUS RHD 1.00 1.00 99211-P1040 663',
@@ -1190,6 +1301,16 @@ FW_VERSIONS = {
b'\xf1\x00MQ4_ SCC FHCUP 1.00 1.08 99110-P2000 ',
],
},
CAR.KIA_SORENTO_2024: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00MQ4 MFC AT AUS RHD 1.01 1.04 99210-P2550 231127',
b'\xf1\x00MQ4 MFC AT USA LHD 1.01 1.04 99210-R5500 231127',
],
(Ecu.fwdRadar, 0x7d0, None): [
b'\xf1\x00MQ4_ RDR ----- 1.00 1.01 99110-P2500 ',
b'\xf1\x00MQ4_ RDR ----- 1.00 1.01 99110-R5500 ',
],
},
CAR.KIA_SORENTO_HEV_4TH_GEN: {
(Ecu.fwdCamera, 0x7c4, None): [
b'\xf1\x00MQ4HMFC AT KOR LHD 1.00 1.04 99210-P2000 200330',
@@ -1,5 +1,6 @@
import numpy as np
from opendbc.car import CanBusBase
from opendbc.car.common.conversions import Conversions as CV
from opendbc.car.crc import CRC16_XMODEM
from opendbc.car.hyundai.values import HyundaiFlags
from opendbc.sunnypilot.car.hyundai.lead_data_ext import CanFdLeadData
@@ -125,8 +126,106 @@ def create_lfahda_cluster(packer, CAN, enabled, lfa_icon):
return packer.make_can_msg("LFAHDA_CLUSTER", CAN.ECAN, values)
def create_ccnc(packer, CAN, openpilot_longitudinal_control, enabled, hud, left_blinker, right_blinker, msg_161, msg_162, msg_1b5,
is_metric, out, main_cruise_enabled, lfa_icon):
for f in {"FAULT_LSS", "FAULT_HDA", "FAULT_DAS", "FAULT_LFA", "FAULT_DAW", "FAULT_ESS"}:
msg_162[f] = 0
if msg_161["ALERTS_2"] == 5:
msg_161.update({"ALERTS_2": 0, "SOUNDS_2": 0})
if msg_161["ALERTS_3"] == 17:
msg_161["ALERTS_3"] = 0
if msg_161["ALERTS_5"] in (2, 5):
msg_161["ALERTS_5"] = 0
if msg_161["SOUNDS_4"] == 2 and msg_161["LFA_ICON"] in (0, 3):
msg_161["SOUNDS_4"] = 0
LANE_CHANGE_SPEED_MIN = 8.9408 # 20 mph
any_blinker = left_blinker or right_blinker
curvature = {i: (31 if i == -1 else 13 - abs(i + 15)) if i < 0 else 15 + i for i in range(-15, 16)}
msg_161.update({
"DAW_ICON": 0,
"LKA_ICON": 0,
"LFA_ICON": 2 if lfa_icon else 0,
"CENTERLINE": 1 if lfa_icon else 0,
"LANELINE_CURVATURE": curvature[max(-15, min(int(out.steeringAngleDeg / 4.5), 15))] if lfa_icon and not any_blinker else 15,
"LANELINE_LEFT": (0 if not lfa_icon else 1 if not hud.leftLaneVisible else 4 if hud.leftLaneDepart else 6 if any_blinker else 2),
"LANELINE_RIGHT": (0 if not lfa_icon else 1 if not hud.rightLaneVisible else 4 if hud.rightLaneDepart else 6 if any_blinker else 2),
"LCA_LEFT_ICON": (0 if not lfa_icon or out.vEgo < LANE_CHANGE_SPEED_MIN else 1 if out.leftBlindspot else 2 if any_blinker else 4),
"LCA_RIGHT_ICON": (0 if not lfa_icon or out.vEgo < LANE_CHANGE_SPEED_MIN else 1 if out.rightBlindspot else 2 if any_blinker else 4),
"LCA_LEFT_ARROW": 2 if left_blinker else 0,
"LCA_RIGHT_ARROW": 2 if right_blinker else 0,
})
if lfa_icon and any_blinker:
left_lane_raw, right_lane_raw = msg_1b5["Info_LftLnPosVal"], msg_1b5["Info_RtLnPosVal"]
scale_per_m = 15 / 1.7
left_lane = abs(int(round(15 + (left_lane_raw - 1.7) * scale_per_m)))
right_lane = abs(int(round(15 + (right_lane_raw - 1.7) * scale_per_m)))
if msg_1b5["Info_LftLnQualSta"] not in (2, 3):
left_lane = 0
if msg_1b5["Info_RtLnQualSta"] not in (2, 3):
right_lane = 0
if left_lane_raw == -2.0248375:
left_lane = 30 - right_lane
if right_lane_raw == 2.0248375:
right_lane = 30 - left_lane
if left_lane_raw == right_lane_raw == 0:
left_lane = right_lane = 15
elif left_lane_raw == 0:
left_lane = 30 - right_lane
elif right_lane_raw == 0:
right_lane = 30 - left_lane
total = left_lane + right_lane
if total == 0:
left_lane = right_lane = 15
else:
left_lane = round((left_lane / total) * 30)
right_lane = 30 - left_lane
msg_161["LANELINE_LEFT_POSITION"] = left_lane
msg_161["LANELINE_RIGHT_POSITION"] = right_lane
if hud.leftLaneDepart or hud.rightLaneDepart:
msg_162["VIBRATE"] = 1
if openpilot_longitudinal_control:
if msg_161["ALERTS_3"] in (1, 2, 3, 4, 7, 8, 9, 10):
msg_161["ALERTS_3"] = 0
if msg_161["ALERTS_5"] == 4:
msg_161["ALERTS_5"] = 0
if msg_161["SOUNDS_3"] == 5:
msg_161["SOUNDS_3"] = 0
msg_161.update({
"SETSPEED": 3 if enabled else 1,
"SETSPEED_HUD": 0 if not main_cruise_enabled else 2 if enabled else 1,
"SETSPEED_SPEED": (
255 if not main_cruise_enabled else
(40 if is_metric else 25) if (s := round(out.vCruiseCluster * (1 if is_metric else CV.KPH_TO_MPH))) > (145 if is_metric else 90) else s
),
"DISTANCE": hud.leadDistanceBars,
"DISTANCE_SPACING": 0 if not main_cruise_enabled else 1 if enabled else 3,
"DISTANCE_LEAD": 0 if not main_cruise_enabled else 2 if enabled and hud.leadVisible else 1 if hud.leadVisible else 0,
"DISTANCE_CAR": 0 if not main_cruise_enabled else 2 if enabled else 1,
"SLA_ICON": 0,
"NAV_ICON": 0,
"TARGET": 0,
})
msg_162["LEAD"] = 0 if not main_cruise_enabled else 2 if enabled else 1
msg_162["LEAD_DISTANCE"] = msg_1b5["Longitudinal_Distance"]
return [packer.make_can_msg(msg, CAN.ECAN, data) for msg, data in [("CCNC_0x161", msg_161), ("CCNC_0x162", msg_162)]]
def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_override, set_speed, hud_control,
lead_data: CanFdLeadData, main_cruise_enabled, tuning):
lead_data: CanFdLeadData, main_cruise_enabled, tuning, cruise_info=None):
jerk = 5
jn = jerk / 50
if not enabled or gas_override:
@@ -154,6 +253,8 @@ def create_acc_control(packer, CAN, enabled, accel_last, accel, stopping, gas_ov
"SET_ME_TMP_64": 0x64,
"DISTANCE_SETTING": hud_control.leadDistanceBars,
}
if cruise_info:
values.update({s: cruise_info[s] for s in ["ACC_ObjDist", "ACC_ObjRelSpd"]})
return packer.make_can_msg("SCC_CONTROL", CAN.ECAN, values)
@@ -85,6 +85,8 @@ 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.CCNC and not ret.flags & HyundaiFlags.CANFD_LKA_STEER_MSG:
ret.safetyConfigs[-1].safetyParam |= HyundaiSafetyFlags.CCNC.value
else:
# Shared configuration for non CAN-FD cars
@@ -22,7 +22,11 @@ NO_DATES_PLATFORMS = {
# CAN FD
CAR.KIA_SPORTAGE_5TH_GEN,
CAR.HYUNDAI_SANTA_CRUZ_1ST_GEN,
CAR.HYUNDAI_SANTA_CRUZ_2025,
CAR.HYUNDAI_TUCSON_4TH_GEN,
CAR.HYUNDAI_TUCSON_2025,
CAR.HYUNDAI_TUCSON_HEV_2025,
CAR.HYUNDAI_TUCSON_PHEV_2025,
# CAN
CAR.HYUNDAI_ELANTRA,
CAR.HYUNDAI_ELANTRA_GT_I30,
+72 -3
View File
@@ -68,6 +68,7 @@ class HyundaiSafetyFlags(IntFlag):
CANFD_LKA_STEER_MSG_ALT = 128
FCEV_GAS = 256
ALT_LIMITS_2 = 512
CCNC = 1024
# Hyundai/Kia/Genesis SCC (Smart Cruise Control) and steering architecture:
@@ -149,6 +150,8 @@ class HyundaiFlags(IntFlag):
ALT_LIMITS_2 = 2 ** 26
CCNC = 2 ** 27
@dataclass
class HyundaiCarDocs(CarDocs):
@@ -285,6 +288,16 @@ class CAR(Platforms):
CarSpecs(mass=1491, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.ALT_LIMITS_2,
)
HYUNDAI_KONA_2ND_GEN = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Kona (without HDA II) 2024-25", car_parts=CarParts.common([CarHarness.hyundai_l]))],
CarSpecs(mass=1590, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_KONA_HEV_2ND_GEN = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Kona Hybrid (without HDA II) 2024-26", car_parts=CarParts.common([CarHarness.hyundai_l]))],
CarSpecs(mass=1590, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_KONA_EV = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Kona Electric 2018-21", car_parts=CarParts.common([CarHarness.hyundai_g]))],
CarSpecs(mass=1685, wheelbase=2.6, steerRatio=13.42, tireStiffnessFactor=0.385),
@@ -296,10 +309,13 @@ class CAR(Platforms):
flags=HyundaiFlags.CAMERA_SCC | HyundaiFlags.EV | HyundaiFlags.ALT_LIMITS,
)
HYUNDAI_KONA_EV_2ND_GEN = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video="https://www.youtube.com/watch?v=U2fOCmcQ8hw",
car_parts=CarParts.common([CarHarness.hyundai_r]))],
[
HyundaiCarDocs("Hyundai Kona Electric (with HDA II, Korea only) 2023", video="https://www.youtube.com/watch?v=U2fOCmcQ8hw",
car_parts=CarParts.common([CarHarness.hyundai_r])),
HyundaiCarDocs("Hyundai Kona Electric (without HDA II) 2024", car_parts=CarParts.common([CarHarness.hyundai_a])),
],
CarSpecs(mass=1740, wheelbase=2.66, steerRatio=13.6, tireStiffnessFactor=0.385),
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE,
flags=HyundaiFlags.EV | HyundaiFlags.CANFD_NO_RADAR_DISABLE | HyundaiFlags.CCNC,
)
HYUNDAI_KONA_HEV = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Kona Hybrid 2020", car_parts=CarParts.common([CarHarness.hyundai_i]))], # TODO: check packages,
@@ -339,6 +355,11 @@ class CAR(Platforms):
CarSpecs(mass=1513, wheelbase=2.84, steerRatio=13.27 * 1.15, tireStiffnessFactor=0.65), # 15% higher at the center seems reasonable
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8,
)
HYUNDAI_SONATA_2024 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Sonata (without HDA II) 2024-26", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=1556, wheelbase=2.84, steerRatio=12.81),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_SONATA_LF = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Sonata 2018-19", car_parts=CarParts.common([CarHarness.hyundai_e]))],
CarSpecs(mass=1536, wheelbase=2.804, steerRatio=13.27 * 1.15), # 15% higher at the center seems reasonable
@@ -374,6 +395,11 @@ class CAR(Platforms):
HYUNDAI_SONATA.specs,
flags=HyundaiFlags.MANDO_RADAR | HyundaiFlags.CHECKSUM_CRC8 | HyundaiFlags.HYBRID,
)
HYUNDAI_SONATA_HEV_2024 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Sonata Hybrid (without HDA II) 2024-25", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=1616, wheelbase=2.84, steerRatio=13.27),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_IONIQ_5 = HyundaiCanFDPlatformConfig(
[
HyundaiCarDocs("Hyundai Ioniq 5 (Southeast Asia and Europe only) 2022-24", "All", car_parts=CarParts.common([CarHarness.hyundai_q])),
@@ -383,6 +409,11 @@ class CAR(Platforms):
CarSpecs(mass=1948, wheelbase=2.97, steerRatio=14.26, tireStiffnessFactor=0.65),
flags=HyundaiFlags.EV,
)
HYUNDAI_IONIQ_5_N = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Ioniq 5 N (with HDA II) 2024", car_parts=CarParts.common([CarHarness.hyundai_s]))],
CarSpecs(mass=2205, wheelbase=3.00, steerRatio=14.26, tireStiffnessFactor=1.3),
flags=HyundaiFlags.EV | HyundaiFlags.CCNC,
)
HYUNDAI_IONIQ_6 = HyundaiCanFDPlatformConfig(
[
HyundaiCarDocs("Hyundai Ioniq 6 (without HDA II) 2023-24", "Highway Driving Assist", car_parts=CarParts.common([CarHarness.hyundai_l])),
@@ -400,11 +431,31 @@ class CAR(Platforms):
],
CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385),
)
HYUNDAI_TUCSON_2025 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Tucson (without HDA II) 2025-26", car_parts=CarParts.common([CarHarness.hyundai_n]))],
CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_TUCSON_HEV_2025 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Tucson Hybrid (without HDA II) 2025-26", car_parts=CarParts.common([CarHarness.hyundai_n]))],
CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_TUCSON_PHEV_2025 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Tucson Plug-in Hybrid (without HDA II) 2025", car_parts=CarParts.common([CarHarness.hyundai_n]))],
CarSpecs(mass=1630, wheelbase=2.756, steerRatio=13.7, tireStiffnessFactor=0.385),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_SANTA_CRUZ_1ST_GEN = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Santa Cruz 2022-24", car_parts=CarParts.common([CarHarness.hyundai_n]))],
# weight from Limited trim - the only supported trim, steering ratio according to Hyundai News https://www.hyundainews.com/assets/documents/original/48035-2022SantaCruzProductGuideSpecsv2081521.pdf
CarSpecs(mass=1870, wheelbase=3, steerRatio=14.2),
)
HYUNDAI_SANTA_CRUZ_2025 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Hyundai Santa Cruz (without HDA II) 2025", car_parts=CarParts.common([CarHarness.hyundai_n]))],
CarSpecs(mass=1920, wheelbase=3, steerRatio=14.2),
flags=HyundaiFlags.CCNC,
)
HYUNDAI_CUSTIN_1ST_GEN = HyundaiPlatformConfig(
[HyundaiCarDocs("Hyundai Custin 2023", "All", car_parts=CarParts.common([CarHarness.hyundai_k]))],
CarSpecs(mass=1690, wheelbase=3.055, steerRatio=17), # mass: from https://www.hyundai-motor.com.tw/clicktobuy/custin#spec_0, steerRatio: from learner
@@ -419,11 +470,24 @@ class CAR(Platforms):
],
CarSpecs(mass=2878 * CV.LB_TO_KG, wheelbase=2.8, steerRatio=13.75, tireStiffnessFactor=0.5)
)
KIA_K4_2025 = HyundaiCanFDPlatformConfig(
[
HyundaiCarDocs("Kia K4 (without HDA II) 2025-26", car_parts=CarParts.common([CarHarness.hyundai_a])),
HyundaiCarDocs("Kia K4 (with HDA II) 2025", car_parts=CarParts.common([CarHarness.hyundai_r])),
],
CarSpecs(mass=2987 * CV.LB_TO_KG, wheelbase=2.72, steerRatio=13.4),
flags=HyundaiFlags.CCNC,
)
KIA_K5_2021 = HyundaiPlatformConfig(
[HyundaiCarDocs("Kia K5 2021-24", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=3381 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27, tireStiffnessFactor=0.5), # 2021 Kia K5 Steering Ratio (all trims)
flags=HyundaiFlags.CHECKSUM_CRC8,
)
KIA_K5_2025 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Kia K5 (without HDA II) 2025", car_parts=CarParts.common([CarHarness.hyundai_m]))],
CarSpecs(mass=3230 * CV.LB_TO_KG, wheelbase=2.85, steerRatio=13.27),
flags=HyundaiFlags.CCNC,
)
KIA_K5_HEV_2020 = HyundaiPlatformConfig(
[HyundaiCarDocs("Kia K5 Hybrid 2020-22", car_parts=CarParts.common([CarHarness.hyundai_a]))],
KIA_K5_2021.specs,
@@ -534,6 +598,11 @@ class CAR(Platforms):
CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5), # average of the platforms
flags=HyundaiFlags.CANFD_RADAR_SCC,
)
KIA_SORENTO_2024 = HyundaiCanFDPlatformConfig(
[HyundaiCarDocs("Kia Sorento (without HDA II) 2024-25", car_parts=CarParts.common([CarHarness.hyundai_a]))],
CarSpecs(mass=3957 * CV.LB_TO_KG, wheelbase=2.81, steerRatio=13.5),
flags=HyundaiFlags.CCNC,
)
KIA_SORENTO_HEV_4TH_GEN = HyundaiCanFDPlatformConfig(
[
HyundaiCarDocs("Kia Sorento Hybrid 2021-23", "All", car_parts=CarParts.common([CarHarness.hyundai_a])),
+2
View File
@@ -246,6 +246,8 @@ 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
@@ -1,36 +0,0 @@
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
-76
View File
@@ -1,76 +0,0 @@
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),
}
@@ -1,18 +0,0 @@
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',
],
},
}
-25
View File
@@ -1,25 +0,0 @@
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
-28
View File
@@ -1,28 +0,0 @@
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)
-47
View File
@@ -1,47 +0,0 @@
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()
+2 -3
View File
@@ -87,9 +87,8 @@ class CarInterface(CarInterfaceBase):
else:
raise ValueError(f"unknown car: {candidate}")
# 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.alphaLongitudinalAvailable = not (ret.flags & (SubaruFlags.GLOBAL_GEN2 | SubaruFlags.PREGLOBAL |
SubaruFlags.LKAS_ANGLE | SubaruFlags.HYBRID))
ret.openpilotLongitudinalControl = alpha_long and ret.alphaLongitudinalAvailable
if ret.flags & SubaruFlags.GLOBAL_GEN2 and ret.openpilotLongitudinalControl:
+12 -3
View File
@@ -16,7 +16,6 @@ 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 = [
@@ -29,6 +28,9 @@ non_tested_cars = [
SUBARU.SUBARU_FORESTER_HYBRID,
VOLKSWAGEN.PORSCHE_MACAN_MK1,
HONDA.ACURA_TLX_2G,
HYUNDAI.KIA_SORENTO_2024,
HYUNDAI.HYUNDAI_IONIQ_5_N,
HYUNDAI.HYUNDAI_TUCSON_PHEV_2025,
# These had their DSUs unplugged, need new routes
# TOYOTA.LEXUS_ES # hybrid
@@ -166,6 +168,7 @@ routes = [
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),
CarTestRoute("f0709d2bc6ca451f/2022-10-15--08-13-54", HYUNDAI.HYUNDAI_SANTA_CRUZ_1ST_GEN),
CarTestRoute("6e7904b03a4aafc2/00000010--31034184b6", HYUNDAI.HYUNDAI_SANTA_CRUZ_2025),
CarTestRoute("4dbd55df87507948/2022-03-01--09-45-38", HYUNDAI.HYUNDAI_SANTA_FE),
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),
@@ -179,11 +182,14 @@ routes = [
CarTestRoute("6a42c1197b2a8179/2023-09-21--10-23-44", HYUNDAI.KIA_OPTIMA_H_G4_FL),
CarTestRoute("c75a59efa0ecd502/2021-03-11--20-52-55", HYUNDAI.KIA_SELTOS),
CarTestRoute("5b7c365c50084530/2020-04-15--16-13-24", HYUNDAI.HYUNDAI_SONATA),
CarTestRoute("4267ea8a353cdb36/00000262--8a427003c7", HYUNDAI.HYUNDAI_SONATA_2024, segment=34),
CarTestRoute("b2a38c712dcf90bd/2020-05-18--18-12-48", HYUNDAI.HYUNDAI_SONATA_LF),
CarTestRoute("c344fd2492c7a9d2/2023-12-11--09-03-23", HYUNDAI.HYUNDAI_STARIA_4TH_GEN),
CarTestRoute("fb3fd42f0baaa2f8/2022-03-30--15-25-05", HYUNDAI.HYUNDAI_TUCSON),
CarTestRoute("db68bbe12250812c/2022-12-05--00-54-12", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # 2023
CarTestRoute("36e10531feea61a4/2022-07-25--13-37-42", HYUNDAI.HYUNDAI_TUCSON_4TH_GEN), # hybrid
CarTestRoute("a01ca5d4f394c812/00000000--e98b7e4414", HYUNDAI.HYUNDAI_TUCSON_2025),
CarTestRoute("22f9090014364a87/00000002--4cc739c0b2", HYUNDAI.HYUNDAI_TUCSON_HEV_2025),
CarTestRoute("5875672fc1d4bf57/2020-07-23--21-33-28", HYUNDAI.KIA_SORENTO),
CarTestRoute("1d0d000db3370fd0/2023-01-04--22-28-42", HYUNDAI.KIA_SORENTO_4TH_GEN, segment=5),
CarTestRoute("fc19648042eb6896/2023-08-16--11-43-27", HYUNDAI.KIA_SORENTO_HEV_4TH_GEN, segment=14),
@@ -201,6 +207,8 @@ routes = [
CarTestRoute("ab59fe909f626921/2021-10-18--18-34-28", HYUNDAI.HYUNDAI_IONIQ_HEV_2022),
CarTestRoute("22d955b2cd499c22/2020-08-10--19-58-21", HYUNDAI.HYUNDAI_KONA),
CarTestRoute("0099bdb24d82951b/00000005--c38d940b04", HYUNDAI.HYUNDAI_KONA_2022),
CarTestRoute("32025f26789d8fab/00000022--a499e8ffa3", HYUNDAI.HYUNDAI_KONA_2ND_GEN),
CarTestRoute("97ca61196eb73e0d/00000052--4555329470", HYUNDAI.HYUNDAI_KONA_HEV_2ND_GEN),
CarTestRoute("efc48acf44b1e64d/2021-05-28--21-05-04", HYUNDAI.HYUNDAI_KONA_EV),
CarTestRoute("f90d3cd06caeb6fa/2023-09-06--17-15-47", HYUNDAI.HYUNDAI_KONA_EV), # openpilot longitudinal enabled
CarTestRoute("ff973b941a69366f/2022-07-28--22-01-19", HYUNDAI.HYUNDAI_KONA_EV_2022, segment=11),
@@ -214,7 +222,9 @@ routes = [
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("9b25e8c1484a1b67/2023-04-13--10-41-45", HYUNDAI.KIA_EV6),
CarTestRoute("baf39eeaba1217ca/00000002--b36e3fa031", HYUNDAI.KIA_K4_2025),
CarTestRoute("007d5e4ad9f86d13/2021-09-30--15-09-23", HYUNDAI.KIA_K5_2021),
CarTestRoute("c4a804b067623789/0000007c--163f831540", HYUNDAI.KIA_K5_2025),
CarTestRoute("c58dfc9fc16590e0/2023-01-14--13-51-48", HYUNDAI.KIA_K5_HEV_2020),
CarTestRoute("74fbff45aa20fe9e/00000010--6f173d5799", HYUNDAI.KIA_K7_2017),
CarTestRoute("78ad5150de133637/2023-09-13--16-15-57", HYUNDAI.KIA_K8_HEV_1ST_GEN),
@@ -233,6 +243,7 @@ routes = [
CarTestRoute("82e9cdd3f43bf83e/2021-05-15--02-42-51", HYUNDAI.HYUNDAI_ELANTRA_2021),
CarTestRoute("715ac05b594e9c59/2021-06-20--16-21-07", HYUNDAI.HYUNDAI_ELANTRA_HEV_2021),
CarTestRoute("7120aa90bbc3add7/2021-08-02--07-12-31", HYUNDAI.HYUNDAI_SONATA_HYBRID),
CarTestRoute("bc40c72b728178f2/00000006--ee76ae8c42", HYUNDAI.HYUNDAI_SONATA_HEV_2024),
CarTestRoute("715ac05b594e9c59/2021-10-27--23-24-56", HYUNDAI.GENESIS_G70_2020),
CarTestRoute("6b0d44d22df18134/2023-05-06--10-36-55", HYUNDAI.GENESIS_GV80),
@@ -373,8 +384,6 @@ 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,6 +53,7 @@ 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.3
total_ref_time = 8.2
brand_ref_times = {
'gm': 1.0,
'body': 0.1,
@@ -287,7 +287,6 @@ class TestFwFingerprintTiming(unittest.TestCase):
'volkswagen': 0.65,
'rivian': 0.3,
'psa': 0.1,
'mg': 0.1,
}
total_times = 0.0
@@ -79,7 +79,6 @@ 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]
@@ -105,6 +104,13 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"JEEP_CHEROKEE_5TH_GEN" = [1.5, 1.5, 0.15]
"ACURA_MDX_4G" = [1.4, 1.4, 0.17]
"ACURA_RDX_3G_MMR" = [1.5, 1.5, 0.16]
"HYUNDAI_KONA_2ND_GEN" = [2.5, 2.5, 0.1]
"HYUNDAI_KONA_HEV_2ND_GEN" = [2.5, 2.5, 0.1]
"KIA_SORENTO_2024" = [2.5, 2.5, 0.1]
"KIA_K5_2025" = [2.5, 2.5, 0.1]
"KIA_K4_2025" = [2.5, 2.5, 0.1]
"HYUNDAI_SANTA_CRUZ_2025" = [2.5, 2.5, 0.1]
"HYUNDAI_IONIQ_5_N" = [2.5, 2.5, 0.005]
# Dashcam or fallback configured as ideal car
"MOCK" = [10.0, 10, 0.0]
@@ -45,6 +45,11 @@ legend = ["LAT_ACCEL_FACTOR", "MAX_LAT_ACCEL_MEASURED", "FRICTION"]
"GENESIS_G90" = "GENESIS_G70"
"GENESIS_G80" = "GENESIS_G70"
"GENESIS_G70_2020" = "HYUNDAI_SONATA"
"HYUNDAI_SONATA_2024" = "HYUNDAI_SONATA"
"HYUNDAI_SONATA_HEV_2024" = "HYUNDAI_SONATA_HYBRID"
"HYUNDAI_TUCSON_2025" = "HYUNDAI_TUCSON_4TH_GEN"
"HYUNDAI_TUCSON_HEV_2025" = "HYUNDAI_TUCSON_4TH_GEN"
"HYUNDAI_TUCSON_PHEV_2025" = "HYUNDAI_TUCSON_4TH_GEN"
"HONDA_FREED" = "HONDA_ODYSSEY"
"HONDA_CRV_EU" = "HONDA_CRV"
@@ -65,6 +65,9 @@ class CarInterface(CarInterfaceBase):
if fw.ecu == "eps" and not fw.fwVersion == b'8965B47060\x00\x00\x00\x00\x00\x00':
ret.steerActuatorDelay = 0.25
CarInterfaceBase.configure_torque_tune(candidate, ret.lateralTuning, steering_angle_deadzone_deg=0.2)
# 2021+ TSS2 steering rack swapped into a TSS-P car, not supported
if fw.ecu == "eps" and fw.fwVersion == b'8965B47070\x00\x00\x00\x00\x00\x00':
ret.dashcamOnly = True
elif candidate in (CAR.LEXUS_RX, CAR.LEXUS_RX_TSS2):
stop_and_go = True
+1 -2
View File
@@ -10,13 +10,12 @@ 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 | MG | NISSAN | PSA | RIVIAN | SUBARU | TESLA | TOYOTA | VOLKSWAGEN
Platform = BODY | CHRYSLER | FORD | GM | HONDA | HYUNDAI | MAZDA | MOCK | 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,6 +118,8 @@ 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" 11 "B";
VAL_ 419 GEAR_SHIFTER 1 "P" 2 "R" 3 "N" 4 "D" 7 "L" 10 "S" 11 "B";
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_ 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";
@@ -951,7 +951,7 @@ 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_ 53 GEAR 0 "P" 4 "S" 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";
-327
View File
@@ -1,327 +0,0 @@
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 " ;
+1 -2
View File
@@ -34,7 +34,6 @@
#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))
@@ -248,6 +247,7 @@ 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,4 +368,3 @@ 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,6 +15,12 @@ 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;
@@ -227,6 +227,7 @@ 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_CCNC = 1024;
static const CanMsg HYUNDAI_CANFD_LKA_STEER_MSG_TX_MSGS[] = {
HYUNDAI_CANFD_LKA_STEER_MSG_COMMON_TX_MSGS(0, 1)
@@ -271,11 +272,21 @@ static safety_config hyundai_canfd_init(uint16_t param) {
HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(0, (longitudinal)) \
{0x160, 0, 16, .check_relay = (longitudinal)}, /* ADRV_0x160 */ \
#define HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_CCNC_TX_MSGS(longitudinal) \
HYUNDAI_CANFD_CRUISE_BUTTON_TX_MSGS(2) \
HYUNDAI_CANFD_LFA_STEERING_COMMON_TX_MSGS(0) \
HYUNDAI_CANFD_SCC_CONTROL_COMMON_TX_MSGS(0, (longitudinal)) \
{0x161, 0, 32, .check_relay = true}, /* CCNC_0x161 */ \
{0x162, 0, 32, .check_relay = true}, /* CCNC_0x162 */ \
{0x7C4, 2, 8, .check_relay = true}, /* 0x7C4 */ \
{0xEA, 2, 24, .check_relay = true}, /* MDPS */ \
hyundai_common_init(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_lka_steer_msg_alt = GET_FLAG(param, HYUNDAI_PARAM_CANFD_LKA_STEER_MSG_ALT);
const bool hyundai_ccnc = GET_FLAG(param, HYUNDAI_PARAM_CCNC);
safety_config ret;
if (hyundai_longitudinal) {
@@ -300,6 +311,10 @@ static safety_config hyundai_canfd_init(uint16_t param) {
HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_TX_MSGS(true)
};
static CanMsg hyundai_canfd_lfa_steering_camera_scc_ccnc_tx_msgs[] = {
HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_CCNC_TX_MSGS(true)
};
if (hyundai_canfd_alt_buttons) {
SET_RX_CHECKS(hyundai_canfd_alt_buttons_long_rx_checks, ret);
} else {
@@ -307,7 +322,11 @@ static safety_config hyundai_canfd_init(uint16_t param) {
}
if (hyundai_camera_scc) {
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_tx_msgs, ret);
if (hyundai_ccnc) {
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_ccnc_tx_msgs, ret);
} else {
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_tx_msgs, ret);
}
} else {
SET_TX_MSGS(HYUNDAI_CANFD_LFA_STEERING_LONG_TX_MSGS, ret);
}
@@ -368,7 +387,15 @@ static safety_config hyundai_canfd_init(uint16_t param) {
HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_TX_MSGS(false)
};
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_tx_msgs, ret);
static CanMsg hyundai_canfd_lfa_steering_camera_scc_ccnc_tx_msgs[] = {
HYUNDAI_CANFD_LFA_STEERING_CAMERA_SCC_CCNC_TX_MSGS(false)
};
if (hyundai_ccnc) {
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_ccnc_tx_msgs, ret);
} else {
SET_TX_MSGS(hyundai_canfd_lfa_steering_camera_scc_tx_msgs, ret);
}
if (hyundai_canfd_alt_buttons) {
SET_RX_CHECKS(hyundai_canfd_alt_buttons_rx_checks, ret);
-128
View File
@@ -1,128 +0,0 @@
#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,
};
+78 -15
View File
@@ -28,11 +28,19 @@
#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
@@ -46,6 +54,17 @@
#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}, \
@@ -59,6 +78,7 @@
{.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];
@@ -150,15 +170,41 @@ 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 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 (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 (violation){
@@ -173,38 +219,55 @@ 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();
// 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
#ifdef ALLOW_DEBUG
const uint16_t SUBARU_PARAM_LONGITUDINAL = 2;
subaru_longitudinal = GET_FLAG(param, SUBARU_PARAM_LONGITUDINAL);
#endif
safety_config ret;
if (subaru_gen2) {
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);
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);
} else {
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);
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);
}
return ret;
}
-2
View File
@@ -17,7 +17,6 @@
#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"
@@ -421,7 +420,6 @@ 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},
@@ -1019,6 +1019,8 @@ class SafetyTest(SafetyTestBase):
continue
if attr.startswith('TestHyundaiCanfd') and current_test.startswith('TestHyundaiCanfd'):
continue
if attr == 'TestElm327' and current_test.startswith(('TestHyundaiCanfdLFASteeringCCNC', 'TestHyundaiCanfdLFASteeringLongCCNC')):
tx = list(filter(lambda m: m[0] != 0x7C4, tx))
if {attr, current_test}.issubset({'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong'}):
continue
base_tests = {'TestHyundaiLongitudinalSafety', 'TestHyundaiLongitudinalSafetyCameraSCC', 'TestHyundaiSafetyFCEVLong',
+16 -7
View File
@@ -260,11 +260,11 @@ def enumerate_sites(input_source, preprocessed_file):
def _build_core_tests(catalog):
"""Build test ordering for core (non-mode) files.
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.
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.
"""
MAX_PER_METHOD = 5
method_freq = {}
method_by_module = {}
for name in sorted(catalog.keys()):
@@ -275,14 +275,23 @@ 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 = []
max_implementations = max(len(module_map) for module_map in method_by_module.values())
for round_idx in range(max_implementations):
for round_idx in range(MAX_PER_METHOD):
for m in sorted_methods:
ids = [method_by_module[m][module] for module in sorted(method_by_module[m])]
ids = method_ids.get(m, [])
if round_idx < len(ids):
ordered.append(ids[round_idx])
return ordered
@@ -21,6 +21,8 @@ ALL_GAS_EV_HYBRID_COMBOS = [
{"GAS_MSG": ("ACCELERATOR_ALT", "ACCELERATOR_PEDAL"), "SCC_BUS": 2, "SAFETY_PARAM": HyundaiSafetyFlags.HYBRID_GAS | HyundaiSafetyFlags.CAMERA_SCC},
]
CAMERA_SCC_COMBOS = ALL_GAS_EV_HYBRID_COMBOS[3:]
class TestHyundaiCanfdBase(HyundaiButtonBase, common.CarSafetyTest, common.DriverTorqueSteeringSafetyTest, common.SteerRequestCutSafetyTest):
@@ -308,5 +310,48 @@ class TestHyundaiCanfdLFASteeringLongAltButtons(TestHyundaiCanfdLFASteeringLongB
pass
class HyundaiCanfdCCNCTest:
CCNC_SAFETY_PARAM = HyundaiSafetyFlags.CCNC
@classmethod
def setUpClass(cls):
if cls.__name__ in (
"TestHyundaiCanfdLFASteeringCCNC",
"TestHyundaiCanfdLFASteeringLongCCNC",
):
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, self.CCNC_SAFETY_PARAM | self.SAFETY_PARAM)
self.safety.init_tests()
def test_ccnc_tx_msgs(self):
for msg, bus in (("CCNC_0x161", 0), ("CCNC_0x162", 0), ("MDPS", 2)):
self.assertTrue(self._tx(self.packer.make_can_msg_safety(msg, bus, {})))
self.assertTrue(self._tx(common.make_msg(2, 0x7C4)))
@parameterized_class(CAMERA_SCC_COMBOS)
class TestHyundaiCanfdLFASteeringCCNC(HyundaiCanfdCCNCTest, TestHyundaiCanfdLFASteeringBase):
TX_MSGS = [[0x12A, 0], [0x1E0, 0], [0x1CF, 2], [0x7C4, 2]]
RELAY_MALFUNCTION_ADDRS = {0: (0x12A, 0x1E0, 0x161, 0x162), 2: (0x7C4, 0xEA)}
FWD_BLACKLISTED_ADDRS = {2: [0x12A, 0x1E0, 0x161, 0x162], 0: [0x7C4, 0xEA]}
@parameterized_class(CAMERA_SCC_COMBOS)
class TestHyundaiCanfdLFASteeringLongCCNC(HyundaiCanfdCCNCTest, TestHyundaiCanfdLFASteeringLongBase):
CCNC_SAFETY_PARAM = HyundaiSafetyFlags.CCNC | HyundaiSafetyFlags.LONG
TX_MSGS = [[0x12A, 0], [0x1E0, 0], [0x1CF, 2], [0x7C4, 2], [0x1A0, 0]]
RELAY_MALFUNCTION_ADDRS = {0: (0x12A, 0x1E0, 0x161, 0x162, 0x1A0), 2: (0x7C4, 0xEA)}
FWD_BLACKLISTED_ADDRS = {2: [0x12A, 0x1E0, 0x161, 0x162, 0x1A0], 0: [0x7C4, 0xEA]}
if __name__ == "__main__":
unittest.main()
@@ -1,77 +0,0 @@
#!/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,10 +18,16 @@ 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
@@ -37,6 +43,18 @@ 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]}
@@ -116,6 +134,40 @@ 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
@@ -150,5 +202,51 @@ 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()
@@ -1620,6 +1620,16 @@
],
"package": "Highway Driving Assist"
},
"Hyundai Ioniq 5 N (with HDA II) 2024": {
"platform": "HYUNDAI_IONIQ_5_N",
"make": "Hyundai",
"brand": "hyundai",
"model": "Ioniq 5 N (with HDA II)",
"year": [
"2024"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Ioniq 6 (with HDA II) 2023-24": {
"platform": "HYUNDAI_IONIQ_6",
"make": "Hyundai",
@@ -1729,6 +1739,17 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona (without HDA II) 2024-25": {
"platform": "HYUNDAI_KONA_2ND_GEN",
"make": "Hyundai",
"brand": "hyundai",
"model": "Kona (without HDA II)",
"year": [
"2024",
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona Electric 2018-21": {
"platform": "HYUNDAI_KONA_EV",
"make": "Hyundai",
@@ -1763,6 +1784,16 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona Electric (without HDA II) 2024": {
"platform": "HYUNDAI_KONA_EV_2ND_GEN",
"make": "Hyundai",
"brand": "hyundai",
"model": "Kona Electric (without HDA II)",
"year": [
"2024"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona Electric Non-SCC 2019": {
"platform": "HYUNDAI_KONA_EV_NON_SCC",
"make": "Hyundai",
@@ -1783,6 +1814,18 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona Hybrid (without HDA II) 2024-26": {
"platform": "HYUNDAI_KONA_HEV_2ND_GEN",
"make": "Hyundai",
"brand": "hyundai",
"model": "Kona Hybrid (without HDA II)",
"year": [
"2024",
"2025",
"2026"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Kona Non-SCC 2019": {
"platform": "HYUNDAI_KONA_NON_SCC",
"make": "Hyundai",
@@ -1827,6 +1870,16 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Santa Cruz (without HDA II) 2025": {
"platform": "HYUNDAI_SANTA_CRUZ_2025",
"make": "Hyundai",
"brand": "hyundai",
"model": "Santa Cruz (without HDA II)",
"year": [
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Santa Fe 2019-20": {
"platform": "HYUNDAI_SANTA_FE",
"make": "Hyundai",
@@ -1896,6 +1949,18 @@
],
"package": "All"
},
"Hyundai Sonata (without HDA II) 2024-26": {
"platform": "HYUNDAI_SONATA_2024",
"make": "Hyundai",
"brand": "hyundai",
"model": "Sonata (without HDA II)",
"year": [
"2024",
"2025",
"2026"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Sonata Hybrid 2020-23": {
"platform": "HYUNDAI_SONATA_HYBRID",
"make": "Hyundai",
@@ -1909,6 +1974,17 @@
],
"package": "All"
},
"Hyundai Sonata Hybrid (without HDA II) 2024-25": {
"platform": "HYUNDAI_SONATA_HEV_2024",
"make": "Hyundai",
"brand": "hyundai",
"model": "Sonata Hybrid (without HDA II)",
"year": [
"2024",
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Staria 2023": {
"platform": "HYUNDAI_STARIA_4TH_GEN",
"make": "Hyundai",
@@ -1950,6 +2026,17 @@
],
"package": "All"
},
"Hyundai Tucson (without HDA II) 2025-26": {
"platform": "HYUNDAI_TUCSON_2025",
"make": "Hyundai",
"brand": "hyundai",
"model": "Tucson (without HDA II)",
"year": [
"2025",
"2026"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Tucson Diesel 2019": {
"platform": "HYUNDAI_TUCSON",
"make": "Hyundai",
@@ -1972,6 +2059,17 @@
],
"package": "All"
},
"Hyundai Tucson Hybrid (without HDA II) 2025-26": {
"platform": "HYUNDAI_TUCSON_HEV_2025",
"make": "Hyundai",
"brand": "hyundai",
"model": "Tucson Hybrid (without HDA II)",
"year": [
"2025",
"2026"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Tucson Plug-in Hybrid 2024": {
"platform": "HYUNDAI_TUCSON_4TH_GEN",
"make": "Hyundai",
@@ -1982,6 +2080,16 @@
],
"package": "All"
},
"Hyundai Tucson Plug-in Hybrid (without HDA II) 2025": {
"platform": "HYUNDAI_TUCSON_PHEV_2025",
"make": "Hyundai",
"brand": "hyundai",
"model": "Tucson Plug-in Hybrid (without HDA II)",
"year": [
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Hyundai Veloster 2019-20": {
"platform": "HYUNDAI_VELOSTER",
"make": "Hyundai",
@@ -2130,6 +2238,27 @@
],
"package": "No Smart Cruise Control (Non-SCC)"
},
"Kia K4 (with HDA II) 2025": {
"platform": "KIA_K4_2025",
"make": "Kia",
"brand": "hyundai",
"model": "K4 (with HDA II)",
"year": [
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Kia K4 (without HDA II) 2025-26": {
"platform": "KIA_K4_2025",
"make": "Kia",
"brand": "hyundai",
"model": "K4 (without HDA II)",
"year": [
"2025",
"2026"
],
"package": "Smart Cruise Control (SCC)"
},
"Kia K5 2021-24": {
"platform": "KIA_K5_2021",
"make": "Kia",
@@ -2143,6 +2272,16 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Kia K5 (without HDA II) 2025": {
"platform": "KIA_K5_2025",
"make": "Kia",
"brand": "hyundai",
"model": "K5 (without HDA II)",
"year": [
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Kia K5 Hybrid 2020-22": {
"platform": "KIA_K5_HEV_2020",
"make": "Kia",
@@ -2393,6 +2532,17 @@
],
"package": "Smart Cruise Control (SCC)"
},
"Kia Sorento (without HDA II) 2024-25": {
"platform": "KIA_SORENTO_2024",
"make": "Kia",
"brand": "hyundai",
"model": "Sorento (without HDA II)",
"year": [
"2024",
"2025"
],
"package": "Smart Cruise Control (SCC)"
},
"Kia Sorento Hybrid 2021-23": {
"platform": "KIA_SORENTO_HEV_4TH_GEN",
"make": "Kia",
+115 -115
View File
@@ -17,38 +17,38 @@ wheels = [
[[package]]
name = "cffi"
version = "2.1.1"
version = "2.1.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "pycparser", marker = "implementation_name != 'PyPy'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" }
sdist = { url = "https://files.pythonhosted.org/packages/57/5f/ff100cae70ebe9d8df1c01a00e510e45d9adb5c1fdda84791b199141de97/cffi-2.1.0.tar.gz", hash = "sha256:efc1cdd798b1aaf39b4610bba7aad28c9bea9b910f25c784ccf9ec1fa719d1f9", size = 531036, upload-time = "2026-07-06T21:34:30.382Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" },
{ url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" },
{ url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" },
{ url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" },
{ url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" },
{ url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" },
{ url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" },
{ url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" },
{ url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" },
{ url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" },
{ url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" },
{ url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" },
{ url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" },
{ url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" },
{ url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" },
{ url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" },
{ url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" },
{ url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" },
{ url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" },
{ url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" },
{ url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" },
{ url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" },
{ url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" },
{ url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" },
{ url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" },
{ url = "https://files.pythonhosted.org/packages/d3/67/85c89a59ba36a671e79638f44d466749f08179266a57e4f2ffdf92174072/cffi-2.1.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:02cb7ff33ded4f1532476731f89ede53e2e488a8e6205515a82144246ffa7dcc", size = 183845, upload-time = "2026-07-06T21:32:26.32Z" },
{ url = "https://files.pythonhosted.org/packages/ea/dd/e3b0baa2d3d6a857ac72b7efbf18e32e487c9cdafcc13049ad765495b15e/cffi-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5bce581e6b8c235e566a14768a943b172ada3ed73537bb0c0be1edee312d4e7", size = 184186, upload-time = "2026-07-06T21:32:28.025Z" },
{ url = "https://files.pythonhosted.org/packages/65/68/9f3ef890cf3c6ab97bd531c5677f67613d302165d16f8142b2811782a614/cffi-2.1.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:30b65779d598c370374fefabf138d456fd6f3216bfa7bedfab1ba82025b0cd93", size = 211892, upload-time = "2026-07-06T21:32:29.565Z" },
{ url = "https://files.pythonhosted.org/packages/22/d7/1a74539db16d8bfd839ff1515948948efbb162e574650fd3d846896eea95/cffi-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88023dfe18799507b73f1dbb0d14326a17465de1bc9c9c7655c22845e9ddc3a2", size = 218793, upload-time = "2026-07-06T21:32:30.951Z" },
{ url = "https://files.pythonhosted.org/packages/ec/d1/9a5b7169499e8e8d8e636de70b97ac7c9447104d2ff1a2cd94790cea5162/cffi-2.1.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:0a96b74cda968eebbad56d973efe5098974f0a9fb323865bf99ea1fd24e3e64c", size = 205737, upload-time = "2026-07-06T21:32:32.216Z" },
{ url = "https://files.pythonhosted.org/packages/ba/b0/e131a9c41f10607926278453d9596163594fe1c4ebc46efe3b5e5b34eb84/cffi-2.1.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a5781494d4d400a3f47f8f1da94b324f6e6b440a53387774002890a2a2f4b50f", size = 204909, upload-time = "2026-07-06T21:32:33.655Z" },
{ url = "https://files.pythonhosted.org/packages/fb/d2/4398416cd699b35167947c6e22aca52c47e69ad5695073c9f1f2c52e04aa/cffi-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aa7a1b53a2a4452ada2d1b5dade9960b2522f1e61293a811a077439e39029565", size = 217883, upload-time = "2026-07-06T21:32:35.173Z" },
{ url = "https://files.pythonhosted.org/packages/a2/a5/d4fe77b589e5e82d43ebc809bf2e6474afe8e48e32ea050b9357645b6471/cffi-2.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9d8272c0e483b024e1b9ad029821470ed8ec65631dbd90217469da0e7cd89f1c", size = 221251, upload-time = "2026-07-06T21:32:36.527Z" },
{ url = "https://files.pythonhosted.org/packages/22/f0/a2fc43084c0433caf7f461bccc013e28f848d04ee1c5ed7fce71423cf4d9/cffi-2.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7762faa47e8ff7eb80bd261d9a7d8eea2d8baa69de5e95b70c1f338bbe712f02", size = 214250, upload-time = "2026-07-06T21:32:37.852Z" },
{ url = "https://files.pythonhosted.org/packages/04/8c/b925975448cf20634a9fbd5efceb807219db452653648d2897c0989cab2d/cffi-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89095c1968b4ba8285840e131bf2891b09ae137fe2146905acae0354fbce1b5e", size = 219441, upload-time = "2026-07-06T21:32:39.146Z" },
{ url = "https://files.pythonhosted.org/packages/eb/da/5c4918a2d61d86fa927d716cb3d8e4626ef8dc8f605a599d32f33897f59a/cffi-2.1.0-cp311-cp311-win32.whl", hash = "sha256:64c753a0f87a256020004f37a1c8c02c480e725f910f0b2a0f3f07debd1b2479", size = 174496, upload-time = "2026-07-06T21:32:40.467Z" },
{ url = "https://files.pythonhosted.org/packages/f9/c8/6c2de1d55cf35ef8b92885d5ef280790f0fb9634d87ea1cc315176aecd61/cffi-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:4f26194e3d95e06501b942642855aed4f953d55e95d7d01b7c4483db3ecff458", size = 185113, upload-time = "2026-07-06T21:32:41.761Z" },
{ url = "https://files.pythonhosted.org/packages/9e/4e/e8d7cb5783f1841a3c8fb3a7735838d7484d08ec08c9f984b14cac1ac0e9/cffi-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:35aaea0c7ee0e58a5cd8c2fd1a48fdf7ece0d2699b7ecdda08194e9ce5dd9b3d", size = 179927, upload-time = "2026-07-06T21:32:42.961Z" },
{ url = "https://files.pythonhosted.org/packages/1e/85/990925db5df586ec90beb97529c853497e7f85ba0234830447faf41c3057/cffi-2.1.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:df2b82571a1b30f58a87bf4e5a9e78d2b1eff6c6ce8fd3aa3757221f93f0863f", size = 184829, upload-time = "2026-07-06T21:32:44.324Z" },
{ url = "https://files.pythonhosted.org/packages/4b/92/e7bb136ad6b5352603732cf907ef862ca103f20f2031c1735a46300c20c9/cffi-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:78474632761faa0fb96f30b1c928c84ebcf68713cbb80d15bab09dfe61640fde", size = 184728, upload-time = "2026-07-06T21:32:45.683Z" },
{ url = "https://files.pythonhosted.org/packages/c3/c0/d1ec30ffb370f748f2fb54425972bfef9871e0132e82fb589c46b6676049/cffi-2.1.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:5972433ad71a9e46516584ef60a0fda12d9dc459938d1539c3ddecf9bdc1368d", size = 214815, upload-time = "2026-07-06T21:32:48.557Z" },
{ url = "https://files.pythonhosted.org/packages/1b/dc/5620cf930688be01f2d673804291de757a934c90b946dbdc3d84130c2ea4/cffi-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b6422532152adf4e59b110cb2808cee7a033800952f5c036b4af047ee43199e7", size = 222429, upload-time = "2026-07-06T21:32:49.848Z" },
{ url = "https://files.pythonhosted.org/packages/4b/a4/77b53abbf7a1e0beb9637edbef2a94d15f9c822f591e85d439ffd91519a6/cffi-2.1.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:46b1c8db8f6122420f32d02fffb924c2fe9bc772d228c7c711748fff56aabb2b", size = 210315, upload-time = "2026-07-06T21:32:51.221Z" },
{ url = "https://files.pythonhosted.org/packages/58/0c/f528df19cc94b675087324d4760d9e6d5bfae97d6217aa4fac43de4f5fcc/cffi-2.1.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9fafc5aa2e2a39aaf7f8cc0c1f044a9b07fca12e558dca53a3cc5c654ad67a7", size = 208859, upload-time = "2026-07-06T21:32:52.512Z" },
{ url = "https://files.pythonhosted.org/packages/62/f2/c9522a81c32132799a1972c39f5c5f8b4c8b9f00488a23feaa6c06f07741/cffi-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e9f50d192a3e525b15a75ab5114e442d83d657b7ec29182a991bc9a88fd3a66", size = 221844, upload-time = "2026-07-06T21:32:53.704Z" },
{ url = "https://files.pythonhosted.org/packages/6e/28/bd53988b9833e8f8ad539d26f4c07a6b3f6bcb1e9e02e7ca038250b3428d/cffi-2.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98fff996e983a36d3aa2eca83af40c5821202e7e6f32d13ae94e3d2286f10cfe", size = 225287, upload-time = "2026-07-06T21:32:54.907Z" },
{ url = "https://files.pythonhosted.org/packages/79/99/0d0fd37f055224085f42bbb2c022d002e17dde4a97972822327b07d84101/cffi-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:379de10ce1ba048b1448599d1b37b24caee16309d1ac98d3982fc997f768700b", size = 223681, upload-time = "2026-07-06T21:32:56.329Z" },
{ url = "https://files.pythonhosted.org/packages/b0/80/c138990aa2a70b1a269f6e06348729836d733d6f970867943f61d367f8cc/cffi-2.1.0-cp312-cp312-win32.whl", hash = "sha256:9b8f0f26ca4e7513c534d351eca551947d053fac438f2a04ac96d882909b0d3a", size = 175269, upload-time = "2026-07-06T21:32:57.777Z" },
{ url = "https://files.pythonhosted.org/packages/a8/eb/f636456ff21a83fc13c032b58cc5dde061691546ac79efa284b2989b7982/cffi-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:c97f080ea627e2863524c5af3836e2270b5f5dfff1f104392b959f8df0c5d384", size = 185881, upload-time = "2026-07-06T21:32:59.253Z" },
{ url = "https://files.pythonhosted.org/packages/dd/2c/400ea43e721727dca8a65c4521390e9196757caba4a45643acb2b63271b8/cffi-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:6d194185eabd279f1c05ebe3504265ddfc5ad2b58d0714f7db9f01da592e9eb6", size = 180088, upload-time = "2026-07-06T21:33:02.278Z" },
]
[[package]]
@@ -132,41 +132,41 @@ requires-dist = [{ name = "requests" }]
[[package]]
name = "coverage"
version = "7.15.4"
version = "7.15.3"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/be/c3/4f2195f512fb172aa425a8803a874b2baa9ba7f80ff7b6080998761fc701/coverage-7.15.4.tar.gz", hash = "sha256:0548198fff07ccf4faf469520bce1c2eceb1ce3e62891921138dec10907f9d00", size = 936952, upload-time = "2026-08-06T13:50:24.442Z" }
sdist = { url = "https://files.pythonhosted.org/packages/f4/45/78dbf9604ee5b3db24efbf26bed1cb58862fb40480cba821963c69348751/coverage-7.15.3.tar.gz", hash = "sha256:ae7ea5a4614acf399ef0483c4cb34f8f8f01df848d8fcbe7d3ce0865733f1c4d", size = 935592, upload-time = "2026-08-02T18:50:17.006Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/66/edcec7d7a0b524aa8923e22925fde6fe50ce005a113dca13ae1581455c4c/coverage-7.15.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbac5abad70df71019988f83f26ac7092ff2642975def4429e98dc7585ef3490", size = 222367, upload-time = "2026-08-06T13:47:15.578Z" },
{ url = "https://files.pythonhosted.org/packages/e6/c6/ab8de429e2e8548faf58ec7e1674a4ce00414b4113942d3fe87109cf0f68/coverage-7.15.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:357a173465c7ce028d07a95cc2b63b5bf59f50ecdd5ad75c5cbb78ada984048e", size = 222874, upload-time = "2026-08-06T13:47:16.961Z" },
{ url = "https://files.pythonhosted.org/packages/be/c4/3b7b49587e8a6b9af79b3eb468d443d6042b6d65b47aa26586846a0d6566/coverage-7.15.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:21b803935e2efc3acebe9697197a294fccf5dc4e5382bd6369542ff7a7d2a1d7", size = 253287, upload-time = "2026-08-06T13:47:18.291Z" },
{ url = "https://files.pythonhosted.org/packages/fb/65/ec03b743a2a229c72cc1eff3e57be9d3564e9c6b4d5aba2d70744a3fc0d8/coverage-7.15.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7a2b580774a4786c1053157c0165e04476e03ff293993d7c148eee784a94bae6", size = 255199, upload-time = "2026-08-06T13:47:19.765Z" },
{ url = "https://files.pythonhosted.org/packages/41/4b/5163729e4b6582d61975cfd3ccab45b4ec53e21cf156d9941cb025188468/coverage-7.15.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9464451c4efffe8d47ace5a540b10b0dc10e879066290f8600872b7f54a419d", size = 257308, upload-time = "2026-08-06T13:47:21.206Z" },
{ url = "https://files.pythonhosted.org/packages/86/08/2167a0f08fb87d702fa423a48578a32865464b7c9e1db3911ad7812ab414/coverage-7.15.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de602f34123c2f4af1c1869c6dbbbd60da6d5983bf01937367295d135cccbfce", size = 259268, upload-time = "2026-08-06T13:47:22.503Z" },
{ url = "https://files.pythonhosted.org/packages/1e/e5/68eebae3053dbd48508edea559c21b23fbdf3460784f91370c83a86a6acd/coverage-7.15.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6879ded16a27f3eeca19b900c147e81616e7054db451471a611b2755ee5249f7", size = 253392, upload-time = "2026-08-06T13:47:23.88Z" },
{ url = "https://files.pythonhosted.org/packages/1a/46/fd4ced40a2b691c774e515c9b69500bfa64c7960b67fcee4b2f6fad97fc3/coverage-7.15.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:986be58c3ab54aae8d3496a6225eea74f760fdbe739b38bd442c7e8d133aa53b", size = 255001, upload-time = "2026-08-06T13:47:25.469Z" },
{ url = "https://files.pythonhosted.org/packages/53/25/ae2e5fa710bb6957a9aadeb9e3598d3b3e4af6587ce857ad42e8639a3f30/coverage-7.15.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c6103639613fe6c1e989082948419bc77a2d26b6c825c99d7fad25f7d3d87afc", size = 253061, upload-time = "2026-08-06T13:47:26.845Z" },
{ url = "https://files.pythonhosted.org/packages/d7/31/67ddc0365db2c6e93ac8580bc4bbc50f65273262f973f63ebcdbc15c0495/coverage-7.15.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d3af93dddb5659276c63bc16ac6466ac2033a70ca816097bbc06345b8ccdf571", size = 256831, upload-time = "2026-08-06T13:47:28.217Z" },
{ url = "https://files.pythonhosted.org/packages/f6/78/82b8fd18f57fb13f12d98fe874995bb2c4f9f17be8aff762c426323fdb96/coverage-7.15.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b10075e5421d04265766a6d1dac809bbeb8a946fbb23c8f82c227409b2190719", size = 252781, upload-time = "2026-08-06T13:47:29.712Z" },
{ url = "https://files.pythonhosted.org/packages/0a/eb/6c74ef4dd12b252e573c49bdef9e2ac265bf3dbb79b8d7feb3266e084e9e/coverage-7.15.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a67a9f78b2942d87ba8ce3059c642164d2aedd65337377fb52fe9803656bc5c7", size = 253692, upload-time = "2026-08-06T13:47:31.192Z" },
{ url = "https://files.pythonhosted.org/packages/5a/66/eb9aed1c3fd2d36ee00eb173f434b14fa607fc056739c9a89ff4244010ea/coverage-7.15.4-cp311-cp311-win32.whl", hash = "sha256:69484d1aca26e322e1c3ce03f09341e84524ababad2d7202161738d83cc9f82e", size = 224461, upload-time = "2026-08-06T13:47:32.572Z" },
{ url = "https://files.pythonhosted.org/packages/e2/6d/81fa4161dfb3ed9d74e40d58647eff83a56b7612e78352581280fce2f477/coverage-7.15.4-cp311-cp311-win_amd64.whl", hash = "sha256:63fd6fcd1dd6e158f7eb78606e72933b3f6d01e7b747f99c6c12d764307a0fdc", size = 224937, upload-time = "2026-08-06T13:47:34.205Z" },
{ url = "https://files.pythonhosted.org/packages/5b/c1/d8dacf683c6cad3cf85ce68fd3774a6774ec402128822fdfaed920f11e6a/coverage-7.15.4-cp311-cp311-win_arm64.whl", hash = "sha256:ea82116c9893fa89e929b7f197ee5a1950a76e91cc5c85ba503fc02379d04890", size = 224479, upload-time = "2026-08-06T13:47:36.118Z" },
{ url = "https://files.pythonhosted.org/packages/1d/48/bc8d4ba7b37551a767bd863f15b3f80182b271c2f55975356f5f7dbe94c2/coverage-7.15.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4fedd1f7f428f9fe83b1ead5e7cc87a43427be31aadafbac3ac0636dc7abb22", size = 222543, upload-time = "2026-08-06T13:47:37.562Z" },
{ url = "https://files.pythonhosted.org/packages/20/dd/88d6f83f1fffc974a3691a34a97951c5b12df7512a6782c5963883cbc058/coverage-7.15.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:37e2f0cdf58e2e1fed4e4d5a8f8786ae2f7eb80b478016876667dc4a01d60a97", size = 222905, upload-time = "2026-08-06T13:47:38.927Z" },
{ url = "https://files.pythonhosted.org/packages/bd/5c/54ee0d4748585bb0acab9891cd8d92f2d3593165b4e59fc9de113bfb3140/coverage-7.15.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fb55d0e70bb15f2e81477613627286581414693d74ac7963c93a790dd453ca9d", size = 254407, upload-time = "2026-08-06T13:47:40.488Z" },
{ url = "https://files.pythonhosted.org/packages/8c/3f/f0642a372f494bd0d7dad3b497083b910194a5f1c88be2c94fef707c3b59/coverage-7.15.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:899b9da30f3c6c336566e3707495bb23e8302d39d862f01fa78c48b99b9437e2", size = 257145, upload-time = "2026-08-06T13:47:41.931Z" },
{ url = "https://files.pythonhosted.org/packages/71/17/8b46d0ed68251016002ec972c8fc0119961a765d0984cafb8bf317c43758/coverage-7.15.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d15715e8c46552827e5e4f30a35575a2dbcad14454cf3284c54483946bd16931", size = 258257, upload-time = "2026-08-06T13:47:43.527Z" },
{ url = "https://files.pythonhosted.org/packages/30/b8/8498a0e72d0adbe15477dd07463d2b3bb2c9f6a4815e8589e50939e2c3ae/coverage-7.15.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:002a438859f7b430bc99afeaf01a6d187dad1d0dc907b64cdeffc632a5db8fd8", size = 260517, upload-time = "2026-08-06T13:47:45.121Z" },
{ url = "https://files.pythonhosted.org/packages/41/e1/7dce19c3bdb1e3dd63e769508216500edad81bd5f69a26d724e32aceaf78/coverage-7.15.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e4193a04b518f7968f3099755f5509ee7cccc6dc2b92a6b14841934d22e222c9", size = 254785, upload-time = "2026-08-06T13:47:46.541Z" },
{ url = "https://files.pythonhosted.org/packages/dd/b1/e1494703c675a2561723cd9b89f45c9168782c31280c611b1f767851e57c/coverage-7.15.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e98dcc55d572b38e69d117da7e8e8efb8500f1f5eaf81ecd460a63220790b839", size = 256176, upload-time = "2026-08-06T13:47:48.155Z" },
{ url = "https://files.pythonhosted.org/packages/73/76/a5629d270fb638a43a4b10466f51e2f49d532c1aa4da2913cbbb150bbe0a/coverage-7.15.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:af6c538498ce66c10d3fd541c2a8d5b03da5850355add34e6cba564210cb9e72", size = 254321, upload-time = "2026-08-06T13:47:49.757Z" },
{ url = "https://files.pythonhosted.org/packages/ff/4f/9c44447218435d5766b911534f9d798144a5560f85e9a54ebe5f3f5d19f9/coverage-7.15.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1d10025d96ea89fc2f73714dbc4cbd433fe012c1ac9e23f895d7728b238b6e52", size = 258390, upload-time = "2026-08-06T13:47:51.248Z" },
{ url = "https://files.pythonhosted.org/packages/de/36/c1e127616fb3fa18a9ff71e76c417f2fd7424332a4870015ac224ef4c039/coverage-7.15.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d802e1947603162ded419bff83ac7489820355d2b856dfb09206574e3a37ac0c", size = 253894, upload-time = "2026-08-06T13:47:52.816Z" },
{ url = "https://files.pythonhosted.org/packages/e9/b9/fdb92c8ae7a8bb9b850cc253b7b3b9c8526f68130002048b5671cd510d09/coverage-7.15.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c2de40895718f91951b86712b4c5b694acaf9a0a49be13874896f599a1eed3f4", size = 255763, upload-time = "2026-08-06T13:47:54.296Z" },
{ url = "https://files.pythonhosted.org/packages/6f/c0/a7d51b2587c7bdb76e71b0896d2565bf7d60436b5122fc83e511adb1f7cd/coverage-7.15.4-cp312-cp312-win32.whl", hash = "sha256:5c3431b2161279b7db5c2a1aa58ae02e5cb8c3c42d93a5094be3f5537bd5b11b", size = 224597, upload-time = "2026-08-06T13:47:56.074Z" },
{ url = "https://files.pythonhosted.org/packages/49/b9/5c5f80cc55f5acaaca6dee677626bfcec8c87204a7809b438b08e84f4571/coverage-7.15.4-cp312-cp312-win_amd64.whl", hash = "sha256:6befeab5fb2b51c958ca4ac6c5d141a1e8240f4f76e46350f1911963deda49cd", size = 225135, upload-time = "2026-08-06T13:47:57.52Z" },
{ url = "https://files.pythonhosted.org/packages/47/e4/2a4561f89ff6bf7c925c287d0f2cce8bdf139c3a33735c87e3203401cf94/coverage-7.15.4-cp312-cp312-win_arm64.whl", hash = "sha256:67bc345491ab55b837277d76f5775d057e8c7f1ac44d890d8c2c82adde258c6f", size = 224515, upload-time = "2026-08-06T13:47:58.977Z" },
{ url = "https://files.pythonhosted.org/packages/b4/d9/e70c286c979378f061d8266e279b686ab0b0b688e1fe0af864684f23a77d/coverage-7.15.4-py3-none-any.whl", hash = "sha256:964730a1e9de9c0cf11be6a1a3c79ce419c34882842abd256086ba4698705e84", size = 214332, upload-time = "2026-08-06T13:50:22.192Z" },
{ url = "https://files.pythonhosted.org/packages/b3/9c/c8a3a923c24f631695cea2d5e2f02e776bc0af6e03800626e13a6c05a615/coverage-7.15.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5f3f854ab4599d98f7799ac9b91e34e8ec9ebc9a6372ee8c1f3413a68cc8b5e9", size = 222328, upload-time = "2026-08-02T18:47:49.228Z" },
{ url = "https://files.pythonhosted.org/packages/92/51/dda77f34cbd2513d6ffb898c901d19e9ca55f48c0cbc4a1eb173a97d157a/coverage-7.15.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75268348fee1f199653b8a846262aec5581c6bb008c4f58824959fb708cc688f", size = 222832, upload-time = "2026-08-02T18:47:51.219Z" },
{ url = "https://files.pythonhosted.org/packages/78/59/e0faafc4c6e23bd76c76148875ee9ec5781b8f1cd62cea2bc4ca0f0f0e5d/coverage-7.15.3-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:21081739f6264cc594cad2d42b62befbd17633824022866c68720eb0c4b8d6b4", size = 253250, upload-time = "2026-08-02T18:47:52.737Z" },
{ url = "https://files.pythonhosted.org/packages/14/e2/4b1e0eeb727ffb471e411c1bd3402184b5dd54a77a762b0e55e87cdf9ae3/coverage-7.15.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:718d366251b060c10731c7dd359de6caea72250036eb94576aa56dacbf830a11", size = 255160, upload-time = "2026-08-02T18:47:54.404Z" },
{ url = "https://files.pythonhosted.org/packages/e9/9e/a602d2d48f9db9f795e578a86aa914f7b20008e9330902defcfb73d17b3a/coverage-7.15.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fa1bbaa502a6e877f3ee67cbac3eba2bb637f623e454e6c37b81b38896dbd48f", size = 257269, upload-time = "2026-08-02T18:47:56.157Z" },
{ url = "https://files.pythonhosted.org/packages/22/fa/bf6db13df2fcee00d2671849fe58c99232ee79a01fec7478c2bf7839b9e1/coverage-7.15.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:494880c9e60782610683f4eb9b65cce4f886673596b8f3cb2dfa079fc551c743", size = 259231, upload-time = "2026-08-02T18:47:57.76Z" },
{ url = "https://files.pythonhosted.org/packages/89/37/8118f13b17fa7d9a3aa2c301d93f2d5ffeef70fa7e27e639a74bdacd3fea/coverage-7.15.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3db264ea689f9e8f9fa4fb9005fee4048c3bff4a547f4cfa27f5086cb0804ec0", size = 253357, upload-time = "2026-08-02T18:47:59.261Z" },
{ url = "https://files.pythonhosted.org/packages/97/6d/c7b94fb03962f4d6f0fe13d01c4eb9c4c6e2e714a20d074516ec7582b110/coverage-7.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4e869d4799674d67778e76ddbe2e26cf1673369262e231a8ec259421b1015fea", size = 254961, upload-time = "2026-08-02T18:48:00.901Z" },
{ url = "https://files.pythonhosted.org/packages/87/f9/fe0bd415fa56e36b62b649017c8fc98330858be4c7593789efb78cd24178/coverage-7.15.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:696fc7a28bbf717aba8d2c6963d26702945c7832cb313ba3b323aa5b1afb3156", size = 253024, upload-time = "2026-08-02T18:48:02.745Z" },
{ url = "https://files.pythonhosted.org/packages/c1/7c/ffa53506d63ba8a77f5b9557dd6f5a5a5ad85adc680d7857410138f82bd9/coverage-7.15.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3fe9be1c527497d047f770d88a0110189714c36383bb88384508f750c302bffa", size = 256792, upload-time = "2026-08-02T18:48:04.377Z" },
{ url = "https://files.pythonhosted.org/packages/1f/c6/df42458e72c18a49fe87e40ccd3fb0314210915256cf4a5593e1b3250e04/coverage-7.15.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2400591f4b2e33746c70846388f8bb4c7e33b820e31cb8c6cb2f25305310438b", size = 252744, upload-time = "2026-08-02T18:48:06.154Z" },
{ url = "https://files.pythonhosted.org/packages/f1/14/8bf18a4b10a44f8ba5f604b00e102f37daf49d581d66a37dc33fa267e1a6/coverage-7.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2e557178799282269412a672e5753f2179edfe1b3f0f19b0c98f8e72d482326a", size = 253652, upload-time = "2026-08-02T18:48:07.955Z" },
{ url = "https://files.pythonhosted.org/packages/27/e6/e530c9bb94e4155817cbd149034105b062a6913bc356ae08f454d155de53/coverage-7.15.3-cp311-cp311-win32.whl", hash = "sha256:68ea6c947375982ae907e19e9d2ef156bd6e68e11f3566dd568d7f4ec974e715", size = 224428, upload-time = "2026-08-02T18:48:09.845Z" },
{ url = "https://files.pythonhosted.org/packages/b4/98/0050c692d120988f1973a15196f52dee4ae221848b760281461a2005b613/coverage-7.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:28743dad31622e8c474b17446118037361f5b1f4f2ecdf72d4f6fde246d64446", size = 224906, upload-time = "2026-08-02T18:48:11.611Z" },
{ url = "https://files.pythonhosted.org/packages/b0/ae/c0ef3e2ba3f35fc1c6985811a40edd9331e5b8978c9ecf84699de3edacbe/coverage-7.15.3-cp311-cp311-win_arm64.whl", hash = "sha256:c4398918c4fda32718191239e451fd86ac5ad1e8979b592f1921ee2d1f038965", size = 224448, upload-time = "2026-08-02T18:48:13.304Z" },
{ url = "https://files.pythonhosted.org/packages/d1/6c/bac99d9d4c6abe856e93bf3f5212982ac0bfac126dd4a042753bd53bc5af/coverage-7.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:79a3e32e83227d83d9684459ed579769b56c369ac2d7313099b2d9e031d2e10f", size = 222499, upload-time = "2026-08-02T18:48:15.018Z" },
{ url = "https://files.pythonhosted.org/packages/aa/bc/cb9a39b083bc1aa70586482dab25c9be20bab0ec6c155340e50d9066bb1e/coverage-7.15.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:767feb87c5886d781d0a69fafd450a20826ddab7b79bce1665deb64d21441b60", size = 222866, upload-time = "2026-08-02T18:48:16.884Z" },
{ url = "https://files.pythonhosted.org/packages/58/fb/beaa453d62000a0a5b39838bee2a137afe609a50a71f55e83c73461e513b/coverage-7.15.3-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:50951e37033c40548d777b8a8454a2cd622dba1136780065678dccaec307c47f", size = 254367, upload-time = "2026-08-02T18:48:18.507Z" },
{ url = "https://files.pythonhosted.org/packages/66/64/43e72500ed6815cef189f9193f29d7af4b078830337c95ea976cd0c0d427/coverage-7.15.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:63a4ff67364afb2cac826b8bbd78a5c50ce656a7b7137436b44d7b96a9271088", size = 257103, upload-time = "2026-08-02T18:48:20.172Z" },
{ url = "https://files.pythonhosted.org/packages/66/3a/2893e2937adfe02f45fd38e4a8a0a0d8b7a02ff9e012ac3d009bee3c4f16/coverage-7.15.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e95e42856509675fe26560310313a6117640e96f9a1e19bb3d220116a27c94c", size = 258220, upload-time = "2026-08-02T18:48:21.963Z" },
{ url = "https://files.pythonhosted.org/packages/30/b4/d5e6e2eb1a62961083734291304b1f85df72e2abe95c76eb88a7f472afd0/coverage-7.15.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:abad631cba27094b4631993f4c72e89ac0ca1b3a0236c7abaf8ca79aea619851", size = 260481, upload-time = "2026-08-02T18:48:23.682Z" },
{ url = "https://files.pythonhosted.org/packages/dc/c9/9b72c5c6a9798a9a12cf65f66e077cc1fdd396e61915c862688f9afe1cae/coverage-7.15.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2b0807f1f051dd82a234ad6acdb6f1425baede60be1e84e862496c8cc9262ab9", size = 254749, upload-time = "2026-08-02T18:48:25.32Z" },
{ url = "https://files.pythonhosted.org/packages/92/20/e1c2f759e2dbce559ba85c40c0e4acfecc6cff4b740c294c88e41ccc6111/coverage-7.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8d6df7aeb5bc464040bbc9ae173d875785d3677ebc4307817997d622d74225e", size = 256138, upload-time = "2026-08-02T18:48:27.064Z" },
{ url = "https://files.pythonhosted.org/packages/a5/ab/48cc7e760f769e86ae290a125ea6e7209dfbdbbbb7ff4f5d9d1ee7a45d57/coverage-7.15.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:974471c506c9f5758808b47c1ebf7949ecd0848f5c1020e78675fefe5ff46866", size = 254283, upload-time = "2026-08-02T18:48:29.082Z" },
{ url = "https://files.pythonhosted.org/packages/15/26/39529a68154f99b3a1829debd8b25eac384effeec890a293b5bbdcb49186/coverage-7.15.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5cba0c9c13e35c86df7998f1afaf6b1da224a3a39e4da59bdabf60c148046dcb", size = 258352, upload-time = "2026-08-02T18:48:30.892Z" },
{ url = "https://files.pythonhosted.org/packages/91/2f/55b82aa3d8d7dd8023a56e7c5c2a70e39a3c44b3353c6cf3faec9ad51566/coverage-7.15.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:4d608dc36a364dce33acbf4fc3a50f9d2054c945f233bb0a2cdb4b90bfa17646", size = 253852, upload-time = "2026-08-02T18:48:32.934Z" },
{ url = "https://files.pythonhosted.org/packages/6a/6d/839f4045124cd3518ecf2c58967e58a911202834e7c5a03cfdf2ab0b29f6/coverage-7.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2395869280554a1941da904423c12660c39f721315e1c02d076a7fe0971382f0", size = 255725, upload-time = "2026-08-02T18:48:34.848Z" },
{ url = "https://files.pythonhosted.org/packages/75/21/d25e3e2a9e327798078c877f469dfb6def860bf6e25036529046227d3e15/coverage-7.15.3-cp312-cp312-win32.whl", hash = "sha256:24f3b21840c3eb76cef3cc70b2bf6649010c64471a84a446538a39306e1ba04d", size = 224566, upload-time = "2026-08-02T18:48:36.661Z" },
{ url = "https://files.pythonhosted.org/packages/b1/0f/df90cc1e8d095ce263968a93e04829821b2afb31ac2752c06a2e0a8e3c13/coverage-7.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:fa7b17902c3c1dd8a7adb52679b7f6340bba08443d710c8838e04db8cf62be2a", size = 225098, upload-time = "2026-08-02T18:48:38.941Z" },
{ url = "https://files.pythonhosted.org/packages/65/c7/ec49e43c58967a07163e2d1c6bbd58112b825b2772ab66784afd6a5400ba/coverage-7.15.3-cp312-cp312-win_arm64.whl", hash = "sha256:fcbe83fb7258eacd293bf5322d88807acb35ed12a5cfa99dd8215c083e3b0235", size = 224485, upload-time = "2026-08-02T18:48:40.682Z" },
{ url = "https://files.pythonhosted.org/packages/37/e7/7069b3d6c018917f49ba2e1c5fb910e498c7fefa3a1b78cb1b79e61ff45d/coverage-7.15.3-py3-none-any.whl", hash = "sha256:da78fa6fc7dafe4212839173133ee85afcf42c5cd5f3e47fa7c1c210453b445e", size = 214297, upload-time = "2026-08-02T18:50:14.709Z" },
]
[[package]]
@@ -361,24 +361,24 @@ wheels = [
[[package]]
name = "numpy"
version = "2.5.2"
version = "2.5.1"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.12'",
]
sdist = { url = "https://files.pythonhosted.org/packages/9a/80/db0b4559e57ec36362bedbb05530a87fafbcb6067708c946967a41d449e7/numpy-2.5.2.tar.gz", hash = "sha256:d482d171c406ae88c5b19cad3b6a1c4c5209f886ab74bc44c2c865c23f52d860", size = 20773161, upload-time = "2026-08-09T13:48:27.962Z" }
sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/69/72/dccb0aaf40972777283303919f613964227266d0c13adebb79ac124f1c3e/numpy-2.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:14e373cfc6387177e8409dac3c7159be8eb05cd77096cd7c950268b86f62831c", size = 16891693, upload-time = "2026-08-09T13:44:51.702Z" },
{ url = "https://files.pythonhosted.org/packages/60/2e/b5aee50a1f74ac815cf8331812cb8251e29024025de462e0c047641c614c/numpy-2.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbd96c833ecc8cc069ce518078fc8c60cb9cbfb0fea5b7a803ad65035596d03", size = 11903109, upload-time = "2026-08-09T13:44:55.501Z" },
{ url = "https://files.pythonhosted.org/packages/f3/f4/29e78102a80601cf034d4e9767022cffeca2c3b4c926e1754572ca95593d/numpy-2.5.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:6e8172ddfcf5cf74b811d372b570b83c60bd2de87a6fbfbebdadb4a9bd9c6cbb", size = 5350202, upload-time = "2026-08-09T13:44:58.401Z" },
{ url = "https://files.pythonhosted.org/packages/11/4b/dcd3b7eadaf4035d2c7a4289d232523a6964f602598ef7674e4bd7291f93/numpy-2.5.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:65f188481f1669e26f62b701e8205d19e460fa4a9b52a1414ba382330e4a3414", size = 6687736, upload-time = "2026-08-09T13:45:00.813Z" },
{ url = "https://files.pythonhosted.org/packages/e5/21/4947e0e9d6c9fc2e2ff15b8949049ee44f63adb9cacc729ab8793f97e712/numpy-2.5.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8ee9c4eeb8454b3660a8b53493563c3e121c2fc94fbd72b848ef814ed7b676a9", size = 15612696, upload-time = "2026-08-09T13:45:04.151Z" },
{ url = "https://files.pythonhosted.org/packages/3a/5f/62d28cf019460c7f1394105b4d49d9911a9c444cb77ab0bd95a204c5a6de/numpy-2.5.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3cdec01fa790a186d430433fdd4d4ffb70eed6f0eeb4bf05c8dbe2dce0a9bcb8", size = 16722264, upload-time = "2026-08-09T13:45:07.714Z" },
{ url = "https://files.pythonhosted.org/packages/14/25/3f0be4c1b9fdf5dd5e708a6806978564d7c46a055c000496309ff2a2f8af/numpy-2.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7999d4ddb0c4025018373fd787510d46e04c769467af22869707b3c1cfd459ab", size = 16974396, upload-time = "2026-08-09T13:45:11.316Z" },
{ url = "https://files.pythonhosted.org/packages/22/72/6262cbdeeb45da9d971e40715f579d791603ba8ec0b5e2db1ac55454421d/numpy-2.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1f017dc0875c9209d219f97feceb7d54c2661bb243deb4114478e1295808af7", size = 18476044, upload-time = "2026-08-09T13:45:14.869Z" },
{ url = "https://files.pythonhosted.org/packages/36/33/29208b8b075bde62d26a81d14b358c42b0f69b6cabd98d4ff97f37f22b05/numpy-2.5.2-cp312-cp312-win32.whl", hash = "sha256:d6a48072864e3324e194a8fbb3c657bcc5b5c869dbc64c9537b1d5c862572c0a", size = 6072817, upload-time = "2026-08-09T13:45:17.867Z" },
{ url = "https://files.pythonhosted.org/packages/7f/b9/87fea2769fe1c47c1b5b01d8310772c9d1a85d485de7cf386ef7a3332b02/numpy-2.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:28ac63476ec7651484215ee7fa15a1f78b57c14621f01e392afe17b9a1390ce4", size = 12464674, upload-time = "2026-08-09T13:45:20.734Z" },
{ url = "https://files.pythonhosted.org/packages/14/52/032b97e00461ab0809bbe4c588b035620e5a14b8cdee47ecddefc7b17d33/numpy-2.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:27650bb0e7140fa3d37b9923b4803645e0b125d190f326eecfd3f4dad8e8ade1", size = 10397131, upload-time = "2026-08-09T13:45:23.73Z" },
{ url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" },
{ url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" },
{ url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" },
{ url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" },
{ url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" },
{ url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" },
{ url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" },
{ url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" },
{ url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" },
{ url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" },
{ url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" },
]
[[package]]
@@ -387,7 +387,7 @@ version = "0.3.1"
source = { editable = "." }
dependencies = [
{ name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" },
{ name = "numpy", version = "2.5.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" },
{ name = "pycapnp" },
{ name = "pycryptodome" },
{ name = "tqdm" },
@@ -537,27 +537,27 @@ wheels = [
[[package]]
name = "ruff"
version = "0.16.2"
version = "0.16.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/73/e1/4508a569211b35599016e84ba65c1a992b7a4004b4b6c4bea02a851cba1b/ruff-0.16.2.tar.gz", hash = "sha256:c3d7828d12e8927a6fc65fe38e2c2541b9e762d360a1786d752cb1b8883b3c9c", size = 4885811, upload-time = "2026-08-07T13:31:01.432Z" }
sdist = { url = "https://files.pythonhosted.org/packages/70/25/7113f6d5498888c5fb7db34081cba7d5971c4cb1bfb26819966eee68f003/ruff-0.16.1.tar.gz", hash = "sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7", size = 4877500, upload-time = "2026-07-30T19:37:01.379Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/14/57/db19951540f98859c956b50bdb4d31089b4d91e9f15e2968e7d5193806d5/ruff-0.16.2-py3-none-linux_armv6l.whl", hash = "sha256:3c8de4cf2181f01d57946d87d777aa52916976fc09942aed89938fab5e013318", size = 10847925, upload-time = "2026-08-07T13:30:14.468Z" },
{ url = "https://files.pythonhosted.org/packages/13/5a/995fe85a8470d3e391ac0f7fa8054bb454eaf33ee138196d6172ed1079c0/ruff-0.16.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9a48cc05c6fbc811ca81b5d7ba95375affea6582d1b8024e455e41afbbf55344", size = 11072662, upload-time = "2026-08-07T13:30:18.143Z" },
{ url = "https://files.pythonhosted.org/packages/32/53/370d767c61c71a971a4ace36703a7ecd8c393956349a7325d7fab2b56827/ruff-0.16.2-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a2c0d14fcbb26c91f0f867a6dc9bd71bbc30b1b6151829c884f23faeab2e5700", size = 10566771, upload-time = "2026-08-07T13:30:20.899Z" },
{ url = "https://files.pythonhosted.org/packages/85/d6/9d96948caf5a632be62d62202d5ec914d6856f204fd79eb036e5915e79ea/ruff-0.16.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:335c621622c4650330be50842561c6586ac6971bb8ab5407fe34dcc9efb16bbe", size = 10975825, upload-time = "2026-08-07T13:30:23.517Z" },
{ url = "https://files.pythonhosted.org/packages/3b/92/ea87129b3414acb0b5770563779c51804d37ac67675c7ba35447ddb14773/ruff-0.16.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:20e66910f2c37cc753f9ef6580c914a621b80c4fa3549d3e3521e29d0f5bfc3f", size = 10649437, upload-time = "2026-08-07T13:30:26.097Z" },
{ url = "https://files.pythonhosted.org/packages/ac/43/f8f291dcd4af5bb7872b74fdfa41a7cd7c856ca1d4069670971cf1b9f5cb/ruff-0.16.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7e36fbfba65510548156902bcf1350a979a958ce0347ce0f90d73894036b39f", size = 11446761, upload-time = "2026-08-07T13:30:28.752Z" },
{ url = "https://files.pythonhosted.org/packages/71/4a/ef991fb2fcf516ab71f0808adcdd8da5e18c8cde447f4ceaf5f47a5132a5/ruff-0.16.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f0eab35f80df8f134aae5d1630e751901321d317cc8e50dc39e36fa3ed34cd12", size = 12336364, upload-time = "2026-08-07T13:30:31.468Z" },
{ url = "https://files.pythonhosted.org/packages/f3/24/f615e74f307e6ca0e56a482872477b856c70d530aa356abfb6dfe5ca8a80/ruff-0.16.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ea8c0594feb894e89c8c61ab9c103d38b0ea72dfde6c594107147ca31b1140", size = 11630720, upload-time = "2026-08-07T13:30:34.426Z" },
{ url = "https://files.pythonhosted.org/packages/c5/d3/8ef50149e8412a77f7ab409efdef0e2b23803707a3863da4fc64cb23d459/ruff-0.16.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab3d62dde0b19facdd632008cc4827fc28ada7736c6bd35ab6f1050f0bfed53f", size = 11466130, upload-time = "2026-08-07T13:30:36.958Z" },
{ url = "https://files.pythonhosted.org/packages/dd/a7/a19334985c4dea8c381981fa252cd854c7ee52dc4b1686dc16f4a911c702/ruff-0.16.2-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:e43e1f5b8388da9eca1b9e88328d47a5cec794633ccf6f7484ac2dd15eee92c0", size = 11523634, upload-time = "2026-08-07T13:30:39.822Z" },
{ url = "https://files.pythonhosted.org/packages/6e/6c/96d192b0e742412ceda08c0a50f9669b253dde9fd6a60ea1a10c9fa79a63/ruff-0.16.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:c24788a980581e1d7ea3a0cbe4344c4fbeb0a6a9b1f4713aa46bb104f8294690", size = 10949807, upload-time = "2026-08-07T13:30:42.745Z" },
{ url = "https://files.pythonhosted.org/packages/fa/51/e26599ceca11e79ee255c7df515995561edf87e9ca1893284e44d98f5a86/ruff-0.16.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:81806b08329130005dd4a8a8394a0c9da8c6f4cafb16ba438d2a2ee6a18bedf1", size = 10646891, upload-time = "2026-08-07T13:30:45.522Z" },
{ url = "https://files.pythonhosted.org/packages/68/01/800c4b1f97bc8d7c6029e06b1f20473a3cf1e13c4933d8f3342add83fc55/ruff-0.16.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:4ce4e02bad779bef557f541a1b31f20d6abeae1cc05ed1b1ac019d4ffd1044c8", size = 11162063, upload-time = "2026-08-07T13:30:48.131Z" },
{ url = "https://files.pythonhosted.org/packages/e4/d0/1477ea50fc5a0d4b0b71d1d63d50770bdd794d90b43e37a7618e63ec9894/ruff-0.16.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e0422abdf70070255fc4073ce9dfc814cc03db577013761ddd09bc1e4a9a4fbd", size = 11556038, upload-time = "2026-08-07T13:30:50.686Z" },
{ url = "https://files.pythonhosted.org/packages/b8/76/a7776f32048d991e16d4fa8ff91790b877342d3596cc3ed04acdbf1aaedc/ruff-0.16.2-py3-none-win32.whl", hash = "sha256:bf3a63d78fb39f4bf5ac8ae52051c5520505301abe19ba4e204c453b3f09bb0b", size = 10872850, upload-time = "2026-08-07T13:30:53.471Z" },
{ url = "https://files.pythonhosted.org/packages/00/0d/929c800d920e61397d82a01b60bffc68da3052c17d31de59efaad2e4ed75/ruff-0.16.2-py3-none-win_amd64.whl", hash = "sha256:bcabe2f6d0fc7819f1431793005af4e4de7371927d037345bf941252b195b9fa", size = 12023338, upload-time = "2026-08-07T13:30:56.193Z" },
{ url = "https://files.pythonhosted.org/packages/5b/6c/93e26c22c5f78ff87363e07da49c84955affbeb1098bd1936bf3b3f293bf/ruff-0.16.2-py3-none-win_arm64.whl", hash = "sha256:d614e95cedf38a2053fd351c55b103ba30d017d61688fdbfd40ee0412852a99f", size = 11374065, upload-time = "2026-08-07T13:30:58.775Z" },
{ url = "https://files.pythonhosted.org/packages/1b/bd/694da69368e0973de65df2ddc73ab18d43c469d5963d9b150911de6bc513/ruff-0.16.1-py3-none-linux_armv6l.whl", hash = "sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0", size = 10839126, upload-time = "2026-07-30T19:36:13.697Z" },
{ url = "https://files.pythonhosted.org/packages/3f/f0/b626e5d5bd0dd9576263658ef12885e2288afd1029a48e26ffed65ec1ac1/ruff-0.16.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c", size = 11070253, upload-time = "2026-07-30T19:36:17.14Z" },
{ url = "https://files.pythonhosted.org/packages/83/63/f40acfb6b35b88623e71684942b552c3edd96035f5d98f313815f7b277de/ruff-0.16.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6", size = 10561425, upload-time = "2026-07-30T19:36:20.04Z" },
{ url = "https://files.pythonhosted.org/packages/aa/dd/14ec0e9c2b4d315547dd38765004b4863e354e1b52cb308272215d9f6f6d/ruff-0.16.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38", size = 10948879, upload-time = "2026-07-30T19:36:22.476Z" },
{ url = "https://files.pythonhosted.org/packages/33/e9/9d870cbae575030fdef595f04b4b97573c525b5497cce4f4498cf2f85446/ruff-0.16.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743", size = 10643691, upload-time = "2026-07-30T19:36:24.914Z" },
{ url = "https://files.pythonhosted.org/packages/c4/09/12743d544e2173f53ecd27217c65f90d2bc0f8424a66a60339e56bbc0457/ruff-0.16.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f", size = 11435354, upload-time = "2026-07-30T19:36:28.447Z" },
{ url = "https://files.pythonhosted.org/packages/7f/89/a1652b2daee52083c9554a6333b678a8b01d0400f976827bb87857f9449a/ruff-0.16.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75", size = 12259033, upload-time = "2026-07-30T19:36:31.326Z" },
{ url = "https://files.pythonhosted.org/packages/16/96/ecdcb8c54ee7b123b487f807eb014e6e019155a0b81dfb669acd52f28ce3/ruff-0.16.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a", size = 11667981, upload-time = "2026-07-30T19:36:34.394Z" },
{ url = "https://files.pythonhosted.org/packages/cd/90/c52e12e0d862e9572f2a33aa227409143520abe53111e9a6babbac7b4af8/ruff-0.16.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c", size = 11468183, upload-time = "2026-07-30T19:36:37.339Z" },
{ url = "https://files.pythonhosted.org/packages/2c/6b/4ffb7ad1d83eb16cf8cbb3c8815d3f11c88460fd162d4b372a2059be1c2a/ruff-0.16.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150", size = 11470071, upload-time = "2026-07-30T19:36:39.91Z" },
{ url = "https://files.pythonhosted.org/packages/9c/72/32ae7db4c0b5e32ab611787caa19d1546800676d79f7483b7100a3561bf4/ruff-0.16.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef", size = 10919503, upload-time = "2026-07-30T19:36:42.65Z" },
{ url = "https://files.pythonhosted.org/packages/f7/ca/3d901ba6ad6fc38da39c3448fc6c59ac945679293a17c3ceb6d6c1cba13e/ruff-0.16.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1", size = 10649861, upload-time = "2026-07-30T19:36:45.18Z" },
{ url = "https://files.pythonhosted.org/packages/92/79/894ef1ced26552d5f8c9cf6d85b0687840e1128c55aeab7b9c2d54a0d880/ruff-0.16.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494", size = 11148137, upload-time = "2026-07-30T19:36:47.936Z" },
{ url = "https://files.pythonhosted.org/packages/2d/69/3609a09fa1cb46cc28b762363e440a354204e5dff01bd0c8d7437874d6b9/ruff-0.16.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd", size = 11559211, upload-time = "2026-07-30T19:36:50.448Z" },
{ url = "https://files.pythonhosted.org/packages/fc/8a/fb22af2fd78a736e241fabf67e30ce1799a64244026377a49e133af90762/ruff-0.16.1-py3-none-win32.whl", hash = "sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806", size = 10838258, upload-time = "2026-07-30T19:36:53.298Z" },
{ url = "https://files.pythonhosted.org/packages/d4/35/e57fd9fb5d423961df087a00b12d42c0a830288dc2f3b45ecca299158b4f/ruff-0.16.1-py3-none-win_amd64.whl", hash = "sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596", size = 11961111, upload-time = "2026-07-30T19:36:56.107Z" },
{ url = "https://files.pythonhosted.org/packages/cb/46/240ea004bf6dc4feb40e9832f2205a476a47dd5b8a3f8211a5fc5f95e20e/ruff-0.16.1-py3-none-win_arm64.whl", hash = "sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8", size = 11309414, upload-time = "2026-07-30T19:36:58.79Z" },
]
[[package]]
@@ -614,39 +614,39 @@ wheels = [
[[package]]
name = "ty"
version = "0.0.69"
version = "0.0.65"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8e/5b/7a618632dfe9373b7df572ecd7a08c8f799d772fbc317da82dd3aa363207/ty-0.0.69.tar.gz", hash = "sha256:b65106e9ff24fa76e25e1142fb09c85244e815c40450e3021d2bf652c231bb43", size = 6565094, upload-time = "2026-08-06T10:04:25.667Z" }
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cf561927e8e9ab5c1892a833b664aa9cd6f051a75f6280c66d8047246bda/ty-0.0.65.tar.gz", hash = "sha256:b7134bffcc00b715fa8291e84d845782ced810a998dc1f7f11d71c85c4046325", size = 6460098, upload-time = "2026-07-29T18:31:03.27Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/06/60/6534092f4d2c15e2491807edd609c2e50d527c1fed957acf40b9f110b64a/ty-0.0.69-py3-none-linux_armv6l.whl", hash = "sha256:98bfd383b273540829af673e7f98b9c1c4bcc8547d12a1a3806cd0bec7f0e087", size = 12364185, upload-time = "2026-08-06T10:03:47.137Z" },
{ url = "https://files.pythonhosted.org/packages/34/2b/5c29689bd4f74c2e3394d983d85e4011b629f2ce3730c9442553b8554bf8/ty-0.0.69-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:964621ddd05771660017c51b4e74078d861d9fc863c21ef2a500db1ab62c9ccf", size = 12042510, upload-time = "2026-08-06T10:03:49.481Z" },
{ url = "https://files.pythonhosted.org/packages/09/46/fa085bde4d23516d7ef14b24736fc5dd7dc498f60f52b3d077e59ffdea20/ty-0.0.69-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3ffea4048dd0da4c9c97393b4be0901098a9065b06fa81be2477cbde65d8a151", size = 11549397, upload-time = "2026-08-06T10:03:51.747Z" },
{ url = "https://files.pythonhosted.org/packages/25/cc/97b9efb2061dcab6fef1e94a4ad99df0bb45bd2cc15d4f5794c787ee0552/ty-0.0.69-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8684d4a70aadd1eab0f41bdba835e3288ef49db8402a8e6ca81bab52ed5d610", size = 12115567, upload-time = "2026-08-06T10:03:53.79Z" },
{ url = "https://files.pythonhosted.org/packages/e0/c1/a5e0404965093835f3e62544e661784ec0aa8ef0b006ed50af50b19c107e/ty-0.0.69-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:afaaba240ab4122e2069a796836d10be81b4ddb053ae268b3dff962a0b4ca5c7", size = 12149770, upload-time = "2026-08-06T10:03:55.993Z" },
{ url = "https://files.pythonhosted.org/packages/e2/39/8cad6b205a4abe8a044ca0c84aea71e8ccda29b07a75a5f090e310605580/ty-0.0.69-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ea63ef07d4e33aeb1a775cf5f2c736b3ed22fa6f8b1b608591612c36795044", size = 12941278, upload-time = "2026-08-06T10:03:58.324Z" },
{ url = "https://files.pythonhosted.org/packages/d6/8b/8766d96b732c2a060d70dc8ccafcc4d6a54109a2a95f1deb0705de88892b/ty-0.0.69-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb3730b1268e92a2907d7aea3afe8dd1b360ae65862f0557080cf479d481b424", size = 13426509, upload-time = "2026-08-06T10:04:00.621Z" },
{ url = "https://files.pythonhosted.org/packages/02/1f/e991b2cde953ea5b94d6a9a4c45c87937bd916bc09235f764407bf471c0a/ty-0.0.69-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a544ff57a752ef186ed40b5a2f44c17402af4cdefeb74a311ca02ebd57c4fca0", size = 13106582, upload-time = "2026-08-06T10:04:02.818Z" },
{ url = "https://files.pythonhosted.org/packages/ea/bb/73538f1b99e3558fd9db87b98698426f0f60fc8666da0b1efd0e70e275eb/ty-0.0.69-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87ed2cbca20caddfdf8e3e14d213ce91b67e75feed78900f4aaf3ef884954028", size = 12708931, upload-time = "2026-08-06T10:04:05.233Z" },
{ url = "https://files.pythonhosted.org/packages/87/cd/484a5208d74c4ad1155933906295ccdce9aa81a257d8df2ab9e41bd60133/ty-0.0.69-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:2684efcbce5b6fe45045faf610b377b50781b6d2aa7e61ea23ecf5b3d2bce421", size = 12985322, upload-time = "2026-08-06T10:04:07.587Z" },
{ url = "https://files.pythonhosted.org/packages/6e/81/b75003f0d4da9ab3bc8fd4f4802f836cb9921ff7e70f460604f7b769a0b5/ty-0.0.69-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:da9aeb26fdac1d2214937542b59e0d4d1ba94ec7a3f45444f33c846de1eb1d63", size = 12063910, upload-time = "2026-08-06T10:04:09.835Z" },
{ url = "https://files.pythonhosted.org/packages/8a/76/088469f547ef63dceefc4a75826aedee5014f9371dc5171cde931896a82c/ty-0.0.69-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:00e7677cd14ede381f705f71104ea7b8ea0ce217a8634e19a89781953de0e9ad", size = 12166823, upload-time = "2026-08-06T10:04:12.114Z" },
{ url = "https://files.pythonhosted.org/packages/0a/c9/ce88a0bec0d46d8ae180b99c6ec014866fecc4cba1727b5feec8877b2765/ty-0.0.69-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d91965eb799649833d0d6042db09cd03d15289125245337cc46a2606effb7bda", size = 12483136, upload-time = "2026-08-06T10:04:14.33Z" },
{ url = "https://files.pythonhosted.org/packages/63/9e/6fae0ff225a0012642cf72c077e20f8f448c0a80771bc3360e8178fe2f32/ty-0.0.69-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1f03359cd8e5c412aa0c181118fa9b9061a4dddaedbb61bac0a424fb0814d402", size = 12799025, upload-time = "2026-08-06T10:04:16.445Z" },
{ url = "https://files.pythonhosted.org/packages/e4/43/78a658d18b2a4ccf35b053392f2213bf12e3c63b2abea512d3b6751d1f4c/ty-0.0.69-py3-none-win32.whl", hash = "sha256:ec460e01586b1eb91894c4a8403bee3e045a47e7a4ada943cc27ce8e348e88cf", size = 11787774, upload-time = "2026-08-06T10:04:18.622Z" },
{ url = "https://files.pythonhosted.org/packages/3a/5e/88db1f674403f2b81316a853a44a81ed220621fa96f8f7ae586fb6ca7513/ty-0.0.69-py3-none-win_amd64.whl", hash = "sha256:18976ca26a4e28fc3249477f79a695d5502e670803f2e080d89ac905baef3c6e", size = 12864038, upload-time = "2026-08-06T10:04:20.748Z" },
{ url = "https://files.pythonhosted.org/packages/4d/7b/6fc6efd00c69103d70f2bdbe824343089cd70b17b3079170057d3e5a3ac0/ty-0.0.69-py3-none-win_arm64.whl", hash = "sha256:7d4ca3bb74d91cb9947ba3f3b4cb131ad6a2b3ecc76d34040c4ec6092d2e411d", size = 12196693, upload-time = "2026-08-06T10:04:22.902Z" },
{ url = "https://files.pythonhosted.org/packages/7b/4e/71e2d325d2b53a1afad81624ad076b2ede413213fc4a18cb05b78c568571/ty-0.0.65-py3-none-linux_armv6l.whl", hash = "sha256:dc556c9f05408bef4c4ef02b2cc382e4e5f797b4b20d64410289848f0d76705f", size = 12298466, upload-time = "2026-07-29T18:30:12.744Z" },
{ url = "https://files.pythonhosted.org/packages/57/77/fec8f29647c55794efa430a7f365e44f5ce7ffb6459d9445a87fac569bec/ty-0.0.65-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:29d2e0d34cc0a28a17ef0cf81135c5ebabc3562131f9079138ba5e7bae0f56bd", size = 11942421, upload-time = "2026-07-29T18:30:16.076Z" },
{ url = "https://files.pythonhosted.org/packages/13/09/7f3766aef9dc627e2698cf4e3e59cf53389dcae3812040d33c1aa931230f/ty-0.0.65-py3-none-macosx_11_0_arm64.whl", hash = "sha256:685f49a9312bbf69d5b65bbb66384fed1f927403ea030c217b9289092d7e46c4", size = 11451922, upload-time = "2026-07-29T18:30:19.155Z" },
{ url = "https://files.pythonhosted.org/packages/cb/7b/1a77cd50e0befb50f55b8bf9bd3ed3eddf184bf28c61b56727039e0774fc/ty-0.0.65-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f564b5ebe78e2f3a8e7b8eacb1292eb88b7c0f3c8630671cfca31abc0709cd9", size = 11994999, upload-time = "2026-07-29T18:30:22.315Z" },
{ url = "https://files.pythonhosted.org/packages/63/7b/feda16f3a4a0a99be27431e0c9598eeeec0db1eb2fec9a15976698209418/ty-0.0.65-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c983e156fe9e113fb56389e13d327b6b8549fe866de9b269684723a88e9b732d", size = 12090662, upload-time = "2026-07-29T18:30:24.93Z" },
{ url = "https://files.pythonhosted.org/packages/ed/3e/3f69bf9c9307dbdc0771719f65ce5b556e7bdeeaccbdd599d4f57866d801/ty-0.0.65-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3663b7396e8b1a9954e20e732de7ccb0192bf4118473069b4945920d6923921", size = 12822094, upload-time = "2026-07-29T18:30:28.012Z" },
{ url = "https://files.pythonhosted.org/packages/90/38/8fa791b3bb503ee2b46ad81690cd1bdd54519582df6d805cee57fe143e85/ty-0.0.65-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:306ed01f29d6e108e98feb233dbbf5878a027603b71bd3743b343977933a9f16", size = 13357833, upload-time = "2026-07-29T18:30:31.122Z" },
{ url = "https://files.pythonhosted.org/packages/c1/73/4dda396a201e1dd0ed3594a9b48e559cb41c4bc048c6cd4c4d1b39eb4313/ty-0.0.65-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28bcfc8898c94f079a9100e684bcf312b6a64ad3a7d4ebb35a4591546030a2cd", size = 12977303, upload-time = "2026-07-29T18:30:33.944Z" },
{ url = "https://files.pythonhosted.org/packages/a5/26/c250c2c569adc53a8591716641388397bcb2a442e4a30b952ae81b50c0e0/ty-0.0.65-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a75bd0c245c38802a8f488378e74f92feb7dd33db7d63fbdd6fdf82791ba730", size = 12579338, upload-time = "2026-07-29T18:30:37.199Z" },
{ url = "https://files.pythonhosted.org/packages/d3/94/4a5647d44753ca218fc930d7e4d9bf468d0ed4a0ad4b3d57588bc1bbacf7/ty-0.0.65-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9e5e1bdea9662d2b5312b4e99f319f4e6e2ea427511b5fbc546141b79ec53f76", size = 12957731, upload-time = "2026-07-29T18:30:39.937Z" },
{ url = "https://files.pythonhosted.org/packages/36/b6/1e22fa11a1e0dfb20b1c7f3cbfd8170273aada2a82f9ecd3055275370c44/ty-0.0.65-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:03a88493d4842889f65280ae241e06b399d57eb3c63571054cad21a4c33b3b69", size = 11938625, upload-time = "2026-07-29T18:30:42.603Z" },
{ url = "https://files.pythonhosted.org/packages/5c/0a/fe5f22ef62b193201bc5566762e22049762cd485bfafb5095a7050760054/ty-0.0.65-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:600b8bf6f4940cf7ffb2f43d3716faaf38dcb97cd8617c55771451bc0276408f", size = 12105592, upload-time = "2026-07-29T18:30:45.419Z" },
{ url = "https://files.pythonhosted.org/packages/76/fd/922b3a6e9d697452cdbb4b7e3f636868add5ec652154518a736e4364f3b7/ty-0.0.65-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c28007bc79d648c1ddaf1e65885d07baec48eb87240da442f608e4107c1b7d8", size = 12387335, upload-time = "2026-07-29T18:30:48.405Z" },
{ url = "https://files.pythonhosted.org/packages/77/22/a1a08ebc84c083db2fb55e3b5cd186db0c067692f4921146f601360231e2/ty-0.0.65-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:c852da96091ad22361e6586b7c7ba98e1334dcd4d8ffb67e47f4fb673de33f77", size = 12682710, upload-time = "2026-07-29T18:30:51.364Z" },
{ url = "https://files.pythonhosted.org/packages/81/14/eaaa410a25bbdea19722109b5422380a0e211b3afcf3071d15953ddbd5db/ty-0.0.65-py3-none-win32.whl", hash = "sha256:cf529d538f1403b14b0511e6ec3cdb95d3d974adabf24cc76cedc533368c3edc", size = 11692341, upload-time = "2026-07-29T18:30:54.35Z" },
{ url = "https://files.pythonhosted.org/packages/bc/0f/6d48f206dce9d7e53fe3b5ea0f0ab5800dd9d2365b2b48f736783436c43f/ty-0.0.65-py3-none-win_amd64.whl", hash = "sha256:234a321e33c7cbbfbd67bfa0b01b685dd9c21f1841781a21e5ca1fa0b25f1d5d", size = 12729355, upload-time = "2026-07-29T18:30:57.275Z" },
{ url = "https://files.pythonhosted.org/packages/96/aa/7446f7725e303cf78e058c893af1f0552b9451895454908706f4c6c3494b/ty-0.0.65-py3-none-win_arm64.whl", hash = "sha256:b9424be1ec56d93ff18609fb1c0a0a2283fe1282cd6d1c7604f97d73b94d61f2", size = 12051375, upload-time = "2026-07-29T18:31:00.579Z" },
]
[[package]]
name = "unittest-parallel"
version = "1.8.3"
version = "1.8.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "coverage" },
]
sdist = { url = "https://files.pythonhosted.org/packages/c2/14/700a77c9cad91daeb74bb8139cd8cb6116a8da5a334f6c9c675ae625190f/unittest_parallel-1.8.3.tar.gz", hash = "sha256:5e5935126fb8245bb8322eb3d63c35a72603b67c2dabe98a3a026fa339e2cc3a", size = 10485, upload-time = "2026-08-06T18:19:23.514Z" }
sdist = { url = "https://files.pythonhosted.org/packages/4c/a8/ef232e095e36b131891f12442063c24da81e455ca8db9304494993d6bb24/unittest_parallel-1.8.2.tar.gz", hash = "sha256:42238ad1f93ef5cc88600b6bb6b8052512c591c9ba2bd57b7cdcf57ce196c01b", size = 10392, upload-time = "2026-05-01T17:30:19.738Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/ef/06/c6d57ed486239dcba509ff87322a30429c9aeb49013c1119a09762dd9926/unittest_parallel-1.8.3-py3-none-any.whl", hash = "sha256:3fe121f5d70f681038aabe9573ad46da943615945459515c4a4f8af4fc3005f1", size = 9612, upload-time = "2026-08-06T18:19:22.581Z" },
{ url = "https://files.pythonhosted.org/packages/7c/e6/ce66604ea5de192913ce8d4825565cf5ba1d97439f49b39ddecd4ec373c8/unittest_parallel-1.8.2-py3-none-any.whl", hash = "sha256:b86bb180d509f2b280cc96a5332fda6324c8cbd59de28be88dea78db3329743d", size = 9571, upload-time = "2026-05-01T17:30:18.4Z" },
]
[[package]]
+176 -192
View File
@@ -5631,7 +5631,7 @@ const ::capnp::_::RawSchema s_af977a6cea924390 = {
1, 5, i_af977a6cea924390, nullptr, nullptr, { &s_af977a6cea924390, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<67> b_c342cefc303e9b8e = {
static const ::capnp::_::AlignedData<105> b_c342cefc303e9b8e = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
142, 155, 62, 48, 252, 206, 66, 195,
20, 0, 0, 0, 1, 0, 1, 0,
@@ -5641,7 +5641,7 @@ static const ::capnp::_::AlignedData<67> b_c342cefc303e9b8e = {
21, 0, 0, 0, 82, 1, 0, 0,
41, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
37, 0, 0, 0, 175, 0, 0, 0,
37, 0, 0, 0, 31, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110,
@@ -5651,123 +5651,42 @@ static const ::capnp::_::AlignedData<67> b_c342cefc303e9b8e = {
80, 73, 68, 84, 117, 110, 105, 110,
103, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
12, 0, 0, 0, 3, 0, 4, 0,
2, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
62, 205, 96, 248, 164, 226, 54, 141,
69, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
49, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
44, 0, 0, 0, 3, 0, 1, 0,
72, 0, 0, 0, 2, 0, 1, 0,
1, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
69, 0, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
64, 0, 0, 0, 3, 0, 1, 0,
92, 0, 0, 0, 2, 0, 1, 0,
100, 101, 112, 114, 101, 99, 97, 116,
101, 100, 0, 0, 0, 0, 0, 0,
107, 105, 66, 80, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0, 1, 0,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
107, 105, 86, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0, 1, 0,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, }
};
::capnp::word const* const bp_c342cefc303e9b8e = b_c342cefc303e9b8e.words;
#if !CAPNP_LITE
static const ::capnp::_::RawSchema* const d_c342cefc303e9b8e[] = {
&s_8d36e2a4f860cd3e,
};
static const uint16_t m_c342cefc303e9b8e[] = {0, 1, 2};
static const uint16_t i_c342cefc303e9b8e[] = {0, 1, 2};
const ::capnp::_::RawSchema s_c342cefc303e9b8e = {
0xc342cefc303e9b8e, b_c342cefc303e9b8e.words, 67, d_c342cefc303e9b8e, m_c342cefc303e9b8e,
1, 3, i_c342cefc303e9b8e, nullptr, nullptr, { &s_c342cefc303e9b8e, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<113> b_8d36e2a4f860cd3e = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
62, 205, 96, 248, 164, 226, 54, 141,
42, 0, 0, 0, 1, 0, 1, 0,
142, 155, 62, 48, 252, 206, 66, 195,
6, 0, 7, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 170, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
37, 0, 0, 0, 31, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110,
112, 58, 67, 97, 114, 80, 97, 114,
97, 109, 115, 46, 76, 111, 110, 103,
105, 116, 117, 100, 105, 110, 97, 108,
80, 73, 68, 84, 117, 110, 105, 110,
103, 46, 100, 101, 112, 114, 101, 99,
97, 116, 101, 100, 0, 0, 0, 0,
20, 0, 0, 0, 3, 0, 4, 0,
3, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
125, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
120, 0, 0, 0, 3, 0, 1, 0,
148, 0, 0, 0, 2, 0, 1, 0,
4, 0, 0, 0, 1, 0, 0, 0,
1, 0, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
145, 0, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
140, 0, 0, 0, 3, 0, 1, 0,
168, 0, 0, 0, 2, 0, 1, 0,
1, 0, 0, 0, 4, 0, 0, 0,
0, 0, 1, 0, 4, 0, 0, 0,
2, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
165, 0, 0, 0, 90, 0, 0, 0,
165, 0, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
164, 0, 0, 0, 3, 0, 1, 0,
192, 0, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 5, 0, 0, 0,
160, 0, 0, 0, 3, 0, 1, 0,
188, 0, 0, 0, 2, 0, 1, 0,
3, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
189, 0, 0, 0, 82, 0, 0, 0,
185, 0, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
188, 0, 0, 0, 3, 0, 1, 0,
216, 0, 0, 0, 2, 0, 1, 0,
180, 0, 0, 0, 3, 0, 1, 0,
208, 0, 0, 0, 2, 0, 1, 0,
4, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
46, 77, 85, 159, 41, 13, 28, 196,
205, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
213, 0, 0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
208, 0, 0, 0, 3, 0, 1, 0,
220, 0, 0, 0, 2, 0, 1, 0,
107, 112, 66, 80, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
@@ -5792,6 +5711,87 @@ static const ::capnp::_::AlignedData<113> b_8d36e2a4f860cd3e = {
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
107, 105, 66, 80, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0, 1, 0,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
107, 105, 86, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 3, 0, 1, 0,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 101, 112, 114, 101, 99, 97, 116,
101, 100, 0, 0, 0, 0, 0, 0, }
};
::capnp::word const* const bp_c342cefc303e9b8e = b_c342cefc303e9b8e.words;
#if !CAPNP_LITE
static const ::capnp::_::RawSchema* const d_c342cefc303e9b8e[] = {
&s_c41c0d299f554d2e,
};
static const uint16_t m_c342cefc303e9b8e[] = {4, 2, 3, 0, 1};
static const uint16_t i_c342cefc303e9b8e[] = {0, 1, 2, 3, 4};
const ::capnp::_::RawSchema s_c342cefc303e9b8e = {
0xc342cefc303e9b8e, b_c342cefc303e9b8e.words, 105, d_c342cefc303e9b8e, m_c342cefc303e9b8e,
1, 5, i_c342cefc303e9b8e, nullptr, nullptr, { &s_c342cefc303e9b8e, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<75> b_c41c0d299f554d2e = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
46, 77, 85, 159, 41, 13, 28, 196,
42, 0, 0, 0, 1, 0, 1, 0,
142, 155, 62, 48, 252, 206, 66, 195,
6, 0, 7, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 170, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
37, 0, 0, 0, 175, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110,
112, 58, 67, 97, 114, 80, 97, 114,
97, 109, 115, 46, 76, 111, 110, 103,
105, 116, 117, 100, 105, 110, 97, 108,
80, 73, 68, 84, 117, 110, 105, 110,
103, 46, 100, 101, 112, 114, 101, 99,
97, 116, 101, 100, 0, 0, 0, 0,
12, 0, 0, 0, 3, 0, 4, 0,
1, 0, 0, 0, 4, 0, 0, 0,
0, 0, 1, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
69, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
68, 0, 0, 0, 3, 0, 1, 0,
96, 0, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 5, 0, 0, 0,
0, 0, 1, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
93, 0, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
92, 0, 0, 0, 3, 0, 1, 0,
120, 0, 0, 0, 2, 0, 1, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
117, 0, 0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
112, 0, 0, 0, 3, 0, 1, 0,
124, 0, 0, 0, 2, 0, 1, 0,
100, 101, 97, 100, 122, 111, 110, 101,
66, 80, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
@@ -5827,16 +5827,16 @@ static const ::capnp::_::AlignedData<113> b_8d36e2a4f860cd3e = {
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, }
};
::capnp::word const* const bp_8d36e2a4f860cd3e = b_8d36e2a4f860cd3e.words;
::capnp::word const* const bp_c41c0d299f554d2e = b_c41c0d299f554d2e.words;
#if !CAPNP_LITE
static const ::capnp::_::RawSchema* const d_8d36e2a4f860cd3e[] = {
static const ::capnp::_::RawSchema* const d_c41c0d299f554d2e[] = {
&s_c342cefc303e9b8e,
};
static const uint16_t m_8d36e2a4f860cd3e[] = {2, 3, 4, 0, 1};
static const uint16_t i_8d36e2a4f860cd3e[] = {0, 1, 2, 3, 4};
const ::capnp::_::RawSchema s_8d36e2a4f860cd3e = {
0x8d36e2a4f860cd3e, b_8d36e2a4f860cd3e.words, 113, d_8d36e2a4f860cd3e, m_8d36e2a4f860cd3e,
1, 5, i_8d36e2a4f860cd3e, nullptr, nullptr, { &s_8d36e2a4f860cd3e, nullptr, nullptr, 0, 0, nullptr }, false
static const uint16_t m_c41c0d299f554d2e[] = {0, 1, 2};
static const uint16_t i_c41c0d299f554d2e[] = {0, 1, 2};
const ::capnp::_::RawSchema s_c41c0d299f554d2e = {
0xc41c0d299f554d2e, b_c41c0d299f554d2e.words, 75, d_c41c0d299f554d2e, m_c41c0d299f554d2e,
1, 3, i_c41c0d299f554d2e, nullptr, nullptr, { &s_c41c0d299f554d2e, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<191> b_caa441291b152efd = {
@@ -6315,7 +6315,7 @@ const ::capnp::_::RawSchema s_a1adf400915718e5 = {
0, 8, i_a1adf400915718e5, nullptr, nullptr, { &s_a1adf400915718e5, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<197> b_95551e5b1edaf451 = {
static const ::capnp::_::AlignedData<181> b_95551e5b1edaf451 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
81, 244, 218, 30, 91, 30, 85, 149,
20, 0, 0, 0, 2, 0, 0, 0,
@@ -6325,7 +6325,7 @@ static const ::capnp::_::AlignedData<197> b_95551e5b1edaf451 = {
21, 0, 0, 0, 2, 1, 0, 0,
33, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
29, 0, 0, 0, 175, 3, 0, 0,
29, 0, 0, 0, 79, 3, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 97, 114, 46, 99, 97, 112, 110,
@@ -6333,123 +6333,111 @@ static const ::capnp::_::AlignedData<197> b_95551e5b1edaf451 = {
97, 109, 115, 46, 83, 97, 102, 101,
116, 121, 77, 111, 100, 101, 108, 0,
0, 0, 0, 0, 1, 0, 1, 0,
156, 0, 0, 0, 1, 0, 2, 0,
140, 0, 0, 0, 1, 0, 2, 0,
0, 0, 0, 0, 0, 0, 0, 0,
205, 1, 0, 0, 58, 0, 0, 0,
157, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0,
197, 1, 0, 0, 90, 0, 0, 0,
149, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
2, 0, 0, 0, 0, 0, 0, 0,
193, 1, 0, 0, 58, 0, 0, 0,
145, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
3, 0, 0, 0, 0, 0, 0, 0,
185, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0,
177, 1, 0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0,
169, 1, 0, 0, 146, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
6, 0, 0, 0, 0, 0, 0, 0,
169, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0,
161, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 0, 0, 0, 0,
157, 1, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0,
149, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
10, 0, 0, 0, 0, 0, 0, 0,
145, 1, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
11, 0, 0, 0, 0, 0, 0, 0,
137, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 0,
129, 1, 0, 0, 26, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0,
121, 1, 0, 0, 146, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
6, 0, 0, 0, 0, 0, 0, 0,
121, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
7, 0, 0, 0, 0, 0, 0, 0,
113, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
8, 0, 0, 0, 0, 0, 0, 0,
109, 1, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 0, 0, 0, 0, 0,
101, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
10, 0, 0, 0, 0, 0, 0, 0,
97, 1, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
11, 0, 0, 0, 0, 0, 0, 0,
89, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
12, 0, 0, 0, 0, 0, 0, 0,
129, 1, 0, 0, 82, 0, 0, 0,
81, 1, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
13, 0, 0, 0, 0, 0, 0, 0,
125, 1, 0, 0, 50, 0, 0, 0,
77, 1, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
14, 0, 0, 0, 0, 0, 0, 0,
117, 1, 0, 0, 58, 0, 0, 0,
69, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
15, 0, 0, 0, 0, 0, 0, 0,
109, 1, 0, 0, 90, 0, 0, 0,
61, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
16, 0, 0, 0, 0, 0, 0, 0,
105, 1, 0, 0, 90, 0, 0, 0,
57, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
17, 0, 0, 0, 0, 0, 0, 0,
101, 1, 0, 0, 82, 0, 0, 0,
53, 1, 0, 0, 82, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
18, 0, 0, 0, 0, 0, 0, 0,
97, 1, 0, 0, 58, 0, 0, 0,
49, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
19, 0, 0, 0, 0, 0, 0, 0,
89, 1, 0, 0, 74, 0, 0, 0,
41, 1, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
20, 0, 0, 0, 0, 0, 0, 0,
85, 1, 0, 0, 90, 0, 0, 0,
37, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 0, 0, 0, 0,
81, 1, 0, 0, 106, 0, 0, 0,
33, 1, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
22, 0, 0, 0, 0, 0, 0, 0,
77, 1, 0, 0, 130, 0, 0, 0,
29, 1, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
23, 0, 0, 0, 0, 0, 0, 0,
73, 1, 0, 0, 114, 0, 0, 0,
25, 1, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
24, 0, 0, 0, 0, 0, 0, 0,
69, 1, 0, 0, 138, 0, 0, 0,
21, 1, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 0, 0, 0, 0,
69, 1, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
26, 0, 0, 0, 0, 0, 0, 0,
65, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
27, 0, 0, 0, 0, 0, 0, 0,
57, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
28, 0, 0, 0, 0, 0, 0, 0,
49, 1, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
29, 0, 0, 0, 0, 0, 0, 0,
45, 1, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
30, 0, 0, 0, 0, 0, 0, 0,
45, 1, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
31, 0, 0, 0, 0, 0, 0, 0,
41, 1, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
32, 0, 0, 0, 0, 0, 0, 0,
33, 1, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
33, 0, 0, 0, 0, 0, 0, 0,
29, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
34, 0, 0, 0, 0, 0, 0, 0,
21, 1, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
35, 0, 0, 0, 0, 0, 0, 0,
17, 1, 0, 0, 34, 0, 0, 0,
26, 0, 0, 0, 0, 0, 0, 0,
17, 1, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
36, 0, 0, 0, 0, 0, 0, 0,
9, 1, 0, 0, 50, 0, 0, 0,
27, 0, 0, 0, 0, 0, 0, 0,
9, 1, 0, 0, 42, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
37, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 34, 0, 0, 0,
28, 0, 0, 0, 0, 0, 0, 0,
1, 1, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
38, 0, 0, 0, 0, 0, 0, 0,
249, 0, 0, 0, 26, 0, 0, 0,
29, 0, 0, 0, 0, 0, 0, 0,
253, 0, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
30, 0, 0, 0, 0, 0, 0, 0,
253, 0, 0, 0, 106, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
31, 0, 0, 0, 0, 0, 0, 0,
249, 0, 0, 0, 34, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
32, 0, 0, 0, 0, 0, 0, 0,
241, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
33, 0, 0, 0, 0, 0, 0, 0,
237, 0, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
34, 0, 0, 0, 0, 0, 0, 0,
229, 0, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
115, 105, 108, 101, 110, 116, 0, 0,
104, 111, 110, 100, 97, 78, 105, 100,
@@ -6508,18 +6496,14 @@ static const ::capnp::_::AlignedData<197> b_95551e5b1edaf451 = {
105, 111, 0, 0, 0, 0, 0, 0,
114, 105, 118, 105, 97, 110, 0, 0,
118, 111, 108, 107, 115, 119, 97, 103,
101, 110, 77, 101, 98, 0, 0, 0,
98, 121, 100, 0, 0, 0, 0, 0,
118, 111, 108, 118, 111, 0, 0, 0,
98, 109, 119, 0, 0, 0, 0, 0,
109, 103, 0, 0, 0, 0, 0, 0, }
101, 110, 77, 101, 98, 0, 0, 0, }
};
::capnp::word const* const bp_95551e5b1edaf451 = b_95551e5b1edaf451.words;
#if !CAPNP_LITE
static const uint16_t m_95551e5b1edaf451[] = {17, 37, 27, 35, 7, 9, 30, 3, 32, 6, 4, 18, 12, 20, 5, 1, 26, 8, 28, 24, 23, 13, 38, 14, 19, 31, 33, 0, 11, 22, 10, 2, 16, 15, 34, 25, 29, 21, 36};
static const uint16_t m_95551e5b1edaf451[] = {17, 27, 7, 9, 30, 3, 32, 6, 4, 18, 12, 20, 5, 1, 26, 8, 28, 24, 23, 13, 14, 19, 31, 33, 0, 11, 22, 10, 2, 16, 15, 34, 25, 29, 21};
const ::capnp::_::RawSchema s_95551e5b1edaf451 = {
0x95551e5b1edaf451, b_95551e5b1edaf451.words, 197, nullptr, m_95551e5b1edaf451,
0, 39, nullptr, nullptr, nullptr, { &s_95551e5b1edaf451, nullptr, nullptr, 0, 0, nullptr }, false
0x95551e5b1edaf451, b_95551e5b1edaf451.words, 181, nullptr, m_95551e5b1edaf451,
0, 35, nullptr, nullptr, nullptr, { &s_95551e5b1edaf451, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(SafetyModel_95551e5b1edaf451, 95551e5b1edaf451);
+112 -118
View File
@@ -245,7 +245,7 @@ CAPNP_DECLARE_SCHEMA(9622723fcbd14c2e);
CAPNP_DECLARE_SCHEMA(80366e0e804ecc1d);
CAPNP_DECLARE_SCHEMA(af977a6cea924390);
CAPNP_DECLARE_SCHEMA(c342cefc303e9b8e);
CAPNP_DECLARE_SCHEMA(8d36e2a4f860cd3e);
CAPNP_DECLARE_SCHEMA(c41c0d299f554d2e);
CAPNP_DECLARE_SCHEMA(caa441291b152efd);
CAPNP_DECLARE_SCHEMA(c1110421b4c850e6);
CAPNP_DECLARE_SCHEMA(a1adf400915718e5);
@@ -286,10 +286,6 @@ enum class SafetyModel_95551e5b1edaf451: uint16_t {
FCA_GIORGIO,
RIVIAN,
VOLKSWAGEN_MEB,
BYD,
VOLVO,
BMW,
MG,
};
CAPNP_DECLARE_ENUM(SafetyModel, 95551e5b1edaf451);
CAPNP_DECLARE_SCHEMA(d661512be2def77f);
@@ -825,7 +821,7 @@ struct CarParams::LongitudinalPIDTuning::Deprecated {
class Pipeline;
struct _capnpPrivate {
CAPNP_DECLARE_STRUCT_HEADER(8d36e2a4f860cd3e, 1, 6)
CAPNP_DECLARE_STRUCT_HEADER(c41c0d299f554d2e, 1, 6)
#if !CAPNP_LITE
static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
#endif // !CAPNP_LITE
@@ -4076,7 +4072,11 @@ public:
}
#endif // !CAPNP_LITE
inline typename Deprecated::Reader getDeprecated() const;
inline bool hasKpBP() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKpBP() const;
inline bool hasKpV() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKpV() const;
inline bool hasKiBP() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKiBP() const;
@@ -4084,6 +4084,8 @@ public:
inline bool hasKiV() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKiV() const;
inline typename Deprecated::Reader getDeprecated() const;
private:
::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind>
@@ -4112,8 +4114,21 @@ public:
inline ::kj::StringTree toString() const { return asReader().toString(); }
#endif // !CAPNP_LITE
inline typename Deprecated::Builder getDeprecated();
inline typename Deprecated::Builder initDeprecated();
inline bool hasKpBP();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getKpBP();
inline void setKpBP( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value);
inline void setKpBP(::kj::ArrayPtr<const float> value);
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder initKpBP(unsigned int size);
inline void adoptKpBP(::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value);
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> disownKpBP();
inline bool hasKpV();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getKpV();
inline void setKpV( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value);
inline void setKpV(::kj::ArrayPtr<const float> value);
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder initKpV(unsigned int size);
inline void adoptKpV(::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value);
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> disownKpV();
inline bool hasKiBP();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getKiBP();
@@ -4131,6 +4146,9 @@ public:
inline void adoptKiV(::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value);
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> disownKiV();
inline typename Deprecated::Builder getDeprecated();
inline typename Deprecated::Builder initDeprecated();
private:
::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind>
@@ -4175,12 +4193,6 @@ public:
}
#endif // !CAPNP_LITE
inline bool hasKpBP() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKpBP() const;
inline bool hasKpV() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getKpV() const;
inline bool hasDeadzoneBP() const;
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader getDeadzoneBP() const;
@@ -4217,22 +4229,6 @@ public:
inline ::kj::StringTree toString() const { return asReader().toString(); }
#endif // !CAPNP_LITE
inline bool hasKpBP();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getKpBP();
inline void setKpBP( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value);
inline void setKpBP(::kj::ArrayPtr<const float> value);
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder initKpBP(unsigned int size);
inline void adoptKpBP(::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value);
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> disownKpBP();
inline bool hasKpV();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getKpV();
inline void setKpV( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value);
inline void setKpV(::kj::ArrayPtr<const float> value);
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder initKpV(unsigned int size);
inline void adoptKpV(::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value);
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> disownKpV();
inline bool hasDeadzoneBP();
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder getDeadzoneBP();
inline void setDeadzoneBP( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value);
@@ -9034,25 +9030,82 @@ inline void CarParams::LateralTorqueTuning::Deprecated::Builder::setKd(float val
::capnp::bounded<8>() * ::capnp::ELEMENTS, value);
}
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Reader CarParams::LongitudinalPIDTuning::Reader::getDeprecated() const {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Reader(_reader);
inline bool CarParams::LongitudinalPIDTuning::Reader::hasKpBP() const {
return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Builder CarParams::LongitudinalPIDTuning::Builder::getDeprecated() {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Builder(_builder);
inline bool CarParams::LongitudinalPIDTuning::Builder::hasKpBP() {
return !_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
#if !CAPNP_LITE
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Pipeline CarParams::LongitudinalPIDTuning::Pipeline::getDeprecated() {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Pipeline(_typeless.noop());
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader CarParams::LongitudinalPIDTuning::Reader::getKpBP() const {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
#endif // !CAPNP_LITE
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Builder CarParams::LongitudinalPIDTuning::Builder::initDeprecated() {
_builder.setDataField< ::uint32_t>(::capnp::bounded<0>() * ::capnp::ELEMENTS, 0);
_builder.getPointerField(::capnp::bounded<0>() * ::capnp::POINTERS).clear();
_builder.getPointerField(::capnp::bounded<1>() * ::capnp::POINTERS).clear();
_builder.getPointerField(::capnp::bounded<4>() * ::capnp::POINTERS).clear();
_builder.getPointerField(::capnp::bounded<5>() * ::capnp::POINTERS).clear();
return typename CarParams::LongitudinalPIDTuning::Deprecated::Builder(_builder);
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Builder::getKpBP() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline void CarParams::LongitudinalPIDTuning::Builder::setKpBP( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline void CarParams::LongitudinalPIDTuning::Builder::setKpBP(::kj::ArrayPtr<const float> value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Builder::initKpBP(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::init(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), size);
}
inline void CarParams::LongitudinalPIDTuning::Builder::adoptKpBP(
::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::adopt(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> CarParams::LongitudinalPIDTuning::Builder::disownKpBP() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::disown(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline bool CarParams::LongitudinalPIDTuning::Reader::hasKpV() const {
return !_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline bool CarParams::LongitudinalPIDTuning::Builder::hasKpV() {
return !_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader CarParams::LongitudinalPIDTuning::Reader::getKpV() const {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Builder::getKpV() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline void CarParams::LongitudinalPIDTuning::Builder::setKpV( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), value);
}
inline void CarParams::LongitudinalPIDTuning::Builder::setKpV(::kj::ArrayPtr<const float> value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), value);
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Builder::initKpV(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::init(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), size);
}
inline void CarParams::LongitudinalPIDTuning::Builder::adoptKpV(
::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::adopt(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> CarParams::LongitudinalPIDTuning::Builder::disownKpV() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::disown(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline bool CarParams::LongitudinalPIDTuning::Reader::hasKiBP() const {
return !_reader.getPointerField(
::capnp::bounded<2>() * ::capnp::POINTERS).isNull();
@@ -9129,82 +9182,23 @@ inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> CarPara
::capnp::bounded<3>() * ::capnp::POINTERS));
}
inline bool CarParams::LongitudinalPIDTuning::Deprecated::Reader::hasKpBP() const {
return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Reader CarParams::LongitudinalPIDTuning::Reader::getDeprecated() const {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Reader(_reader);
}
inline bool CarParams::LongitudinalPIDTuning::Deprecated::Builder::hasKpBP() {
return !_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Builder CarParams::LongitudinalPIDTuning::Builder::getDeprecated() {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Builder(_builder);
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader CarParams::LongitudinalPIDTuning::Deprecated::Reader::getKpBP() const {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
#if !CAPNP_LITE
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Pipeline CarParams::LongitudinalPIDTuning::Pipeline::getDeprecated() {
return typename CarParams::LongitudinalPIDTuning::Deprecated::Pipeline(_typeless.noop());
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Deprecated::Builder::getKpBP() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
#endif // !CAPNP_LITE
inline typename CarParams::LongitudinalPIDTuning::Deprecated::Builder CarParams::LongitudinalPIDTuning::Builder::initDeprecated() {
_builder.setDataField< ::uint32_t>(::capnp::bounded<0>() * ::capnp::ELEMENTS, 0);
_builder.getPointerField(::capnp::bounded<4>() * ::capnp::POINTERS).clear();
_builder.getPointerField(::capnp::bounded<5>() * ::capnp::POINTERS).clear();
return typename CarParams::LongitudinalPIDTuning::Deprecated::Builder(_builder);
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::setKpBP( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::setKpBP(::kj::ArrayPtr<const float> value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Deprecated::Builder::initKpBP(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::init(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), size);
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::adoptKpBP(
::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::adopt(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> CarParams::LongitudinalPIDTuning::Deprecated::Builder::disownKpBP() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::disown(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline bool CarParams::LongitudinalPIDTuning::Deprecated::Reader::hasKpV() const {
return !_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline bool CarParams::LongitudinalPIDTuning::Deprecated::Builder::hasKpV() {
return !_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader CarParams::LongitudinalPIDTuning::Deprecated::Reader::getKpV() const {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Deprecated::Builder::getKpV() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::get(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::setKpV( ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Reader value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), value);
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::setKpV(::kj::ArrayPtr<const float> value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::set(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), value);
}
inline ::capnp::List<float, ::capnp::Kind::PRIMITIVE>::Builder CarParams::LongitudinalPIDTuning::Deprecated::Builder::initKpV(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::init(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), size);
}
inline void CarParams::LongitudinalPIDTuning::Deprecated::Builder::adoptKpV(
::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>&& value) {
::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::adopt(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>> CarParams::LongitudinalPIDTuning::Deprecated::Builder::disownKpV() {
return ::capnp::_::PointerHelpers< ::capnp::List<float, ::capnp::Kind::PRIMITIVE>>::disown(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline bool CarParams::LongitudinalPIDTuning::Deprecated::Reader::hasDeadzoneBP() const {
return !_reader.getPointerField(
::capnp::bounded<4>() * ::capnp::POINTERS).isNull();
Binary file not shown.
+1 -1
View File
@@ -15,7 +15,7 @@ public:
static std::string get_serial() { return "cccccc"; }
static std::map<std::string, std::string> get_init_logs(bool route_log = false) {
static std::map<std::string, std::string> get_init_logs() {
return {};
}
+7 -9
View File
@@ -59,7 +59,7 @@ public:
std::ofstream("/sys/class/leds/led:switch_2/brightness") << value << "\n";
}
static std::map<std::string, std::string> get_init_logs(bool route_log = false) {
static std::map<std::string, std::string> get_init_logs() {
std::map<std::string, std::string> ret = {
{"/BUILD", util::read_file("/BUILD")},
{"lsblk", util::check_output("lsblk -o NAME,SIZE,STATE,VENDOR,MODEL,REV,SERIAL")},
@@ -73,14 +73,12 @@ public:
temp.erase(temp.find_last_not_of(std::string("\0\r\n", 3))+1);
ret["boot temp"] = temp;
// TODO: these are too slow to do on route log inits. need to do it async?
if (!route_log) {
for (std::string part : {"xbl", "abl", "aop", "devcfg", "xbl_config"}) {
for (std::string slot : {"a", "b"}) {
std::string partition = part + "_" + slot;
std::string hash = util::check_output("sha256sum /dev/disk/by-partlabel/" + partition);
ret[partition] = hash.substr(0, hash.find_first_of(" "));
}
// TODO: log something from system and boot
for (std::string part : {"xbl", "abl", "aop", "devcfg", "xbl_config"}) {
for (std::string slot : {"a", "b"}) {
std::string partition = part + "_" + slot;
std::string hash = util::check_output("sha256sum /dev/disk/by-partlabel/" + partition);
ret[partition] = hash.substr(0, hash.find_first_of(" "));
}
}
Binary file not shown.
+1 -4
View File
@@ -91,10 +91,10 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
{"ObdMultiplexingChanged", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BOOL}},
{"ObdMultiplexingEnabled", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, BOOL}},
{"Offroad_CarUnrecognized", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}},
{"Offroad_ChestnutBranch", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_ConnectivityNeeded", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_ConnectivityNeededPrompt", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_ExcessiveActuation", {PERSISTENT, JSON}},
{"Offroad_NeosUpdate", {CLEAR_ON_MANAGER_START, JSON}},
{"Offroad_NoFirmware", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}},
{"Offroad_Recalibration", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, JSON}},
{"Offroad_TemperatureTooHigh", {CLEAR_ON_MANAGER_START, JSON}},
@@ -195,14 +195,11 @@ inline static std::unordered_map<std::string, ParamKeyAttributes> keys = {
// Model Manager params
{"ModelManager_ActiveBundle", {PERSISTENT, JSON}},
{"ModelManager_ActiveJson", {CLEAR_ON_MANAGER_START, STRING}},
{"ModelManager_ClearCache", {CLEAR_ON_MANAGER_START, BOOL}},
{"ModelManager_DownloadIndex", {CLEAR_ON_MANAGER_START | CLEAR_ON_ONROAD_TRANSITION, INT}},
{"ModelManager_Favs", {PERSISTENT | BACKUP, STRING}},
{"ModelManager_LastSyncTime", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, INT, "0"}},
{"ModelManager_LastSyncTime_USBGPU", {CLEAR_ON_MANAGER_START | CLEAR_ON_OFFROAD_TRANSITION, INT, "0"}},
{"ModelManager_ModelsCache", {PERSISTENT | BACKUP, JSON}},
{"ModelManager_ModelsCache_USBGPU", {PERSISTENT | BACKUP, JSON}},
// Neural Network Lateral Control
{"NeuralNetworkLateralControl", {PERSISTENT | BACKUP, BOOL, "0"}},
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -44,7 +44,8 @@ class LongControl:
self.CP = CP
self.CP_SP = CP_SP
self.long_control_state = LongCtrlState.off
self.pid = PIDController(0.0, (CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV),
self.pid = PIDController((CP.longitudinalTuning.kpBP, CP.longitudinalTuning.kpV),
(CP.longitudinalTuning.kiBP, CP.longitudinalTuning.kiV),
rate=1 / DT_CTRL)
self.last_output_accel = 0.0
@@ -1,524 +0,0 @@
{
"acados_include_path": "/usr/local/venv/lib/python3.12/site-packages/acados/install/include",
"acados_lib_path": "/usr/local/venv/lib/python3.12/site-packages/acados/install/lib",
"code_export_directory": "/data/openpilot/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/c_generated_code",
"constraints": {
"C": [],
"C_e": [],
"D": [],
"constr_type": "BGH",
"constr_type_e": "BGH",
"idxbu": [],
"idxbx": [],
"idxbx_0": [
0,
1,
2
],
"idxbx_e": [],
"idxbxe_0": [
0,
1,
2
],
"idxsbu": [],
"idxsbx": [],
"idxsbx_e": [],
"idxsg": [],
"idxsg_e": [],
"idxsh": [
0,
1,
2,
3
],
"idxsh_e": [],
"idxsphi": [],
"idxsphi_e": [],
"lbu": [],
"lbx": [],
"lbx_0": [
0.0,
0.0,
0.0
],
"lbx_e": [],
"lg": [],
"lg_e": [],
"lh": [
0.0,
0.0,
0.0,
0.0
],
"lh_e": [],
"lphi": [],
"lphi_e": [],
"lsbu": [],
"lsbx": [],
"lsbx_e": [],
"lsg": [],
"lsg_e": [],
"lsh": [
0.0,
0.0,
0.0,
0.0
],
"lsh_e": [],
"lsphi": [],
"lsphi_e": [],
"ubu": [],
"ubx": [],
"ubx_0": [
0.0,
0.0,
0.0
],
"ubx_e": [],
"ug": [],
"ug_e": [],
"uh": [
10000.0,
10000.0,
10000.0,
10000.0
],
"uh_e": [],
"uphi": [],
"uphi_e": [],
"usbu": [],
"usbx": [],
"usbx_e": [],
"usg": [],
"usg_e": [],
"ush": [
0.0,
0.0,
0.0,
0.0
],
"ush_e": [],
"usphi": [],
"usphi_e": []
},
"cost": {
"Vu": [],
"Vu_0": [],
"Vx": [],
"Vx_0": [],
"Vx_e": [],
"Vz": [],
"Vz_0": [],
"W": [
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
],
"W_0": [
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
]
],
"W_e": [
[
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0
],
[
0.0,
0.0,
0.0,
0.0,
0.0
]
],
"Zl": [
0.0,
0.0,
0.0,
0.0
],
"Zl_e": [],
"Zu": [
0.0,
0.0,
0.0,
0.0
],
"Zu_e": [],
"cost_ext_fun_type": "casadi",
"cost_ext_fun_type_0": "casadi",
"cost_ext_fun_type_e": "casadi",
"cost_type": "NONLINEAR_LS",
"cost_type_0": "NONLINEAR_LS",
"cost_type_e": "NONLINEAR_LS",
"yref": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"yref_0": [
0.0,
0.0,
0.0,
0.0,
0.0,
0.0
],
"yref_e": [
0.0,
0.0,
0.0,
0.0,
0.0
],
"zl": [
0.0,
0.0,
0.0,
0.0
],
"zl_e": [],
"zu": [
0.0,
0.0,
0.0,
0.0
],
"zu_e": []
},
"cython_include_dirs": [
"/usr/local/venv/lib/python3.12/site-packages/numpy/_core/include",
"/usr/include/python3.12"
],
"dims": {
"N": 12,
"nbu": 0,
"nbx": 0,
"nbx_0": 3,
"nbx_e": 0,
"nbxe_0": 3,
"ng": 0,
"ng_e": 0,
"nh": 4,
"nh_e": 0,
"np": 6,
"nphi": 0,
"nphi_e": 0,
"nr": 0,
"nr_e": 0,
"ns": 4,
"ns_e": 0,
"nsbu": 0,
"nsbx": 0,
"nsbx_e": 0,
"nsg": 0,
"nsg_e": 0,
"nsh": 4,
"nsh_e": 0,
"nsphi": 0,
"nsphi_e": 0,
"nu": 1,
"nx": 3,
"ny": 6,
"ny_0": 6,
"ny_e": 5,
"nz": 0
},
"json_file": "/data/openpilot/openpilot/selfdrive/controls/lib/longitudinal_mpc_lib/acados_ocp_long.json",
"model": {
"con_h_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegiaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpfngjgogegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpfngbgihchcaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaacbaaaaaamgfgbgegpfegbgoghgfgchpfggbgdgehpgchegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaachbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhchbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajggaaaaaaaegbaaaaaaaaaaaaaaachbaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaa",
"con_h_expr_e": null,
"con_phi_expr": null,
"con_phi_expr_e": null,
"con_r_expr": null,
"con_r_expr_e": null,
"con_r_in_phi": null,
"con_r_in_phi_e": null,
"cost_conl_custom_outer_hess": null,
"cost_conl_custom_outer_hess_0": null,
"cost_conl_custom_outer_hess_e": null,
"cost_expr_ext_cost": null,
"cost_expr_ext_cost_0": null,
"cost_expr_ext_cost_custom_hess": null,
"cost_expr_ext_cost_custom_hess_0": null,
"cost_expr_ext_cost_custom_hess_e": null,
"cost_expr_ext_cost_e": null,
"cost_psi_expr": null,
"cost_psi_expr_0": null,
"cost_psi_expr_e": null,
"cost_r_in_psi_expr": null,
"cost_r_in_psi_expr_0": null,
"cost_r_in_psi_expr_e": null,
"cost_y_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegkaaaaaaaaaaaaaaagaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajggaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegcaaaaaaaaaaaaaaachbbaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaagaaaaaaabgpfahchfgghegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg",
"cost_y_expr_0": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegkaaaaaaaaaaaaaaagaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajggaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegcaaaaaaaaaaaaaaachbbaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaagaaaaaaabgpfahchfgghegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg",
"cost_y_expr_e": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegjaaaaaaaaaaaaaaafaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegbaaaaaaaaaaaaaaaegbaaaaaaaaaaaaaaaegeaaaaaaaaaaaaaaaeglaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegmcaaaaaaaaaaaaaajgfaaaaaaaegdaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhcheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajggaaaaaaaegbaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegmcaaaaaaaaaaaaaajgkaaaaaaachcaaaaaaaaaaaaaaacheaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegcaaaaaaaaaaaaaaachbbaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaagaaaaaaabgpfahchfggh",
"disc_dyn_expr": null,
"dyn_disc_fun": null,
"dyn_disc_fun_jac": null,
"dyn_disc_fun_jac_hess": null,
"dyn_ext_fun_type": "casadi",
"dyn_generic_source": null,
"f_expl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg",
"f_impl_expr": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaghpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpgegcaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaabgpffghgpgpfegpgehegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg",
"gnsf": {
"nontrivial_f_LO": 1,
"purely_linear": 0
},
"name": "long",
"p": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegkaaaaaaaaaaaaaaagaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaafaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaabgpfngjgogegpcaaaaaaaaaaaaaafaaaaaaabgpfngbgihegpcaaaaaaaaaaaaaakaaaaaaaihpfpgcgdhehbgdgmgfgegpcaaaaaaaaaaaaaagaaaaaaabgpfahchfgghegpcaaaaaaaaaaaaaanaaaaaaamgfgbgegpfehpfggpgmgmgpghhegpcaaaaaaaaaaaaaacbaaaaaamgfgbgegpfegbgoghgfgchpfggbgdgehpgch",
"u": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegfaaaaaaaaaaaaaaabaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaakgpffghgpg",
"x": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaafaaaaaaaihpffghgpgegpcaaaaaaaaaaaaaafaaaaaaaghpffghgpgegpcaaaaaaaaaaaaaafaaaaaaabgpffghgpg",
"xdot": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaeghaaaaaaaaaaaaaaadaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaacaaaaaaaaaaaaaaadaaaaaaaaaaaaaaaegpcaaaaaaaaaaaaaajaaaaaaaihpffghgpgpfegpgehegpcaaaaaaaaaaaaaajaaaaaaaghpffghgpgpfegpgehegpcaaaaaaaaaaaaaajaaaaaaabgpffghgpgpfegpgeh",
"z": "jhpnnagiieahaaaadaaaaaaaaaaaaaaaaaegdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
},
"parameter_values": [
-1.2,
1.2,
0.0,
0.0,
1.45,
0.75
],
"problem_class": "OCP",
"shared_lib_ext": ".so",
"solver_options": {
"Tsim": 0.06944444444444445,
"alpha_min": 0.05,
"alpha_reduction": 0.7,
"collocation_type": "GAUSS_LEGENDRE",
"custom_templates": [],
"custom_update_copy": true,
"custom_update_filename": "",
"custom_update_header_filename": "",
"eps_sufficient_descent": 0.0001,
"exact_hess_constr": 1,
"exact_hess_cost": 1,
"exact_hess_dyn": 1,
"ext_cost_num_hess": 0,
"ext_fun_compile_flags": "-O2",
"full_step_dual": 0,
"globalization": "FIXED_STEP",
"globalization_use_SOC": 0,
"hessian_approx": "GAUSS_NEWTON",
"hpipm_mode": "BALANCE",
"initialize_t_slacks": 0,
"integrator_type": "ERK",
"levenberg_marquardt": 0.0,
"line_search_use_sufficient_descent": 0,
"model_external_shared_lib_dir": null,
"model_external_shared_lib_name": null,
"nlp_solver_ext_qp_res": 0,
"nlp_solver_max_iter": 100,
"nlp_solver_step_length": 1.0,
"nlp_solver_tol_comp": 1e-06,
"nlp_solver_tol_eq": 1e-06,
"nlp_solver_tol_ineq": 1e-06,
"nlp_solver_tol_stat": 1e-06,
"nlp_solver_type": "SQP_RTI",
"print_level": 0,
"qp_solver": "PARTIAL_CONDENSING_HPIPM",
"qp_solver_cond_N": 1,
"qp_solver_cond_ric_alg": 1,
"qp_solver_iter_max": 10,
"qp_solver_ric_alg": 1,
"qp_solver_tol_comp": 0.001,
"qp_solver_tol_eq": 0.001,
"qp_solver_tol_ineq": 0.001,
"qp_solver_tol_stat": 0.001,
"qp_solver_warm_start": 0,
"regularize_method": null,
"shooting_nodes": [
0.0,
0.06944444444444445,
0.2777777777777778,
0.625,
1.1111111111111112,
1.7361111111111114,
2.5,
3.4027777777777786,
4.444444444444445,
5.625,
6.9444444444444455,
8.402777777777777,
10.0
],
"sim_method_jac_reuse": [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
],
"sim_method_newton_iter": 3,
"sim_method_newton_tol": 0.0,
"sim_method_num_stages": [
4,
4,
4,
4,
4,
4,
4,
4,
4,
4,
4,
4
],
"sim_method_num_steps": [
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1,
1
],
"tf": 10.0,
"time_steps": [
0.06944444444444445,
0.20833333333333334,
0.3472222222222222,
0.48611111111111116,
0.6250000000000002,
0.7638888888888886,
0.9027777777777786,
1.041666666666666,
1.1805555555555554,
1.3194444444444455,
1.4583333333333313,
1.5972222222222232
]
}
}
File diff suppressed because one or more lines are too long
@@ -49,8 +49,9 @@ def get_cruise_accel(e2e, v_cruise, v_ego, a_cruise_prev, angle_steers, CP, dt,
max_accel = min(max_accel, coast_limit)
target_accel = np.clip(v_cruise - v_ego, A_CRUISE_MIN, max_accel)
j_cruise = np.interp(v_ego, A_CRUISE_MAX_BP, J_CRUISE_VALS)
target_accel = float(np.clip(target_accel, a_cruise_prev - j_cruise * dt, a_cruise_prev + j_cruise * dt))
if not e2e:
j_cruise = np.interp(v_ego, A_CRUISE_MAX_BP, J_CRUISE_VALS)
target_accel = float(np.clip(target_accel, a_cruise_prev - j_cruise * dt, a_cruise_prev + j_cruise * dt))
return target_accel
@@ -64,9 +65,10 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
self.dt = dt
self.allow_throttle = True
self.a_desired = init_a
self.v_desired_filter = FirstOrderFilter(init_v, 2.0, self.dt)
self.a_cruise = init_a
self.output_a_target = init_a
self.a_cruise = 0.0
self.output_a_target = 0.0
self.output_should_stop = False
self.v_desired_trajectory = np.zeros(CONTROL_N)
@@ -103,8 +105,7 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
if reset_state:
self.v_desired_filter.x = v_ego
self.output_a_target = np.clip(sm['carState'].aEgo, ACCEL_MIN, ACCEL_MAX)
self.a_cruise = self.output_a_target
self.a_desired = np.clip(sm['carState'].aEgo, ACCEL_MIN, ACCEL_MAX)
# Prevent divergence, smooth in current v_ego
self.v_desired_filter.x = max(0.0, self.v_desired_filter.update(v_ego))
@@ -112,11 +113,11 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
# No change cost when user is controlling the speed, or when standstill
prev_accel_constraint = not (reset_state or sm['carState'].standstill)
# Get new v_cruise and a_target from Smart Cruise Control and Speed Limit Assist
v_cruise, self.output_a_target = LongitudinalPlannerSP.update_targets(self, sm, self.v_desired_filter.x, self.output_a_target, v_cruise)
# Get new v_cruise and a_desired from Smart Cruise Control and Speed Limit Assist
v_cruise, self.a_desired = LongitudinalPlannerSP.update_targets(self, sm, self.v_desired_filter.x, self.a_desired, v_cruise)
self.mpc.set_weights(prev_accel_constraint, personality=sm['selfdriveState'].personality)
self.mpc.set_cur_state(self.v_desired_filter.x, self.output_a_target)
self.mpc.set_cur_state(self.v_desired_filter.x, self.a_desired)
self.mpc.update(sm['radarState'], personality=sm['selfdriveState'].personality)
self.v_desired_trajectory = np.interp(CONTROL_N_T_IDX, T_IDXS_MPC, self.mpc.v_solution)
@@ -129,7 +130,7 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
cloudlog.info("FCW triggered")
# Save starting point for next iteration
a_prev = self.output_a_target
a_prev = self.a_desired
action_t = self.CP.longitudinalActuatorDelay + DT_MDL
output_a_target_mpc = get_accel_from_plan(self.v_desired_trajectory, self.a_desired_trajectory, CONTROL_N_T_IDX,
@@ -138,22 +139,30 @@ class LongitudinalPlanner(LongitudinalPlannerSP):
output_a_target_e2e = sm['modelV2'].action.desiredAcceleration
output_should_stop_e2e = sm['modelV2'].action.shouldStop
is_e2e = self.is_e2e(sm)
if self.is_e2e(sm):
output_a_target = min(output_a_target_e2e, output_a_target_mpc)
self.output_should_stop = output_should_stop_e2e or output_should_stop_mpc
if output_a_target < output_a_target_mpc:
self.mpc.source = LongitudinalPlanSource.e2e
else:
output_a_target = output_a_target_mpc
self.output_should_stop = output_should_stop_mpc
self.a_cruise = get_cruise_accel(is_e2e, v_cruise, v_ego,
self.a_cruise = get_cruise_accel(sm['selfdriveState'].experimentalMode, v_cruise, v_ego,
self.a_cruise, steer_angle_without_offset, self.CP, self.dt,
accel_coast, self.allow_throttle)
cruise_should_stop = should_stop(v_ego, self.a_cruise)
candidates = [(output_a_target_mpc, self.mpc.source, output_should_stop_mpc),
(self.a_cruise, LongitudinalPlanSource.cruise, cruise_should_stop)]
if is_e2e:
if sm['selfdriveState'].experimentalMode:
candidates.append((output_a_target_e2e, LongitudinalPlanSource.e2e, output_should_stop_e2e))
output_a_target, self.mpc.source, _ = min(candidates, key=lambda c: c[0])
self.output_should_stop = any(should_stop for _, _, should_stop in candidates)
self.output_a_target = np.clip(output_a_target, ACCEL_MIN, ACCEL_MAX)
self.a_desired = float(self.output_a_target)
self.v_desired_filter.x = self.v_desired_filter.x + self.dt * (self.output_a_target + a_prev) / 2.0
def publish(self, sm, pm):
@@ -45,326 +45,326 @@ const static double MAHA_THRESH_31 = 3.8414588206941227;
* *
* This file is part of 'ekf' *
******************************************************************************/
void err_fun(double *nom_x, double *delta_x, double *out_5070392900769873758) {
out_5070392900769873758[0] = delta_x[0] + nom_x[0];
out_5070392900769873758[1] = delta_x[1] + nom_x[1];
out_5070392900769873758[2] = delta_x[2] + nom_x[2];
out_5070392900769873758[3] = delta_x[3] + nom_x[3];
out_5070392900769873758[4] = delta_x[4] + nom_x[4];
out_5070392900769873758[5] = delta_x[5] + nom_x[5];
out_5070392900769873758[6] = delta_x[6] + nom_x[6];
out_5070392900769873758[7] = delta_x[7] + nom_x[7];
out_5070392900769873758[8] = delta_x[8] + nom_x[8];
void err_fun(double *nom_x, double *delta_x, double *out_3066078453041735876) {
out_3066078453041735876[0] = delta_x[0] + nom_x[0];
out_3066078453041735876[1] = delta_x[1] + nom_x[1];
out_3066078453041735876[2] = delta_x[2] + nom_x[2];
out_3066078453041735876[3] = delta_x[3] + nom_x[3];
out_3066078453041735876[4] = delta_x[4] + nom_x[4];
out_3066078453041735876[5] = delta_x[5] + nom_x[5];
out_3066078453041735876[6] = delta_x[6] + nom_x[6];
out_3066078453041735876[7] = delta_x[7] + nom_x[7];
out_3066078453041735876[8] = delta_x[8] + nom_x[8];
}
void inv_err_fun(double *nom_x, double *true_x, double *out_3742760733154016051) {
out_3742760733154016051[0] = -nom_x[0] + true_x[0];
out_3742760733154016051[1] = -nom_x[1] + true_x[1];
out_3742760733154016051[2] = -nom_x[2] + true_x[2];
out_3742760733154016051[3] = -nom_x[3] + true_x[3];
out_3742760733154016051[4] = -nom_x[4] + true_x[4];
out_3742760733154016051[5] = -nom_x[5] + true_x[5];
out_3742760733154016051[6] = -nom_x[6] + true_x[6];
out_3742760733154016051[7] = -nom_x[7] + true_x[7];
out_3742760733154016051[8] = -nom_x[8] + true_x[8];
void inv_err_fun(double *nom_x, double *true_x, double *out_7998306431651746749) {
out_7998306431651746749[0] = -nom_x[0] + true_x[0];
out_7998306431651746749[1] = -nom_x[1] + true_x[1];
out_7998306431651746749[2] = -nom_x[2] + true_x[2];
out_7998306431651746749[3] = -nom_x[3] + true_x[3];
out_7998306431651746749[4] = -nom_x[4] + true_x[4];
out_7998306431651746749[5] = -nom_x[5] + true_x[5];
out_7998306431651746749[6] = -nom_x[6] + true_x[6];
out_7998306431651746749[7] = -nom_x[7] + true_x[7];
out_7998306431651746749[8] = -nom_x[8] + true_x[8];
}
void H_mod_fun(double *state, double *out_5758456641177717920) {
out_5758456641177717920[0] = 1.0;
out_5758456641177717920[1] = 0.0;
out_5758456641177717920[2] = 0.0;
out_5758456641177717920[3] = 0.0;
out_5758456641177717920[4] = 0.0;
out_5758456641177717920[5] = 0.0;
out_5758456641177717920[6] = 0.0;
out_5758456641177717920[7] = 0.0;
out_5758456641177717920[8] = 0.0;
out_5758456641177717920[9] = 0.0;
out_5758456641177717920[10] = 1.0;
out_5758456641177717920[11] = 0.0;
out_5758456641177717920[12] = 0.0;
out_5758456641177717920[13] = 0.0;
out_5758456641177717920[14] = 0.0;
out_5758456641177717920[15] = 0.0;
out_5758456641177717920[16] = 0.0;
out_5758456641177717920[17] = 0.0;
out_5758456641177717920[18] = 0.0;
out_5758456641177717920[19] = 0.0;
out_5758456641177717920[20] = 1.0;
out_5758456641177717920[21] = 0.0;
out_5758456641177717920[22] = 0.0;
out_5758456641177717920[23] = 0.0;
out_5758456641177717920[24] = 0.0;
out_5758456641177717920[25] = 0.0;
out_5758456641177717920[26] = 0.0;
out_5758456641177717920[27] = 0.0;
out_5758456641177717920[28] = 0.0;
out_5758456641177717920[29] = 0.0;
out_5758456641177717920[30] = 1.0;
out_5758456641177717920[31] = 0.0;
out_5758456641177717920[32] = 0.0;
out_5758456641177717920[33] = 0.0;
out_5758456641177717920[34] = 0.0;
out_5758456641177717920[35] = 0.0;
out_5758456641177717920[36] = 0.0;
out_5758456641177717920[37] = 0.0;
out_5758456641177717920[38] = 0.0;
out_5758456641177717920[39] = 0.0;
out_5758456641177717920[40] = 1.0;
out_5758456641177717920[41] = 0.0;
out_5758456641177717920[42] = 0.0;
out_5758456641177717920[43] = 0.0;
out_5758456641177717920[44] = 0.0;
out_5758456641177717920[45] = 0.0;
out_5758456641177717920[46] = 0.0;
out_5758456641177717920[47] = 0.0;
out_5758456641177717920[48] = 0.0;
out_5758456641177717920[49] = 0.0;
out_5758456641177717920[50] = 1.0;
out_5758456641177717920[51] = 0.0;
out_5758456641177717920[52] = 0.0;
out_5758456641177717920[53] = 0.0;
out_5758456641177717920[54] = 0.0;
out_5758456641177717920[55] = 0.0;
out_5758456641177717920[56] = 0.0;
out_5758456641177717920[57] = 0.0;
out_5758456641177717920[58] = 0.0;
out_5758456641177717920[59] = 0.0;
out_5758456641177717920[60] = 1.0;
out_5758456641177717920[61] = 0.0;
out_5758456641177717920[62] = 0.0;
out_5758456641177717920[63] = 0.0;
out_5758456641177717920[64] = 0.0;
out_5758456641177717920[65] = 0.0;
out_5758456641177717920[66] = 0.0;
out_5758456641177717920[67] = 0.0;
out_5758456641177717920[68] = 0.0;
out_5758456641177717920[69] = 0.0;
out_5758456641177717920[70] = 1.0;
out_5758456641177717920[71] = 0.0;
out_5758456641177717920[72] = 0.0;
out_5758456641177717920[73] = 0.0;
out_5758456641177717920[74] = 0.0;
out_5758456641177717920[75] = 0.0;
out_5758456641177717920[76] = 0.0;
out_5758456641177717920[77] = 0.0;
out_5758456641177717920[78] = 0.0;
out_5758456641177717920[79] = 0.0;
out_5758456641177717920[80] = 1.0;
void H_mod_fun(double *state, double *out_8410823161376016702) {
out_8410823161376016702[0] = 1.0;
out_8410823161376016702[1] = 0.0;
out_8410823161376016702[2] = 0.0;
out_8410823161376016702[3] = 0.0;
out_8410823161376016702[4] = 0.0;
out_8410823161376016702[5] = 0.0;
out_8410823161376016702[6] = 0.0;
out_8410823161376016702[7] = 0.0;
out_8410823161376016702[8] = 0.0;
out_8410823161376016702[9] = 0.0;
out_8410823161376016702[10] = 1.0;
out_8410823161376016702[11] = 0.0;
out_8410823161376016702[12] = 0.0;
out_8410823161376016702[13] = 0.0;
out_8410823161376016702[14] = 0.0;
out_8410823161376016702[15] = 0.0;
out_8410823161376016702[16] = 0.0;
out_8410823161376016702[17] = 0.0;
out_8410823161376016702[18] = 0.0;
out_8410823161376016702[19] = 0.0;
out_8410823161376016702[20] = 1.0;
out_8410823161376016702[21] = 0.0;
out_8410823161376016702[22] = 0.0;
out_8410823161376016702[23] = 0.0;
out_8410823161376016702[24] = 0.0;
out_8410823161376016702[25] = 0.0;
out_8410823161376016702[26] = 0.0;
out_8410823161376016702[27] = 0.0;
out_8410823161376016702[28] = 0.0;
out_8410823161376016702[29] = 0.0;
out_8410823161376016702[30] = 1.0;
out_8410823161376016702[31] = 0.0;
out_8410823161376016702[32] = 0.0;
out_8410823161376016702[33] = 0.0;
out_8410823161376016702[34] = 0.0;
out_8410823161376016702[35] = 0.0;
out_8410823161376016702[36] = 0.0;
out_8410823161376016702[37] = 0.0;
out_8410823161376016702[38] = 0.0;
out_8410823161376016702[39] = 0.0;
out_8410823161376016702[40] = 1.0;
out_8410823161376016702[41] = 0.0;
out_8410823161376016702[42] = 0.0;
out_8410823161376016702[43] = 0.0;
out_8410823161376016702[44] = 0.0;
out_8410823161376016702[45] = 0.0;
out_8410823161376016702[46] = 0.0;
out_8410823161376016702[47] = 0.0;
out_8410823161376016702[48] = 0.0;
out_8410823161376016702[49] = 0.0;
out_8410823161376016702[50] = 1.0;
out_8410823161376016702[51] = 0.0;
out_8410823161376016702[52] = 0.0;
out_8410823161376016702[53] = 0.0;
out_8410823161376016702[54] = 0.0;
out_8410823161376016702[55] = 0.0;
out_8410823161376016702[56] = 0.0;
out_8410823161376016702[57] = 0.0;
out_8410823161376016702[58] = 0.0;
out_8410823161376016702[59] = 0.0;
out_8410823161376016702[60] = 1.0;
out_8410823161376016702[61] = 0.0;
out_8410823161376016702[62] = 0.0;
out_8410823161376016702[63] = 0.0;
out_8410823161376016702[64] = 0.0;
out_8410823161376016702[65] = 0.0;
out_8410823161376016702[66] = 0.0;
out_8410823161376016702[67] = 0.0;
out_8410823161376016702[68] = 0.0;
out_8410823161376016702[69] = 0.0;
out_8410823161376016702[70] = 1.0;
out_8410823161376016702[71] = 0.0;
out_8410823161376016702[72] = 0.0;
out_8410823161376016702[73] = 0.0;
out_8410823161376016702[74] = 0.0;
out_8410823161376016702[75] = 0.0;
out_8410823161376016702[76] = 0.0;
out_8410823161376016702[77] = 0.0;
out_8410823161376016702[78] = 0.0;
out_8410823161376016702[79] = 0.0;
out_8410823161376016702[80] = 1.0;
}
void f_fun(double *state, double dt, double *out_730595102125265078) {
out_730595102125265078[0] = state[0];
out_730595102125265078[1] = state[1];
out_730595102125265078[2] = state[2];
out_730595102125265078[3] = state[3];
out_730595102125265078[4] = state[4];
out_730595102125265078[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8100000000000005*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5];
out_730595102125265078[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6];
out_730595102125265078[7] = state[7];
out_730595102125265078[8] = state[8];
void f_fun(double *state, double dt, double *out_8406538155675584278) {
out_8406538155675584278[0] = state[0];
out_8406538155675584278[1] = state[1];
out_8406538155675584278[2] = state[2];
out_8406538155675584278[3] = state[3];
out_8406538155675584278[4] = state[4];
out_8406538155675584278[5] = dt*((-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]))*state[6] - 9.8100000000000005*state[8] + stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*state[1]) + (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*state[4])) + state[5];
out_8406538155675584278[6] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*state[4])) + state[6];
out_8406538155675584278[7] = state[7];
out_8406538155675584278[8] = state[8];
}
void F_fun(double *state, double dt, double *out_7198115545780111359) {
out_7198115545780111359[0] = 1;
out_7198115545780111359[1] = 0;
out_7198115545780111359[2] = 0;
out_7198115545780111359[3] = 0;
out_7198115545780111359[4] = 0;
out_7198115545780111359[5] = 0;
out_7198115545780111359[6] = 0;
out_7198115545780111359[7] = 0;
out_7198115545780111359[8] = 0;
out_7198115545780111359[9] = 0;
out_7198115545780111359[10] = 1;
out_7198115545780111359[11] = 0;
out_7198115545780111359[12] = 0;
out_7198115545780111359[13] = 0;
out_7198115545780111359[14] = 0;
out_7198115545780111359[15] = 0;
out_7198115545780111359[16] = 0;
out_7198115545780111359[17] = 0;
out_7198115545780111359[18] = 0;
out_7198115545780111359[19] = 0;
out_7198115545780111359[20] = 1;
out_7198115545780111359[21] = 0;
out_7198115545780111359[22] = 0;
out_7198115545780111359[23] = 0;
out_7198115545780111359[24] = 0;
out_7198115545780111359[25] = 0;
out_7198115545780111359[26] = 0;
out_7198115545780111359[27] = 0;
out_7198115545780111359[28] = 0;
out_7198115545780111359[29] = 0;
out_7198115545780111359[30] = 1;
out_7198115545780111359[31] = 0;
out_7198115545780111359[32] = 0;
out_7198115545780111359[33] = 0;
out_7198115545780111359[34] = 0;
out_7198115545780111359[35] = 0;
out_7198115545780111359[36] = 0;
out_7198115545780111359[37] = 0;
out_7198115545780111359[38] = 0;
out_7198115545780111359[39] = 0;
out_7198115545780111359[40] = 1;
out_7198115545780111359[41] = 0;
out_7198115545780111359[42] = 0;
out_7198115545780111359[43] = 0;
out_7198115545780111359[44] = 0;
out_7198115545780111359[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4]));
out_7198115545780111359[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2));
out_7198115545780111359[47] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_7198115545780111359[48] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_7198115545780111359[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2)));
out_7198115545780111359[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1;
out_7198115545780111359[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]));
out_7198115545780111359[52] = dt*stiffness_front*state[0]/(mass*state[1]);
out_7198115545780111359[53] = -9.8100000000000005*dt;
out_7198115545780111359[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4]));
out_7198115545780111359[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2));
out_7198115545780111359[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_7198115545780111359[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_7198115545780111359[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2)));
out_7198115545780111359[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]);
out_7198115545780111359[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1;
out_7198115545780111359[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_7198115545780111359[62] = 0;
out_7198115545780111359[63] = 0;
out_7198115545780111359[64] = 0;
out_7198115545780111359[65] = 0;
out_7198115545780111359[66] = 0;
out_7198115545780111359[67] = 0;
out_7198115545780111359[68] = 0;
out_7198115545780111359[69] = 0;
out_7198115545780111359[70] = 1;
out_7198115545780111359[71] = 0;
out_7198115545780111359[72] = 0;
out_7198115545780111359[73] = 0;
out_7198115545780111359[74] = 0;
out_7198115545780111359[75] = 0;
out_7198115545780111359[76] = 0;
out_7198115545780111359[77] = 0;
out_7198115545780111359[78] = 0;
out_7198115545780111359[79] = 0;
out_7198115545780111359[80] = 1;
void F_fun(double *state, double dt, double *out_9168420830296677739) {
out_9168420830296677739[0] = 1;
out_9168420830296677739[1] = 0;
out_9168420830296677739[2] = 0;
out_9168420830296677739[3] = 0;
out_9168420830296677739[4] = 0;
out_9168420830296677739[5] = 0;
out_9168420830296677739[6] = 0;
out_9168420830296677739[7] = 0;
out_9168420830296677739[8] = 0;
out_9168420830296677739[9] = 0;
out_9168420830296677739[10] = 1;
out_9168420830296677739[11] = 0;
out_9168420830296677739[12] = 0;
out_9168420830296677739[13] = 0;
out_9168420830296677739[14] = 0;
out_9168420830296677739[15] = 0;
out_9168420830296677739[16] = 0;
out_9168420830296677739[17] = 0;
out_9168420830296677739[18] = 0;
out_9168420830296677739[19] = 0;
out_9168420830296677739[20] = 1;
out_9168420830296677739[21] = 0;
out_9168420830296677739[22] = 0;
out_9168420830296677739[23] = 0;
out_9168420830296677739[24] = 0;
out_9168420830296677739[25] = 0;
out_9168420830296677739[26] = 0;
out_9168420830296677739[27] = 0;
out_9168420830296677739[28] = 0;
out_9168420830296677739[29] = 0;
out_9168420830296677739[30] = 1;
out_9168420830296677739[31] = 0;
out_9168420830296677739[32] = 0;
out_9168420830296677739[33] = 0;
out_9168420830296677739[34] = 0;
out_9168420830296677739[35] = 0;
out_9168420830296677739[36] = 0;
out_9168420830296677739[37] = 0;
out_9168420830296677739[38] = 0;
out_9168420830296677739[39] = 0;
out_9168420830296677739[40] = 1;
out_9168420830296677739[41] = 0;
out_9168420830296677739[42] = 0;
out_9168420830296677739[43] = 0;
out_9168420830296677739[44] = 0;
out_9168420830296677739[45] = dt*(stiffness_front*(-state[2] - state[3] + state[7])/(mass*state[1]) + (-stiffness_front - stiffness_rear)*state[5]/(mass*state[4]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[6]/(mass*state[4]));
out_9168420830296677739[46] = -dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(mass*pow(state[1], 2));
out_9168420830296677739[47] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_9168420830296677739[48] = -dt*stiffness_front*state[0]/(mass*state[1]);
out_9168420830296677739[49] = dt*((-1 - (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*pow(state[4], 2)))*state[6] - (-stiffness_front*state[0] - stiffness_rear*state[0])*state[5]/(mass*pow(state[4], 2)));
out_9168420830296677739[50] = dt*(-stiffness_front*state[0] - stiffness_rear*state[0])/(mass*state[4]) + 1;
out_9168420830296677739[51] = dt*(-state[4] + (-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(mass*state[4]));
out_9168420830296677739[52] = dt*stiffness_front*state[0]/(mass*state[1]);
out_9168420830296677739[53] = -9.8100000000000005*dt;
out_9168420830296677739[54] = dt*(center_to_front*stiffness_front*(-state[2] - state[3] + state[7])/(rotational_inertia*state[1]) + (-center_to_front*stiffness_front + center_to_rear*stiffness_rear)*state[5]/(rotational_inertia*state[4]) + (-pow(center_to_front, 2)*stiffness_front - pow(center_to_rear, 2)*stiffness_rear)*state[6]/(rotational_inertia*state[4]));
out_9168420830296677739[55] = -center_to_front*dt*stiffness_front*(-state[2] - state[3] + state[7])*state[0]/(rotational_inertia*pow(state[1], 2));
out_9168420830296677739[56] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_9168420830296677739[57] = -center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_9168420830296677739[58] = dt*(-(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])*state[5]/(rotational_inertia*pow(state[4], 2)) - (-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])*state[6]/(rotational_inertia*pow(state[4], 2)));
out_9168420830296677739[59] = dt*(-center_to_front*stiffness_front*state[0] + center_to_rear*stiffness_rear*state[0])/(rotational_inertia*state[4]);
out_9168420830296677739[60] = dt*(-pow(center_to_front, 2)*stiffness_front*state[0] - pow(center_to_rear, 2)*stiffness_rear*state[0])/(rotational_inertia*state[4]) + 1;
out_9168420830296677739[61] = center_to_front*dt*stiffness_front*state[0]/(rotational_inertia*state[1]);
out_9168420830296677739[62] = 0;
out_9168420830296677739[63] = 0;
out_9168420830296677739[64] = 0;
out_9168420830296677739[65] = 0;
out_9168420830296677739[66] = 0;
out_9168420830296677739[67] = 0;
out_9168420830296677739[68] = 0;
out_9168420830296677739[69] = 0;
out_9168420830296677739[70] = 1;
out_9168420830296677739[71] = 0;
out_9168420830296677739[72] = 0;
out_9168420830296677739[73] = 0;
out_9168420830296677739[74] = 0;
out_9168420830296677739[75] = 0;
out_9168420830296677739[76] = 0;
out_9168420830296677739[77] = 0;
out_9168420830296677739[78] = 0;
out_9168420830296677739[79] = 0;
out_9168420830296677739[80] = 1;
}
void h_25(double *state, double *unused, double *out_5441109048213736058) {
out_5441109048213736058[0] = state[6];
void h_25(double *state, double *unused, double *out_6925664705835598268) {
out_6925664705835598268[0] = state[6];
}
void H_25(double *state, double *unused, double *out_4766949399557973891) {
out_4766949399557973891[0] = 0;
out_4766949399557973891[1] = 0;
out_4766949399557973891[2] = 0;
out_4766949399557973891[3] = 0;
out_4766949399557973891[4] = 0;
out_4766949399557973891[5] = 0;
out_4766949399557973891[6] = 1;
out_4766949399557973891[7] = 0;
out_4766949399557973891[8] = 0;
void H_25(double *state, double *unused, double *out_842732686421297677) {
out_842732686421297677[0] = 0;
out_842732686421297677[1] = 0;
out_842732686421297677[2] = 0;
out_842732686421297677[3] = 0;
out_842732686421297677[4] = 0;
out_842732686421297677[5] = 0;
out_842732686421297677[6] = 1;
out_842732686421297677[7] = 0;
out_842732686421297677[8] = 0;
}
void h_24(double *state, double *unused, double *out_2797667639827089179) {
out_2797667639827089179[0] = state[4];
out_2797667639827089179[1] = state[5];
void h_24(double *state, double *unused, double *out_611774507479316058) {
out_611774507479316058[0] = state[4];
out_611774507479316058[1] = state[5];
}
void H_24(double *state, double *unused, double *out_4461115786511221334) {
out_4461115786511221334[0] = 0;
out_4461115786511221334[1] = 0;
out_4461115786511221334[2] = 0;
out_4461115786511221334[3] = 0;
out_4461115786511221334[4] = 1;
out_4461115786511221334[5] = 0;
out_4461115786511221334[6] = 0;
out_4461115786511221334[7] = 0;
out_4461115786511221334[8] = 0;
out_4461115786511221334[9] = 0;
out_4461115786511221334[10] = 0;
out_4461115786511221334[11] = 0;
out_4461115786511221334[12] = 0;
out_4461115786511221334[13] = 0;
out_4461115786511221334[14] = 1;
out_4461115786511221334[15] = 0;
out_4461115786511221334[16] = 0;
out_4461115786511221334[17] = 0;
void H_24(double *state, double *unused, double *out_7496938144529483434) {
out_7496938144529483434[0] = 0;
out_7496938144529483434[1] = 0;
out_7496938144529483434[2] = 0;
out_7496938144529483434[3] = 0;
out_7496938144529483434[4] = 1;
out_7496938144529483434[5] = 0;
out_7496938144529483434[6] = 0;
out_7496938144529483434[7] = 0;
out_7496938144529483434[8] = 0;
out_7496938144529483434[9] = 0;
out_7496938144529483434[10] = 0;
out_7496938144529483434[11] = 0;
out_7496938144529483434[12] = 0;
out_7496938144529483434[13] = 0;
out_7496938144529483434[14] = 1;
out_7496938144529483434[15] = 0;
out_7496938144529483434[16] = 0;
out_7496938144529483434[17] = 0;
}
void h_30(double *state, double *unused, double *out_1188271489450022901) {
out_1188271489450022901[0] = state[4];
void h_30(double *state, double *unused, double *out_7082851374186727413) {
out_7082851374186727413[0] = state[4];
}
void H_30(double *state, double *unused, double *out_9152098344023969527) {
out_9152098344023969527[0] = 0;
out_9152098344023969527[1] = 0;
out_9152098344023969527[2] = 0;
out_9152098344023969527[3] = 0;
out_9152098344023969527[4] = 1;
out_9152098344023969527[5] = 0;
out_9152098344023969527[6] = 0;
out_9152098344023969527[7] = 0;
out_9152098344023969527[8] = 0;
void H_30(double *state, double *unused, double *out_3684963643706310521) {
out_3684963643706310521[0] = 0;
out_3684963643706310521[1] = 0;
out_3684963643706310521[2] = 0;
out_3684963643706310521[3] = 0;
out_3684963643706310521[4] = 1;
out_3684963643706310521[5] = 0;
out_3684963643706310521[6] = 0;
out_3684963643706310521[7] = 0;
out_3684963643706310521[8] = 0;
}
void h_26(double *state, double *unused, double *out_6530138725336053464) {
out_6530138725336053464[0] = state[7];
void h_26(double *state, double *unused, double *out_6139341521285064978) {
out_6139341521285064978[0] = state[7];
}
void H_26(double *state, double *unused, double *out_8508452718432030115) {
out_8508452718432030115[0] = 0;
out_8508452718432030115[1] = 0;
out_8508452718432030115[2] = 0;
out_8508452718432030115[3] = 0;
out_8508452718432030115[4] = 0;
out_8508452718432030115[5] = 0;
out_8508452718432030115[6] = 0;
out_8508452718432030115[7] = 1;
out_8508452718432030115[8] = 0;
void H_26(double *state, double *unused, double *out_2898770632452758547) {
out_2898770632452758547[0] = 0;
out_2898770632452758547[1] = 0;
out_2898770632452758547[2] = 0;
out_2898770632452758547[3] = 0;
out_2898770632452758547[4] = 0;
out_2898770632452758547[5] = 0;
out_2898770632452758547[6] = 0;
out_2898770632452758547[7] = 1;
out_2898770632452758547[8] = 0;
}
void h_27(double *state, double *unused, double *out_8003961757834969913) {
out_8003961757834969913[0] = state[3];
void h_27(double *state, double *unused, double *out_8484293316429620663) {
out_8484293316429620663[0] = state[3];
}
void H_27(double *state, double *unused, double *out_6977335032223544616) {
out_6977335032223544616[0] = 0;
out_6977335032223544616[1] = 0;
out_6977335032223544616[2] = 0;
out_6977335032223544616[3] = 1;
out_6977335032223544616[4] = 0;
out_6977335032223544616[5] = 0;
out_6977335032223544616[6] = 0;
out_6977335032223544616[7] = 0;
out_6977335032223544616[8] = 0;
void H_27(double *state, double *unused, double *out_5859726955506735432) {
out_5859726955506735432[0] = 0;
out_5859726955506735432[1] = 0;
out_5859726955506735432[2] = 0;
out_5859726955506735432[3] = 1;
out_5859726955506735432[4] = 0;
out_5859726955506735432[5] = 0;
out_5859726955506735432[6] = 0;
out_5859726955506735432[7] = 0;
out_5859726955506735432[8] = 0;
}
void h_29(double *state, double *unused, double *out_1416133831358674750) {
out_1416133831358674750[0] = state[1];
void h_29(double *state, double *unused, double *out_2081178106525881768) {
out_2081178106525881768[0] = state[1];
}
void H_29(double *state, double *unused, double *out_8784414385371189905) {
out_8784414385371189905[0] = 0;
out_8784414385371189905[1] = 1;
out_8784414385371189905[2] = 0;
out_8784414385371189905[3] = 0;
out_8784414385371189905[4] = 0;
out_8784414385371189905[5] = 0;
out_8784414385371189905[6] = 0;
out_8784414385371189905[7] = 0;
out_8784414385371189905[8] = 0;
void H_29(double *state, double *unused, double *out_3174732299391918337) {
out_3174732299391918337[0] = 0;
out_3174732299391918337[1] = 1;
out_3174732299391918337[2] = 0;
out_3174732299391918337[3] = 0;
out_3174732299391918337[4] = 0;
out_3174732299391918337[5] = 0;
out_3174732299391918337[6] = 0;
out_3174732299391918337[7] = 0;
out_3174732299391918337[8] = 0;
}
void h_28(double *state, double *unused, double *out_7400645873158492396) {
out_7400645873158492396[0] = state[0];
void h_28(double *state, double *unused, double *out_9087609201106098180) {
out_9087609201106098180[0] = state[0];
}
void H_28(double *state, double *unused, double *out_6820784113805863654) {
out_6820784113805863654[0] = 1;
out_6820784113805863654[1] = 0;
out_6820784113805863654[2] = 0;
out_6820784113805863654[3] = 0;
out_6820784113805863654[4] = 0;
out_6820784113805863654[5] = 0;
out_6820784113805863654[6] = 0;
out_6820784113805863654[7] = 0;
out_6820784113805863654[8] = 0;
void H_28(double *state, double *unused, double *out_8257131316461448911) {
out_8257131316461448911[0] = 1;
out_8257131316461448911[1] = 0;
out_8257131316461448911[2] = 0;
out_8257131316461448911[3] = 0;
out_8257131316461448911[4] = 0;
out_8257131316461448911[5] = 0;
out_8257131316461448911[6] = 0;
out_8257131316461448911[7] = 0;
out_8257131316461448911[8] = 0;
}
void h_31(double *state, double *unused, double *out_1803659519959713708) {
out_1803659519959713708[0] = state[8];
void h_31(double *state, double *unused, double *out_7580923347048146882) {
out_7580923347048146882[0] = state[8];
}
void H_31(double *state, double *unused, double *out_9134660820665381591) {
out_9134660820665381591[0] = 0;
out_9134660820665381591[1] = 0;
out_9134660820665381591[2] = 0;
out_9134660820665381591[3] = 0;
out_9134660820665381591[4] = 0;
out_9134660820665381591[5] = 0;
out_9134660820665381591[6] = 0;
out_9134660820665381591[7] = 0;
out_9134660820665381591[8] = 1;
void H_31(double *state, double *unused, double *out_3524978734686110023) {
out_3524978734686110023[0] = 0;
out_3524978734686110023[1] = 0;
out_3524978734686110023[2] = 0;
out_3524978734686110023[3] = 0;
out_3524978734686110023[4] = 0;
out_3524978734686110023[5] = 0;
out_3524978734686110023[6] = 0;
out_3524978734686110023[7] = 0;
out_3524978734686110023[8] = 1;
}
#include <eigen3/Eigen/Dense>
#include <iostream>
@@ -518,68 +518,68 @@ void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea) {
update<1, 3, 0>(in_x, in_P, h_31, H_31, NULL, in_z, in_R, in_ea, MAHA_THRESH_31);
}
void car_err_fun(double *nom_x, double *delta_x, double *out_5070392900769873758) {
err_fun(nom_x, delta_x, out_5070392900769873758);
void car_err_fun(double *nom_x, double *delta_x, double *out_3066078453041735876) {
err_fun(nom_x, delta_x, out_3066078453041735876);
}
void car_inv_err_fun(double *nom_x, double *true_x, double *out_3742760733154016051) {
inv_err_fun(nom_x, true_x, out_3742760733154016051);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_7998306431651746749) {
inv_err_fun(nom_x, true_x, out_7998306431651746749);
}
void car_H_mod_fun(double *state, double *out_5758456641177717920) {
H_mod_fun(state, out_5758456641177717920);
void car_H_mod_fun(double *state, double *out_8410823161376016702) {
H_mod_fun(state, out_8410823161376016702);
}
void car_f_fun(double *state, double dt, double *out_730595102125265078) {
f_fun(state, dt, out_730595102125265078);
void car_f_fun(double *state, double dt, double *out_8406538155675584278) {
f_fun(state, dt, out_8406538155675584278);
}
void car_F_fun(double *state, double dt, double *out_7198115545780111359) {
F_fun(state, dt, out_7198115545780111359);
void car_F_fun(double *state, double dt, double *out_9168420830296677739) {
F_fun(state, dt, out_9168420830296677739);
}
void car_h_25(double *state, double *unused, double *out_5441109048213736058) {
h_25(state, unused, out_5441109048213736058);
void car_h_25(double *state, double *unused, double *out_6925664705835598268) {
h_25(state, unused, out_6925664705835598268);
}
void car_H_25(double *state, double *unused, double *out_4766949399557973891) {
H_25(state, unused, out_4766949399557973891);
void car_H_25(double *state, double *unused, double *out_842732686421297677) {
H_25(state, unused, out_842732686421297677);
}
void car_h_24(double *state, double *unused, double *out_2797667639827089179) {
h_24(state, unused, out_2797667639827089179);
void car_h_24(double *state, double *unused, double *out_611774507479316058) {
h_24(state, unused, out_611774507479316058);
}
void car_H_24(double *state, double *unused, double *out_4461115786511221334) {
H_24(state, unused, out_4461115786511221334);
void car_H_24(double *state, double *unused, double *out_7496938144529483434) {
H_24(state, unused, out_7496938144529483434);
}
void car_h_30(double *state, double *unused, double *out_1188271489450022901) {
h_30(state, unused, out_1188271489450022901);
void car_h_30(double *state, double *unused, double *out_7082851374186727413) {
h_30(state, unused, out_7082851374186727413);
}
void car_H_30(double *state, double *unused, double *out_9152098344023969527) {
H_30(state, unused, out_9152098344023969527);
void car_H_30(double *state, double *unused, double *out_3684963643706310521) {
H_30(state, unused, out_3684963643706310521);
}
void car_h_26(double *state, double *unused, double *out_6530138725336053464) {
h_26(state, unused, out_6530138725336053464);
void car_h_26(double *state, double *unused, double *out_6139341521285064978) {
h_26(state, unused, out_6139341521285064978);
}
void car_H_26(double *state, double *unused, double *out_8508452718432030115) {
H_26(state, unused, out_8508452718432030115);
void car_H_26(double *state, double *unused, double *out_2898770632452758547) {
H_26(state, unused, out_2898770632452758547);
}
void car_h_27(double *state, double *unused, double *out_8003961757834969913) {
h_27(state, unused, out_8003961757834969913);
void car_h_27(double *state, double *unused, double *out_8484293316429620663) {
h_27(state, unused, out_8484293316429620663);
}
void car_H_27(double *state, double *unused, double *out_6977335032223544616) {
H_27(state, unused, out_6977335032223544616);
void car_H_27(double *state, double *unused, double *out_5859726955506735432) {
H_27(state, unused, out_5859726955506735432);
}
void car_h_29(double *state, double *unused, double *out_1416133831358674750) {
h_29(state, unused, out_1416133831358674750);
void car_h_29(double *state, double *unused, double *out_2081178106525881768) {
h_29(state, unused, out_2081178106525881768);
}
void car_H_29(double *state, double *unused, double *out_8784414385371189905) {
H_29(state, unused, out_8784414385371189905);
void car_H_29(double *state, double *unused, double *out_3174732299391918337) {
H_29(state, unused, out_3174732299391918337);
}
void car_h_28(double *state, double *unused, double *out_7400645873158492396) {
h_28(state, unused, out_7400645873158492396);
void car_h_28(double *state, double *unused, double *out_9087609201106098180) {
h_28(state, unused, out_9087609201106098180);
}
void car_H_28(double *state, double *unused, double *out_6820784113805863654) {
H_28(state, unused, out_6820784113805863654);
void car_H_28(double *state, double *unused, double *out_8257131316461448911) {
H_28(state, unused, out_8257131316461448911);
}
void car_h_31(double *state, double *unused, double *out_1803659519959713708) {
h_31(state, unused, out_1803659519959713708);
void car_h_31(double *state, double *unused, double *out_7580923347048146882) {
h_31(state, unused, out_7580923347048146882);
}
void car_H_31(double *state, double *unused, double *out_9134660820665381591) {
H_31(state, unused, out_9134660820665381591);
void car_H_31(double *state, double *unused, double *out_3524978734686110023) {
H_31(state, unused, out_3524978734686110023);
}
void car_predict(double *in_x, double *in_P, double *in_Q, double dt) {
predict(in_x, in_P, in_Q, dt);
@@ -9,27 +9,27 @@ void car_update_27(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void car_update_29(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_update_28(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_update_31(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void car_err_fun(double *nom_x, double *delta_x, double *out_5070392900769873758);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_3742760733154016051);
void car_H_mod_fun(double *state, double *out_5758456641177717920);
void car_f_fun(double *state, double dt, double *out_730595102125265078);
void car_F_fun(double *state, double dt, double *out_7198115545780111359);
void car_h_25(double *state, double *unused, double *out_5441109048213736058);
void car_H_25(double *state, double *unused, double *out_4766949399557973891);
void car_h_24(double *state, double *unused, double *out_2797667639827089179);
void car_H_24(double *state, double *unused, double *out_4461115786511221334);
void car_h_30(double *state, double *unused, double *out_1188271489450022901);
void car_H_30(double *state, double *unused, double *out_9152098344023969527);
void car_h_26(double *state, double *unused, double *out_6530138725336053464);
void car_H_26(double *state, double *unused, double *out_8508452718432030115);
void car_h_27(double *state, double *unused, double *out_8003961757834969913);
void car_H_27(double *state, double *unused, double *out_6977335032223544616);
void car_h_29(double *state, double *unused, double *out_1416133831358674750);
void car_H_29(double *state, double *unused, double *out_8784414385371189905);
void car_h_28(double *state, double *unused, double *out_7400645873158492396);
void car_H_28(double *state, double *unused, double *out_6820784113805863654);
void car_h_31(double *state, double *unused, double *out_1803659519959713708);
void car_H_31(double *state, double *unused, double *out_9134660820665381591);
void car_err_fun(double *nom_x, double *delta_x, double *out_3066078453041735876);
void car_inv_err_fun(double *nom_x, double *true_x, double *out_7998306431651746749);
void car_H_mod_fun(double *state, double *out_8410823161376016702);
void car_f_fun(double *state, double dt, double *out_8406538155675584278);
void car_F_fun(double *state, double dt, double *out_9168420830296677739);
void car_h_25(double *state, double *unused, double *out_6925664705835598268);
void car_H_25(double *state, double *unused, double *out_842732686421297677);
void car_h_24(double *state, double *unused, double *out_611774507479316058);
void car_H_24(double *state, double *unused, double *out_7496938144529483434);
void car_h_30(double *state, double *unused, double *out_7082851374186727413);
void car_H_30(double *state, double *unused, double *out_3684963643706310521);
void car_h_26(double *state, double *unused, double *out_6139341521285064978);
void car_H_26(double *state, double *unused, double *out_2898770632452758547);
void car_h_27(double *state, double *unused, double *out_8484293316429620663);
void car_H_27(double *state, double *unused, double *out_5859726955506735432);
void car_h_29(double *state, double *unused, double *out_2081178106525881768);
void car_H_29(double *state, double *unused, double *out_3174732299391918337);
void car_h_28(double *state, double *unused, double *out_9087609201106098180);
void car_H_28(double *state, double *unused, double *out_8257131316461448911);
void car_h_31(double *state, double *unused, double *out_7580923347048146882);
void car_H_31(double *state, double *unused, double *out_3524978734686110023);
void car_predict(double *in_x, double *in_P, double *in_Q, double dt);
void car_set_mass(double x);
void car_set_rotational_inertia(double x);
File diff suppressed because it is too large Load Diff
@@ -5,18 +5,18 @@ void pose_update_4(double *in_x, double *in_P, double *in_z, double *in_R, doubl
void pose_update_10(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_update_13(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_update_14(double *in_x, double *in_P, double *in_z, double *in_R, double *in_ea);
void pose_err_fun(double *nom_x, double *delta_x, double *out_8299703332077589328);
void pose_inv_err_fun(double *nom_x, double *true_x, double *out_4608058237383429265);
void pose_H_mod_fun(double *state, double *out_7885453398379249088);
void pose_f_fun(double *state, double dt, double *out_1688144950946873165);
void pose_F_fun(double *state, double dt, double *out_4851283621730691038);
void pose_h_4(double *state, double *unused, double *out_2329133011647763937);
void pose_H_4(double *state, double *unused, double *out_8639614400433961695);
void pose_h_10(double *state, double *unused, double *out_3294648635274985008);
void pose_H_10(double *state, double *unused, double *out_3780608178453222524);
void pose_h_13(double *state, double *unused, double *out_8905113933939181200);
void pose_H_13(double *state, double *unused, double *out_6594855847943257120);
void pose_h_14(double *state, double *unused, double *out_8324071568749841126);
void pose_H_14(double *state, double *unused, double *out_5843888816936105392);
void pose_err_fun(double *nom_x, double *delta_x, double *out_5688174754372622748);
void pose_inv_err_fun(double *nom_x, double *true_x, double *out_598026621986152539);
void pose_H_mod_fun(double *state, double *out_2381892679141553073);
void pose_f_fun(double *state, double dt, double *out_1702484166209795754);
void pose_F_fun(double *state, double dt, double *out_2610723520316632485);
void pose_h_4(double *state, double *unused, double *out_1625499965422042150);
void pose_H_4(double *state, double *unused, double *out_5582302580243023097);
void pose_h_10(double *state, double *unused, double *out_2139046532052679128);
void pose_H_10(double *state, double *unused, double *out_280379430924529525);
void pose_h_13(double *state, double *unused, double *out_4130601663238522497);
void pose_H_13(double *state, double *unused, double *out_2028328628073677832);
void pose_h_14(double *state, double *unused, double *out_5394061988893492228);
void pose_H_14(double *state, double *unused, double *out_8665091012538395393);
void pose_predict(double *in_x, double *in_P, double *in_Q, double dt);
}
Binary file not shown.
@@ -102,6 +102,7 @@ class TestBoarddSpi(OpenpilotTestCase):
edt = 1e3 / SERVICE_LIST[service].frequency
assert edt*0.9 < np.mean(dts) < edt*1.1
assert np.max(dts) < edt*8
assert np.min(dts) < edt
assert len(dts) >= ((et-0.5)*SERVICE_LIST[service].frequency*0.8)
with subtests.test(msg="CAN traffic"):
@@ -17,8 +17,8 @@
"severity": 1,
"_comment": "Set extra field to the failed reason."
},
"Offroad_ChestnutBranch": {
"text": "Chestnut detected! Switch to the release-chestnut branch to use chestnut-class models.",
"Offroad_NeosUpdate": {
"text": "An update to your device's operating system is downloading in the background. You will be prompted to update when it's ready to install.",
"severity": 0
},
"Offroad_UnregisteredHardware": {

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