Compare commits

..

1 Commits

Author SHA1 Message Date
Comma Device 741c1d1a70 dragonpilot v0.10.2 2025-12-19 09:16:54 +00:00
4254 changed files with 1198797 additions and 312153 deletions
+18
View File
@@ -0,0 +1,18 @@
**/.git
.DS_Store
*.dylib
*.DSYM
*.d
*.pyc
*.pyo
.*.swp
.*.swo
.*.un~
*.tmp
*.o
*.o-*
*.os
*.os-*
venv/
.venv/
+11
View File
@@ -0,0 +1,11 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.{py,pyx,pxd}]
charset = utf-8
indent_style = space
indent_size = 2
+47
View File
@@ -0,0 +1,47 @@
name: Bug report
description: For issues with running openpilot on your comma device
labels: ["bug"]
body:
- type: markdown
attributes:
value: >
Before creating a **bug report**, please check the following:
* If the issue likely only affects your car model or make, go back and open a **car bug report** instead.
* If the issue is related to the driving or driver monitoring models, you should open a [discussion](https://github.com/commaai/openpilot/discussions/categories/model-feedback) instead.
* Ensure you're running the latest openpilot release.
* Ensure you're using officially supported hardware. Issues running on PCs have a different issue template.
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
* Ensure you're running stock openpilot. We cannot look into bug reports from forks.
If you're unsure whether you've hit a bug, check out the #installation-help channel in the [community Discord server](https://discord.comma.ai).
- type: textarea
attributes:
label: Describe the bug
description: Also include a description of how to reproduce the bug
validations:
required: true
- type: input
id: route
attributes:
label: Provide a route where the issue occurs
description: Ensure the route is fully uploaded at https://useradmin.comma.ai. We cannot look into issues without routes, or at least a Dongle ID.
placeholder: 77611a1fac303767|2020-05-11--16-37-07
validations:
required: true
- type: input
id: version
attributes:
label: openpilot version
description: If you're not on release, provide the commit hash
placeholder: 0.8.10
validations:
required: true
- type: textarea
attributes:
label: Additional info
+14
View File
@@ -0,0 +1,14 @@
blank_issues_enabled: false
contact_links:
- name: Car bug report
url: https://github.com/commaai/opendbc/issues/new
about: For issues with a particular car make or model
- name: Join the Discord
url: https://discord.comma.ai
about: The community Discord is for both openpilot development and experience discussion
- name: Report driving behavior feedback
url: https://discord.com/channels/469524606043160576/1254834193066623017
about: Feedback for the driving and driver monitoring models goes in the #driving-feedback in Discord
- name: Community Wiki
url: https://github.com/commaai/openpilot/wiki
about: Check out our community wiki
+8
View File
@@ -0,0 +1,8 @@
---
name: Enhancement
about: For openpilot enhancement suggestions
title: ''
labels: 'enhancement'
assignees: ''
---
+42
View File
@@ -0,0 +1,42 @@
name: PC bug report
description: For issues with running openpilot on PC
labels: ["PC"]
body:
- type: markdown
attributes:
value: >
Before creating a **bug report**, please check the following:
* Ensure you're running the latest openpilot release.
* Ensure there isn't an existing issue for your bug. If there is, leave a comment on the existing issue.
* Ensure you're running stock openpilot. We cannot look into bug reports from forks.
If you're unsure whether you've hit a bug, check out the #installation-help channel in the [community Discord server](https://discord.comma.ai).
- type: textarea
attributes:
label: Describe the bug
description: Also include a description of how to reproduce the bug
validations:
required: true
- type: input
id: os-version
attributes:
label: OS Version
placeholder: Ubuntu 24.04
validations:
required: true
- type: input
id: version
attributes:
label: openpilot version or commit
placeholder: bd36f2ec8d3559909678eff2690c10a520938367
validations:
required: false
- type: textarea
attributes:
label: Additional info
+27
View File
@@ -0,0 +1,27 @@
CI / testing:
- changed-files:
- any-glob-to-all-files: "{.github/**,**/test_*,**/test/**,Jenkinsfile}"
car:
- changed-files:
- any-glob-to-all-files: '{selfdrive/car/**,opendbc_repo}'
simulation:
- changed-files:
- any-glob-to-all-files: 'tools/sim/**'
ui:
- changed-files:
- any-glob-to-all-files: '{selfdrive/assets/**,selfdrive/ui/**,system/ui/**}'
tools:
- changed-files:
- any-glob-to-all-files: 'tools/**'
multilanguage:
- changed-files:
- any-glob-to-all-files: 'selfdrive/ui/translations/**'
autonomy:
- changed-files:
- any-glob-to-all-files: "{selfdrive/modeld/models/**,selfdrive/test/process_replay/model_replay_ref_commit}"
+68
View File
@@ -0,0 +1,68 @@
<!-- Please copy and paste the relevant template -->
<!--- ***** Template: Fingerprint *****
**Car**
Which car (make, model, year) this fingerprint is for
**Route**
A route with the fingerprint
-->
<!--- ***** Template: Car Bugfix *****
**Description**
A description of the bug and the fix. Also link the issue if it exists.
**Verification**
Explain how you tested this bug fix.
**Route**
Route: [a route with the bug fix]
-->
<!--- ***** Template: Bugfix *****
**Description**
A description of the bug and the fix. Also link the issue if it exists.
**Verification**
Explain how you tested this bug fix.
-->
<!--- ***** Template: Car Port *****
**Checklist**
- [ ] added entry to CAR in selfdrive/car/*/values.py and ran `selfdrive/car/docs.py` to generate new docs
- [ ] test route added to [routes.py](https://github.com/commaai/openpilot/blob/master/selfdrive/car/tests/routes.py)
- [ ] route with openpilot:
- [ ] route with stock system:
- [ ] car harness used (if comma doesn't sell it, put N/A):
-->
<!--- ***** Template: Refactor *****
**Description**
A description of the refactor, including the goals it accomplishes.
**Verification**
Explain how you tested the refactor for regressions.
-->
+43 -30
View File
@@ -1,4 +1,6 @@
venv/
.venv/
.ci_cache
.env
.clang-format
.DS_Store
@@ -8,11 +10,13 @@ venv/
.overlay_init
.overlay_consistent
.sconsign.dblite
.vscode*
model2.png
a.out
.hypothesis
.cache/
/docs_site/
*.mp4
*.dylib
*.DSYM
*.d
@@ -32,37 +36,22 @@ a.out
*.class
*.pyxbldc
*.vcd
*.qm
*.mo
*_pyx.cpp
*.stats
config.json
clcache
compile_commands.json
compare_runtime*.html
persist
board/obj/
selfdrive/boardd/boardd
selfdrive/logcatd/logcatd
selfdrive/mapd/default_speeds_by_region.json
system/proclogd/proclogd
selfdrive/ui/_ui
selfdrive/test/longitudinal_maneuvers/out
selfdrive/visiond/visiond
selfdrive/sensord/_gpsd
selfdrive/sensord/_sensord
selfdrive/pandad/pandad
cereal/services.h
cereal/gen
cereal/messaging/bridge
selfdrive/ui/translations/tmp
selfdrive/car/tests/cars_dump
system/camerad/camerad
system/camerad/test/ae_gray_test
selfdrive/modeld/_modeld
selfdrive/modeld/_dmonitoringmodeld
/src/
one
/body/
openpilot
notebooks
xx
yy
hyperthneed
panda_jungle
provisioning
.coverage*
coverage.xml
@@ -75,13 +64,37 @@ flycheck_*
cppcheck_report.txt
comma*.sh
selfdrive/modeld/thneed/compile
selfdrive/modeld/models/*.thneed
selfdrive/modeld/models/*.pkl
# openpilot log files
*.bz2
*.zst
build/
!**/.gitkeep
*.po~
poetry.toml
Pipfile
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
# rick - keep panda_tici standalone
panda_tici/
+11
View File
@@ -0,0 +1,11 @@
{
"recommendations": [
"ms-python.python",
"ms-vscode.cpptools",
"elagil.pre-commit-helper",
"charliermarsh.ruff",
"JamiTech.simply-blame",
"k--kato.intellij-idea-keybindings",
"trinm1709.dracula-theme-from-intellij"
]
}
+85
View File
@@ -0,0 +1,85 @@
{
"version": "0.2.0",
"inputs": [
{
"id": "python_process",
"type": "pickString",
"description": "Select the process to debug",
"options": [
"selfdrive/controls/controlsd.py",
"system/timed/timed.py",
"tools/sim/run_bridge.py"
]
},
{
"id": "cpp_process",
"type": "pickString",
"description": "Select the process to debug",
"options": [
"selfdrive/ui/ui"
]
},
{
"id": "args",
"description": "Arguments to pass to the process",
"type": "promptString"
},
{
"id": "replayArg",
"type": "promptString",
"description": "Enter route or segment to replay."
}
],
"configurations": [
{
"name": "Python: openpilot Process",
"type": "debugpy",
"request": "launch",
"program": "${input:python_process}",
"console": "integratedTerminal",
"justMyCode": true,
"args": "${input:args}"
},
{
"name": "C++: openpilot Process",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/${input:cpp_process}",
"cwd": "${workspaceFolder}"
},
{
"name": "Attach LLDB to Replay drive",
"type": "lldb",
"request": "attach",
"pid": "${command:pickMyProcess}",
"initCommands": [
"script import time; time.sleep(3)"
]
},
{
"name": "Replay drive",
"type": "debugpy",
"request": "launch",
"program": "${workspaceFolder}/opendbc/safety/tests/safety_replay/replay_drive.py",
"args": [
"${input:replayArg}"
],
"console": "integratedTerminal",
"justMyCode": false,
"env": {
"PYTHONPATH": "${workspaceFolder}"
},
"subProcess": true,
"stopOnEntry": false
}
],
"compounds": [
{
"name": "Replay drive + Safety LLDB",
"configurations": [
"Replay drive",
"Attach LLDB to Replay drive"
]
}
]
}
+42
View File
@@ -0,0 +1,42 @@
{
"editor.tabSize": 2,
"editor.insertSpaces": true,
"editor.renderWhitespace": "trailing",
"files.trimTrailingWhitespace": true,
"terminal.integrated.defaultProfile.linux": "dragonpilot",
"terminal.integrated.profiles.linux": {
"dragonpilot": {
"path": "bash",
"args": ["-c", "distrobox enter dp"]
}
},
"search.exclude": {
"**/.git": true,
"**/.venv": true,
"**/__pycache__": true,
"msgq_repo/": true,
"opendbc/": true,
"rednose/": true,
"rednose_repo/": true,
"openpilot/": true,
"teleoprtc_repo/": true,
"tinygrad/": true,
"tinygrad_repo/": true
},
"files.exclude": {
"**/.git": true,
"**/.venv": true,
"**/__pycache__": true
},
"python.analysis.exclude": [
"**/.git",
"**/.venv",
"**/__pycache__",
// exclude directories that should be using the symlinked version
"common/**",
"selfdrive/**",
"system/**",
"third_party/**",
"tools/**",
]
}
+89
View File
@@ -0,0 +1,89 @@
```mermaid
flowchart TD
B000["devel-staging"] ---> CORE["core"]
CORE ---> CORE_001["core-feat/params"]
CORE_001 ---> CORE_002["core-feat/panel"]
CORE_002 ---> MIN["min"]
MIN ---> MIN_001["min-feat/dev/c3"]
MIN ---> MIN_002["min-feat/dev/o3"]
MIN ---> MIN_003["min-feat/lat/alka"]
MIN ---> MIN_004["min-feat/ui/display-mode"]
MIN ---> MIN_005["min-feat/dev/model-selector"]
MIN ---> MIN_006["min-feat/lat/lca"]
MIN ---> MIN_007["min-feat/dev/on-off-road"]
MIN ---> MIN_008["min-feat/ui/hide-hud"]
MIN ---> MIN_009["min-feat/lon/ext-radar"]
MIN ---> MIN_010["min-feat/lat/road-edge-detection"]
MIN ---> MIN_011["min-feat/ui/rainbow-path"]
MIN ---> MIN_012["min-feat/lon/acm"]
MIN ---> MIN_013["min-feat/lon/aem"]
MIN ---> MIN_014["min-feat/lon/dtsc"]
MIN ---> MIN_015["min-feat/dev/alert-mode"]
MIN ---> MIN_016["min-feat/dev/auto-shutdown"]
MIN ---> MIN_017["min-feat/ui/lead-stats"]
MIN ---> MIN_018["min-feat/ui/border-indicator"]
MIN ---> MIN_019["min-feat/dev/dashy"]
MIN ---> MIN_010["min-feat/dev/delay-loggerd"]
MIN ---> MIN_021["min-feat/dev/disable-connect"]
MIN ---> MIN_022["min-feat/dev/tether-on-boot"]
MIN_001 ---> FULL["full"]
MIN_002 ---> FULL
MIN_003 ---> FULL
MIN_004 ---> FULL
MIN_005 ---> FULL
MIN_006 ---> FULL
MIN_007 ---> FULL
MIN_008 ---> FULL
MIN_009 ---> FULL
MIN_010 ---> FULL
MIN_011 ---> FULL
MIN_012 ---> FULL
MIN_013 ---> FULL
MIN_014 ---> FULL
MIN_015 ---> FULL
MIN_016 ---> FULL
MIN_017 ---> FULL
MIN_018 ---> FULL
MIN_019 ---> FULL
MIN_020 ---> FULL
MIN_021 ---> FULL
MIN_022 ---> FULL
FULL ---> TOYOTA_001[brand/toyota/safety-common]
FULL ---> TOYOTA_002[brand/toyota/door-auto-lock-unlock]
FULL ---> TOYOTA_003[brand/toyota/tss1-sng]
FULL ---> TOYOTA_004[brand/toyota/radar-filter]
FULL ---> TOYOTA_005[brand/toyota/sdsu]
FULL ---> TOYOTA_006[brand/toyota/dsu-bypass]
FULL ---> TOYOTA_007[brand/toyota/zss]
FULL ---> TOYOTA_008[brand/toyota/stock-lon]
FULL ---> VAG_001[brand/vag/a0-sng]
FULL ---> VAG_002[brand/vag/pq-steering-patch]
FULL ---> VAG_003[brand/vag/pq-no-dashcam]
FULL ---> VAG_004[brand/vag/avoid-eps-lockout]
FULL ---> HKG_001[brand/hkg/smdps]
FULL ---> HONDA_001[brand/honda/eps-mod]
FULL ---> SUBARU_001[brand/subaru/torque-3071]
TOYOTA_001 ---> TOYOTA[pre-toyota]
TOYOTA_002 ---> TOYOTA
TOYOTA_003 ---> TOYOTA
TOYOTA_004 ---> TOYOTA
TOYOTA_005 ---> TOYOTA
TOYOTA_006 ---> TOYOTA
TOYOTA_007 ---> TOYOTA
TOYOTA_008 ---> TOYOTA
VAG_001 ---> VAG[pre-vag]
VAG_002 ---> VAG
VAG_003 ---> VAG
VAG_004 ---> VAG
HKG_001 ---> HKG[pre-hkg]
HONDA_001 ---> HONDA[pre-honda]
SUBARU_001 ---> SUBARU[pre-subaru]
TOYOTA ---> PRE[pre]
VAG ---> PRE
HKG ---> PRE
HONDA ---> PRE
SUBARU ---> PRE
PRE ---> PRE_PATCH[pre-patch]
PRE_PATCH ---> PREBUILD[pre-build]
PREBUILD ---> VERSION[x.x.x]
```
+925 -8
View File
@@ -1,3 +1,920 @@
dragonpilot 0.10.2 r1 (2025-11-30)
=======================
* ✅ openpilot 0.10.2 (devel-staging) (2025-11-20)
* ✨ 🚧 UI: C4 UI Mode (2025-11-26)
* ✨ UI: Torque Bar from C4 UI (2025-11-26)
* ✅ UI: Extend screen timeout (2025-11-04)
* ✅ UI: Display Lead & Radar Stats (2025-10-30)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Dynamic Turn Speed Control (DTSC) (2025-11-04)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Branch Selector (2025-11-14)
* ✅ MISC: Tether on boot (2025-11-04)
* ✅ MISC: Disable Comma Connect (2025-09-22)
* ✅ MISC: C3/C3X/O3 series Support (2025-09-15)
* ✅ MISC: Delay Starting Loggerd (2025-06-30)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: DSU Bypass Support by @cydia2020 (2025-09-09)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ Honda: EPS Mod Support (2025-09-09)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
* ✅ 🚧 Subaru: Increase torque limits for early Impreza/Crosstek by @ClockeNessMnstr (2025-09-25)
dragonpilot 0.10.1 r3 (2025-11-25)
=======================
* ✅ openpilot 0.10.1 (devel-staging) (2025-10-24)
* ✨ Various Bugfixes / Improvements (2025-11-25)
* ✨ UI: Back to Display Mode v1 (std., main+, main-, op+, op-) (2025-11-25)
* ✅ UI: Extend screen timeout (2025-11-04)
* ✅ UI: Display Lead & Radar Stats (2025-10-30)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Dynamic Turn Speed Control (DTSC) (2025-11-04)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Branch Selector (2025-11-14)
* ✅ MISC: Tether on boot (2025-11-04)
* ✅ MISC: Disable Comma Connect (2025-09-22)
* ✅ MISC: C3/C3X/O3 series Support (2025-09-15)
* ✅ MISC: Delay Starting Loggerd (2025-06-30)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: DSU Bypass Support by @cydia2020 (2025-09-09)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ Honda: EPS Mod Support (2025-09-09)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
* ✅ 🚧 Subaru: Increase torque limits for early Impreza/Crosstek by @ClockeNessMnstr (2025-09-25)
*~~🚧 AGNOS 14.7 (2025-11-11)~~
*~~LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)~~
*~~MISC: FileServ (port 5000) (2025-05-28)~~
dragonpilot 0.10.1 r2 (2025-11-16)
=======================
* ✅ openpilot 0.10.1 (devel-staging) (2025-10-24)
* ✨ Various Bugfixes / Improvements (2025-11-14)
* ✨ UI: Display Mode v2 - (std., op+, op- ONLY) (2025-11-14)
* ✨ MISC: Branch Selector (2025-11-14)
* ✅ UI: Extend screen timeout (2025-11-04)
* ✅ UI: Display Lead & Radar Stats (2025-10-30)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Dynamic Turn Speed Control (DTSC) (2025-11-04)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Tether on boot (2025-11-04)
* ✅ MISC: Disable Comma Connect (2025-09-22)
* ✅ MISC: C3/C3X/O3 series Support (2025-09-15)
* ✅ MISC: Delay Starting Loggerd (2025-06-30)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: DSU Bypass Support by @cydia2020 (2025-09-09)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ Honda: EPS Mod Support (2025-09-09)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
* ✅ 🚧 Subaru: Increase torque limits for early Impreza/Crosstek by @ClockeNessMnstr (2025-09-25)
*~~🚧 AGNOS 14.7 (2025-11-11)~~
*~~LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)~~
*~~MISC: FileServ (port 5000) (2025-05-28)~~
dragonpilot 0.10.1 r1 (2025-11-11)
=======================
* ✨ openpilot 0.10.1 (devel-staging) (2025-10-24)
* ✨ 🚧 AGNOS 14.7 (2025-11-11)
* ✨ UI: Extend screen timeout (2025-11-04)
* ✨ UI: Display Lead & Radar Stats (2025-10-30)
* ✨ 🚧 LON/AEM: Refactored w/ New Logic (2025-11-10)
* ✨ 🚧 LON: Dynamic Turn Speed Control (DTSC) (2025-11-04)
* ✨ 🚧 LON/ACM: Refactored w/ New Logic (2025-09-19)
* ✨ MISC: Tether on boot (2025-11-04)
* ✨ MISC: Disable Comma Connect (2025-09-22)
* ✨ MISC: C3/C3X/O3 series Support (2025-09-15)
* ✨ Toyota: sDSU jerk fix by @sunnyhaibin (2025-09-30)
* ✨ 🚧 Subaru: Increase torque limits for early Impreza/Crosstek by @ClockeNessMnstr (2025-09-25)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Delay Starting Loggerd (2025-06-30)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: DSU Bypass Support by @cydia2020 (2025-09-09)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ Honda: EPS Mod Support (2025-09-09)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
*~~LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)~~
*~~MISC: FileServ (port 5000) (2025-05-28)~~
dragonpilot 0.10.0 r2 (2025-09-15)
=======================
* ✅ openpilot 0.10.0 (devel-staging) (2025-08-06)
* ✨ 🚧 Toyota: DSU Bypass Support by @cydia2020 (Disabled, Code Change Requred) (2025-09-09)
* ✨ Honda: EPS Mod Support (2025-09-09)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Display Radar Tracks (2025-05-14)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
*~~LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)~~
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
*~~MISC: FileServ (port 5000) (2025-05-28)~~
* ✅ MISC: Delay Starting Loggerd (2025-06-30)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.10.0 r1 (2025-09-05)
=======================
* ✨ openpilot 0.10.0 (devel-staging) (2025-08-06)
* ✨ MISC: Delay Starting Loggerd (2025-06-30)
* 🔄 LON: Ext Radar Support - Better filters (2025-06-30)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Display Radar Tracks (2025-05-14)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
*~~LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)~~
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
*~~MISC: FileServ - Quick Access QR Code (2025-06-18)~~
*~~MISC: FileServ (port 5000) (2025-05-28)~~
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.9 r1 (2025-06-20)
=======================
* ✨ openpilot 0.9.9 (2025-06-05)
* ✨ Various Bugfixes / Improvements (2025-06-18)
* ✅ UI: Border Indicators (2025-05-27)
* ✅ UI: Display Radar Tracks (2025-05-14)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: FileServ (port 5000) (2025-05-28)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r10 (2025-06-09)
=======================
* ✅ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ Various Bugfixes / Improvement (2025-05-27)
* ✨ UI: Border Indicators (2025-05-27)
* ✨ MISC: FileServ (offroad, port 5000) (2025-05-28)
* ✅ UI: Display Radar Tracks (2025-05-14)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r9 (2025-05-17)
=======================
* ✅ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ Various Bugfixes / Improvement (2025-05-17)
* ✨ UI: Display Radar Tracks (2025-05-14)
* ✨ 🚧 LON: Adaptive Experimental Mode (AEM) (2025-05-14)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Auto Shutdown (2025-04-28)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r8 (2025-05-10)
=======================
* ✅ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ MISC: Auto Shutdown (2025-04-28)
* ✨ Various Bugfixes / Performance Improvement (2025-04-22)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r7 (2025-04-20)
=======================
* ✅ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ Various Bugfixes / Performance Improvement (2025-04-18)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✅ LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Increase Max Speed Allowed (2025-04-18)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r6 (2025-04-18)
=======================
* ✅ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ LON: No Gas Gating Mode (NoGG) Toggle (2025-04-19)
* ✨ MISC: Increase Max Speed Allowed (2025-04-18)
* ✨ Various Bugfixes / Performance Improvement (2025-04-18)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Auto Lane Change (2025-04-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Audible Alert Mode (2025-04-17)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
* ✅ HKG: SMDPS Support (2025-04-17)
dragonpilot 0.9.8 r5 (2025-04-17)
=======================
* ✨ openpilot 0.9.8 w/ hotfixes (2025-04-17)
* ✨ VAG: Avoid EPS Lockout Toggle (2025-04-17)
* ✨ HKG: SMDPS Support (2025-04-17)
* ✨ LAT: Auto Lane Change (2025-04-14)
* ✨ MISC: Audible Alert Mode (2025-04-17)
* ✨ Various Bugfixes / Performance Improvement (2025-04-12)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ 🚧 LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Error Logs Btn (2025-04-08)
* ✅ MISC: Reset Conf Btn (2025-04-08)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
dragonpilot 0.9.8 r4 (2025-04-08)
=======================
* ✨ openpilot 0.9.8 w/ hotfixes (2025-04-08)
* ✨ MISC: Error Logs Btn (2025-04-08)
* ✨ MISC: Reset Conf Btn (2025-04-08)
* ✨ VAG: Remove Dashcam for VAG PQ (2025-04-06)
* ✨ 🚧 LON: Adaptive Coasting Mode (ACM) (2025-04-06)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
dragonpilot 0.9.8 r3 (2025-04-07)
=======================
* ✅ openpilot 0.9.8 devel-staging (2025-03-19)
* ✨ MISC: Remove Dashcam (2025-04-06)
* ✨ 🚧 LON: Adaptive Coasting Mode (ADM) (2025-04-06)
* ✅ UI: Rainbow Path (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: PQ Steering Patch (2025-04-02)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
dragonpilot 0.9.8 r2 (2025-04-03)
=======================
* ✅ openpilot 0.9.8 devel-staging (2025-03-19)
* ✨ UI: Rainbow Path (2025-04-02)
* ✨ VAG: PQ Steering Patch (2025-04-02)
* ✅ UI: Speed Based HUD (2025-04-01)
* ✅ UI: Display Mode (2025-03-14)
* ✅ LAT: Road Edge Detection (2025-04-01)
* ✅ LAT: LCA Speed Changer (2025-03-21)
* ✅ LAT: ALKA (2025-03-14)
* ✅ LON: Ext Radar Support (2025-03-31)
* ✅ MISC: Model Selector (2025-03-14)
* ✅ Toyota: Stock Lon Mode (2025-04-01)
* ✅ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✅ Toyota: Radar Filter (2025-03-14)
* ✅ Toyota: TSS1 SnG Mod (2025-03-14)
* ✅ Toyota: SDSU Support (2025-03-14)
* ✅ Toyota: ZSS Support (2025-03-14)
* ✅ VAG: MQB A0 SnG Mod (2025-03-20)
dragonpilot 0.9.8 r1 (2025-04-01)
=======================
* ✨ openpilot 0.9.8 devel-staging (2025-03-19)
* ✨ UI: Speed Based HUD (2025-04-01)
* ✨ UI: Display Mode (2025-03-14)
* ✨ LAT: Road Edge Detection (2025-04-01)
* ✨ LAT: LCA Speed Changer (2025-03-21)
* ✨ LAT: ALKA (2025-03-14)
* ✨ LON: Ext Radar Support (2025-03-31)
* ✨ MISC: Model Selector (2025-03-14)
* ✨ Toyota: Stock Lon Mode (2025-04-01)
* ✨ Toyota: Door Auto Lock/Unlock (2025-03-14)
* ✨ Toyota: Radar Filter (2025-03-14)
* ✨ Toyota: TSS1 SnG Mod (2025-03-14)
* ✨ Toyota: SDSU Support (2025-03-14)
* ✨ Toyota: ZSS Support (2025-03-14)
* ✨ VAG: MQB A0 SnG Mod (2025-03-20)
dragonpilot beta3 0.9.8 (2024-08-20)
=======================
* Up to comma.ai openpilot master branch commit 7ee9d2d1b93abb3ccba53f9552b716d3a11c2b6d (2024-07-31)
* DP HIGHLIGHT:
* [NEW] Disable Auto Update Toggle (Software Panel)
* [UPDATE] Flight Panel
* Performance improvement
* Removed shade
* Use green + yellow colour scheme
* Moved below road name
* Less elements on the screen
* Rotate compass instead of the indicator
* [UPDATE] Rainbow Path
* Performance improvement
* [UPDATE] TeToo
* Updated Taiwan Speed Camera Database (2024-07-11)
* [UPDATE] Personalized Accel Learner (PAL)
* Adjusted learning freq
* Save learnt values every minute
* [UPDATE] Dynamic End-to-End Controller
* DANGEOROUS_TTC reduce to 1.2s to rely on ACC mode more.
  
dragonpilot beta3 [2024.07.13]
=======================
* Up to comma.ai openpilot master branch commit 01c2174d5968266b87f1d1fecefce5affaeaa624 (2024-07-02)
* DP HIGHLIGHT:
* [NEW] [TESTING] Tē-Tôo / Map Module
* Road Name Display (Online using OSM)
* Speed Camera Warning (Online using OSM: Untested)
* Speed Camera Warning (Taiwan, Offline)
* Dynamic End-to-End w/ Toggleable Road Condition Detection.
* Device Auto Shutdown Toggle.
* Device Audible Alert Mode Toggle.
dragonpilot beta3 [2024.07.01]
=======================
* Up to comma.ai openpilot master branch commit 442e9f4ae492901a5698b3188741c97c053026c4 (2024-06-21)
* DP HIGHLIGHT:
* Restart from scratch.
dragonpilot beta3 [2024.02.13]
=======================
* Comma 0.9.6 release
* New driving model (Los Angles V2)
* Vision model trained on more data
* Improved driving performance
* Directly outputs curvature for lateral control
* New driver monitoring model
* Trained on larger dataset
* AGNOS 9 (9.6)
* comma body streaming and controls over WebRTC
* Improved fuzzy fingerprinting for many makes and models
* Hyundai Staria 2023 support thanks to sunnyhaibin!
* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Toyota RAV4 2023-24 support
* Toyota RAV4 Hybrid 2023-24 support
* DP HIGHLIGHT:
* TSS2 long, Dynamic Follow and Accel profile tune has been updated.
* New version of dynamic e2e with twice and fast detection.
* De2e will now slow down for upcoming turns when using NOO.
* Auto lane change assist (USE IT AT YOUR OWN RISK).
* Optimized/Refactored NOO Voice Guidence.
* Re-added: Rainbow road path.
* Re-added: Full screen Nav.
* Re-added: Toyota Low Speed Override.
* Bug fixes and improvements.
dragonpilot beta3 [2023.12.23]
=======================
* Comma 0.9.6 release
* New driving model (Blue Diamond).
* Vision model trained on more data
* Improved driving performance
* AGNOS 9
* comma body streaming and controls over WebRTC
* Hyundai Staria 2023 support thanks to sunnyhaibin!
* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Toyota RAV4 2023 support
* Toyota RAV4 Hybrid 2023 support
* DP HIGHLIGHT:
* Flight Panel (compass, height, pitch).
* Model Confidence indicator (in the max speed box).
* New version of dynamic e2e controller with better detection logic.
* Adjustable lane change speed (default 20mph, OFF = no control during lane change)
* TSS2 long, Dynamic Follow and Accel profile tune has been updated.
* Re-added: Full Screen Nav, Lane Priority Mode and Vision Turn Controller.
* Remove Frogai Agressive take off and re-add improved krkeegen sng boot.
dragonpilot beta3 [2023.11.20]
=======================
* Comma 0.9.5 release
* New driving model (Farm Ville)
* Improved navigate on openpilot performance using navigation instructions as an additional model input
* Do lateral planning inside the model
* New vision transformer architecture
* Cadillac Escalade ESV 2019 support thanks to twilsonco!
* Hyundai Azera 2022 support thanks to sunnyhaibin!
* Hyundai Azera Hybrid 2020 support thanks to chanhojung and haram-KONA!
* Hyundai Custin 2023 support thanks to sunnyhaibin and Saber422!
* Hyundai Ioniq 6 2023 support thanks to sunnyhaibin, alamo3, and sshane!
* Hyundai Kona Electric 2023 (Korean version) support thanks to sunnyhaibin and haram-KONA!
* Kia K8 Hybrid (with HDA II) 2023 support thanks to sunnyhaibin!
* Kia Sorento Hybrid 2023 support thanks to sunnyhaibin!
* Kia Optima Hybrid 2019 support
* Lexus IS 2023 support thanks to L3R5!
* DP HIGHLIGHT:
* Otisserv Improvement/bug fixes. You can now see your car 12v battery on the main page. (https://dragonpilot.org)
* UI/UX Improvement.
* TSS2 updated long tune.
* Added Smooth braking and Aggressive take off Thanks to @FrogAi.
* Added Toggle to Disable uploads onroad.
* Remove Lane Priority Mode.
dragonpilot beta3 [2023.10.20]
=======================
* openpilot master branch on 2023.10.20.
* Otisserv improvement/bug fixes.
* TSS2 updated long tune.
* @krkeegan SNG boost tune.
dragonpilot beta3 [2023-10-09]
=======================
* openpilot master branch on 2023.07.21.
* Comma 0.9.3 release
* Night Strike Model
* Improved navigate on openpilot performance using navigation instructions as an additional model input
* DP HIGHLIGHT:
* Always on lateral.
* Otisserv with snapshot! Comma Prime Experience https://dragonpilot.org/
* Dynamic End-to-End Longitudinal Control
* Road Edge Detection
* Acceleration profiles
* Enhanced BSM for all Toyota/Lexus that is not currently supported by stock openpilot.
* Display Mode
* Audible Alert Mode
* File server
* Lane Priority Mode
* New minimal UI with on screen button.
dragonpilot [2023.5.12]
=======================
* Synced with openpilot master 2023.05.12 commits.
* comma 0.9.2 release
* New driving model
* Reduced turn diving
* Trained on a new dataset
* UI updates
* New experimental mode visualization
* Draw MPC path instead of model-predicted path
* AGNOS 7
* Faster boot time
* Fixes rare no sounds bug
* Fixes bootsplash bug at extreme temperatures
* DP Highlight
* NEW: Enhance BSM request for car's that op currently does not support. (TESTED ON: Prius TSS1/TSS2, RAV4 TSS1)
* NEW: Manual Lane Change.
* NEW: Local Trip counter.
* TWEAK: Better TSS2 Long and DF tune. @cgw1968-5779
* TWEAK: Honda - ODYSSEY_HYBRID tweaks. (@lijunhao731)
* TWEAK: Toyota - AVALONH_2019 SNG tweaks. (@南少)
* FIXED: Fixed Reverse message not showing issue.
* FIXED: Honda - ALKA not working. @loveloveses
* FIXED: Display Mode.
* FIXED: Toyota - Speed Override.
dragonpilot [2023.3.27]
=======================
* Synced with openpilot master 2023.03.26 commits.
* comma 0.9.2 release
* Draw MPC path instead of model predicted path, this is a more accurate representation of what the car will do.
* DP Highlight
* Dynamic Rainbow mode. (fancy lol)
* Different color when Always On Lateral is enabled.
* RoadEdge detection has it's own toggle now.
* IMPROVEMENT: Better TSS2 Long and DF tune. @cgw1968-5779
* NEW: Alternative Lateral Controller
* Ability to switch to another lateral controller when SET speed is higher than configure speed.
* E.g. Use Torque + Laneless when belows 80kph and use PID + Laneline when above.
dragonpilot [2023.2.15]
=======================
* Synced with openpilot master 2022.12.14 commits.
* Comma 0.9.1 release
* New driving model
* 30% improved height estimation resulting in better driving performance for tall cars
* UI updates
* Adjust alert volume using ambient noise level
* Driver monitoring icon shows driver's head pose
* NEW: Always On Lateral v2 (For Toyota/VAG/HKG/Honda).
* NEW: Block ALC if it's close to the road edges.
* NEW: Rinbow path toggle. (This effect is purely cosmetic)
* IMPROVEMENT: Better TSS2 Long and DF tune. @cgw1968-5779
* Bug fixes and improvement.
dragonpilot [2023.1.10]
=======================
* Synced with openpilot master 2023.1.3 commits.
* IMPROVEMENT: Dynamic end to end refactored. It will automatically turn on and off for red light for smoother u/x. Now Supports (honda and vw that cab take advantage of VOACC).
* IMPROVEMENT: Better TSS2 Long and DF tune. @cgw1968-5779
* ADDED: support for Chevrolet Trailblazer 2022 (Thanks @TurboCE)
* ADDED: support for Honda odyssey hybrid 2022 China (Thanks @lijunhao731)
* ADDED: GPS accuracy on the sidebar.
* Bug fixes and improvement.
HOTFIX:
=======================
* Allow Experimental Mode in release branch. (@Stupefacient)
* Happy Holiday / New Years! Safe Travel, cya in 2023!
dragonpilot 2022.12.13
=======================
* Synced with openpilot master 2022.12.13 commits.
* COMMA: New model, Toyota users can now configure SWAY settings.
* ADDED: Dashcam for comma 3. Store in /data/media/0/video/ (@neokii)
* ADDED: Better TSS2 Long and DF tune. @cgw1968-5779
* NEW: Toggle to adapt Dynamic End-to-End to Following Dist. Mode.
* NEW: Toggle to adapt Dynamic End-to-End to Accel Mode.
* Improvement: Dynamic end to end is much more reliable and smoother experience
* Bug fixes and improvement.
* Happy Holiday / New Years! Safe Travel, cya in 2023!
dragonpilot [2022.11.25]
=======================
* Synced with openpilot master 2022.11.25 commits.
* ADDED: Lateral Controller Selector.
- Ability to select between DEFAULT / PID / LQR / Torque Controller.
* ADDED: Redesigned UI to match Comma's new UI/UX style.
* ADDED: Dynamic End-to-End can be turned on when lead car is going below x km/h. (Useful for stop and go traffic.)
* ADDED: Toggle to adapt Dynamic End-to-End to Following Dist. Mode.
* ADDED: Toggle to adapt Dynamic End-to-End to Accel Mode.
* bug fix and improvement.
dragonpilot [2022.11.14]
=======================
* Synced with openpilot master 2022.11.14 commits.
* COMMA: New Model.
* COMMA: RAV4 TSS2 now uses PID.
* REFACTORED: Turning off nav will free up some system resource. QR for nav has been move to home button / sidebar.
* ADDED: 2 new toggle to turn on or off laneline / path and chevron.
* ADDED: When reversing it will now show DM cam.
dragonpilot [2022.11.01]
=======================
* Synced with openpilot master 2022.11.01 commits.
* COMMA: New Model.
* ADDED: Multi Lateral Planner: Ability to choose different Lateral Planner (0 = LATEST, 1 = 0.8.13, 2 = 0.8.16).
* READD: Toyota Prius ZSS support.
* Improvement: Better User experience for installing mapd database.
* Improvement: Turning on Lane Line will automatically will use DLP (Dynamic Lane Profile).
* bug fix and improvement
dragonpilot [2022.10.26]
=======================
* Synced with openpilot master 2022.10.26 commits.
* COMMA: Torque controller used on all Toyota, Lexus, Hyundai, Kia, and Genesis models.
* COMMA: New Model with much improved e2e long.
* ADDED: Mapd Database selector menu to use mapd offline located in software. When installing Database it will take some time. It is not stuck just be patience run `tmux a` for more info. DO NOT RESTART When database is being installed.
* ADDED: Better TSS2 Long and DF tune. @cgw1968-5779
* ADDED: Toggle to bypass dashcam mode for Mazda.
* Improvement: Dynamic End to End tune.
* Improvement: Better Optimization for Vision Turn Controller with laneline mode.
* bug fix and improvement
dragonpilot [2022.10.18]
=======================
* Synced with openpilot master 2022.10.18 commits.
* ADDED: Laneline toggle.
* ADDED: Turn and BSM indicator. (turn = green, turn + bsm = yellow, bsm = red)
* Improvement: Dynamic End to End tune.
* bug fix and improvement
dragonpilot [2022.10.04]
=======================
* Synced with openpilot master 2022.10.04 commits.
* ADDED: Dynamic End to End long. For more detail read the setting description.
* ADDED: Mpad now support's Stop Sign, Yield, Speed Bump, Sharp Curve. (For best experience map you area. https://www.openstreetmap.org/)
* ADDED: Chevron can display either distance or speed.
* ADDED: Toggles to force enabling torque control / torque tune for some vehicles
* Improvement: Dynamic Follow, Toyota Longitudinal and Decel tune.
* bug fix and improvement
dragonpilot [2022.09.27]
=======================
* Synced with openpilot master 2022.09.27 commits.
* ADDED: Always On Lateral toggle under dp-controls!
* ADDED: Live torque fix pr#25868
* ADDED: RAV4 and HIGHLANDER with sdsu can use follow distance button on the wheel.
* bug fix and improvement
dragonpilot [2022.09.19]
========================
* Synced with openpilot master 2022.09.19 commits.
* READD: refactored dyanmaic follow. support all car with op long.
* ADDED: PRIUS_TSS2 (2020-2022) now uses torque as default and auto learns.
* ADDED: Added a TSS2 RAV4 Special PID Tune toggle.
* ADDED: Added a PRIUS 2017 Special Torque Tune toggle.
* ADDED: Toggle to turn on and off Torque controller.
* ADDED: Toggle to turn on and off auto tune torque controller.
* ADDED: Vision Turn Controller.
* bug fix and improvement
dragonpilot [2022.09.09]
========================
* Synced with openpilot master 2022.09.09 commits.
* ADDED: us-west coast can now use mapd without data. See toggle description for more detail.
* READD: Temp check toggl e, max speed toggle and couple other UI toggles.
* bug fix and improvement
dragonpilot [2022.09.04]
========================
* Synced with openpilot master 2022.09.01 commits.
* Refactor: Dynamic Follow has been removerd temporary. Needs a refactor. (wip)
* ADDED: Auto Toyota door lock/unlock **only works on some car**
* READDED: Camera offset toggle.
* Improvement: gpxd now uses liveLocationKalman better performance.
* bug fix and improvement.
dragonpilot [2022.08.07]
========================
Synced to openpilot master 2022.08.07 commits.
NEW: Added back auto shutdown toggle.
NEW: Added back LQR tune toggle.
NEW: MAZDA - Ability to enable/disable below steer speed alert. (Thanks to @TheCrowd)
TWEAKED: Panda Recovery should kill boardd process first.
FIXED: Fixed stop working issue when mapd crashed.
dragonpilot 2022.07.27
========================
NEW: Synced to openpilot 2022.07.27 commits.
NEW: Included Mazda vehicles.
TWEAK: Only show road name bar when it's not empty.
TWEAK: Enlarged lead car distance text.
TWEAK: TOYOTA - Updated lowest speed override feature.
FIXED: Fixed Panda Flash/Recovery buttons.
FIXED: Included dp_patcher.py execution.
dragonpilot [2022.08.07]
========================
* Synced to openpilot master 2022.08.07 commits.
@@ -552,14 +1469,14 @@ dragonpilot 0.7.5.0
2020-03-27
========================
* [DEVEL] 更新至最新的 testing 分支:
* 加入波蘭版 2015 Lexus NX200T 支援。(感謝 wabes 提供)
* 調整「啟用原廠 DSU 模式」為不再需要 AHB 。(Enable Stock DSU Mode no longer requires "AHB" toggle)
* 加入「安全帶檢查」、「車門檢查」、「檔位檢查」、「溫度檢查」開關。
* 加入曲率學習功能 - Curvature Learner 。(感謝 zorrobyte 提供)
* 加入大陸版 2018 Toyota Highlander 支援。(感謝 toyboxZ 提供)
* 加入大陸版 2018 Toyota Camry 2.0 支援。(感謝 Rming 提供)
* 加入韓文支持。(感謝 crwusiz 提供)
* 調整 OFFROAD 主頁翻譯將 "dragonpilot" 改回 "openpilot"。
* 加入波蘭版 2015 Lexus NX200T 支援。(感謝 wabes 提供)
* 調整「啟用原廠 DSU 模式」為不再需要 AHB 。(Enable Stock DSU Mode no longer requires "AHB" toggle)
* 加入「安全帶檢查」、「車門檢查」、「檔位檢查」、「溫度檢查」開關。
* 加入曲率學習功能 - Curvature Learner 。(感謝 zorrobyte 提供)
* 加入大陸版 2018 Toyota Highlander 支援。(感謝 toyboxZ 提供)
* 加入大陸版 2018 Toyota Camry 2.0 支援。(感謝 Rming 提供)
* 加入韓文支持。(感謝 crwusiz 提供)
* 調整 OFFROAD 主頁翻譯將 "dragonpilot" 改回 "openpilot"。
2020-03-22
========================
+14
View File
@@ -0,0 +1,14 @@
FROM ghcr.io/commaai/openpilot-base:latest
ENV PYTHONUNBUFFERED=1
ENV OPENPILOT_PATH=/home/batman/openpilot
RUN mkdir -p ${OPENPILOT_PATH}
WORKDIR ${OPENPILOT_PATH}
COPY . ${OPENPILOT_PATH}/
ENV UV_BIN="/home/batman/.local/bin/"
ENV PATH="$UV_BIN:$PATH"
RUN UV_PROJECT_ENVIRONMENT=$VIRTUAL_ENV uv run scons --cache-readonly -j$(nproc)
+81
View File
@@ -0,0 +1,81 @@
FROM ubuntu:24.04
ENV PYTHONUNBUFFERED=1
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends sudo tzdata locales ssh pulseaudio xvfb x11-xserver-utils gnome-screenshot python3-tk python3-dev && \
rm -rf /var/lib/apt/lists/*
RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && locale-gen
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8
COPY tools/install_ubuntu_dependencies.sh /tmp/tools/
RUN /tmp/tools/install_ubuntu_dependencies.sh && \
rm -rf /var/lib/apt/lists/* /tmp/* && \
cd /usr/lib/gcc/arm-none-eabi/* && \
rm -rf arm/ thumb/nofp thumb/v6* thumb/v8* thumb/v7+fp thumb/v7-r+fp.sp
# Add OpenCL
RUN apt-get update && apt-get install -y --no-install-recommends \
apt-utils \
alien \
unzip \
tar \
curl \
xz-utils \
dbus \
gcc-arm-none-eabi \
tmux \
vim \
libx11-6 \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /tmp/opencl-driver-intel && \
cd /tmp/opencl-driver-intel && \
wget https://github.com/intel/llvm/releases/download/2024-WW14/oclcpuexp-2024.17.3.0.09_rel.tar.gz && \
wget https://github.com/oneapi-src/oneTBB/releases/download/v2021.12.0/oneapi-tbb-2021.12.0-lin.tgz && \
mkdir -p /opt/intel/oclcpuexp_2024.17.3.0.09_rel && \
cd /opt/intel/oclcpuexp_2024.17.3.0.09_rel && \
tar -zxvf /tmp/opencl-driver-intel/oclcpuexp-2024.17.3.0.09_rel.tar.gz && \
mkdir -p /etc/OpenCL/vendors && \
echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64/libintelocl.so > /etc/OpenCL/vendors/intel_expcpu.icd && \
cd /opt/intel && \
tar -zxvf /tmp/opencl-driver-intel/oneapi-tbb-2021.12.0-lin.tgz && \
ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \
ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \
ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbb.so.12 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \
ln -s /opt/intel/oneapi-tbb-2021.12.0/lib/intel64/gcc4.8/libtbbmalloc.so.2 /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 && \
mkdir -p /etc/ld.so.conf.d && \
echo /opt/intel/oclcpuexp_2024.17.3.0.09_rel/x64 > /etc/ld.so.conf.d/libintelopenclexp.conf && \
ldconfig -f /etc/ld.so.conf.d/libintelopenclexp.conf && \
cd / && \
rm -rf /tmp/opencl-driver-intel
ENV NVIDIA_VISIBLE_DEVICES=all
ENV NVIDIA_DRIVER_CAPABILITIES=graphics,utility,compute
ENV QTWEBENGINE_DISABLE_SANDBOX=1
RUN dbus-uuidgen > /etc/machine-id
ARG USER=batman
ARG USER_UID=1001
RUN useradd -m -s /bin/bash -u $USER_UID $USER
RUN usermod -aG sudo $USER
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER $USER
COPY --chown=$USER pyproject.toml uv.lock /home/$USER
COPY --chown=$USER tools/install_python_dependencies.sh /home/$USER/tools/
ENV VIRTUAL_ENV=/home/$USER/.venv
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
RUN cd /home/$USER && \
tools/install_python_dependencies.sh && \
rm -rf tools/ pyproject.toml uv.lock .cache
USER root
RUN sudo git config --global --add safe.directory /tmp/openpilot
+30
View File
@@ -0,0 +1,30 @@
Copyright (c) 2019, Rick Lan
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, and/or sublicense,
for non-commercial purposes only, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
- Commercial use (e.g. use in a product, service, or activity intended to
generate revenue) is prohibited without explicit written permission from
the copyright holder.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---
Copyright (c) 2018, Comma.ai, Inc.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Executable → Regular
+39 -114
View File
@@ -1,149 +1,74 @@
![](https://i.imgur.com/b0ZyIx5.jpg)
![](dragonpilot/selfdrive/assets/dragonpilot.png)
Table of Contents
=======================
[Read this in English](README_EN.md)
* [What is openpilot?](#what-is-openpilot)
* [Running in a car](#running-on-a-dedicated-device-in-a-car)
* [Running on PC](#running-on-pc)
* [Community and Contributing](#community-and-contributing)
* [User Data and comma Account](#user-data-and-comma-account)
* [Safety and Testing](#safety-and-testing)
* [Directory Structure](#directory-structure)
* [Licensing](#licensing)
# **🐲 dragonpilot - 賦予您的愛車「龍」之魂**
---
**我們與您一同翱翔於更智慧、更貼心的駕駛旅程。**
What is openpilot?
------
## **👋 嘿, 朋友,歡迎您的到來!**
[openpilot](http://github.com/commaai/openpilot) is an open source driver assistance system. Currently, openpilot performs the functions of Adaptive Cruise Control (ACC), Automated Lane Centering (ALC), Forward Collision Warning (FCW) and Lane Departure Warning (LDW) for a growing variety of [supported car makes, models and model years](docs/CARS.md). In addition, while openpilot is engaged, a camera based Driver Monitoring (DM) feature alerts distracted and asleep drivers. See more about [the vehicle integration](docs/INTEGRATION.md) and [limitations](docs/LIMITATIONS.md).
`dragonpilot` 誕生於 2019 年,由三位早期的 openpilot 華人玩家共同創立。初衷很簡單:為廣大的華人用戶、玩家們提供一個友善的交流環境、更簡便的設定協助,並加入更多適合在地使用的貼心功能。
<table>
<tr>
<td><a href="https://youtu.be/NmBfgOanCyk" title="Video By Greer Viau"><img src="https://i.imgur.com/1w8c6d2.jpg"></a></td>
<td><a href="https://youtu.be/VHKyqZ7t8Gw" title="Video By Logan LeGrand"><img src="https://i.imgur.com/LnBucik.jpg"></a></td>
<td><a href="https://youtu.be/VxiR4iyBruo" title="Video By Charlie Kim"><img src="https://i.imgur.com/4Qoy48c.jpg"></a></td>
<td><a href="https://youtu.be/-IkImTe1NYE" title="Video By Aragon"><img src="https://i.imgur.com/04VNzPf.jpg"></a></td>
</tr>
<tr>
<td><a href="https://youtu.be/iIUICQkdwFQ" title="Video By Logan LeGrand"><img src="https://i.imgur.com/b1LHQTy.jpg"></a></td>
<td><a href="https://youtu.be/XOsa0FsVIsg" title="Video By PinoyDrives"><img src="https://i.imgur.com/6FG0Bd8.jpg"></a></td>
<td><a href="https://youtu.be/bCwcJ98R_Xw" title="Video By JS"><img src="https://i.imgur.com/zO18CbW.jpg"></a></td>
<td><a href="https://youtu.be/BQ0tF3MTyyc" title="Video By Tsai-Fi"><img src="https://i.imgur.com/eZzelq3.jpg"></a></td>
</tr>
</table>
我們深知在地化的重要性,特別是語言的親切感。因此,我們率先導入了完整的中文介面,讓 `dragonpilot` 迅速在華語地區累積了口碑,也讓華人的使用者數量在全球名列前茅。這份來自在地的支持,是我們持續前進的最大動力。
我們以功能強大的 [openpilot](https://github.com/commaai/openpilot) 為基礎——這套據美國消費者報告評測優於市售車方案的開源輔助駕駛系統——融入了更多在地化的巧思與客製化的溫度,希望能打造出最符合您需求的駕駛夥伴。(您也可以參考我們 repo 中保留的 [openpilot 原始說明檔案](README_OPENPILOT.md))
Running on a dedicated device in a car
------
取名 `dragonpilot`,是因為我們希望它能像神話中的「龍」一樣,既強大又充滿智慧,為您的行車安全保駕護航。龍,在我們華人文化中,更是吉祥與力量的象徵,也代表著我們的根源與驕傲。
To use openpilot in a car, you need four things
* A supported device to run this software: a [comma three](https://comma.ai/shop/products/three).
* This software. The setup procedure of the comma three allows the user to enter a url for custom software.
The url, openpilot.comma.ai will install the release version of openpilot. To install openpilot master, you can use installer.comma.ai/commaai/master, and replacing commaai with another github username can install a fork.
* One of [the 150+ supported cars](docs/CARS.md). We support Honda, Toyota, Hyundai, Nissan, Kia, Chrysler, Lexus, Acura, Audi, VW, and more. If your car is not supported, but has adaptive cruise control and lane keeping assist, it's likely able to run openpilot.
* A [car harness](https://comma.ai/shop/products/car-harness) to connect to your car.
## **✨ dragonpilot 的里程碑**
We have detailed instructions for [how to mount the device in a car](https://comma.ai/setup).
我們不僅保留了 openpilot 的核心優勢,更達成了許多從社群回饋中誕生的里程碑,這些是我們引以為傲的足跡:
Running on PC
------
* **🚘 全時置中車道維持 (ALKA)**
All of openpilot's services can run as normal on a PC, even without special hardware or a car. To develop or experiment with openpilot you can run openpilot on recorded or simulated data.
這不只是一個功能,更是 `dragonpilot` 的哲學。我們最早於 [0.6.2 版本](https://github.com/dragonpilot-community/dragonpilot/blob/2861467183d62151024320447ba04d18fc3fe1e6/selfdrive/car/toyota/carstate.py#L199) 時便實現了這個功能,其開發歷程始於 2017 Lexus IS300h,接著擴展至 Toyota 全車系,並逐步延伸到其他支援的品牌。它能溫柔地輔助您,讓車輛始終穩定地保持在車道中央,提供一份額外的安心與從容。
With openpilot's tools you can plot logs, replay drives and watch the full-res camera streams. See [the tools README](tools/README.md) for more information.
* **🌐 率先導入多國語言介面**
You can also run openpilot in simulation [with the CARLA simulator](tools/sim/README.md). This allows openpilot to drive around a virtual car on your Ubuntu machine. The whole setup should only take a few minutes, but does require a decent GPU.
在官方 openpilot 還未支援前,我們便已將多國語言介面實現。`dragonpilot` 完整支援繁體中文、簡體中文與英文,讓操作毫無隔閡。
A PC running openpilot can also control your vehicle if it is connected to a [a webcam](https://github.com/commaai/openpilot/tree/master/tools/webcam), a [black panda](https://comma.ai/shop/products/panda), and [a harness](https://comma.ai/shop/products/car-harness).
* **💻 唯一同時支援多硬體平台**
Community and Contributing
------
我們是唯一曾致力於讓專案同時兼容 EON、comma two、comma 3 與 Jetson 平台的社群分支,這份努力是為了服務最廣大的玩家社群。
此外,在 comma.ai 團隊於 0.10.0 版本宣布停止支持 comma 3 後,我們仍是唯一一個完整同時支援 comma 3、comma 3X 以及 O3、O3L、O3XL(O3 系列為副廠硬體)的社群分支。
openpilot is developed by [comma](https://comma.ai/) and by users like you. We welcome both pull requests and issues on [GitHub](http://github.com/commaai/openpilot). Bug fixes and new car ports are encouraged. Check out [the contributing docs](docs/CONTRIBUTING.md).
* **📜 曾榮獲官方認證第一大分支**
Documentation related to openpilot development can be found on [docs.comma.ai](https://docs.comma.ai). Information about running openpilot (e.g. FAQ, fingerprinting, troubleshooting, custom forks, community hardware) should go on the [wiki](https://github.com/commaai/openpilot/wiki).
基於活躍的社群與功能創新,`dragonpilot` 曾一度成長為 comma ai 官方認證的第一大 openpilot 分支,這份榮耀屬於每一位參與者。
You can add support for your car by following guides we have written for [Brand](https://blog.comma.ai/how-to-write-a-car-port-for-openpilot/) and [Model](https://blog.comma.ai/openpilot-port-guide-for-toyota-models/) ports. Generally, a car with adaptive cruise control and lane keep assist is a good candidate. [Join our Discord](https://discord.comma.ai) to discuss car ports: most car makes have a dedicated channel.
## **🧑‍💻 設計理念 - 少即是多 (Less is More)**
Want to get paid to work on openpilot? [comma is hiring](https://comma.ai/jobs/).
隨著 openpilot 的 AI 模型日益強大,許多過去需要手動微調的功能,現在都已能透過更先進的模型來實現。因此,我們現在的開發重心回歸到 **「最小化修改」(minimal changes)** 的核心原則上。
And [follow us on Twitter](https://twitter.com/comma_ai).
我們的目標是為您提供最純粹、最接近官方的 openpilot 駕駛感受,同時保留 `dragonpilot` 那些經過時間考驗、最受社群喜愛的經典功能。我們相信,在強大的 AI 基礎上,簡潔即是力量。
User Data and comma Account
------
## **🛠️ 硬件的足跡 - 一路走來的夥伴們**
By default, openpilot uploads the driving data to our servers. You can also access your data through [comma connect](https://connect.comma.ai/). We use your data to train better models and improve openpilot for everyone.
從最早的 **EON**,到官方的 **comma two / three (C2/C3/C3X)**,再到社群中各式各樣充滿智慧的**副廠機 (如 C1.5, O2, O3, O3L, O3XL 等)**,甚至我們也曾探索過在 [**Jetson Xavier NX**](https://github.com/eFiniLan/xnxpilot) 上的可能性。
openpilot is open source software: the user is free to disable data collection if they wish to do so.
目前最新版本主要支援: comma3 / 3X 以及 O3 / O3L / O3XL 等社群硬體。
針對 EON / C1.5 / C2 等舊款硬體,最後支援的版本位於 [d2 分支](https://github.com/dragonpilot-community/dragonpilot/tree/d2)。
無論您手上是哪一款設備,都代表著您對開源駕駛輔助的一份熱情。
openpilot logs the road facing cameras, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
The driver facing camera is only logged if you explicitly opt-in in settings. The microphone is not recorded.
## **🫂 加入我們,成為「尋龍者」的一份子**
By using openpilot, you agree to [our Privacy Policy](https://comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data.
`dragonpilot` 的成長,離不開每一位使用者的貢獻與回饋。我們是一個以**公開、透明**為原則的溫暖社群,希望在這裡能與所有對 openpilot / dragonpilot 有興趣的用戶分享、交流開發與使用上的經驗。
Safety and Testing
----
[**歡迎加入我們的 Facebook 社團進行交流!**](https://www.facebook.com/groups/930190251238639)
* openpilot observes ISO26262 guidelines, see [SAFETY.md](docs/SAFETY.md) for more details.
* openpilot has software in the loop [tests](.github/workflows/selfdrive_tests.yaml) that run on every commit.
* The code enforcing the safety model lives in panda and is written in C, see [code rigor](https://github.com/commaai/panda#code-rigor) for more details.
* panda has software in the loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety).
* Internally, we have a hardware in the loop Jenkins test suite that builds and unit tests the various processes.
* panda has additional hardware in the loop [tests](https://github.com/commaai/panda/blob/master/Jenkinsfile).
* We run the latest openpilot in a testing closet containing 10 comma devices continuously replaying routes.
## **❤️ 特別感謝**
Directory Structure
------
.
├── cereal # The messaging spec and libs used for all logs
├── common # Library like functionality we've developed here
├── docs # Documentation
├── opendbc # Files showing how to interpret data from cars
├── panda # Code used to communicate on CAN
├── third_party # External libraries
├── pyextra # Extra python packages
└── system # Generic services
├── camerad # Driver to capture images from the camera sensors
├── clocksd # Broadcasts current time
├── hardware # Hardware abstraction classes
├── logcatd # systemd journal as a service
└── proclogd # Logs information from /proc
└── selfdrive # Code needed to drive the car
├── assets # Fonts, images, and sounds for UI
├── athena # Allows communication with the app
├── boardd # Daemon to talk to the board
├── car # Car specific code to read states and control actuators
├── controls # Planning and controls
├── debug # Tools to help you debug and do car ports
├── locationd # Precise localization and vehicle parameter estimation
├── loggerd # Logger and uploader of car data
├── manager # Deamon that starts/stops all other daemons as needed
├── modeld # Driving and monitoring model runners
├── monitoring # Daemon to determine driver attention
├── navd # Turn-by-turn navigation
├── sensord # IMU interface code
├── test # Unit tests, system tests, and a car simulator
└── ui # The UI
`dragonpilot` 從創立至今,從未打算透過 Patreon 等平台進行任何形式的募資。我們的初衷是建立一個讓大家能一起學習、一起成長的社群。It's all about fun, not money.
Licensing
------
然而,我們仍要對那些自發性支持本專案的朋友們,致上最誠摯的感謝。正是因為有您們的鼓勵,我們才有更大的動力持續前進。
openpilot is released under the MIT license. Some parts of the software are released under other licenses as specified.
[**我們的贊助者名單**](SPONSORS.md)
Any user of this software shall indemnify and hold harmless Comma.ai, Inc. and its directors, officers, employees, agents, stockholders, affiliates, subcontractors and customers from and against all allegations, claims, actions, suits, demands, damages, liabilities, obligations, losses, settlements, judgments, costs and expenses (including without limitation attorneys fees and costs) which arise out of, relate to or result from any use of this software by user.
### **安全聲明**
**THIS IS ALPHA QUALITY SOFTWARE FOR RESEARCH PURPOSES ONLY. THIS IS NOT A PRODUCT.
YOU ARE RESPONSIBLE FOR COMPLYING WITH LOCAL LAWS AND REGULATIONS.
NO WARRANTY EXPRESSED OR IMPLIED.**
`dragonpilot` 是一種駕駛**輔助**系統,並非全自動駕駛。它旨在減輕您的駕駛疲勞,提升行車安全,但駕駛人仍需時刻保持專注,並隨時準備接管車輛。請務必遵守您所在地區的交通法規。
---
**最後,再次感謝您的到來。**
<img src="https://d1qb2nb5cznatu.cloudfront.net/startups/i/1061157-bc7e9bf3b246ece7322e6ffe653f6af8-medium_jpg.jpg?buster=1458363130" width="75"></img> <img src="https://cdn-images-1.medium.com/max/1600/1*C87EjxGeMPrkTuVRVWVg4w.png" width="225"></img>
[![openpilot tests](https://github.com/commaai/openpilot/workflows/openpilot%20tests/badge.svg?event=push)](https://github.com/commaai/openpilot/actions)
[![Total alerts](https://img.shields.io/lgtm/alerts/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/alerts/)
[![Language grade: Python](https://img.shields.io/lgtm/grade/python/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/context:python)
[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/commaai/openpilot.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/commaai/openpilot/context:cpp)
[![codecov](https://codecov.io/gh/commaai/openpilot/branch/master/graph/badge.svg)](https://codecov.io/gh/commaai/openpilot)
**期待與您一同在智慧駕駛的道路上,乘「龍」而行!**
+74
View File
@@ -0,0 +1,74 @@
![](dragonpilot/selfdrive/assets/dragonpilot.png)
[Read this in Chinese](README.md)
# **🐲 dragonpilot - Bringing the Spirit of the Dragon to Your Car**
**Join us on a smarter, more thoughtful driving journey.**
## **👋 Welcome, friend!**
`dragonpilot` was launched in 2019 by three early openpilot enthusiasts from the Chinese community. Our mission was simple: create a friendly space for users to share experiences, provide easier setup help, and add features tailored for local needs.
Localization has always been at the heart of what we do—starting with a fully Chinese interface. This made `dragonpilot` quickly popular in Chinese-speaking regions and helped our user base grow into one of the largest worldwide. That community support is what keeps us moving forward.
Built on top of the powerful [openpilot](https://github.com/commaai/openpilot)—an open-source driver assistance system rated by Consumer Reports as outperforming commercial offerings—we add localized refinements and user-focused features to create a driving companion that truly fits your needs. (You can also see the [original openpilot README](README_OPENPILOT.md) preserved in our repo.)
The name `dragonpilot` reflects our vision: like the dragon of mythology, it is strong and wise, guarding your safety on the road. In Chinese culture, the dragon is also a symbol of luck and strength, representing our roots and pride.
## **✨ Milestones**
Beyond carrying forward openpilot's core strengths, we've reached several milestones inspired by community feedback:
* **🚘 Always Lane Keep Assist (ALKA)**
More than a feature—it's part of the `dragonpilot` philosophy. Introduced as early as [version 0.6.2](https://github.com/dragonpilot-community/dragonpilot/blob/2861467183d62151024320447ba04d18fc3fe1e6/selfdrive/car/toyota/carstate.py#L199), first tested on a 2017 Lexus IS300h, then expanded to Toyota's lineup and beyond. ALKA helps keep your vehicle steadily centered, giving you extra confidence on the road.
* **🌐 First to add multilingual support**
Before openpilot officially supported it, we had already introduced multiple languages. `dragonpilot` fully supports Traditional Chinese, Simplified Chinese, and English.
* **💻 Only community fork to support multiple hardware platforms at once**
We uniquely worked to make the project run on EON, comma two, comma 3, and Jetson—serving the widest range of users possible.
Additionally, after the comma.ai team deprecated the comma 3 in version 0.10.0, we remain the only community fork to offer full, simultaneous support for the comma 3, comma 3X, and the O3, O3L, and O3XL (the O3 series being third-party hardware).
* **📜 Once recognized as the #1 openpilot fork**
Thanks to an active community and continuous innovation, `dragonpilot` was once the largest openpilot fork officially recognized by comma ai. This honor belongs to everyone who contributed.
## **🧑‍💻 Design Philosophy - Less is More**
As openpilot's AI grows stronger, many features that once required manual tuning are now handled by advanced models. That's why our focus has returned to **“minimal changes.”**
We aim to give you the purest, most official-like openpilot driving experience—while preserving `dragonpilot`'s classic, community-loved features. With a solid AI foundation, simplicity is strength.
## **🛠️ Hardware Journey**
From the early **EON**, to official devices like **comma two / three (C2/C3/C3X)**, to creative community builds (**C1.5, O2, O3, O3L, O3XL, etc.**), and even experiments with [**Jetson Xavier NX**](https://github.com/eFiniLan/xnxpilot).
Currently, the latest versions support: **comma3 / 3X** and community hardware like **O3 / O3L / O3XL**.
Older devices such as **EON / C1.5 / C2** are supported in the [d2 branch](https://github.com/dragonpilot-community/dragonpilot/tree/d2).
Whatever device you're on, it represents your passion for open-source driver assistance.
## **🫂 Join Us Become a “Dragon Seeker”**
`dragonpilot` thrives thanks to every user's contributions and feedback. We're an open, transparent, and welcoming community where enthusiasts can share experiences with openpilot and `dragonpilot`.
[**Join our Facebook group here!**](https://www.facebook.com/groups/930190251238639)
## **❤️ Special Thanks**
Since day one, `dragonpilot` has never asked for funding through Patreon or similar platforms. Our vision is a community where everyone learns and grows together. It's about fun, not money.
That said, we're deeply grateful to those who voluntarily supported the project. Your encouragement keeps us motivated to keep building.
[**See our sponsors**](SPONSORS.md)
### **Safety Notice**
`dragonpilot` is a driver **assistance** system, not full self-driving. It reduces fatigue and improves safety, but you must remain alert and ready to take control at all times. Always follow your local traffic laws.
**Thanks again for being here.**
**We look forward to riding the “dragon” with you on the road to smarter driving!**
+107
View File
@@ -0,0 +1,107 @@
<div align="center" style="text-align: center;">
<h1>openpilot</h1>
<p>
<b>openpilot is an operating system for robotics.</b>
<br>
Currently, it upgrades the driver assistance system in 300+ supported cars.
</p>
<h3>
<a href="https://docs.comma.ai">Docs</a>
<span> · </span>
<a href="https://docs.comma.ai/contributing/roadmap/">Roadmap</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">Community</a>
<span> · </span>
<a href="https://comma.ai/shop">Try it on a comma 3X</a>
</h3>
Quick start: `bash <(curl -fsSL openpilot.comma.ai)`
[![openpilot tests](https://github.com/commaai/openpilot/actions/workflows/tests.yaml/badge.svg)](https://github.com/commaai/openpilot/actions/workflows/tests.yaml)
[![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)
</div>
<table>
<tr>
<td><a href="https://youtu.be/NmBfgOanCyk" title="Video By Greer Viau"><img src="https://github.com/commaai/openpilot/assets/8762862/2f7112ae-f748-4f39-b617-fabd689c3772"></a></td>
<td><a href="https://youtu.be/VHKyqZ7t8Gw" title="Video By Logan LeGrand"><img src="https://github.com/commaai/openpilot/assets/8762862/92351544-2833-40d7-9e0b-7ef7ae37ec4c"></a></td>
<td><a href="https://youtu.be/SUIZYzxtMQs" title="A drive to Taco Bell"><img src="https://github.com/commaai/openpilot/assets/8762862/05ceefc5-2628-439c-a9b2-89ce77dc6f63"></a></td>
</tr>
</table>
Using openpilot in a car
------
To use openpilot in a car, you need four things:
1. **Supported Device:** a comma 3X, available at [comma.ai/shop](https://comma.ai/shop/comma-3x).
2. **Software:** The setup procedure for the comma 3X allows users to enter a URL for custom software. Use the URL `openpilot.comma.ai` to install the release version.
3. **Supported Car:** Ensure that you have one of [the 275+ supported cars](docs/CARS.md).
4. **Car Harness:** You will also need a [car harness](https://comma.ai/shop/car-harness) to connect your comma 3X to your car.
We have detailed instructions for [how to install the harness and device in a car](https://comma.ai/setup). Note that it's possible to run openpilot on [other hardware](https://blog.comma.ai/self-driving-car-for-free/), although it's not plug-and-play.
### Branches
| branch | URL | description |
|------------------|----------------------------------------|-------------------------------------------------------------------------------------|
| `release3` | openpilot.comma.ai | This is openpilot's release branch. |
| `release3-staging` | openpilot-test.comma.ai | This is the staging branch for releases. Use it to get new releases slightly early. |
| `nightly` | openpilot-nightly.comma.ai | This is the bleeding edge development branch. Do not expect this to be stable. |
| `nightly-dev` | installer.comma.ai/commaai/nightly-dev | Same as nightly, but includes experimental development features for some cars. |
To start developing openpilot
------
openpilot is developed by [comma](https://comma.ai/) and by users like you. We welcome both pull requests and issues on [GitHub](http://github.com/commaai/openpilot).
* Join the [community Discord](https://discord.comma.ai)
* Check out [the contributing docs](docs/CONTRIBUTING.md)
* Check out the [openpilot tools](tools/)
* Code documentation lives at https://docs.comma.ai
* Information about running openpilot lives on the [community wiki](https://github.com/commaai/openpilot/wiki)
Want to get paid to work on openpilot? [comma is hiring](https://comma.ai/jobs#open-positions) and offers lots of [bounties](https://comma.ai/bounties) for external contributors.
Safety and Testing
----
* openpilot observes [ISO26262](https://en.wikipedia.org/wiki/ISO_26262) guidelines, see [SAFETY.md](docs/SAFETY.md) for more details.
* openpilot has software-in-the-loop [tests](.github/workflows/tests.yaml) that run on every commit.
* The code enforcing the safety model lives in panda and is written in C, see [code rigor](https://github.com/commaai/panda#code-rigor) for more details.
* panda has software-in-the-loop [safety tests](https://github.com/commaai/panda/tree/master/tests/safety).
* Internally, we have a hardware-in-the-loop Jenkins test suite that builds and unit tests the various processes.
* panda has additional hardware-in-the-loop [tests](https://github.com/commaai/panda/blob/master/Jenkinsfile).
* We run the latest openpilot in a testing closet containing 10 comma devices continuously replaying routes.
<details>
<summary>MIT Licensed</summary>
openpilot is released under the MIT license. Some parts of the software are released under other licenses as specified.
Any user of this software shall indemnify and hold harmless Comma.ai, Inc. and its directors, officers, employees, agents, stockholders, affiliates, subcontractors and customers from and against all allegations, claims, actions, suits, demands, damages, liabilities, obligations, losses, settlements, judgments, costs and expenses (including without limitation attorneys fees and costs) which arise out of, relate to or result from any use of this software by user.
**THIS IS ALPHA QUALITY SOFTWARE FOR RESEARCH PURPOSES ONLY. THIS IS NOT A PRODUCT.
YOU ARE RESPONSIBLE FOR COMPLYING WITH LOCAL LAWS AND REGULATIONS.
NO WARRANTY EXPRESSED OR IMPLIED.**
</details>
<details>
<summary>User Data and comma Account</summary>
By default, openpilot uploads the driving data to our servers. You can also access your data through [comma connect](https://connect.comma.ai/). We use your data to train better models and improve openpilot for everyone.
openpilot is open source software: the user is free to disable data collection if they wish to do so.
openpilot logs the road-facing cameras, CAN, GPS, IMU, magnetometer, thermal sensors, crashes, and operating system logs.
The driver-facing camera and microphone are only logged if you explicitly opt-in in settings.
By using openpilot, you agree to [our Privacy Policy](https://comma.ai/privacy). You understand that use of this software or its related services will generate certain types of user data, which may be logged and stored at the sole discretion of comma. By accepting this agreement, you grant an irrevocable, perpetual, worldwide right to comma for the use of this data.
</details>
+246 -7
View File
@@ -1,6 +1,245 @@
Version 0.8.16 (2022-XX-XX)
Version 0.10.2 (2025-11-19)
========================
* comma four support
Version 0.10.1 (2025-09-08)
========================
* New driving model #36276
* World Model: removed global localization inputs
* World Model: 2x the number of parameters
* World Model: trained on 4x the number of segments
* VAE Compression Model: new architecture and training objective
* Driving Vision Model: trained on 4x the number of segments
* New Driver Monitoring model #36198
* Acura TLX 2021 support thanks to MVL!
* Honda City 2023 support thanks to vanillagorillaa and drFritz!
* Honda N-Box 2018 support thanks to miettal!
* Honda Odyssey 2021-25 support thanks to csouers and MVL!
* Honda Passport 2026 support thanks to vanillagorillaa and MVL!
Version 0.10.0 (2025-08-05)
========================
* New driving model
* New training architecture
* Described in our CVPR paper: "Learning to Drive from a World Model"
* Longitudinal MPC replaced by E2E planning from World Model in Experimental Mode
* Action from lateral MPC as training objective replaced by E2E planning from World Model
* Low-speed lead car ground-truth fixes
* Enable live-learned steering actuation delay
* Opt-in audio recording for dashcam video
* Acura MDX 2025 support thanks to vanillagorillaa and MVL!
* Honda Accord 2023-25 support thanks to vanillagorillaa and MVL!
* Honda CR-V 2023-25 support thanks to vanillagorillaa and MVL!
* Honda Pilot 2023-25 support thanks to vanillagorillaa and MVL!
Version 0.9.9 (2025-05-23)
========================
* New driving model
* New training architecture using parts from MLSIM
* Steering actuation delay is now learned online
* Ford Escape 2023-24 support thanks to incognitojam!
* Ford Kuga 2024 support thanks to incognitojam!
* Hyundai Nexo 2021 support thanks to sunnyhaibin!
* Tesla Model 3 and Y support thanks to lukasloetkolben!
* Lexus RC 2023 support thanks to nelsonjchen!
Version 0.9.8 (2025-02-28)
========================
* New driving model
* Model now gates applying positive acceleration in Chill mode
* New driver monitoring model
* Reduced false positives related to passengers
* Image processing pipeline moved to the ISP
* More GPU time for bigger driving models
* Power draw reduced 0.5W, which means your device runs cooler
* Added toggle to enable driver monitoring even when openpilot is not engaged
* Localizer rewritten to remove GPS dependency at runtime
* Firehose Mode for maximizing your training data uploads
* Enable openpilot longitudinal control for Ford Q3 vehicles
* New Toyota TSS2 longitudinal tune
* Rivian R1S and R1T support thanks to lukasloetkolben!
* Ford F-150, F-150 Hybrid, Mach-E, and Ranger support
Version 0.9.7 (2024-06-13)
========================
* New driving model
* Inputs the past curvature for smoother and more accurate lateral control
* Simplified neural network architecture in the model's last layers
* Minor fixes to desire augmentation and weight decay
* New driver monitoring model
* Improved end-to-end bit for phone detection
* Adjust driving personality with the follow distance button
* Support for hybrid variants of supported Ford models
* Fingerprinting without the OBD-II port on all cars
* Improved fuzzy fingerprinting for Ford and Volkswagen
Version 0.9.6 (2024-02-27)
========================
* New driving model
* Vision model trained on more data
* Improved driving performance
* Directly outputs curvature for lateral control
* New driver monitoring model
* Trained on larger dataset
* Model path UI
* Shows where driving model wants to be
* Shows what model is seeing more clearly, but more jittery
* AGNOS 9
* comma body streaming and controls over WebRTC
* Improved fuzzy fingerprinting for many makes and models
* Alpha longitudinal support for new Toyota models
* Chevrolet Equinox 2019-22 support thanks to JasonJShuler and nworb-cire!
* Dodge Durango 2020-21 support
* Hyundai Staria 2023 support thanks to sunnyhaibin!
* Kia Niro Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Lexus LC 2024 support thanks to nelsonjchen!
* Toyota RAV4 2023-24 support
* Toyota RAV4 Hybrid 2023-24 support
Version 0.9.5 (2023-11-17)
========================
* New driving model
* Improved navigate on openpilot performance using navigation instructions as an additional model input
* Do lateral planning inside the model
* New vision transformer architecture
* Cadillac Escalade ESV 2019 support thanks to twilsonco!
* Hyundai Azera 2022 support thanks to sunnyhaibin!
* Hyundai Azera Hybrid 2020 support thanks to chanhojung and haram-KONA!
* Hyundai Custin 2023 support thanks to sunnyhaibin and Saber422!
* Hyundai Ioniq 6 2023 support thanks to sunnyhaibin and alamo3!
* Hyundai Kona Electric 2023 (Korean version) support thanks to sunnyhaibin and haram-KONA!
* Kia K8 Hybrid (with HDA II) 2023 support thanks to sunnyhaibin!
* Kia Optima Hybrid 2019 support
* Kia Sorento Hybrid 2023 support thanks to sunnyhaibin!
* Lexus GS F 2016 support thanks to snyperifle!
* Lexus IS 2023 support thanks to L3R5!
Version 0.9.4 (2023-07-27)
========================
* comma 3X support
* Navigate on openpilot in Experimental mode
* When navigation has a destination, openpilot will input the map information into the model, which provides useful context to help the model understand the scene
* When navigating on openpilot, openpilot will keep left or right appropriately at forks and exits
* When navigating on openpilot, lane change behavior is unchanged and still activated by the driver
* When navigate on openpilot is active, the path on the map is green
* UI updates
* Navigation settings moved to home screen and map
* Border color always shows engagement status. Blue means disengaged, green means engaged, and grey means engaged with human overriding
* Alerts are shown inside the border. Black means info, orange means warning, and red means critical alert
* Bookmarked segments are preserved on the device's storage
* Ford Focus 2018 support
* Kia Carnival 2023 support thanks to sunnyhaibin!
Version 0.9.3 (2023-06-29)
========================
* New driving model
* Improved height estimation and added height tracking in liveCalibration
* Model inputs refactor
* New driving personality setting
* Three settings: aggressive, standard, and relaxed
* Standard is recommended and the default
* In aggressive mode, lead follow distance is shorter and acceleration response is quicker
* In relaxed mode, lead follow distance is longer
* Improved fuzzy fingerprinting for Hyundai, Kia, and Genesis
* Improved thermal management logic
Version 0.9.2 (2023-05-22)
========================
* New driving model
* Reduced turn diving
* Trained on a new dataset
* UI updates
* New experimental mode visualization
* Draw MPC path instead of model-predicted path
* AGNOS 7
* Faster boot time
* Fixes rare no sounds bug
* Fixes bootsplash bug at extreme temperatures
* Buick LaCrosse 2017-19 support thanks to koch-cf!
* Chevrolet Trailblazer 2021-22 support thanks to TurboCE!
* Ford Bronco Sport 2021-22 support
* Ford Escape 2020-22 support
* Ford Explorer 2020-22 support
* Ford Kuga 2020-22 support
* Ford Maverick 2022-23 support
* Genesis GV80 2023 support thanks to JWingate80!
* Honda HR-V 2023 support thanks to AlexandreSato and galegozi!
* Kia Niro EV 2023 support thanks to JosselinLecocq!
* Lexus ES 2017-18 support
* Lincoln Aviator 2021 support
* Škoda Fabia 2022-23 support thanks to jyoung8607!
Version 0.9.1 (2023-02-28)
========================
* New driving model
* 30% improved height estimation resulting in better driving performance for tall cars
* Driver monitoring: removed timer resetting on user interaction if distracted
* UI updates
* Adjust alert volume using ambient noise level
* Driver monitoring icon shows driver's head pose
* German translation thanks to Vrabetz and CzokNorris!
* Cadillac Escalade 2017 support thanks to rickygilleland!
* Chevrolet Bolt EV 2022-23 support thanks to JasonJShuler!
* Genesis GV60 2023 support thanks to sunnyhaibin!
* Hyundai Tucson 2022-23 support
* Kia K5 Hybrid 2020 support thanks to sunnyhaibin!
* Kia Niro Hybrid 2023 support thanks to sunnyhaibin!
* Kia Sorento 2022-23 support thanks to sunnyhaibin!
* Kia Sorento Plug-in Hybrid 2022 support thanks to sunnyhaibin!
* Toyota C-HR 2021 support thanks to eFiniLan!
* Toyota C-HR Hybrid 2022 support thanks to Korben00!
* Volkswagen Crafter and MAN TGE 2017-23 support thanks to jyoung8607!
Version 0.9.0 (2022-11-21)
========================
* New driving model
* Internal feature space information content increased tenfold during training to ~700 bits, which makes the model dramatically more accurate
* Less reliance on previous frames makes model more reactive and snappy
* Trained in new reprojective simulator
* Trained in 36 hours from scratch, compared to one week for previous releases
* Training now simulates both lateral and longitudinal behavior, which allows openpilot to slow down for turns, stop at traffic lights, and more in experimental mode
* Experimental driving mode
* End-to-end longitudinal control
* Stops for traffic lights and stop signs
* Slows down for turns
* openpilot defaults to chill mode, enable experimental mode in settings
* Driver monitoring updates
* New bigger model with added end-to-end distracted trigger
* Reduced false positives during driver calibration
* Self-tuning torque controller: learns parameters live for each car
* Torque controller used on all Toyota, Lexus, Hyundai, Kia, and Genesis models
* UI updates
* Matched speeds shown on car's dash
* Multi-language in navigation
* Improved update experience
* Border turns grey while overriding steering
* Bookmark events while driving; view them in comma connect
* New onroad visualization for experimental mode
* tools: new and improved cabana thanks to deanlee!
* Experimental longitudinal support for Volkswagen, CAN-FD Hyundai, and new GM models
* Genesis GV70 2022-23 support thanks to zunichky and sunnyhaibin!
* Hyundai Santa Cruz 2021-22 support thanks to sunnyhaibin!
* Kia Sportage 2023 support thanks to sunnyhaibin!
* Kia Sportage Hybrid 2023 support thanks to sunnyhaibin!
* Kia Stinger 2022 support thanks to sunnyhaibin!
Version 0.8.16 (2022-08-26)
========================
* New driving model
* Reduced turn cutting
* Auto-detect right hand drive setting with driver monitoring model
* Improved fan controller for comma three
* New translations
* Japanese thanks to cydia2020!
* Brazilian Portuguese thanks to AlexandreSato!
* Chevrolet Bolt EUV 2022-23 support thanks to JasonJShuler!
* Chevrolet Silverado 1500 2020-21 support thanks to JasonJShuler!
* GMC Sierra 1500 2020-21 support thanks to JasonJShuler!
* Hyundai Ioniq 5 2022 support thanks to sunnyhaibin!
* Hyundai Kona Electric 2022 support thanks to sunnyhaibin!
* Hyundai Tucson Hybrid 2022 support thanks to sunnyhaibin!
* Subaru Legacy 2020-22 support thanks to martinl!
* Subaru Outback 2020-22 support
Version 0.8.15 (2022-07-20)
@@ -60,7 +299,7 @@ Version 0.8.14 (2022-06-01)
Version 0.8.13 (2022-02-18)
========================
* Improved driver monitoring
* Retuned driver pose learner for relaxed driving positions
* Re-tuned driver pose learner for relaxed driving positions
* Added reliance on driving model to be more scene adaptive
* Matched strictness between comma two and comma three
* Improved performance in turns by compensating for the road bank angle
@@ -206,7 +445,7 @@ Version 0.8.4 (2021-05-17)
* Delay controls start until system is ready
* Fuzzy car identification, enabled with Community Features toggle
* Localizer optimized for increased precision and less CPU usage
* Retuned lateral control to be more aggressive when model is confident
* Re-tuned lateral control to be more aggressive when model is confident
* Toyota Mirai 2021 support
* Lexus NX 300 2020 support thanks to goesreallyfast!
* Volkswagen Atlas 2018-19 support thanks to jyoung8607!
@@ -371,7 +610,7 @@ Version 0.7 (2019-12-13)
* Improve GM longitudinal control: proper computations for 15Hz radar
* Move GM port, Toyota with DSU removed, comma pedal in community features; toggle switch required
* Remove upload over cellular toggle: only upload qlog and qcamera files if not on wifi
* Refactor Panda code towards ISO26262 and SIL2 compliancy
* Refactor Panda code towards ISO26262 and SIL2 compliance
* Forward stock FCW for Honda Nidec
* Volkswagen port now standard: comma Harness intercepts stock camera
@@ -462,7 +701,7 @@ Version 0.5.13 (2019-05-31)
* Reduce CPU utilization by 20% and improve stability
* Temporarily remove mapd functionalities to improve stability
* Add openpilot record-only mode for unsupported cars
* Synchronize controlsd to boardd to reduce latency
* Synchronize controlsd to pandad to reduce latency
* Remove panda support for Subaru giraffe
Version 0.5.12 (2019-05-16)
@@ -798,7 +1037,7 @@ Version 0.2.8 (2017-02-27)
Version 0.2.7 (2017-02-08)
===========================
* Better performance and pictures at night
* Fix ptr alignment issue in boardd
* Fix ptr alignment issue in pandad
* Fix brake error light, fix crash if too cold
Version 0.2.6 (2017-01-31)
@@ -830,7 +1069,7 @@ Version 0.2.2 (2017-01-10)
Version 0.2.1 (2016-12-14)
===========================
* Performance improvements, removal of more numpy
* Fix boardd process priority
* Fix pandad process priority
* Make counter timer reset on use of steering wheel
Version 0.2 (2016-12-12)
+224
View File
@@ -0,0 +1,224 @@
import os
import subprocess
import sys
import sysconfig
import platform
import shlex
import numpy as np
import SCons.Errors
SCons.Warnings.warningAsException(True)
Decider('MD5-timestamp')
SetOption('num_jobs', max(1, int(os.cpu_count()/2)))
AddOption('--kaitai', action='store_true', help='Regenerate kaitai struct parsers')
AddOption('--asan', action='store_true', help='turn on ASAN')
AddOption('--ubsan', action='store_true', help='turn on UBSan')
AddOption('--mutation', action='store_true', help='generate mutation-ready code')
AddOption('--ccflags', action='store', type='string', default='', help='pass arbitrary flags over the command line')
AddOption('--minimal',
action='store_false',
dest='extras',
default=os.path.exists(File('#.gitattributes').abspath), # minimal by default on release branch (where there's no LFS)
help='the minimum build to run openpilot. no tests, tools, etc.')
# Detect platform
arch = subprocess.check_output(["uname", "-m"], encoding='utf8').rstrip()
if platform.system() == "Darwin":
arch = "Darwin"
brew_prefix = subprocess.check_output(['brew', '--prefix'], encoding='utf8').strip()
elif arch == "aarch64" and os.path.isfile('/TICI'):
arch = "larch64"
assert arch in [
"larch64", # linux tici arm64
"aarch64", # linux pc arm64
"x86_64", # linux pc x64
"Darwin", # macOS arm64 (x86 not supported)
]
env = Environment(
ENV={
"PATH": os.environ['PATH'],
"PYTHONPATH": Dir("#").abspath + ':' + Dir(f"#third_party/acados").abspath,
"ACADOS_SOURCE_DIR": Dir("#third_party/acados").abspath,
"ACADOS_PYTHON_INTERFACE_PATH": Dir("#third_party/acados/acados_template").abspath,
"TERA_PATH": Dir("#").abspath + f"/third_party/acados/{arch}/t_renderer"
},
CC='clang',
CXX='clang++',
CCFLAGS=[
"-g",
"-fPIC",
"-O2",
"-Wunused",
"-Werror",
"-Wshadow",
"-Wno-unknown-warning-option",
"-Wno-inconsistent-missing-override",
"-Wno-c99-designator",
"-Wno-reorder-init-list",
"-Wno-vla-cxx-extension",
],
CFLAGS=["-std=gnu11"],
CXXFLAGS=["-std=c++1z"],
CPPPATH=[
"#",
"#msgq",
"#third_party",
"#third_party/json11",
"#third_party/linux/include",
"#third_party/acados/include",
"#third_party/acados/include/blasfeo/include",
"#third_party/acados/include/hpipm/include",
"#third_party/catch2/include",
"#third_party/libyuv/include",
],
LIBPATH=[
"#common",
"#msgq_repo",
"#third_party",
"#selfdrive/pandad",
"#rednose/helpers",
f"#third_party/libyuv/{arch}/lib",
f"#third_party/acados/{arch}/lib",
],
RPATH=[],
CYTHONCFILESUFFIX=".cpp",
COMPILATIONDB_USE_ABSPATH=True,
REDNOSE_ROOT="#",
tools=["default", "cython", "compilation_db", "rednose_filter"],
toolpath=["#site_scons/site_tools", "#rednose_repo/site_scons/site_tools"],
)
# Arch-specific flags and paths
if arch == "larch64":
env.Append(CPPPATH=["#third_party/opencl/include"])
env.Append(LIBPATH=[
"/usr/local/lib",
"/system/vendor/lib64",
"/usr/lib/aarch64-linux-gnu",
])
arch_flags = ["-D__TICI__", "-mcpu=cortex-a57"]
env.Append(CCFLAGS=arch_flags)
env.Append(CXXFLAGS=arch_flags)
elif arch == "Darwin":
env.Append(LIBPATH=[
f"{brew_prefix}/lib",
f"{brew_prefix}/opt/openssl@3.0/lib",
f"{brew_prefix}/opt/llvm/lib/c++",
"/System/Library/Frameworks/OpenGL.framework/Libraries",
])
env.Append(CCFLAGS=["-DGL_SILENCE_DEPRECATION"])
env.Append(CXXFLAGS=["-DGL_SILENCE_DEPRECATION"])
env.Append(CPPPATH=[
f"{brew_prefix}/include",
f"{brew_prefix}/opt/openssl@3.0/include",
])
else:
env.Append(LIBPATH=[
"/usr/lib",
"/usr/local/lib",
])
# Sanitizers and extra CCFLAGS from CLI
if GetOption('asan'):
env.Append(CCFLAGS=["-fsanitize=address", "-fno-omit-frame-pointer"])
env.Append(LINKFLAGS=["-fsanitize=address"])
elif GetOption('ubsan'):
env.Append(CCFLAGS=["-fsanitize=undefined"])
env.Append(LINKFLAGS=["-fsanitize=undefined"])
_extra_cc = shlex.split(GetOption('ccflags') or '')
if _extra_cc:
env.Append(CCFLAGS=_extra_cc)
# no --as-needed on mac linker
if arch != "Darwin":
env.Append(LINKFLAGS=["-Wl,--as-needed", "-Wl,--no-undefined"])
# progress output
node_interval = 5
node_count = 0
def progress_function(node):
global node_count
node_count += node_interval
sys.stderr.write("progress: %d\n" % node_count)
if os.environ.get('SCONS_PROGRESS'):
Progress(progress_function, interval=node_interval)
# ********** Cython build environment **********
py_include = sysconfig.get_paths()['include']
envCython = env.Clone()
envCython["CPPPATH"] += [py_include, np.get_include()]
envCython["CCFLAGS"] += ["-Wno-#warnings", "-Wno-shadow", "-Wno-deprecated-declarations"]
envCython["CCFLAGS"].remove("-Werror")
envCython["LIBS"] = []
if arch == "Darwin":
envCython["LINKFLAGS"] = env["LINKFLAGS"] + ["-bundle", "-undefined", "dynamic_lookup"]
else:
envCython["LINKFLAGS"] = ["-pthread", "-shared"]
np_version = SCons.Script.Value(np.__version__)
Export('envCython', 'np_version')
Export('env', 'arch')
# Setup cache dir
cache_dir = '/data/scons_cache' if arch == "larch64" else '/tmp/scons_cache'
CacheDir(cache_dir)
Clean(["."], cache_dir)
# ********** start building stuff **********
# Build common module
SConscript(['common/SConscript'])
Import('_common')
common = [_common, 'json11', 'zmq']
Export('common')
# Build messaging (cereal + msgq + socketmaster + their dependencies)
# Enable swaglog include in submodules
env_swaglog = env.Clone()
env_swaglog['CXXFLAGS'].append('-DSWAGLOG="\\"common/swaglog.h\\""')
SConscript(['msgq_repo/SConscript'], exports={'env': env_swaglog})
SConscript(['opendbc_repo/SConscript'], exports={'env': env_swaglog})
SConscript(['cereal/SConscript'])
Import('socketmaster', 'msgq')
messaging = [socketmaster, msgq, 'capnp', 'kj',]
Export('messaging')
# Build other submodules
SConscript(['panda/SConscript'])
SConscript(['panda_tici/SConscript'])
# Build rednose library
SConscript(['rednose/SConscript'])
# Build system services
SConscript([
'system/ubloxd/SConscript',
'system/loggerd/SConscript',
])
if arch == "larch64":
SConscript(['system/camerad/SConscript'])
# Build openpilot
SConscript(['third_party/SConscript'])
SConscript(['selfdrive/SConscript'])
if Dir('#tools/cabana/').exists() and GetOption('extras'):
SConscript(['tools/replay/SConscript'])
if arch != "larch64":
SConscript(['tools/cabana/SConscript'])
env.CompilationDatabase('compile_commands.json')
+5
View File
@@ -0,0 +1,5 @@
# Security Policy
## Reporting a Vulnerability
Suspected vulnerabilities can be reported to both `adeeb@comma.ai` and `security@comma.ai`.
+26
View File
@@ -0,0 +1,26 @@
# Sponsors 贊助者
我們誠摯感謝以下贊助者提供的硬體資源,讓專案能夠在多種平台上進行測試與驗證。
We sincerely thank the following sponsors for providing hardware resources, which enable the project to be tested and validated across multiple platforms.
---
## 贊助者列表 Sponsors
| 贊助者 Sponsor | 設備 Deices | 備註 Notes |
| -------------- | ----------- | ---------- |
| BlueGood | <ul><li>Radar Filter x 2</li><li>sDSU x1</li></ul> | - |
| Chia Chun Lee | <ul><li>C3 Quick Mount x1</li></ul> | - |
| CloudJ | <ul><li>C3X x1</li></ul> | - |
| FareWay | <ul><li>EON Quick Mount x1</li><li>C2/C3 Quick Mount x1</li></ul> | Special thanks for fixing my good old EON |
| Fred Wang | <ul><li>Oneplus 3t x1</li></ul> | - |
| Saber Huang | <ul><li>O3L x1</li></ul> | - |
| [馬威 Mr. One](https://shop61532546.taobao.com/) | <ul><li>O3 x 1</li><li>O3 (Dev) x1</li><li>O3XL x1</li><li>Red Panda x1</li><li>Panda Jungle v1 x1</li></ul> | - |
| 門文梁 | <ul><li>C1.5 x1</li></ul> | - |
---
🙏 沒有你們的支持,我們無法讓專案在這麼多硬體平台上持續成長與驗證。
Without your support, this project could not continue to grow and be validated across so many hardware platforms.
-21
View File
@@ -1,21 +0,0 @@
gen
node_modules
package-lock.json
*.tmp
*.pyc
__pycache__
.*.swp
.*.swo
*.os
*.o
*.a
test_runner
libmessaging.*
libmessaging_shared.*
services.h
.sconsign.dblite
libcereal_shared.*
.mypy_cache/
catch2/
+95
View File
@@ -0,0 +1,95 @@
# What is cereal?
cereal is the messaging system for openpilot. It uses [msgq](https://github.com/commaai/msgq) as a pub/sub backend, and [Cap'n proto](https://capnproto.org/capnp-tool.html) for serialization of the structs.
## Messaging Spec
You'll find the message types in [log.capnp](log.capnp). It uses [Cap'n proto](https://capnproto.org/capnp-tool.html) and defines one struct called `Event`.
All `Events` have a `logMonoTime` and a `valid`. Then a big union defines the packet type.
### Best Practices
- **All fields must describe quantities in SI units**, unless otherwise specified in the field name.
- In the context of the message they are in, field names should be completely unambiguous.
- All values should be easy to plot and be human-readable with minimal parsing.
### Maintaining backwards-compatibility
When making changes to the messaging spec you want to maintain backwards-compatibility, such that old logs can
be parsed with a new version of cereal. Adding structs and adding members to structs is generally safe, most other
things are not. Read more details [here](https://capnproto.org/language.html).
### Custom forks
Forks of [openpilot](https://github.com/commaai/openpilot) might want to add things to the messaging
spec, however this could conflict with future changes made in mainline cereal/openpilot. Rebasing against mainline openpilot
then means breaking backwards-compatibility with all old logs of your fork. So we added reserved events in
[custom.capnp](custom.capnp) that we will leave empty in mainline cereal/openpilot. **If you only modify those, you can ensure your
fork will remain backwards-compatible with all versions of mainline openpilot and your fork.**
An example of compatible changes:
```diff
diff --git a/cereal/custom.capnp b/cereal/custom.capnp
index 3348e859e..3365c7b98 100644
--- a/cereal/custom.capnp
+++ b/cereal/custom.capnp
@@ -10,7 +10,11 @@ $Cxx.namespace("cereal");
# DO rename the structs
# DON'T change the identifier (e.g. @0x81c2f05a394cf4af)
-struct CustomReserved0 @0x81c2f05a394cf4af {
+struct SteeringInfo @0x81c2f05a394cf4af {
+ active @0 :Bool;
+ steeringAngleDeg @1 :Float32;
+ steeringRateDeg @2 :Float32;
+ steeringAccelDeg @3 :Float32;
}
struct CustomReserved1 @0xaedffd8f31e7b55d {
diff --git a/cereal/log.capnp b/cereal/log.capnp
index 1209f3fd9..b189f58b6 100644
--- a/cereal/log.capnp
+++ b/cereal/log.capnp
@@ -2558,14 +2558,14 @@ struct Event {
# DO change the name of the field
# DON'T change anything after the "@"
- customReservedRawData0 @124 :Data;
+ rawCanData @124 :Data;
customReservedRawData1 @125 :Data;
customReservedRawData2 @126 :Data;
# DO change the name of the field and struct
# DON'T change the ID (e.g. @107)
# DON'T change which struct it points to
- customReserved0 @107 :Custom.CustomReserved0;
+ steeringInfo @107 :Custom.SteeringInfo;
customReserved1 @108 :Custom.CustomReserved1;
customReserved2 @109 :Custom.CustomReserved2;
customReserved3 @110 :Custom.CustomReserved3;
```
---
Example
---
```python
import cereal.messaging as messaging
# in subscriber
sm = messaging.SubMaster(['sensorEvents'])
while 1:
sm.update()
print(sm['sensorEvents'])
```
```python
# in publisher
pm = messaging.PubMaster(['sensorEvents'])
dat = messaging.new_message('sensorEvents', size=1)
dat.sensorEvents[0] = {"gyro": {"v": [0.1, -0.1, 0.1]}}
pm.send('sensorEvents', dat)
```
+20
View File
@@ -0,0 +1,20 @@
Import('env', 'common', 'msgq')
cereal_dir = Dir('.')
gen_dir = Dir('gen')
# Build cereal
schema_files = ['log.capnp', 'car.capnp', 'legacy.capnp', 'custom.capnp']
env.Command([f'gen/cpp/{s}.c++' for s in schema_files] + [f'gen/cpp/{s}.h' for s in schema_files],
schema_files,
f"capnpc --src-prefix={cereal_dir.path} $SOURCES -o c++:{gen_dir.path}/cpp/")
cereal = env.Library('cereal', [f'gen/cpp/{s}.c++' for s in schema_files])
# Build messaging
services_h = env.Command(['services.h'], ['services.py'], 'python3 ' + cereal_dir.path + '/services.py > $TARGET')
env.Program('messaging/bridge', ['messaging/bridge.cc', 'messaging/msgq_to_zmq.cc'], LIBS=[msgq, common, 'pthread'])
socketmaster = env.Library('socketmaster', ['messaging/socketmaster.cc'])
Export('cereal', 'socketmaster')
+6 -4
View File
@@ -1,9 +1,11 @@
# pylint: skip-file
import os
import capnp
from importlib.resources import as_file, files
CEREAL_PATH = os.path.dirname(os.path.abspath(__file__))
capnp.remove_import_hook()
log = capnp.load(os.path.join(CEREAL_PATH, "log.capnp"))
car = capnp.load(os.path.join(CEREAL_PATH, "car.capnp"))
with as_file(files("cereal")) as fspath:
CEREAL_PATH = fspath.as_posix()
log = capnp.load(os.path.join(CEREAL_PATH, "log.capnp"))
car = capnp.load(os.path.join(CEREAL_PATH, "car.capnp"))
custom = capnp.load(os.path.join(CEREAL_PATH, "custom.capnp"))
-665
View File
@@ -1,665 +0,0 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
@0x8e2af1e708af8b8d;
# ******* events causing controls state machine transition *******
struct CarEvent @0x9b1657f34caf3ad3 {
name @0 :EventName;
# event types
enable @1 :Bool;
noEntry @2 :Bool;
warning @3 :Bool; # alerts presented only when enabled or soft disabling
userDisable @4 :Bool;
softDisable @5 :Bool;
immediateDisable @6 :Bool;
preEnable @7 :Bool;
permanent @8 :Bool; # alerts presented regardless of openpilot state
override @9 :Bool;
enum EventName @0xbaa8c5d505f727de {
canError @0;
steerUnavailable @1;
brakeUnavailable @2;
wrongGear @4;
doorOpen @5;
seatbeltNotLatched @6;
espDisabled @7;
wrongCarMode @8;
steerTempUnavailable @9;
reverseGear @10;
buttonCancel @11;
buttonEnable @12;
pedalPressed @13; # exits active state
pedalPressedPreEnable @73; # added during pre-enable state for either pedal
gasPressedOverride @108; # added when user is pressing gas with no disengage on gas
cruiseDisabled @14;
speedTooLow @17;
outOfSpace @18;
overheat @19;
calibrationIncomplete @20;
calibrationInvalid @21;
controlsMismatch @22;
pcmEnable @23;
pcmDisable @24;
noTarget @25;
radarFault @26;
brakeHold @28;
parkBrake @29;
manualRestart @30;
lowSpeedLockout @31;
plannerError @32;
joystickDebug @34;
steerTempUnavailableSilent @35;
resumeRequired @36;
preDriverDistracted @37;
promptDriverDistracted @38;
driverDistracted @39;
preDriverUnresponsive @43;
promptDriverUnresponsive @44;
driverUnresponsive @45;
belowSteerSpeed @46;
lowBattery @48;
vehicleModelInvalid @50;
accFaulted @51;
sensorDataInvalid @52;
commIssue @53;
commIssueAvgFreq @109;
tooDistracted @54;
posenetInvalid @55;
soundsUnavailable @56;
preLaneChangeLeft @57;
preLaneChangeRight @58;
laneChange @59;
lowMemory @63;
stockAeb @64;
ldw @65;
carUnrecognized @66;
invalidLkasSetting @69;
speedTooHigh @70;
laneChangeBlocked @71;
relayMalfunction @72;
stockFcw @74;
startup @75;
startupNoCar @76;
startupNoControl @77;
startupMaster @78;
startupNoFw @104;
fcw @79;
steerSaturated @80;
belowEngageSpeed @84;
noGps @85;
wrongCruiseMode @87;
modeldLagging @89;
deviceFalling @90;
fanMalfunction @91;
cameraMalfunction @92;
cameraFrameRate @110;
gpsMalfunction @94;
processNotRunning @95;
dashcamMode @96;
controlsInitializing @98;
usbError @99;
roadCameraError @100;
driverCameraError @101;
wideRoadCameraError @102;
localizerMalfunction @103;
highCpuUsage @105;
cruiseMismatch @106;
lkasDisabled @107;
canBusMissing @111;
controlsdLagging @112;
#dp
speedLimitActive @113;
speedLimitValueChange @114;
radarCanErrorDEPRECATED @15;
communityFeatureDisallowedDEPRECATED @62;
radarCommIssueDEPRECATED @67;
driverMonitorLowAccDEPRECATED @68;
gasUnavailableDEPRECATED @3;
dataNeededDEPRECATED @16;
modelCommIssueDEPRECATED @27;
ipasOverrideDEPRECATED @33;
geofenceDEPRECATED @40;
driverMonitorOnDEPRECATED @41;
driverMonitorOffDEPRECATED @42;
calibrationProgressDEPRECATED @47;
invalidGiraffeHondaDEPRECATED @49;
invalidGiraffeToyotaDEPRECATED @60;
internetConnectivityNeededDEPRECATED @61;
whitePandaUnsupportedDEPRECATED @81;
commIssueWarningDEPRECATED @83;
focusRecoverActiveDEPRECATED @86;
neosUpdateRequiredDEPRECATED @88;
modelLagWarningDEPRECATED @93;
startupOneplusDEPRECATED @82;
startupFuzzyFingerprintDEPRECATED @97;
}
}
# ******* main car state @ 100hz *******
# all speeds in m/s
struct CarState {
events @13 :List(CarEvent);
# CAN health
canValid @26 :Bool; # invalid counter/checksums
canTimeout @40 :Bool; # CAN bus dropped out
# car speed
vEgo @1 :Float32; # best estimate of speed
aEgo @16 :Float32; # best estimate of acceleration
vEgoRaw @17 :Float32; # unfiltered speed from CAN sensors
vEgoCluster @44 :Float32; # best estimate of speed shown on car's instrument cluster, used for UI
yawRate @22 :Float32; # best estimate of yaw rate
standstill @18 :Bool;
wheelSpeeds @2 :WheelSpeeds;
# gas pedal, 0.0-1.0
gas @3 :Float32; # this is user pedal only
gasPressed @4 :Bool; # this is user pedal only
# brake pedal, 0.0-1.0
brake @5 :Float32; # this is user pedal only
brakePressed @6 :Bool; # this is user pedal only
parkingBrake @39 :Bool;
brakeHoldActive @38 :Bool;
# steering wheel
steeringAngleDeg @7 :Float32;
steeringAngleOffsetDeg @37 :Float32; # Offset betweens sensors in case there multiple
steeringRateDeg @15 :Float32;
steeringTorque @8 :Float32; # TODO: standardize units
steeringTorqueEps @27 :Float32; # TODO: standardize units
steeringPressed @9 :Bool; # if the user is using the steering wheel
steerFaultTemporary @35 :Bool; # temporary EPS fault
steerFaultPermanent @36 :Bool; # permanent EPS fault
stockAeb @30 :Bool;
stockFcw @31 :Bool;
espDisabled @32 :Bool;
accFaulted @42 :Bool;
# cruise state
cruiseState @10 :CruiseState;
# gear
gearShifter @14 :GearShifter;
# button presses
buttonEvents @11 :List(ButtonEvent);
leftBlinker @20 :Bool;
rightBlinker @21 :Bool;
genericToggle @23 :Bool;
# lock info
doorOpen @24 :Bool;
seatbeltUnlatched @25 :Bool;
# clutch (manual transmission only)
clutchPressed @28 :Bool;
# which packets this state came from
canMonoTimes @12: List(UInt64);
# blindspot sensors
leftBlindspot @33 :Bool; # Is there something blocking the left lane change
rightBlindspot @34 :Bool; # Is there something blocking the right lane change
fuelGauge @41 :Float32; # battery or fuel tank level from 0.0 to 1.0
charging @43 :Bool;
# dp
cruiseActualEnabled @45 :Bool;
engineRPM @46 :Float32;
distanceLines @47:UInt8;
struct WheelSpeeds {
# optional wheel speeds
fl @0 :Float32;
fr @1 :Float32;
rl @2 :Float32;
rr @3 :Float32;
}
struct CruiseState {
enabled @0 :Bool;
speed @1 :Float32;
speedCluster @6 :Float32; # Set speed as shown on instrument cluster
available @2 :Bool;
speedOffset @3 :Float32;
standstill @4 :Bool;
nonAdaptive @5 :Bool;
speedLimit @7 :Float32;
}
enum GearShifter {
unknown @0;
park @1;
drive @2;
neutral @3;
reverse @4;
sport @5;
low @6;
brake @7;
eco @8;
manumatic @9;
}
# send on change
struct ButtonEvent {
pressed @0 :Bool;
type @1 :Type;
enum Type {
unknown @0;
leftBlinker @1;
rightBlinker @2;
accelCruise @3;
decelCruise @4;
cancel @5;
altButton1 @6;
altButton2 @7;
altButton3 @8;
setCruise @9;
resumeCruise @10;
gapAdjustCruise @11;
}
}
errorsDEPRECATED @0 :List(CarEvent.EventName);
brakeLightsDEPRECATED @19 :Bool;
steeringRateLimitedDEPRECATED @29 :Bool;
}
# ******* radar state @ 20hz *******
struct RadarData @0x888ad6581cf0aacb {
errors @0 :List(Error);
points @1 :List(RadarPoint);
# which packets this state came from
canMonoTimes @2 :List(UInt64);
enum Error {
canError @0;
fault @1;
wrongConfig @2;
}
# similar to LiveTracks
# is one timestamp valid for all? I think so
struct RadarPoint {
trackId @0 :UInt64; # no trackId reuse
# these 3 are the minimum required
dRel @1 :Float32; # m from the front bumper of the car
yRel @2 :Float32; # m
vRel @3 :Float32; # m/s
# these are optional and valid if they are not NaN
aRel @4 :Float32; # m/s^2
yvRel @5 :Float32; # m/s
# some radars flag measurements VS estimates
measured @6 :Bool;
}
}
# ******* car controls @ 100hz *******
struct CarControl {
# must be true for any actuator commands to work
enabled @0 :Bool;
latActive @11: Bool;
longActive @12: Bool;
# Actuator commands as computed by controlsd
actuators @6 :Actuators;
# Any car specific rate limits or quirks applied by
# the CarController are reflected in actuatorsOutput
# and matches what is sent to the car
actuatorsOutput @10 :Actuators;
orientationNED @13 :List(Float32);
angularVelocity @14 :List(Float32);
cruiseControl @4 :CruiseControl;
hudControl @5 :HUDControl;
struct Actuators {
# range from 0.0 - 1.0
gas @0: Float32;
brake @1: Float32;
# range from -1.0 - 1.0
steer @2: Float32;
steeringAngleDeg @3: Float32;
speed @6: Float32; # m/s
accel @4: Float32; # m/s^2
longControlState @5: LongControlState;
enum LongControlState @0xe40f3a917d908282{
off @0;
pid @1;
stopping @2;
startingDEPRECATED @3;
}
}
struct CruiseControl {
cancel @0: Bool;
resume @1: Bool;
speedOverrideDEPRECATED @2: Float32;
accelOverrideDEPRECATED @3: Float32;
}
struct HUDControl {
speedVisible @0: Bool;
setSpeed @1: Float32;
lanesVisible @2: Bool;
leadVisible @3: Bool;
visualAlert @4: VisualAlert;
audibleAlert @5: AudibleAlert;
rightLaneVisible @6: Bool;
leftLaneVisible @7: Bool;
rightLaneDepart @8: Bool;
leftLaneDepart @9: Bool;
enum VisualAlert {
# these are the choices from the Honda
# map as good as you can for your car
none @0;
fcw @1;
steerRequired @2;
brakePressed @3;
wrongGear @4;
seatbeltUnbuckled @5;
speedTooHigh @6;
ldw @7;
}
enum AudibleAlert {
none @0;
engage @1;
disengage @2;
refuse @3;
warningSoft @4;
warningImmediate @5;
prompt @6;
promptRepeat @7;
promptDistracted @8;
}
}
gasDEPRECATED @1 :Float32;
brakeDEPRECATED @2 :Float32;
steeringTorqueDEPRECATED @3 :Float32;
activeDEPRECATED @7 :Bool;
rollDEPRECATED @8 :Float32;
pitchDEPRECATED @9 :Float32;
}
# ****** car param ******
struct CarParams {
carName @0 :Text;
carFingerprint @1 :Text;
fuzzyFingerprint @55 :Bool;
notCar @66 :Bool; # flag for non-car robotics platforms
enableGasInterceptor @2 :Bool;
pcmCruise @3 :Bool; # is openpilot's state tied to the PCM's cruise state?
enableDsu @5 :Bool; # driving support unit
enableApgs @6 :Bool; # advanced parking guidance system
enableBsm @56 :Bool; # blind spot monitoring
flags @64 :UInt32; # flags for car specific quirks
minEnableSpeed @7 :Float32;
minSteerSpeed @8 :Float32;
maxSteeringAngleDeg @54 :Float32;
safetyConfigs @62 :List(SafetyConfig);
alternativeExperience @65 :Int16; # panda flag for features like no disengage on gas
maxLateralAccel @68 :Float32;
steerMaxBPDEPRECATED @11 :List(Float32);
steerMaxVDEPRECATED @12 :List(Float32);
gasMaxBPDEPRECATED @13 :List(Float32);
gasMaxVDEPRECATED @14 :List(Float32);
brakeMaxBPDEPRECATED @15 :List(Float32);
brakeMaxVDEPRECATED @16 :List(Float32);
# things about the car in the manual
mass @17 :Float32; # [kg] curb weight: all fluids no cargo
wheelbase @18 :Float32; # [m] distance from rear axle to front axle
centerToFront @19 :Float32; # [m] distance from center of mass to front axle
steerRatio @20 :Float32; # [] ratio of steering wheel angle to front wheel angle
steerRatioRear @21 :Float32; # [] ratio of steering wheel angle to rear wheel angle (usually 0)
# things we can derive
rotationalInertia @22 :Float32; # [kg*m2] body rotational inertia
tireStiffnessFront @23 :Float32; # [N/rad] front tire coeff of stiff
tireStiffnessRear @24 :Float32; # [N/rad] rear tire coeff of stiff
longitudinalTuning @25 :LongitudinalPIDTuning;
lateralParams @48 :LateralParams;
lateralTuning :union {
pid @26 :LateralPIDTuning;
indi @27 :LateralINDITuning;
lqr @40 :LateralLQRTuning;
torque @67 :LateralTorqueTuning;
}
steerLimitAlert @28 :Bool;
steerLimitTimer @47 :Float32; # time before steerLimitAlert is issued
vEgoStopping @29 :Float32; # Speed at which the car goes into stopping state
vEgoStarting @59 :Float32; # Speed at which the car goes into starting state
directAccelControl @30 :Bool; # Does the car have direct accel control or just gas/brake
stoppingControl @31 :Bool; # Does the car allows full control even at lows speeds when stopping
stopAccel @60 :Float32; # Required acceleraton to keep vehicle stationary
steerControlType @34 :SteerControlType;
radarOffCan @35 :Bool; # True when radar objects aren't visible on CAN
stoppingDecelRate @52 :Float32; # m/s^2/s while trying to stop
steerActuatorDelay @36 :Float32; # Steering wheel actuator delay in seconds
longitudinalActuatorDelayLowerBound @61 :Float32; # Gas/Brake actuator delay in seconds, lower bound
longitudinalActuatorDelayUpperBound @58 :Float32; # Gas/Brake actuator delay in seconds, upper bound
openpilotLongitudinalControl @37 :Bool; # is openpilot doing the longitudinal control?
carVin @38 :Text; # VIN number queried during fingerprinting
dashcamOnly @41: Bool;
transmissionType @43 :TransmissionType;
carFw @44 :List(CarFw);
radarTimeStep @45: Float32 = 0.05; # time delta between radar updates, 20Hz is very standard
fingerprintSource @49: FingerprintSource;
networkLocation @50 :NetworkLocation; # Where Panda/C2 is integrated into the car's CAN network
wheelSpeedFactor @63 :Float32; # Multiplier on wheels speeds to computer actual speeds
struct SafetyConfig {
safetyModel @0 :SafetyModel;
safetyParam @3 :UInt16;
safetyParamDEPRECATED @1 :Int16;
safetyParam2DEPRECATED @2 :UInt32;
}
struct LateralParams {
torqueBP @0 :List(Int32);
torqueV @1 :List(Int32);
}
struct LateralPIDTuning {
kpBP @0 :List(Float32);
kpV @1 :List(Float32);
kiBP @2 :List(Float32);
kiV @3 :List(Float32);
kf @4 :Float32;
}
struct LateralTorqueTuning {
useSteeringAngle @0 :Bool;
kp @1 :Float32;
ki @2 :Float32;
friction @3 :Float32;
kf @4 :Float32;
steeringAngleDeadzoneDeg @5 :Float32;
}
struct LongitudinalPIDTuning {
kpBP @0 :List(Float32);
kpV @1 :List(Float32);
kiBP @2 :List(Float32);
kiV @3 :List(Float32);
kf @6 :Float32;
deadzoneBP @4 :List(Float32);
deadzoneV @5 :List(Float32);
}
struct LateralINDITuning {
outerLoopGainBP @4 :List(Float32);
outerLoopGainV @5 :List(Float32);
innerLoopGainBP @6 :List(Float32);
innerLoopGainV @7 :List(Float32);
timeConstantBP @8 :List(Float32);
timeConstantV @9 :List(Float32);
actuatorEffectivenessBP @10 :List(Float32);
actuatorEffectivenessV @11 :List(Float32);
outerLoopGainDEPRECATED @0 :Float32;
innerLoopGainDEPRECATED @1 :Float32;
timeConstantDEPRECATED @2 :Float32;
actuatorEffectivenessDEPRECATED @3 :Float32;
}
struct LateralLQRTuning {
scale @0 :Float32;
ki @1 :Float32;
dcGain @2 :Float32;
# State space system
a @3 :List(Float32);
b @4 :List(Float32);
c @5 :List(Float32);
k @6 :List(Float32); # LQR gain
l @7 :List(Float32); # Kalman gain
}
enum SafetyModel {
silent @0;
hondaNidec @1;
toyota @2;
elm327 @3;
gm @4;
hondaBoschGiraffe @5;
ford @6;
cadillac @7;
hyundai @8;
chrysler @9;
tesla @10;
subaru @11;
gmPassive @12;
mazda @13;
nissan @14;
volkswagen @15;
toyotaIpas @16;
allOutput @17;
gmAscm @18;
noOutput @19; # like silent but without silent CAN TXs
hondaBosch @20;
volkswagenPq @21;
subaruLegacy @22; # pre-Global platform
hyundaiLegacy @23;
hyundaiCommunity @24;
stellantis @25;
faw @26;
body @27;
hyundaiHDA2 @28;
}
enum SteerControlType {
torque @0;
angle @1;
}
enum TransmissionType {
unknown @0;
automatic @1; # Traditional auto, including DSG
manual @2; # True "stick shift" only
direct @3; # Electric vehicle or other direct drive
cvt @4;
}
struct CarFw {
ecu @0 :Ecu;
fwVersion @1 :Data;
address @2 :UInt32;
subAddress @3 :UInt8;
responseAddress @4 :UInt32;
request @5 :List(Data);
brand @6 :Text;
bus @7 :UInt8;
}
enum Ecu {
eps @0;
esp @1;
fwdRadar @2;
fwdCamera @3;
engine @4;
unknown @5;
transmission @8; # Transmission Control Module
srs @9; # airbag
gateway @10; # can gateway
hud @11; # heads up display
combinationMeter @12; # instrument cluster
# Toyota only
dsu @6;
apgs @7;
# Honda only
vsa @13; # Vehicle Stability Assist
programmedFuelInjection @14;
electricBrakeBooster @15;
shiftByWire @16;
debug @17;
}
enum FingerprintSource {
can @0;
fw @1;
fixed @2;
}
enum NetworkLocation {
fwdCamera @0; # Standard/default integration at LKAS camera
gateway @1; # Integration at vehicle's CAN gateway
}
enableCameraDEPRECATED @4 :Bool;
steerRateCostDEPRECATED @33 :Float32;
isPandaBlackDEPRECATED @39 :Bool;
hasStockCameraDEPRECATED @57 :Bool;
safetyParamDEPRECATED @10 :Int16;
safetyModelDEPRECATED @9 :SafetyModel;
safetyModelPassiveDEPRECATED @42 :SafetyModel = silent;
minSpeedCanDEPRECATED @51 :Float32;
startAccelDEPRECATED @32 :Float32;
communityFeatureDEPRECATED @46: Bool;
startingAccelRateDEPRECATED @53 :Float32;
}
+1
View File
@@ -0,0 +1 @@
../opendbc_repo/opendbc/car/car.capnp
+74
View File
@@ -0,0 +1,74 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
@0xb526ba661d550a59;
# custom.capnp: a home for empty structs reserved for custom forks
# These structs are guaranteed to remain reserved and empty in mainline
# cereal, so use these if you want custom events in your fork.
# DO rename the structs
# DON'T change the identifier (e.g. @0x81c2f05a394cf4af)
struct DpControlsState @0x81c2f05a394cf4af {
alkaActive @0 :Bool;
}
struct ModelExt @0xaedffd8f31e7b55d {
leftEdgeDetected @0 :Bool;
rightEdgeDetected @1 :Bool;
}
struct CustomReserved2 @0xf35cc4560bbf6ec2 {
}
struct CustomReserved3 @0xda96579883444c35 {
}
struct CustomReserved4 @0x80ae746ee2596b11 {
}
struct CustomReserved5 @0xa5cd762cd951a455 {
}
struct CustomReserved6 @0xf98d843bfd7004a3 {
}
struct CustomReserved7 @0xb86e6369214c01c8 {
}
struct CustomReserved8 @0xf416ec09499d9d19 {
}
struct CustomReserved9 @0xa1680744031fdb2d {
}
struct CustomReserved10 @0xcb9fd56c7057593a {
}
struct CustomReserved11 @0xc2243c65e0340384 {
}
struct CustomReserved12 @0x9ccdc8676701b412 {
}
struct CustomReserved13 @0xcd96dafb67a082d0 {
}
struct CustomReserved14 @0xb057204d7deadf3f {
}
struct CustomReserved15 @0xbd443b539493bc68 {
}
struct CustomReserved16 @0xfc6241ed8877b611 {
}
struct CustomReserved17 @0xa30662f84033036c {
}
struct CustomReserved18 @0xc86a3d38d13eb3ef {
}
struct CustomReserved19 @0xa4f1eb3323f5f582 {
}
-28
View File
@@ -1,28 +0,0 @@
using Cxx = import "./include/c++.capnp";
$Cxx.namespace("cereal");
@0xbfa7e645486440c7;
# dp
struct DragonConf {
dpAtl @0 :UInt8;
dpLocale @1 :Text;
dpLateralMode @2 :UInt8;
dpLcMinMph @3 :UInt8;
dpLcAutoMinMph @4 :UInt8;
dpLcAutoDelay @5 :Float32;
dpIpAddr @6 :Text;
dpUiTop @7 :Bool;
dpUiSide @8 :Bool;
dpUiVolume @9 :Int8;
dpUiBrightness @10 :UInt8;
dpUiDisplayMode @11 :UInt8;
dpToyotaSng @12 :Bool;
dpAccelProfileCtrl @13 :Bool;
dpAccelProfile @14 :UInt8;
dpToyotaCruiseOverride @15 :Bool;
dpToyotaCruiseOverrideSpeed @16 :UInt8;
dpUseLanelines @17 :Bool;
dpMapd @18 :Bool;
dpMazdaSteerAlert @19 :Bool;
}
+2678 -1683
View File
File diff suppressed because it is too large Load Diff
+1512 -484
View File
File diff suppressed because it is too large Load Diff
+832
View File
@@ -0,0 +1,832 @@
// Generated by Cap'n Proto compiler, DO NOT EDIT
// source: custom.capnp
#include "custom.capnp.h"
namespace capnp {
namespace schemas {
static const ::capnp::_::AlignedData<34> b_81c2f05a394cf4af = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
175, 244, 76, 57, 90, 240, 194, 129,
13, 0, 0, 0, 1, 0, 1, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
29, 0, 0, 0, 63, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 68, 112, 67,
111, 110, 116, 114, 111, 108, 115, 83,
116, 97, 116, 101, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
4, 0, 0, 0, 3, 0, 4, 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,
13, 0, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
12, 0, 0, 0, 3, 0, 1, 0,
24, 0, 0, 0, 2, 0, 1, 0,
97, 108, 107, 97, 65, 99, 116, 105,
118, 101, 0, 0, 0, 0, 0, 0,
1, 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,
1, 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_81c2f05a394cf4af = b_81c2f05a394cf4af.words;
#if !CAPNP_LITE
static const uint16_t m_81c2f05a394cf4af[] = {0};
static const uint16_t i_81c2f05a394cf4af[] = {0};
const ::capnp::_::RawSchema s_81c2f05a394cf4af = {
0x81c2f05a394cf4af, b_81c2f05a394cf4af.words, 34, nullptr, m_81c2f05a394cf4af,
0, 1, i_81c2f05a394cf4af, nullptr, nullptr, { &s_81c2f05a394cf4af, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<51> b_aedffd8f31e7b55d = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
93, 181, 231, 49, 143, 253, 223, 174,
13, 0, 0, 0, 1, 0, 1, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 178, 0, 0, 0,
29, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 119, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 77, 111, 100,
101, 108, 69, 120, 116, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
8, 0, 0, 0, 3, 0, 4, 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,
41, 0, 0, 0, 138, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
44, 0, 0, 0, 3, 0, 1, 0,
56, 0, 0, 0, 2, 0, 1, 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,
53, 0, 0, 0, 146, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
56, 0, 0, 0, 3, 0, 1, 0,
68, 0, 0, 0, 2, 0, 1, 0,
108, 101, 102, 116, 69, 100, 103, 101,
68, 101, 116, 101, 99, 116, 101, 100,
0, 0, 0, 0, 0, 0, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
114, 105, 103, 104, 116, 69, 100, 103,
101, 68, 101, 116, 101, 99, 116, 101,
100, 0, 0, 0, 0, 0, 0, 0,
1, 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,
1, 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_aedffd8f31e7b55d = b_aedffd8f31e7b55d.words;
#if !CAPNP_LITE
static const uint16_t m_aedffd8f31e7b55d[] = {0, 1};
static const uint16_t i_aedffd8f31e7b55d[] = {0, 1};
const ::capnp::_::RawSchema s_aedffd8f31e7b55d = {
0xaedffd8f31e7b55d, b_aedffd8f31e7b55d.words, 51, nullptr, m_aedffd8f31e7b55d,
0, 2, i_aedffd8f31e7b55d, nullptr, nullptr, { &s_aedffd8f31e7b55d, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_f35cc4560bbf6ec2 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
194, 110, 191, 11, 86, 196, 92, 243,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 50, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_f35cc4560bbf6ec2 = b_f35cc4560bbf6ec2.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_f35cc4560bbf6ec2 = {
0xf35cc4560bbf6ec2, b_f35cc4560bbf6ec2.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_f35cc4560bbf6ec2, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_da96579883444c35 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
53, 76, 68, 131, 152, 87, 150, 218,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 51, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_da96579883444c35 = b_da96579883444c35.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_da96579883444c35 = {
0xda96579883444c35, b_da96579883444c35.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_da96579883444c35, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_80ae746ee2596b11 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
17, 107, 89, 226, 110, 116, 174, 128,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 52, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_80ae746ee2596b11 = b_80ae746ee2596b11.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_80ae746ee2596b11 = {
0x80ae746ee2596b11, b_80ae746ee2596b11.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_80ae746ee2596b11, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_a5cd762cd951a455 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
85, 164, 81, 217, 44, 118, 205, 165,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 53, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_a5cd762cd951a455 = b_a5cd762cd951a455.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_a5cd762cd951a455 = {
0xa5cd762cd951a455, b_a5cd762cd951a455.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_a5cd762cd951a455, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_f98d843bfd7004a3 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
163, 4, 112, 253, 59, 132, 141, 249,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 54, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_f98d843bfd7004a3 = b_f98d843bfd7004a3.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_f98d843bfd7004a3 = {
0xf98d843bfd7004a3, b_f98d843bfd7004a3.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_f98d843bfd7004a3, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_b86e6369214c01c8 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
200, 1, 76, 33, 105, 99, 110, 184,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 55, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_b86e6369214c01c8 = b_b86e6369214c01c8.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_b86e6369214c01c8 = {
0xb86e6369214c01c8, b_b86e6369214c01c8.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_b86e6369214c01c8, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_f416ec09499d9d19 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
25, 157, 157, 73, 9, 236, 22, 244,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 56, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_f416ec09499d9d19 = b_f416ec09499d9d19.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_f416ec09499d9d19 = {
0xf416ec09499d9d19, b_f416ec09499d9d19.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_f416ec09499d9d19, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_a1680744031fdb2d = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
45, 219, 31, 3, 68, 7, 104, 161,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 234, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 57, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_a1680744031fdb2d = b_a1680744031fdb2d.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_a1680744031fdb2d = {
0xa1680744031fdb2d, b_a1680744031fdb2d.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_a1680744031fdb2d, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_cb9fd56c7057593a = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
58, 89, 87, 112, 108, 213, 159, 203,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 48, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_cb9fd56c7057593a = b_cb9fd56c7057593a.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_cb9fd56c7057593a = {
0xcb9fd56c7057593a, b_cb9fd56c7057593a.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_cb9fd56c7057593a, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_c2243c65e0340384 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
132, 3, 52, 224, 101, 60, 36, 194,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 49, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_c2243c65e0340384 = b_c2243c65e0340384.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_c2243c65e0340384 = {
0xc2243c65e0340384, b_c2243c65e0340384.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_c2243c65e0340384, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_9ccdc8676701b412 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
18, 180, 1, 103, 103, 200, 205, 156,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 50, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_9ccdc8676701b412 = b_9ccdc8676701b412.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_9ccdc8676701b412 = {
0x9ccdc8676701b412, b_9ccdc8676701b412.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_9ccdc8676701b412, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_cd96dafb67a082d0 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
208, 130, 160, 103, 251, 218, 150, 205,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 51, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_cd96dafb67a082d0 = b_cd96dafb67a082d0.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_cd96dafb67a082d0 = {
0xcd96dafb67a082d0, b_cd96dafb67a082d0.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_cd96dafb67a082d0, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_b057204d7deadf3f = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
63, 223, 234, 125, 77, 32, 87, 176,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 52, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_b057204d7deadf3f = b_b057204d7deadf3f.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_b057204d7deadf3f = {
0xb057204d7deadf3f, b_b057204d7deadf3f.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_b057204d7deadf3f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_bd443b539493bc68 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
104, 188, 147, 148, 83, 59, 68, 189,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 53, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_bd443b539493bc68 = b_bd443b539493bc68.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_bd443b539493bc68 = {
0xbd443b539493bc68, b_bd443b539493bc68.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_bd443b539493bc68, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_fc6241ed8877b611 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
17, 182, 119, 136, 237, 65, 98, 252,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 54, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_fc6241ed8877b611 = b_fc6241ed8877b611.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_fc6241ed8877b611 = {
0xfc6241ed8877b611, b_fc6241ed8877b611.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_fc6241ed8877b611, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_a30662f84033036c = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
108, 3, 51, 64, 248, 98, 6, 163,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 55, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_a30662f84033036c = b_a30662f84033036c.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_a30662f84033036c = {
0xa30662f84033036c, b_a30662f84033036c.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_a30662f84033036c, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_c86a3d38d13eb3ef = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
239, 179, 62, 209, 56, 61, 106, 200,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 56, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_c86a3d38d13eb3ef = b_c86a3d38d13eb3ef.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_c86a3d38d13eb3ef = {
0xc86a3d38d13eb3ef, b_c86a3d38d13eb3ef.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_c86a3d38d13eb3ef, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<17> b_a4f1eb3323f5f582 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
130, 245, 245, 35, 51, 235, 241, 164,
13, 0, 0, 0, 1, 0, 0, 0,
89, 10, 85, 29, 102, 186, 38, 181,
0, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 242, 0, 0, 0,
33, 0, 0, 0, 7, 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,
99, 117, 115, 116, 111, 109, 46, 99,
97, 112, 110, 112, 58, 67, 117, 115,
116, 111, 109, 82, 101, 115, 101, 114,
118, 101, 100, 49, 57, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0, }
};
::capnp::word const* const bp_a4f1eb3323f5f582 = b_a4f1eb3323f5f582.words;
#if !CAPNP_LITE
const ::capnp::_::RawSchema s_a4f1eb3323f5f582 = {
0xa4f1eb3323f5f582, b_a4f1eb3323f5f582.words, 17, nullptr, nullptr,
0, 0, nullptr, nullptr, nullptr, { &s_a4f1eb3323f5f582, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
} // namespace schemas
} // namespace capnp
// =======================================================================================
namespace cereal {
// DpControlsState
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t DpControlsState::_capnpPrivate::dataWordSize;
constexpr uint16_t DpControlsState::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind DpControlsState::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* DpControlsState::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelExt
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelExt::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelExt::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelExt::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelExt::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved2
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved2::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved2::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved2::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved2::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved3
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved3::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved3::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved3::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved3::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved4
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved4::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved4::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved4::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved4::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved5
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved5::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved5::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved5::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved5::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved6
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved6::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved6::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved6::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved6::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved7
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved7::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved7::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved7::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved7::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved8
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved8::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved8::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved8::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved8::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved9
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved9::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved9::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved9::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved9::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved10
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved10::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved10::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved10::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved10::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved11
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved11::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved11::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved11::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved11::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved12
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved12::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved12::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved12::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved12::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved13
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved13::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved13::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved13::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved13::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved14
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved14::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved14::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved14::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved14::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved15
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved15::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved15::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved15::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved15::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved16
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved16::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved16::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved16::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved16::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved17
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved17::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved17::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved17::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved17::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved18
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved18::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved18::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved18::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved18::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CustomReserved19
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CustomReserved19::_capnpPrivate::dataWordSize;
constexpr uint16_t CustomReserved19::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CustomReserved19::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CustomReserved19::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
} // namespace
File diff suppressed because it is too large Load Diff
-375
View File
@@ -1,375 +0,0 @@
// Generated by Cap'n Proto compiler, DO NOT EDIT
// source: dp.capnp
#include "dp.capnp.h"
namespace capnp {
namespace schemas {
static const ::capnp::_::AlignedData<339> b_84e5d575c3177d12 = {
{ 0, 0, 0, 0, 5, 0, 6, 0,
18, 125, 23, 195, 117, 213, 229, 132,
9, 0, 0, 0, 1, 0, 2, 0,
199, 64, 100, 72, 69, 230, 167, 191,
2, 0, 7, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
21, 0, 0, 0, 162, 0, 0, 0,
29, 0, 0, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
25, 0, 0, 0, 103, 4, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 46, 99, 97, 112, 110, 112,
58, 68, 114, 97, 103, 111, 110, 67,
111, 110, 102, 0, 0, 0, 0, 0,
0, 0, 0, 0, 1, 0, 1, 0,
80, 0, 0, 0, 3, 0, 4, 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,
33, 2, 0, 0, 50, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
28, 2, 0, 0, 3, 0, 1, 0,
40, 2, 0, 0, 2, 0, 1, 0,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
37, 2, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
36, 2, 0, 0, 3, 0, 1, 0,
48, 2, 0, 0, 2, 0, 1, 0,
2, 0, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 2, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
45, 2, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
44, 2, 0, 0, 3, 0, 1, 0,
56, 2, 0, 0, 2, 0, 1, 0,
3, 0, 0, 0, 2, 0, 0, 0,
0, 0, 1, 0, 3, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
53, 2, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
52, 2, 0, 0, 3, 0, 1, 0,
64, 2, 0, 0, 2, 0, 1, 0,
4, 0, 0, 0, 3, 0, 0, 0,
0, 0, 1, 0, 4, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
61, 2, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
60, 2, 0, 0, 3, 0, 1, 0,
72, 2, 0, 0, 2, 0, 1, 0,
5, 0, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 5, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
69, 2, 0, 0, 114, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
68, 2, 0, 0, 3, 0, 1, 0,
80, 2, 0, 0, 2, 0, 1, 0,
6, 0, 0, 0, 1, 0, 0, 0,
0, 0, 1, 0, 6, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
77, 2, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
76, 2, 0, 0, 3, 0, 1, 0,
88, 2, 0, 0, 2, 0, 1, 0,
7, 0, 0, 0, 64, 0, 0, 0,
0, 0, 1, 0, 7, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
85, 2, 0, 0, 66, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
80, 2, 0, 0, 3, 0, 1, 0,
92, 2, 0, 0, 2, 0, 1, 0,
8, 0, 0, 0, 65, 0, 0, 0,
0, 0, 1, 0, 8, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
89, 2, 0, 0, 74, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
88, 2, 0, 0, 3, 0, 1, 0,
100, 2, 0, 0, 2, 0, 1, 0,
9, 0, 0, 0, 9, 0, 0, 0,
0, 0, 1, 0, 9, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
97, 2, 0, 0, 90, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
96, 2, 0, 0, 3, 0, 1, 0,
108, 2, 0, 0, 2, 0, 1, 0,
10, 0, 0, 0, 10, 0, 0, 0,
0, 0, 1, 0, 10, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
105, 2, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
104, 2, 0, 0, 3, 0, 1, 0,
116, 2, 0, 0, 2, 0, 1, 0,
11, 0, 0, 0, 11, 0, 0, 0,
0, 0, 1, 0, 11, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
113, 2, 0, 0, 130, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
112, 2, 0, 0, 3, 0, 1, 0,
124, 2, 0, 0, 2, 0, 1, 0,
12, 0, 0, 0, 66, 0, 0, 0,
0, 0, 1, 0, 12, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
121, 2, 0, 0, 98, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
120, 2, 0, 0, 3, 0, 1, 0,
132, 2, 0, 0, 2, 0, 1, 0,
13, 0, 0, 0, 67, 0, 0, 0,
0, 0, 1, 0, 13, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
129, 2, 0, 0, 154, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
132, 2, 0, 0, 3, 0, 1, 0,
144, 2, 0, 0, 2, 0, 1, 0,
14, 0, 0, 0, 12, 0, 0, 0,
0, 0, 1, 0, 14, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
141, 2, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
140, 2, 0, 0, 3, 0, 1, 0,
152, 2, 0, 0, 2, 0, 1, 0,
15, 0, 0, 0, 68, 0, 0, 0,
0, 0, 1, 0, 15, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
149, 2, 0, 0, 186, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
152, 2, 0, 0, 3, 0, 1, 0,
164, 2, 0, 0, 2, 0, 1, 0,
16, 0, 0, 0, 13, 0, 0, 0,
0, 0, 1, 0, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
161, 2, 0, 0, 226, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
168, 2, 0, 0, 3, 0, 1, 0,
180, 2, 0, 0, 2, 0, 1, 0,
17, 0, 0, 0, 69, 0, 0, 0,
0, 0, 1, 0, 17, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
177, 2, 0, 0, 122, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
176, 2, 0, 0, 3, 0, 1, 0,
188, 2, 0, 0, 2, 0, 1, 0,
18, 0, 0, 0, 70, 0, 0, 0,
0, 0, 1, 0, 18, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
185, 2, 0, 0, 58, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
180, 2, 0, 0, 3, 0, 1, 0,
192, 2, 0, 0, 2, 0, 1, 0,
19, 0, 0, 0, 71, 0, 0, 0,
0, 0, 1, 0, 19, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
189, 2, 0, 0, 146, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
192, 2, 0, 0, 3, 0, 1, 0,
204, 2, 0, 0, 2, 0, 1, 0,
100, 112, 65, 116, 108, 0, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 76, 111, 99, 97, 108, 101,
0, 0, 0, 0, 0, 0, 0, 0,
12, 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,
12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 76, 97, 116, 101, 114, 97,
108, 77, 111, 100, 101, 0, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 76, 99, 77, 105, 110, 77,
112, 104, 0, 0, 0, 0, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 76, 99, 65, 117, 116, 111,
77, 105, 110, 77, 112, 104, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 76, 99, 65, 117, 116, 111,
68, 101, 108, 97, 121, 0, 0, 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,
10, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 73, 112, 65, 100, 100, 114,
0, 0, 0, 0, 0, 0, 0, 0,
12, 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,
12, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 105, 84, 111, 112, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 105, 83, 105, 100, 101,
0, 0, 0, 0, 0, 0, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 105, 86, 111, 108, 117,
109, 101, 0, 0, 0, 0, 0, 0,
2, 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, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 105, 66, 114, 105, 103,
104, 116, 110, 101, 115, 115, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 105, 68, 105, 115, 112,
108, 97, 121, 77, 111, 100, 101, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 84, 111, 121, 111, 116, 97,
83, 110, 103, 0, 0, 0, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 65, 99, 99, 101, 108, 80,
114, 111, 102, 105, 108, 101, 67, 116,
114, 108, 0, 0, 0, 0, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 65, 99, 99, 101, 108, 80,
114, 111, 102, 105, 108, 101, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 84, 111, 121, 111, 116, 97,
67, 114, 117, 105, 115, 101, 79, 118,
101, 114, 114, 105, 100, 101, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 84, 111, 121, 111, 116, 97,
67, 114, 117, 105, 115, 101, 79, 118,
101, 114, 114, 105, 100, 101, 83, 112,
101, 101, 100, 0, 0, 0, 0, 0,
6, 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,
6, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 85, 115, 101, 76, 97, 110,
101, 108, 105, 110, 101, 115, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 77, 97, 112, 100, 0, 0,
1, 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,
1, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
100, 112, 77, 97, 122, 100, 97, 83,
116, 101, 101, 114, 65, 108, 101, 114,
116, 0, 0, 0, 0, 0, 0, 0,
1, 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,
1, 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_84e5d575c3177d12 = b_84e5d575c3177d12.words;
#if !CAPNP_LITE
static const uint16_t m_84e5d575c3177d12[] = {14, 13, 0, 6, 2, 5, 4, 3, 1, 18, 19, 15, 16, 12, 10, 11, 8, 7, 9, 17};
static const uint16_t i_84e5d575c3177d12[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
const ::capnp::_::RawSchema s_84e5d575c3177d12 = {
0x84e5d575c3177d12, b_84e5d575c3177d12.words, 339, nullptr, m_84e5d575c3177d12,
0, 20, i_84e5d575c3177d12, nullptr, nullptr, { &s_84e5d575c3177d12, nullptr, nullptr, 0, 0, nullptr }
};
#endif // !CAPNP_LITE
} // namespace schemas
} // namespace capnp
// =======================================================================================
namespace cereal {
// DragonConf
constexpr uint16_t DragonConf::_capnpPrivate::dataWordSize;
constexpr uint16_t DragonConf::_capnpPrivate::pointerCount;
#if !CAPNP_LITE
constexpr ::capnp::Kind DragonConf::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* DragonConf::_capnpPrivate::schema;
#endif // !CAPNP_LITE
} // namespace
-545
View File
@@ -1,545 +0,0 @@
// Generated by Cap'n Proto compiler, DO NOT EDIT
// source: dp.capnp
#pragma once
#include <capnp/generated-header-support.h>
#include <kj/windows-sanity.h>
#if CAPNP_VERSION != 8000
#error "Version mismatch between generated code and library headers. You must use the same version of the Cap'n Proto compiler and library."
#endif
namespace capnp {
namespace schemas {
CAPNP_DECLARE_SCHEMA(84e5d575c3177d12);
} // namespace schemas
} // namespace capnp
namespace cereal {
struct DragonConf {
DragonConf() = delete;
class Reader;
class Builder;
class Pipeline;
struct _capnpPrivate {
CAPNP_DECLARE_STRUCT_HEADER(84e5d575c3177d12, 2, 2)
#if !CAPNP_LITE
static constexpr ::capnp::_::RawBrandedSchema const* brand() { return &schema->defaultBrand; }
#endif // !CAPNP_LITE
};
};
// =======================================================================================
class DragonConf::Reader {
public:
typedef DragonConf Reads;
Reader() = default;
inline explicit Reader(::capnp::_::StructReader base): _reader(base) {}
inline ::capnp::MessageSize totalSize() const {
return _reader.totalSize().asPublic();
}
#if !CAPNP_LITE
inline ::kj::StringTree toString() const {
return ::capnp::_::structString(_reader, *_capnpPrivate::brand());
}
#endif // !CAPNP_LITE
inline ::uint8_t getDpAtl() const;
inline bool hasDpLocale() const;
inline ::capnp::Text::Reader getDpLocale() const;
inline ::uint8_t getDpLateralMode() const;
inline ::uint8_t getDpLcMinMph() const;
inline ::uint8_t getDpLcAutoMinMph() const;
inline float getDpLcAutoDelay() const;
inline bool hasDpIpAddr() const;
inline ::capnp::Text::Reader getDpIpAddr() const;
inline bool getDpUiTop() const;
inline bool getDpUiSide() const;
inline ::int8_t getDpUiVolume() const;
inline ::uint8_t getDpUiBrightness() const;
inline ::uint8_t getDpUiDisplayMode() const;
inline bool getDpToyotaSng() const;
inline bool getDpAccelProfileCtrl() const;
inline ::uint8_t getDpAccelProfile() const;
inline bool getDpToyotaCruiseOverride() const;
inline ::uint8_t getDpToyotaCruiseOverrideSpeed() const;
inline bool getDpUseLanelines() const;
inline bool getDpMapd() const;
inline bool getDpMazdaSteerAlert() const;
private:
::capnp::_::StructReader _reader;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
template <typename, ::capnp::Kind>
friend struct ::capnp::_::PointerHelpers;
template <typename, ::capnp::Kind>
friend struct ::capnp::List;
friend class ::capnp::MessageBuilder;
friend class ::capnp::Orphanage;
};
class DragonConf::Builder {
public:
typedef DragonConf Builds;
Builder() = delete; // Deleted to discourage incorrect usage.
// You can explicitly initialize to nullptr instead.
inline Builder(decltype(nullptr)) {}
inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}
inline operator Reader() const { return Reader(_builder.asReader()); }
inline Reader asReader() const { return *this; }
inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); }
#if !CAPNP_LITE
inline ::kj::StringTree toString() const { return asReader().toString(); }
#endif // !CAPNP_LITE
inline ::uint8_t getDpAtl();
inline void setDpAtl( ::uint8_t value);
inline bool hasDpLocale();
inline ::capnp::Text::Builder getDpLocale();
inline void setDpLocale( ::capnp::Text::Reader value);
inline ::capnp::Text::Builder initDpLocale(unsigned int size);
inline void adoptDpLocale(::capnp::Orphan< ::capnp::Text>&& value);
inline ::capnp::Orphan< ::capnp::Text> disownDpLocale();
inline ::uint8_t getDpLateralMode();
inline void setDpLateralMode( ::uint8_t value);
inline ::uint8_t getDpLcMinMph();
inline void setDpLcMinMph( ::uint8_t value);
inline ::uint8_t getDpLcAutoMinMph();
inline void setDpLcAutoMinMph( ::uint8_t value);
inline float getDpLcAutoDelay();
inline void setDpLcAutoDelay(float value);
inline bool hasDpIpAddr();
inline ::capnp::Text::Builder getDpIpAddr();
inline void setDpIpAddr( ::capnp::Text::Reader value);
inline ::capnp::Text::Builder initDpIpAddr(unsigned int size);
inline void adoptDpIpAddr(::capnp::Orphan< ::capnp::Text>&& value);
inline ::capnp::Orphan< ::capnp::Text> disownDpIpAddr();
inline bool getDpUiTop();
inline void setDpUiTop(bool value);
inline bool getDpUiSide();
inline void setDpUiSide(bool value);
inline ::int8_t getDpUiVolume();
inline void setDpUiVolume( ::int8_t value);
inline ::uint8_t getDpUiBrightness();
inline void setDpUiBrightness( ::uint8_t value);
inline ::uint8_t getDpUiDisplayMode();
inline void setDpUiDisplayMode( ::uint8_t value);
inline bool getDpToyotaSng();
inline void setDpToyotaSng(bool value);
inline bool getDpAccelProfileCtrl();
inline void setDpAccelProfileCtrl(bool value);
inline ::uint8_t getDpAccelProfile();
inline void setDpAccelProfile( ::uint8_t value);
inline bool getDpToyotaCruiseOverride();
inline void setDpToyotaCruiseOverride(bool value);
inline ::uint8_t getDpToyotaCruiseOverrideSpeed();
inline void setDpToyotaCruiseOverrideSpeed( ::uint8_t value);
inline bool getDpUseLanelines();
inline void setDpUseLanelines(bool value);
inline bool getDpMapd();
inline void setDpMapd(bool value);
inline bool getDpMazdaSteerAlert();
inline void setDpMazdaSteerAlert(bool value);
private:
::capnp::_::StructBuilder _builder;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
friend class ::capnp::Orphanage;
template <typename, ::capnp::Kind>
friend struct ::capnp::_::PointerHelpers;
};
#if !CAPNP_LITE
class DragonConf::Pipeline {
public:
typedef DragonConf Pipelines;
inline Pipeline(decltype(nullptr)): _typeless(nullptr) {}
inline explicit Pipeline(::capnp::AnyPointer::Pipeline&& typeless)
: _typeless(kj::mv(typeless)) {}
private:
::capnp::AnyPointer::Pipeline _typeless;
friend class ::capnp::PipelineHook;
template <typename, ::capnp::Kind>
friend struct ::capnp::ToDynamic_;
};
#endif // !CAPNP_LITE
// =======================================================================================
inline ::uint8_t DragonConf::Reader::getDpAtl() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpAtl() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpAtl( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<0>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::hasDpLocale() const {
return !_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline bool DragonConf::Builder::hasDpLocale() {
return !_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS).isNull();
}
inline ::capnp::Text::Reader DragonConf::Reader::getDpLocale() const {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline ::capnp::Text::Builder DragonConf::Builder::getDpLocale() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline void DragonConf::Builder::setDpLocale( ::capnp::Text::Reader value) {
::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), value);
}
inline ::capnp::Text::Builder DragonConf::Builder::initDpLocale(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), size);
}
inline void DragonConf::Builder::adoptDpLocale(
::capnp::Orphan< ::capnp::Text>&& value) {
::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::Text> DragonConf::Builder::disownDpLocale() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField(
::capnp::bounded<0>() * ::capnp::POINTERS));
}
inline ::uint8_t DragonConf::Reader::getDpLateralMode() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpLateralMode() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpLateralMode( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<1>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpLcMinMph() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpLcMinMph() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpLcMinMph( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<2>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpLcAutoMinMph() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<3>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpLcAutoMinMph() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<3>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpLcAutoMinMph( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<3>() * ::capnp::ELEMENTS, value);
}
inline float DragonConf::Reader::getDpLcAutoDelay() const {
return _reader.getDataField<float>(
::capnp::bounded<1>() * ::capnp::ELEMENTS);
}
inline float DragonConf::Builder::getDpLcAutoDelay() {
return _builder.getDataField<float>(
::capnp::bounded<1>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpLcAutoDelay(float value) {
_builder.setDataField<float>(
::capnp::bounded<1>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::hasDpIpAddr() const {
return !_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline bool DragonConf::Builder::hasDpIpAddr() {
return !_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS).isNull();
}
inline ::capnp::Text::Reader DragonConf::Reader::getDpIpAddr() const {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_reader.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline ::capnp::Text::Builder DragonConf::Builder::getDpIpAddr() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::get(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline void DragonConf::Builder::setDpIpAddr( ::capnp::Text::Reader value) {
::capnp::_::PointerHelpers< ::capnp::Text>::set(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), value);
}
inline ::capnp::Text::Builder DragonConf::Builder::initDpIpAddr(unsigned int size) {
return ::capnp::_::PointerHelpers< ::capnp::Text>::init(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), size);
}
inline void DragonConf::Builder::adoptDpIpAddr(
::capnp::Orphan< ::capnp::Text>&& value) {
::capnp::_::PointerHelpers< ::capnp::Text>::adopt(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS), kj::mv(value));
}
inline ::capnp::Orphan< ::capnp::Text> DragonConf::Builder::disownDpIpAddr() {
return ::capnp::_::PointerHelpers< ::capnp::Text>::disown(_builder.getPointerField(
::capnp::bounded<1>() * ::capnp::POINTERS));
}
inline bool DragonConf::Reader::getDpUiTop() const {
return _reader.getDataField<bool>(
::capnp::bounded<64>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpUiTop() {
return _builder.getDataField<bool>(
::capnp::bounded<64>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUiTop(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<64>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpUiSide() const {
return _reader.getDataField<bool>(
::capnp::bounded<65>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpUiSide() {
return _builder.getDataField<bool>(
::capnp::bounded<65>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUiSide(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<65>() * ::capnp::ELEMENTS, value);
}
inline ::int8_t DragonConf::Reader::getDpUiVolume() const {
return _reader.getDataField< ::int8_t>(
::capnp::bounded<9>() * ::capnp::ELEMENTS);
}
inline ::int8_t DragonConf::Builder::getDpUiVolume() {
return _builder.getDataField< ::int8_t>(
::capnp::bounded<9>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUiVolume( ::int8_t value) {
_builder.setDataField< ::int8_t>(
::capnp::bounded<9>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpUiBrightness() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<10>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpUiBrightness() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<10>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUiBrightness( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<10>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpUiDisplayMode() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<11>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpUiDisplayMode() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<11>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUiDisplayMode( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<11>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpToyotaSng() const {
return _reader.getDataField<bool>(
::capnp::bounded<66>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpToyotaSng() {
return _builder.getDataField<bool>(
::capnp::bounded<66>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpToyotaSng(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<66>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpAccelProfileCtrl() const {
return _reader.getDataField<bool>(
::capnp::bounded<67>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpAccelProfileCtrl() {
return _builder.getDataField<bool>(
::capnp::bounded<67>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpAccelProfileCtrl(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<67>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpAccelProfile() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<12>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpAccelProfile() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<12>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpAccelProfile( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<12>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpToyotaCruiseOverride() const {
return _reader.getDataField<bool>(
::capnp::bounded<68>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpToyotaCruiseOverride() {
return _builder.getDataField<bool>(
::capnp::bounded<68>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpToyotaCruiseOverride(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<68>() * ::capnp::ELEMENTS, value);
}
inline ::uint8_t DragonConf::Reader::getDpToyotaCruiseOverrideSpeed() const {
return _reader.getDataField< ::uint8_t>(
::capnp::bounded<13>() * ::capnp::ELEMENTS);
}
inline ::uint8_t DragonConf::Builder::getDpToyotaCruiseOverrideSpeed() {
return _builder.getDataField< ::uint8_t>(
::capnp::bounded<13>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpToyotaCruiseOverrideSpeed( ::uint8_t value) {
_builder.setDataField< ::uint8_t>(
::capnp::bounded<13>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpUseLanelines() const {
return _reader.getDataField<bool>(
::capnp::bounded<69>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpUseLanelines() {
return _builder.getDataField<bool>(
::capnp::bounded<69>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpUseLanelines(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<69>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpMapd() const {
return _reader.getDataField<bool>(
::capnp::bounded<70>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpMapd() {
return _builder.getDataField<bool>(
::capnp::bounded<70>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpMapd(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<70>() * ::capnp::ELEMENTS, value);
}
inline bool DragonConf::Reader::getDpMazdaSteerAlert() const {
return _reader.getDataField<bool>(
::capnp::bounded<71>() * ::capnp::ELEMENTS);
}
inline bool DragonConf::Builder::getDpMazdaSteerAlert() {
return _builder.getDataField<bool>(
::capnp::bounded<71>() * ::capnp::ELEMENTS);
}
inline void DragonConf::Builder::setDpMazdaSteerAlert(bool value) {
_builder.setDataField<bool>(
::capnp::bounded<71>() * ::capnp::ELEMENTS, value);
}
} // namespace
+212 -52
View File
@@ -61,7 +61,7 @@ static const uint16_t m_9811e1f38f62f2d1[] = {1, 0};
static const uint16_t i_9811e1f38f62f2d1[] = {0, 1};
const ::capnp::_::RawSchema s_9811e1f38f62f2d1 = {
0x9811e1f38f62f2d1, b_9811e1f38f62f2d1.words, 48, nullptr, m_9811e1f38f62f2d1,
0, 2, i_9811e1f38f62f2d1, nullptr, nullptr, { &s_9811e1f38f62f2d1, nullptr, nullptr, 0, 0, nullptr }
0, 2, i_9811e1f38f62f2d1, nullptr, nullptr, { &s_9811e1f38f62f2d1, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<81> b_c08240f996aefced = {
@@ -153,7 +153,7 @@ static const uint16_t m_c08240f996aefced[] = {1, 2, 3, 0};
static const uint16_t i_c08240f996aefced[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_c08240f996aefced = {
0xc08240f996aefced, b_c08240f996aefced.words, 81, nullptr, m_c08240f996aefced,
0, 4, i_c08240f996aefced, nullptr, nullptr, { &s_c08240f996aefced, nullptr, nullptr, 0, 0, nullptr }
0, 4, i_c08240f996aefced, nullptr, nullptr, { &s_c08240f996aefced, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<86> b_88dcce08ad29dda0 = {
@@ -253,7 +253,7 @@ static const uint16_t m_88dcce08ad29dda0[] = {0, 2, 3, 1};
static const uint16_t i_88dcce08ad29dda0[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_88dcce08ad29dda0 = {
0x88dcce08ad29dda0, b_88dcce08ad29dda0.words, 86, d_88dcce08ad29dda0, m_88dcce08ad29dda0,
1, 4, i_88dcce08ad29dda0, nullptr, nullptr, { &s_88dcce08ad29dda0, nullptr, nullptr, 0, 0, nullptr }
1, 4, i_88dcce08ad29dda0, nullptr, nullptr, { &s_88dcce08ad29dda0, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<39> b_9917470acf94d285 = {
@@ -302,7 +302,7 @@ static const ::capnp::_::AlignedData<39> b_9917470acf94d285 = {
static const uint16_t m_9917470acf94d285[] = {0, 1, 2, 4, 3};
const ::capnp::_::RawSchema s_9917470acf94d285 = {
0x9917470acf94d285, b_9917470acf94d285.words, 39, nullptr, m_9917470acf94d285,
0, 5, nullptr, nullptr, nullptr, { &s_9917470acf94d285, nullptr, nullptr, 0, 0, nullptr }
0, 5, nullptr, nullptr, nullptr, { &s_9917470acf94d285, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(App_9917470acf94d285, 9917470acf94d285);
@@ -447,7 +447,7 @@ static const uint16_t m_8afd33dc9b35e1aa[] = {0, 5, 4, 2, 3, 1};
static const uint16_t i_8afd33dc9b35e1aa[] = {0, 1, 2, 3, 4, 5};
const ::capnp::_::RawSchema s_8afd33dc9b35e1aa = {
0x8afd33dc9b35e1aa, b_8afd33dc9b35e1aa.words, 133, nullptr, m_8afd33dc9b35e1aa,
0, 6, i_8afd33dc9b35e1aa, nullptr, nullptr, { &s_8afd33dc9b35e1aa, nullptr, nullptr, 0, 0, nullptr }
0, 6, i_8afd33dc9b35e1aa, nullptr, nullptr, { &s_8afd33dc9b35e1aa, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<48> b_a99a9d5b33cf5859 = {
@@ -506,7 +506,7 @@ static const uint16_t m_a99a9d5b33cf5859[] = {0, 1};
static const uint16_t i_a99a9d5b33cf5859[] = {0, 1};
const ::capnp::_::RawSchema s_a99a9d5b33cf5859 = {
0xa99a9d5b33cf5859, b_a99a9d5b33cf5859.words, 48, nullptr, m_a99a9d5b33cf5859,
0, 2, i_a99a9d5b33cf5859, nullptr, nullptr, { &s_a99a9d5b33cf5859, nullptr, nullptr, 0, 0, nullptr }
0, 2, i_a99a9d5b33cf5859, nullptr, nullptr, { &s_a99a9d5b33cf5859, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<48> b_cff7566681c277ce = {
@@ -565,7 +565,7 @@ static const uint16_t m_cff7566681c277ce[] = {1, 0};
static const uint16_t i_cff7566681c277ce[] = {0, 1};
const ::capnp::_::RawSchema s_cff7566681c277ce = {
0xcff7566681c277ce, b_cff7566681c277ce.words, 48, nullptr, m_cff7566681c277ce,
0, 2, i_cff7566681c277ce, nullptr, nullptr, { &s_cff7566681c277ce, nullptr, nullptr, 0, 0, nullptr }
0, 2, i_cff7566681c277ce, nullptr, nullptr, { &s_cff7566681c277ce, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<260> b_d4df5a192382ba0b = {
@@ -839,7 +839,7 @@ static const uint16_t m_d4df5a192382ba0b[] = {0, 2, 6, 7, 8, 13, 14, 3, 11, 4, 9
static const uint16_t i_d4df5a192382ba0b[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
const ::capnp::_::RawSchema s_d4df5a192382ba0b = {
0xd4df5a192382ba0b, b_d4df5a192382ba0b.words, 260, d_d4df5a192382ba0b, m_d4df5a192382ba0b,
1, 15, i_d4df5a192382ba0b, nullptr, nullptr, { &s_d4df5a192382ba0b, nullptr, nullptr, 0, 0, nullptr }
1, 15, i_d4df5a192382ba0b, nullptr, nullptr, { &s_d4df5a192382ba0b, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<40> b_cb6a279f015f6b51 = {
@@ -889,7 +889,7 @@ static const ::capnp::_::AlignedData<40> b_cb6a279f015f6b51 = {
static const uint16_t m_cb6a279f015f6b51[] = {3, 0, 1, 2, 4};
const ::capnp::_::RawSchema s_cb6a279f015f6b51 = {
0xcb6a279f015f6b51, b_cb6a279f015f6b51.words, 40, nullptr, m_cb6a279f015f6b51,
0, 5, nullptr, nullptr, nullptr, { &s_cb6a279f015f6b51, nullptr, nullptr, 0, 0, nullptr }
0, 5, nullptr, nullptr, nullptr, { &s_cb6a279f015f6b51, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(ChannelWidth_cb6a279f015f6b51, cb6a279f015f6b51);
@@ -949,7 +949,7 @@ static const uint16_t m_94b7baa90c5c321e[] = {0, 1};
static const uint16_t i_94b7baa90c5c321e[] = {0, 1};
const ::capnp::_::RawSchema s_94b7baa90c5c321e = {
0x94b7baa90c5c321e, b_94b7baa90c5c321e.words, 48, nullptr, m_94b7baa90c5c321e,
0, 2, i_94b7baa90c5c321e, nullptr, nullptr, { &s_94b7baa90c5c321e, nullptr, nullptr, 0, 0, nullptr }
0, 2, i_94b7baa90c5c321e, nullptr, nullptr, { &s_94b7baa90c5c321e, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<314> b_b8aad62cffef28a9 = {
@@ -1281,7 +1281,7 @@ static const uint16_t m_b8aad62cffef28a9[] = {12, 13, 0, 6, 16, 4, 7, 2, 11, 10,
static const uint16_t i_b8aad62cffef28a9[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
const ::capnp::_::RawSchema s_b8aad62cffef28a9 = {
0xb8aad62cffef28a9, b_b8aad62cffef28a9.words, 314, d_b8aad62cffef28a9, m_b8aad62cffef28a9,
5, 17, i_b8aad62cffef28a9, nullptr, nullptr, { &s_b8aad62cffef28a9, nullptr, nullptr, 0, 0, nullptr }
5, 17, i_b8aad62cffef28a9, nullptr, nullptr, { &s_b8aad62cffef28a9, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<121> b_8817eeea389e9f08 = {
@@ -1413,7 +1413,7 @@ static const uint16_t m_8817eeea389e9f08[] = {0, 4, 1, 2, 3, 5};
static const uint16_t i_8817eeea389e9f08[] = {0, 1, 2, 3, 4, 5};
const ::capnp::_::RawSchema s_8817eeea389e9f08 = {
0x8817eeea389e9f08, b_8817eeea389e9f08.words, 121, nullptr, m_8817eeea389e9f08,
0, 6, i_8817eeea389e9f08, nullptr, nullptr, { &s_8817eeea389e9f08, nullptr, nullptr, 0, 0, nullptr }
0, 6, i_8817eeea389e9f08, nullptr, nullptr, { &s_8817eeea389e9f08, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<154> b_d1c9bef96d26fa91 = {
@@ -1578,7 +1578,7 @@ static const uint16_t m_d1c9bef96d26fa91[] = {0, 1, 7, 8, 3, 4, 5, 6, 2};
static const uint16_t i_d1c9bef96d26fa91[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
const ::capnp::_::RawSchema s_d1c9bef96d26fa91 = {
0xd1c9bef96d26fa91, b_d1c9bef96d26fa91.words, 154, nullptr, m_d1c9bef96d26fa91,
0, 9, i_d1c9bef96d26fa91, nullptr, nullptr, { &s_d1c9bef96d26fa91, nullptr, nullptr, 0, 0, nullptr }
0, 9, i_d1c9bef96d26fa91, nullptr, nullptr, { &s_d1c9bef96d26fa91, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<141> b_a26e3710efd3e914 = {
@@ -1730,7 +1730,7 @@ static const uint16_t m_a26e3710efd3e914[] = {3, 2, 0, 1, 4, 6, 5};
static const uint16_t i_a26e3710efd3e914[] = {0, 1, 2, 3, 4, 5, 6};
const ::capnp::_::RawSchema s_a26e3710efd3e914 = {
0xa26e3710efd3e914, b_a26e3710efd3e914.words, 141, nullptr, m_a26e3710efd3e914,
0, 7, i_a26e3710efd3e914, nullptr, nullptr, { &s_a26e3710efd3e914, nullptr, nullptr, 0, 0, nullptr }
0, 7, i_a26e3710efd3e914, nullptr, nullptr, { &s_a26e3710efd3e914, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<126> b_9744f25fb60f2bf8 = {
@@ -1867,7 +1867,7 @@ static const uint16_t m_9744f25fb60f2bf8[] = {2, 1, 5, 0, 3, 4};
static const uint16_t i_9744f25fb60f2bf8[] = {0, 1, 2, 3, 4, 5};
const ::capnp::_::RawSchema s_9744f25fb60f2bf8 = {
0x9744f25fb60f2bf8, b_9744f25fb60f2bf8.words, 126, nullptr, m_9744f25fb60f2bf8,
0, 6, i_9744f25fb60f2bf8, nullptr, nullptr, { &s_9744f25fb60f2bf8, nullptr, nullptr, 0, 0, nullptr }
0, 6, i_9744f25fb60f2bf8, nullptr, nullptr, { &s_9744f25fb60f2bf8, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<78> b_f98f999c6a071122 = {
@@ -1956,7 +1956,7 @@ static const uint16_t m_f98f999c6a071122[] = {1, 2, 0};
static const uint16_t i_f98f999c6a071122[] = {0, 1, 2};
const ::capnp::_::RawSchema s_f98f999c6a071122 = {
0xf98f999c6a071122, b_f98f999c6a071122.words, 78, nullptr, m_f98f999c6a071122,
0, 3, i_f98f999c6a071122, nullptr, nullptr, { &s_f98f999c6a071122, nullptr, nullptr, 0, 0, nullptr }
0, 3, i_f98f999c6a071122, nullptr, nullptr, { &s_f98f999c6a071122, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<62> b_c25bbbd524983447 = {
@@ -2029,7 +2029,7 @@ static const uint16_t m_c25bbbd524983447[] = {0, 1, 2};
static const uint16_t i_c25bbbd524983447[] = {0, 1, 2};
const ::capnp::_::RawSchema s_c25bbbd524983447 = {
0xc25bbbd524983447, b_c25bbbd524983447.words, 62, nullptr, m_c25bbbd524983447,
0, 3, i_c25bbbd524983447, nullptr, nullptr, { &s_c25bbbd524983447, nullptr, nullptr, 0, 0, nullptr }
0, 3, i_c25bbbd524983447, nullptr, nullptr, { &s_c25bbbd524983447, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<64> b_e10e21168db0c7f7 = {
@@ -2104,7 +2104,7 @@ static const uint16_t m_e10e21168db0c7f7[] = {0, 1, 2};
static const uint16_t i_e10e21168db0c7f7[] = {0, 1, 2};
const ::capnp::_::RawSchema s_e10e21168db0c7f7 = {
0xe10e21168db0c7f7, b_e10e21168db0c7f7.words, 64, nullptr, m_e10e21168db0c7f7,
0, 3, i_e10e21168db0c7f7, nullptr, nullptr, { &s_e10e21168db0c7f7, nullptr, nullptr, 0, 0, nullptr }
0, 3, i_e10e21168db0c7f7, nullptr, nullptr, { &s_e10e21168db0c7f7, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<153> b_ab54c59699f8f9f3 = {
@@ -2272,7 +2272,7 @@ static const uint16_t m_ab54c59699f8f9f3[] = {5, 6, 0, 7, 1, 4, 3, 2};
static const uint16_t i_ab54c59699f8f9f3[] = {0, 1, 2, 3, 4, 5, 6, 7};
const ::capnp::_::RawSchema s_ab54c59699f8f9f3 = {
0xab54c59699f8f9f3, b_ab54c59699f8f9f3.words, 153, d_ab54c59699f8f9f3, m_ab54c59699f8f9f3,
2, 8, i_ab54c59699f8f9f3, nullptr, nullptr, { &s_ab54c59699f8f9f3, nullptr, nullptr, 0, 0, nullptr }
2, 8, i_ab54c59699f8f9f3, nullptr, nullptr, { &s_ab54c59699f8f9f3, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<155> b_f5ad1d90cdc1dd6b = {
@@ -2442,7 +2442,7 @@ static const uint16_t m_f5ad1d90cdc1dd6b[] = {4, 6, 5, 1, 3, 2, 0, 7};
static const uint16_t i_f5ad1d90cdc1dd6b[] = {0, 1, 2, 3, 4, 5, 6, 7};
const ::capnp::_::RawSchema s_f5ad1d90cdc1dd6b = {
0xf5ad1d90cdc1dd6b, b_f5ad1d90cdc1dd6b.words, 155, d_f5ad1d90cdc1dd6b, m_f5ad1d90cdc1dd6b,
2, 8, i_f5ad1d90cdc1dd6b, nullptr, nullptr, { &s_f5ad1d90cdc1dd6b, nullptr, nullptr, 0, 0, nullptr }
2, 8, i_f5ad1d90cdc1dd6b, nullptr, nullptr, { &s_f5ad1d90cdc1dd6b, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<103> b_90c8426c3eaddd3b = {
@@ -2562,7 +2562,7 @@ static const uint16_t m_90c8426c3eaddd3b[] = {2, 4, 3, 1, 0};
static const uint16_t i_90c8426c3eaddd3b[] = {0, 1, 2, 3, 4};
const ::capnp::_::RawSchema s_90c8426c3eaddd3b = {
0x90c8426c3eaddd3b, b_90c8426c3eaddd3b.words, 103, d_90c8426c3eaddd3b, m_90c8426c3eaddd3b,
4, 5, i_90c8426c3eaddd3b, nullptr, nullptr, { &s_90c8426c3eaddd3b, nullptr, nullptr, 0, 0, nullptr }
4, 5, i_90c8426c3eaddd3b, nullptr, nullptr, { &s_90c8426c3eaddd3b, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<53> b_e8db07dcf8fcea05 = {
@@ -2625,7 +2625,7 @@ static const ::capnp::_::AlignedData<53> b_e8db07dcf8fcea05 = {
static const uint16_t m_e8db07dcf8fcea05[] = {1, 2, 3, 4, 0, 5, 6};
const ::capnp::_::RawSchema s_e8db07dcf8fcea05 = {
0xe8db07dcf8fcea05, b_e8db07dcf8fcea05.words, 53, nullptr, m_e8db07dcf8fcea05,
0, 7, nullptr, nullptr, nullptr, { &s_e8db07dcf8fcea05, nullptr, nullptr, 0, 0, nullptr }
0, 7, nullptr, nullptr, nullptr, { &s_e8db07dcf8fcea05, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Type_e8db07dcf8fcea05, e8db07dcf8fcea05);
@@ -2672,7 +2672,7 @@ static const ::capnp::_::AlignedData<36> b_b9aa88c75ef99a1f = {
static const uint16_t m_b9aa88c75ef99a1f[] = {3, 2, 0, 1};
const ::capnp::_::RawSchema s_b9aa88c75ef99a1f = {
0xb9aa88c75ef99a1f, b_b9aa88c75ef99a1f.words, 36, nullptr, m_b9aa88c75ef99a1f,
0, 4, nullptr, nullptr, nullptr, { &s_b9aa88c75ef99a1f, nullptr, nullptr, 0, 0, nullptr }
0, 4, nullptr, nullptr, nullptr, { &s_b9aa88c75ef99a1f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Status_b9aa88c75ef99a1f, b9aa88c75ef99a1f);
@@ -3094,7 +3094,7 @@ static const uint16_t m_b99b2bc7a57e8128[] = {12, 13, 3, 15, 16, 11, 8, 22, 1, 2
static const uint16_t i_b99b2bc7a57e8128[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22};
const ::capnp::_::RawSchema s_b99b2bc7a57e8128 = {
0xb99b2bc7a57e8128, b_b99b2bc7a57e8128.words, 406, d_b99b2bc7a57e8128, m_b99b2bc7a57e8128,
2, 23, i_b99b2bc7a57e8128, nullptr, nullptr, { &s_b99b2bc7a57e8128, nullptr, nullptr, 0, 0, nullptr }
2, 23, i_b99b2bc7a57e8128, nullptr, nullptr, { &s_b99b2bc7a57e8128, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<159> b_943dc4625473b03f = {
@@ -3264,7 +3264,7 @@ static const uint16_t m_943dc4625473b03f[] = {7, 5, 6, 4, 0, 3, 2, 1};
static const uint16_t i_943dc4625473b03f[] = {0, 1, 2, 3, 4, 5, 6, 7};
const ::capnp::_::RawSchema s_943dc4625473b03f = {
0x943dc4625473b03f, b_943dc4625473b03f.words, 159, nullptr, m_943dc4625473b03f,
0, 8, i_943dc4625473b03f, nullptr, nullptr, { &s_943dc4625473b03f, nullptr, nullptr, 0, 0, nullptr }
0, 8, i_943dc4625473b03f, nullptr, nullptr, { &s_943dc4625473b03f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<41> b_c871d3cc252af657 = {
@@ -3315,7 +3315,7 @@ static const ::capnp::_::AlignedData<41> b_c871d3cc252af657 = {
static const uint16_t m_c871d3cc252af657[] = {0, 4, 1, 2, 3};
const ::capnp::_::RawSchema s_c871d3cc252af657 = {
0xc871d3cc252af657, b_c871d3cc252af657.words, 41, nullptr, m_c871d3cc252af657,
0, 5, nullptr, nullptr, nullptr, { &s_c871d3cc252af657, nullptr, nullptr, 0, 0, nullptr }
0, 5, nullptr, nullptr, nullptr, { &s_c871d3cc252af657, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(SensorSource_c871d3cc252af657, c871d3cc252af657);
@@ -3445,7 +3445,7 @@ static const uint16_t m_d7700859ed1f5b76[] = {1, 3, 2, 4, 5, 0};
static const uint16_t i_d7700859ed1f5b76[] = {0, 1, 2, 3, 4, 5};
const ::capnp::_::RawSchema s_d7700859ed1f5b76 = {
0xd7700859ed1f5b76, b_d7700859ed1f5b76.words, 118, nullptr, m_d7700859ed1f5b76,
0, 6, i_d7700859ed1f5b76, nullptr, nullptr, { &s_d7700859ed1f5b76, nullptr, nullptr, 0, 0, nullptr }
0, 6, i_d7700859ed1f5b76, nullptr, nullptr, { &s_d7700859ed1f5b76, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<143> b_cd60164a8a0159ef = {
@@ -3599,7 +3599,7 @@ static const uint16_t m_cd60164a8a0159ef[] = {3, 6, 4, 0, 5, 1, 2};
static const uint16_t i_cd60164a8a0159ef[] = {0, 1, 2, 3, 4, 5, 6};
const ::capnp::_::RawSchema s_cd60164a8a0159ef = {
0xcd60164a8a0159ef, b_cd60164a8a0159ef.words, 143, nullptr, m_cd60164a8a0159ef,
0, 7, i_cd60164a8a0159ef, nullptr, nullptr, { &s_cd60164a8a0159ef, nullptr, nullptr, 0, 0, nullptr }
0, 7, i_cd60164a8a0159ef, nullptr, nullptr, { &s_cd60164a8a0159ef, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<99> b_d500d30c5803fa4f = {
@@ -3709,7 +3709,7 @@ static const uint16_t m_d500d30c5803fa4f[] = {4, 2, 3, 0, 1};
static const uint16_t i_d500d30c5803fa4f[] = {0, 1, 2, 3, 4};
const ::capnp::_::RawSchema s_d500d30c5803fa4f = {
0xd500d30c5803fa4f, b_d500d30c5803fa4f.words, 99, nullptr, m_d500d30c5803fa4f,
0, 5, i_d500d30c5803fa4f, nullptr, nullptr, { &s_d500d30c5803fa4f, nullptr, nullptr, 0, 0, nullptr }
0, 5, i_d500d30c5803fa4f, nullptr, nullptr, { &s_d500d30c5803fa4f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<83> b_c8233c0345e27e24 = {
@@ -3806,7 +3806,7 @@ static const uint16_t m_c8233c0345e27e24[] = {3, 2, 0, 1};
static const uint16_t i_c8233c0345e27e24[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_c8233c0345e27e24 = {
0xc8233c0345e27e24, b_c8233c0345e27e24.words, 83, d_c8233c0345e27e24, m_c8233c0345e27e24,
1, 4, i_c8233c0345e27e24, nullptr, nullptr, { &s_c8233c0345e27e24, nullptr, nullptr, 0, 0, nullptr }
1, 4, i_c8233c0345e27e24, nullptr, nullptr, { &s_c8233c0345e27e24, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<95> b_92e21bb7ea38793a = {
@@ -3912,7 +3912,7 @@ static const uint16_t m_92e21bb7ea38793a[] = {1, 3, 0, 2};
static const uint16_t i_92e21bb7ea38793a[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_92e21bb7ea38793a = {
0x92e21bb7ea38793a, b_92e21bb7ea38793a.words, 95, nullptr, m_92e21bb7ea38793a,
0, 4, i_92e21bb7ea38793a, nullptr, nullptr, { &s_92e21bb7ea38793a, nullptr, nullptr, 0, 0, nullptr }
0, 4, i_92e21bb7ea38793a, nullptr, nullptr, { &s_92e21bb7ea38793a, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<92> b_9b326d4e436afec7 = {
@@ -4015,7 +4015,7 @@ static const uint16_t m_9b326d4e436afec7[] = {2, 3, 1, 0};
static const uint16_t i_9b326d4e436afec7[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_9b326d4e436afec7 = {
0x9b326d4e436afec7, b_9b326d4e436afec7.words, 92, nullptr, m_9b326d4e436afec7,
0, 4, i_9b326d4e436afec7, nullptr, nullptr, { &s_9b326d4e436afec7, nullptr, nullptr, 0, 0, nullptr }
0, 4, i_9b326d4e436afec7, nullptr, nullptr, { &s_9b326d4e436afec7, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<91> b_8fdfadb254ea867a = {
@@ -4117,7 +4117,7 @@ static const uint16_t m_8fdfadb254ea867a[] = {0, 1, 2, 3};
static const uint16_t i_8fdfadb254ea867a[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_8fdfadb254ea867a = {
0x8fdfadb254ea867a, b_8fdfadb254ea867a.words, 91, nullptr, m_8fdfadb254ea867a,
0, 4, i_8fdfadb254ea867a, nullptr, nullptr, { &s_8fdfadb254ea867a, nullptr, nullptr, 0, 0, nullptr }
0, 4, i_8fdfadb254ea867a, nullptr, nullptr, { &s_8fdfadb254ea867a, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<52> b_bd8822120928120c = {
@@ -4183,7 +4183,7 @@ static const uint16_t m_bd8822120928120c[] = {1, 0};
static const uint16_t i_bd8822120928120c[] = {0, 1};
const ::capnp::_::RawSchema s_bd8822120928120c = {
0xbd8822120928120c, b_bd8822120928120c.words, 52, d_bd8822120928120c, m_bd8822120928120c,
1, 2, i_bd8822120928120c, nullptr, nullptr, { &s_bd8822120928120c, nullptr, nullptr, 0, 0, nullptr }
1, 2, i_bd8822120928120c, nullptr, nullptr, { &s_bd8822120928120c, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<153> b_ce7cd672cacc7814 = {
@@ -4347,7 +4347,7 @@ static const uint16_t m_ce7cd672cacc7814[] = {4, 6, 8, 3, 1, 2, 7, 5, 0};
static const uint16_t i_ce7cd672cacc7814[] = {0, 1, 2, 3, 4, 5, 6, 7, 8};
const ::capnp::_::RawSchema s_ce7cd672cacc7814 = {
0xce7cd672cacc7814, b_ce7cd672cacc7814.words, 153, nullptr, m_ce7cd672cacc7814,
0, 9, i_ce7cd672cacc7814, nullptr, nullptr, { &s_ce7cd672cacc7814, nullptr, nullptr, 0, 0, nullptr }
0, 9, i_ce7cd672cacc7814, nullptr, nullptr, { &s_ce7cd672cacc7814, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<75> b_db98be6565516acb = {
@@ -4436,7 +4436,7 @@ static const uint16_t m_db98be6565516acb[] = {1, 0, 2};
static const uint16_t i_db98be6565516acb[] = {0, 1, 2};
const ::capnp::_::RawSchema s_db98be6565516acb = {
0xdb98be6565516acb, b_db98be6565516acb.words, 75, d_db98be6565516acb, m_db98be6565516acb,
1, 3, i_db98be6565516acb, nullptr, nullptr, { &s_db98be6565516acb, nullptr, nullptr, 0, 0, nullptr }
1, 3, i_db98be6565516acb, nullptr, nullptr, { &s_db98be6565516acb, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<48> b_9eaef9187cadbb9b = {
@@ -4495,7 +4495,7 @@ static const uint16_t m_9eaef9187cadbb9b[] = {0, 1};
static const uint16_t i_9eaef9187cadbb9b[] = {0, 1};
const ::capnp::_::RawSchema s_9eaef9187cadbb9b = {
0x9eaef9187cadbb9b, b_9eaef9187cadbb9b.words, 48, nullptr, m_9eaef9187cadbb9b,
0, 2, i_9eaef9187cadbb9b, nullptr, nullptr, { &s_9eaef9187cadbb9b, nullptr, nullptr, 0, 0, nullptr }
0, 2, i_9eaef9187cadbb9b, nullptr, nullptr, { &s_9eaef9187cadbb9b, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<150> b_a5b39b4fc4d7da3f = {
@@ -4660,7 +4660,7 @@ static const uint16_t m_a5b39b4fc4d7da3f[] = {4, 3, 5, 0, 6, 7, 1, 2};
static const uint16_t i_a5b39b4fc4d7da3f[] = {0, 1, 2, 3, 4, 5, 6, 7};
const ::capnp::_::RawSchema s_a5b39b4fc4d7da3f = {
0xa5b39b4fc4d7da3f, b_a5b39b4fc4d7da3f.words, 150, d_a5b39b4fc4d7da3f, m_a5b39b4fc4d7da3f,
2, 8, i_a5b39b4fc4d7da3f, nullptr, nullptr, { &s_a5b39b4fc4d7da3f, nullptr, nullptr, 0, 0, nullptr }
2, 8, i_a5b39b4fc4d7da3f, nullptr, nullptr, { &s_a5b39b4fc4d7da3f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<117> b_c5417a637451246f = {
@@ -4787,7 +4787,7 @@ static const ::capnp::_::AlignedData<117> b_c5417a637451246f = {
static const uint16_t m_c5417a637451246f[] = {15, 16, 17, 2, 3, 6, 5, 9, 7, 11, 13, 4, 0, 1, 10, 12, 14, 18, 8, 19};
const ::capnp::_::RawSchema s_c5417a637451246f = {
0xc5417a637451246f, b_c5417a637451246f.words, 117, nullptr, m_c5417a637451246f,
0, 20, nullptr, nullptr, nullptr, { &s_c5417a637451246f, nullptr, nullptr, 0, 0, nullptr }
0, 20, nullptr, nullptr, nullptr, { &s_c5417a637451246f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Instruction_c5417a637451246f, c5417a637451246f);
@@ -4889,7 +4889,7 @@ static const uint16_t m_acfa74a094e62626[] = {2, 1, 3, 0};
static const uint16_t i_acfa74a094e62626[] = {0, 1, 2, 3};
const ::capnp::_::RawSchema s_acfa74a094e62626 = {
0xacfa74a094e62626, b_acfa74a094e62626.words, 86, d_acfa74a094e62626, m_acfa74a094e62626,
2, 4, i_acfa74a094e62626, nullptr, nullptr, { &s_acfa74a094e62626, nullptr, nullptr, 0, 0, nullptr }
2, 4, i_acfa74a094e62626, nullptr, nullptr, { &s_acfa74a094e62626, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<43> b_d85d75253435bf4b = {
@@ -4942,7 +4942,7 @@ static const ::capnp::_::AlignedData<43> b_d85d75253435bf4b = {
static const uint16_t m_d85d75253435bf4b[] = {3, 1, 2, 4, 0};
const ::capnp::_::RawSchema s_d85d75253435bf4b = {
0xd85d75253435bf4b, b_d85d75253435bf4b.words, 43, nullptr, m_d85d75253435bf4b,
0, 5, nullptr, nullptr, nullptr, { &s_d85d75253435bf4b, nullptr, nullptr, 0, 0, nullptr }
0, 5, nullptr, nullptr, nullptr, { &s_d85d75253435bf4b, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Type_d85d75253435bf4b, d85d75253435bf4b);
@@ -4989,7 +4989,7 @@ static const ::capnp::_::AlignedData<36> b_a6f6ce72165ccb49 = {
static const uint16_t m_a6f6ce72165ccb49[] = {0, 3, 2, 1};
const ::capnp::_::RawSchema s_a6f6ce72165ccb49 = {
0xa6f6ce72165ccb49, b_a6f6ce72165ccb49.words, 36, nullptr, m_a6f6ce72165ccb49,
0, 4, nullptr, nullptr, nullptr, { &s_a6f6ce72165ccb49, nullptr, nullptr, 0, 0, nullptr }
0, 4, nullptr, nullptr, nullptr, { &s_a6f6ce72165ccb49, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Action_a6f6ce72165ccb49, a6f6ce72165ccb49);
@@ -5065,7 +5065,7 @@ static const uint16_t m_dfdf30d03fc485bd[] = {0, 1};
static const uint16_t i_dfdf30d03fc485bd[] = {0, 1};
const ::capnp::_::RawSchema s_dfdf30d03fc485bd = {
0xdfdf30d03fc485bd, b_dfdf30d03fc485bd.words, 60, d_dfdf30d03fc485bd, m_dfdf30d03fc485bd,
2, 2, i_dfdf30d03fc485bd, nullptr, nullptr, { &s_dfdf30d03fc485bd, nullptr, nullptr, 0, 0, nullptr }
2, 2, i_dfdf30d03fc485bd, nullptr, nullptr, { &s_dfdf30d03fc485bd, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<61> b_a20710d4f428d6cd = {
@@ -5141,7 +5141,7 @@ static const uint16_t m_a20710d4f428d6cd[] = {0, 1};
static const uint16_t i_a20710d4f428d6cd[] = {0, 1};
const ::capnp::_::RawSchema s_a20710d4f428d6cd = {
0xa20710d4f428d6cd, b_a20710d4f428d6cd.words, 61, d_a20710d4f428d6cd, m_a20710d4f428d6cd,
2, 2, i_a20710d4f428d6cd, nullptr, nullptr, { &s_a20710d4f428d6cd, nullptr, nullptr, 0, 0, nullptr }
2, 2, i_a20710d4f428d6cd, nullptr, nullptr, { &s_a20710d4f428d6cd, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<290> b_a0e27b453a38f450 = {
@@ -5442,7 +5442,7 @@ static const uint16_t m_a0e27b453a38f450[] = {9, 11, 13, 15, 7, 1, 8, 10, 12, 14
static const uint16_t i_a0e27b453a38f450[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
const ::capnp::_::RawSchema s_a0e27b453a38f450 = {
0xa0e27b453a38f450, b_a0e27b453a38f450.words, 290, nullptr, m_a0e27b453a38f450,
0, 16, i_a0e27b453a38f450, nullptr, nullptr, { &s_a0e27b453a38f450, nullptr, nullptr, 0, 0, nullptr }
0, 16, i_a0e27b453a38f450, nullptr, nullptr, { &s_a0e27b453a38f450, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<420> b_d949bf717d77614d = {
@@ -5877,7 +5877,7 @@ static const uint16_t m_d949bf717d77614d[] = {10, 9, 11, 15, 13, 17, 19, 6, 1, 1
static const uint16_t i_d949bf717d77614d[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22};
const ::capnp::_::RawSchema s_d949bf717d77614d = {
0xd949bf717d77614d, b_d949bf717d77614d.words, 420, d_d949bf717d77614d, m_d949bf717d77614d,
2, 23, i_d949bf717d77614d, nullptr, nullptr, { &s_d949bf717d77614d, nullptr, nullptr, 0, 0, nullptr }
2, 23, i_d949bf717d77614d, nullptr, nullptr, { &s_d949bf717d77614d, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<50> b_9ef1f3ff0deb5ffb = {
@@ -5937,7 +5937,7 @@ static const ::capnp::_::AlignedData<50> b_9ef1f3ff0deb5ffb = {
static const uint16_t m_9ef1f3ff0deb5ffb[] = {5, 6, 3, 1, 4, 2, 0};
const ::capnp::_::RawSchema s_9ef1f3ff0deb5ffb = {
0x9ef1f3ff0deb5ffb, b_9ef1f3ff0deb5ffb.words, 50, nullptr, m_9ef1f3ff0deb5ffb,
0, 7, nullptr, nullptr, nullptr, { &s_9ef1f3ff0deb5ffb, nullptr, nullptr, 0, 0, nullptr }
0, 7, nullptr, nullptr, nullptr, { &s_9ef1f3ff0deb5ffb, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Constellation_9ef1f3ff0deb5ffb, 9ef1f3ff0deb5ffb);
@@ -6044,7 +6044,7 @@ static const ::capnp::_::AlignedData<96> b_cbb9490adce12d72 = {
static const uint16_t m_cbb9490adce12d72[] = {9, 10, 2, 1, 13, 11, 12, 7, 8, 5, 14, 3, 6, 4, 0};
const ::capnp::_::RawSchema s_cbb9490adce12d72 = {
0xcbb9490adce12d72, b_cbb9490adce12d72.words, 96, nullptr, m_cbb9490adce12d72,
0, 15, nullptr, nullptr, nullptr, { &s_cbb9490adce12d72, nullptr, nullptr, 0, 0, nullptr }
0, 15, nullptr, nullptr, nullptr, { &s_cbb9490adce12d72, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(State_cbb9490adce12d72, cbb9490adce12d72);
@@ -6092,7 +6092,7 @@ static const ::capnp::_::AlignedData<37> b_c04e7b6231d4caa8 = {
static const uint16_t m_c04e7b6231d4caa8[] = {1, 2, 0};
const ::capnp::_::RawSchema s_c04e7b6231d4caa8 = {
0xc04e7b6231d4caa8, b_c04e7b6231d4caa8.words, 37, nullptr, m_c04e7b6231d4caa8,
0, 3, nullptr, nullptr, nullptr, { &s_c04e7b6231d4caa8, nullptr, nullptr, 0, 0, nullptr }
0, 3, nullptr, nullptr, nullptr, { &s_c04e7b6231d4caa8, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(MultipathIndicator_c04e7b6231d4caa8, c04e7b6231d4caa8);
@@ -6222,7 +6222,7 @@ static const uint16_t m_e2517b083095fd4e[] = {4, 2, 5, 3, 1, 0};
static const uint16_t i_e2517b083095fd4e[] = {0, 1, 2, 3, 4, 5};
const ::capnp::_::RawSchema s_e2517b083095fd4e = {
0xe2517b083095fd4e, b_e2517b083095fd4e.words, 115, d_e2517b083095fd4e, m_e2517b083095fd4e,
1, 6, i_e2517b083095fd4e, nullptr, nullptr, { &s_e2517b083095fd4e, nullptr, nullptr, 0, 0, nullptr }
1, 6, i_e2517b083095fd4e, nullptr, nullptr, { &s_e2517b083095fd4e, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
static const ::capnp::_::AlignedData<35> b_ec1ff7996b35366f = {
@@ -6267,7 +6267,7 @@ static const ::capnp::_::AlignedData<35> b_ec1ff7996b35366f = {
static const uint16_t m_ec1ff7996b35366f[] = {1, 2, 0};
const ::capnp::_::RawSchema s_ec1ff7996b35366f = {
0xec1ff7996b35366f, b_ec1ff7996b35366f.words, 35, nullptr, m_ec1ff7996b35366f,
0, 3, nullptr, nullptr, nullptr, { &s_ec1ff7996b35366f, nullptr, nullptr, 0, 0, nullptr }
0, 3, nullptr, nullptr, nullptr, { &s_ec1ff7996b35366f, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
CAPNP_DEFINE_ENUM(Status_ec1ff7996b35366f, ec1ff7996b35366f);
@@ -6383,7 +6383,7 @@ static const uint16_t m_e3d6685d4e9d8f7a[] = {3, 4, 0, 2, 1};
static const uint16_t i_e3d6685d4e9d8f7a[] = {0, 1, 2, 3, 4};
const ::capnp::_::RawSchema s_e3d6685d4e9d8f7a = {
0xe3d6685d4e9d8f7a, b_e3d6685d4e9d8f7a.words, 104, nullptr, m_e3d6685d4e9d8f7a,
0, 5, i_e3d6685d4e9d8f7a, nullptr, nullptr, { &s_e3d6685d4e9d8f7a, nullptr, nullptr, 0, 0, nullptr }
0, 5, i_e3d6685d4e9d8f7a, nullptr, nullptr, { &s_e3d6685d4e9d8f7a, nullptr, nullptr, 0, 0, nullptr }, false
};
#endif // !CAPNP_LITE
} // namespace schemas
@@ -6394,323 +6394,483 @@ const ::capnp::_::RawSchema s_e3d6685d4e9d8f7a = {
namespace cereal {
// LogRotate
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LogRotate::_capnpPrivate::dataWordSize;
constexpr uint16_t LogRotate::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LogRotate::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LogRotate::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// LiveUI
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LiveUI::_capnpPrivate::dataWordSize;
constexpr uint16_t LiveUI::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LiveUI::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LiveUI::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// UiLayoutState
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t UiLayoutState::_capnpPrivate::dataWordSize;
constexpr uint16_t UiLayoutState::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind UiLayoutState::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* UiLayoutState::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbslamCorrection
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbslamCorrection::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbslamCorrection::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbslamCorrection::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbslamCorrection::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// EthernetPacket
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t EthernetPacket::_capnpPrivate::dataWordSize;
constexpr uint16_t EthernetPacket::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind EthernetPacket::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* EthernetPacket::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CellInfo
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CellInfo::_capnpPrivate::dataWordSize;
constexpr uint16_t CellInfo::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CellInfo::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CellInfo::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// WifiScan
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t WifiScan::_capnpPrivate::dataWordSize;
constexpr uint16_t WifiScan::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind WifiScan::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* WifiScan::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// LiveEventData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LiveEventData::_capnpPrivate::dataWordSize;
constexpr uint16_t LiveEventData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LiveEventData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LiveEventData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData::PathData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::PathData::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::PathData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::PathData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::PathData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData::LeadData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::LeadData::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::LeadData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::LeadData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::LeadData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData::ModelSettings
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::ModelSettings::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::ModelSettings::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::ModelSettings::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::ModelSettings::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData::MetaData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::MetaData::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::MetaData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::MetaData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::MetaData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ModelData::LongitudinalData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ModelData::LongitudinalData::_capnpPrivate::dataWordSize;
constexpr uint16_t ModelData::LongitudinalData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ModelData::LongitudinalData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ModelData::LongitudinalData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ECEFPoint
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ECEFPoint::_capnpPrivate::dataWordSize;
constexpr uint16_t ECEFPoint::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ECEFPoint::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ECEFPoint::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// ECEFPointDEPRECATED
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t ECEFPointDEPRECATED::_capnpPrivate::dataWordSize;
constexpr uint16_t ECEFPointDEPRECATED::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind ECEFPointDEPRECATED::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* ECEFPointDEPRECATED::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// GPSPlannerPoints
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t GPSPlannerPoints::_capnpPrivate::dataWordSize;
constexpr uint16_t GPSPlannerPoints::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind GPSPlannerPoints::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* GPSPlannerPoints::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// GPSPlannerPlan
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t GPSPlannerPlan::_capnpPrivate::dataWordSize;
constexpr uint16_t GPSPlannerPlan::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind GPSPlannerPlan::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* GPSPlannerPlan::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// UiNavigationEvent
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t UiNavigationEvent::_capnpPrivate::dataWordSize;
constexpr uint16_t UiNavigationEvent::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind UiNavigationEvent::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* UiNavigationEvent::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// LiveLocationData
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LiveLocationData::_capnpPrivate::dataWordSize;
constexpr uint16_t LiveLocationData::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LiveLocationData::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LiveLocationData::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// LiveLocationData::Accuracy
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LiveLocationData::Accuracy::_capnpPrivate::dataWordSize;
constexpr uint16_t LiveLocationData::Accuracy::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LiveLocationData::Accuracy::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LiveLocationData::Accuracy::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbOdometry
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbOdometry::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbOdometry::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbOdometry::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbOdometry::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbFeatures
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbFeatures::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbFeatures::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbFeatures::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbFeatures::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbFeaturesSummary
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbFeaturesSummary::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbFeaturesSummary::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbFeaturesSummary::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbFeaturesSummary::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbKeyFrame
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbKeyFrame::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbKeyFrame::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbKeyFrame::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbKeyFrame::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// KalmanOdometry
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t KalmanOdometry::_capnpPrivate::dataWordSize;
constexpr uint16_t KalmanOdometry::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind KalmanOdometry::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* KalmanOdometry::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// OrbObservation
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t OrbObservation::_capnpPrivate::dataWordSize;
constexpr uint16_t OrbObservation::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind OrbObservation::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* OrbObservation::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// CalibrationFeatures
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t CalibrationFeatures::_capnpPrivate::dataWordSize;
constexpr uint16_t CalibrationFeatures::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind CalibrationFeatures::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* CalibrationFeatures::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// NavStatus
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t NavStatus::_capnpPrivate::dataWordSize;
constexpr uint16_t NavStatus::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind NavStatus::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* NavStatus::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// NavStatus::Address
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t NavStatus::Address::_capnpPrivate::dataWordSize;
constexpr uint16_t NavStatus::Address::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind NavStatus::Address::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* NavStatus::Address::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// NavUpdate
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t NavUpdate::_capnpPrivate::dataWordSize;
constexpr uint16_t NavUpdate::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind NavUpdate::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* NavUpdate::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// NavUpdate::LatLng
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t NavUpdate::LatLng::_capnpPrivate::dataWordSize;
constexpr uint16_t NavUpdate::LatLng::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind NavUpdate::LatLng::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* NavUpdate::LatLng::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// NavUpdate::Segment
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t NavUpdate::Segment::_capnpPrivate::dataWordSize;
constexpr uint16_t NavUpdate::Segment::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind NavUpdate::Segment::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* NavUpdate::Segment::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// TrafficEvent
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t TrafficEvent::_capnpPrivate::dataWordSize;
constexpr uint16_t TrafficEvent::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind TrafficEvent::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* TrafficEvent::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// AndroidGnss
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t AndroidGnss::_capnpPrivate::dataWordSize;
constexpr uint16_t AndroidGnss::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind AndroidGnss::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* AndroidGnss::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// AndroidGnss::Measurements
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t AndroidGnss::Measurements::_capnpPrivate::dataWordSize;
constexpr uint16_t AndroidGnss::Measurements::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind AndroidGnss::Measurements::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* AndroidGnss::Measurements::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// AndroidGnss::Measurements::Clock
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t AndroidGnss::Measurements::Clock::_capnpPrivate::dataWordSize;
constexpr uint16_t AndroidGnss::Measurements::Clock::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind AndroidGnss::Measurements::Clock::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* AndroidGnss::Measurements::Clock::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// AndroidGnss::Measurements::Measurement
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t AndroidGnss::Measurements::Measurement::_capnpPrivate::dataWordSize;
constexpr uint16_t AndroidGnss::Measurements::Measurement::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind AndroidGnss::Measurements::Measurement::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* AndroidGnss::Measurements::Measurement::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// AndroidGnss::NavigationMessage
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t AndroidGnss::NavigationMessage::_capnpPrivate::dataWordSize;
constexpr uint16_t AndroidGnss::NavigationMessage::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind AndroidGnss::NavigationMessage::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* AndroidGnss::NavigationMessage::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
// LidarPts
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr uint16_t LidarPts::_capnpPrivate::dataWordSize;
constexpr uint16_t LidarPts::_capnpPrivate::pointerCount;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#if !CAPNP_LITE
#if CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
constexpr ::capnp::Kind LidarPts::_capnpPrivate::kind;
constexpr ::capnp::_::RawSchema const* LidarPts::_capnpPrivate::schema;
#endif // !CAPNP_NEED_REDUNDANT_CONSTEXPR_DECL
#endif // !CAPNP_LITE
+7 -1
View File
@@ -6,11 +6,15 @@
#include <capnp/generated-header-support.h>
#include <kj/windows-sanity.h>
#if CAPNP_VERSION != 8000
#ifndef CAPNP_VERSION
#error "CAPNP_VERSION is not defined, is capnp/generated-header-support.h missing?"
#elif CAPNP_VERSION != 1000002
#error "Version mismatch between generated code and library headers. You must use the same version of the Cap'n Proto compiler and library."
#endif
CAPNP_BEGIN_HEADER
namespace capnp {
namespace schemas {
@@ -11407,3 +11411,5 @@ inline ::capnp::Orphan< ::capnp::Data> LidarPts::Builder::disownPkt() {
} // namespace
CAPNP_END_HEADER
+13102 -4754
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
+905 -256
View File
File diff suppressed because it is too large Load Diff
-10
View File
@@ -1,10 +0,0 @@
demo
bridge
test_runner
*.o
*.os
*.d
*.a
*.so
messaging_pyx.cpp
build/
+142 -147
View File
@@ -1,39 +1,39 @@
# must be build with scons
from .messaging_pyx import Context, Poller, SubSocket, PubSocket # pylint: disable=no-name-in-module, import-error
from .messaging_pyx import MultiplePublishersError, MessagingError # pylint: disable=no-name-in-module, import-error
# must be built with scons
from msgq.ipc_pyx import Context, Poller, SubSocket, PubSocket, SocketEventHandle, toggle_fake_events, \
set_fake_prefix, get_fake_prefix, delete_fake_prefix, wait_for_one_event
from msgq.ipc_pyx import MultiplePublishersError, IpcError
from msgq import fake_event_handle, pub_sock, sub_sock, drain_sock_raw
import msgq
import os
import capnp
import time
from typing import Optional, List, Union
from collections import deque
from typing import Optional, List, Union, Dict
from cereal import log
from cereal.services import service_list
assert MultiplePublishersError
assert MessagingError
from cereal.services import SERVICE_LIST
from openpilot.common.util import MovingAverage
NO_TRAVERSAL_LIMIT = 2**64-1
AVG_FREQ_HISTORY = 100
SIMULATION = "SIMULATION" in os.environ
# sec_since_boot is faster, but allow to run standalone too
try:
from common.realtime import sec_since_boot
except ImportError:
import time
sec_since_boot = time.time
print("Warning, using python time.time() instead of faster sec_since_boot")
context = Context()
def reset_context():
msgq.context = Context()
def log_from_bytes(dat: bytes) -> capnp.lib.capnp._DynamicStructReader:
return log.Event.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT)
def new_message(service: Optional[str] = None, size: Optional[int] = None) -> capnp.lib.capnp._DynamicStructBuilder:
dat = log.Event.new_message()
dat.logMonoTime = int(sec_since_boot() * 1e9)
dat.valid = True
def log_from_bytes(dat: bytes, struct: capnp.lib.capnp._StructModule = log.Event) -> capnp.lib.capnp._DynamicStructReader:
with struct.from_bytes(dat, traversal_limit_in_words=NO_TRAVERSAL_LIMIT) as msg:
return msg
def new_message(service: Optional[str], size: Optional[int] = None, **kwargs) -> capnp.lib.capnp._DynamicStructBuilder:
args = {
'valid': False,
'logMonoTime': int(time.monotonic() * 1e9),
**kwargs
}
dat = log.Event.new_message(**args)
if service is not None:
if size is None:
dat.init(service)
@@ -41,56 +41,11 @@ def new_message(service: Optional[str] = None, size: Optional[int] = None) -> ca
dat.init(service, size)
return dat
def pub_sock(endpoint: str) -> PubSocket:
sock = PubSocket()
sock.connect(context, endpoint)
return sock
def sub_sock(endpoint: str, poller: Optional[Poller] = None, addr: str = "127.0.0.1",
conflate: bool = False, timeout: Optional[int] = None) -> SubSocket:
sock = SubSocket()
sock.connect(context, endpoint, addr.encode('utf8'), conflate)
if timeout is not None:
sock.setTimeout(timeout)
if poller is not None:
poller.registerSocket(sock)
return sock
def drain_sock_raw(sock: SubSocket, wait_for_one: bool = False) -> List[bytes]:
"""Receive all message currently available on the queue"""
ret: List[bytes] = []
while 1:
if wait_for_one and len(ret) == 0:
dat = sock.receive()
else:
dat = sock.receive(non_blocking=True)
if dat is None:
break
ret.append(dat)
return ret
def drain_sock(sock: SubSocket, wait_for_one: bool = False) -> List[capnp.lib.capnp._DynamicStructReader]:
"""Receive all message currently available on the queue"""
ret: List[capnp.lib.capnp._DynamicStructReader] = []
while 1:
if wait_for_one and len(ret) == 0:
dat = sock.receive()
else:
dat = sock.receive(non_blocking=True)
if dat is None: # Timeout hit
break
dat = log_from_bytes(dat)
ret.append(dat)
return ret
msgs = drain_sock_raw(sock, wait_for_one=wait_for_one)
return [log_from_bytes(m) for m in msgs]
# TODO: print when we drop packets?
@@ -100,32 +55,35 @@ def recv_sock(sock: SubSocket, wait: bool = False) -> Optional[capnp.lib.capnp._
while 1:
if wait and dat is None:
rcv = sock.receive()
recv = sock.receive()
else:
rcv = sock.receive(non_blocking=True)
recv = sock.receive(non_blocking=True)
if rcv is None: # Timeout hit
if recv is None: # Timeout hit
break
dat = rcv
dat = recv
if dat is not None:
dat = log_from_bytes(dat)
return dat
def recv_one(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]:
dat = sock.receive()
if dat is not None:
dat = log_from_bytes(dat)
return dat
def recv_one_or_none(sock: SubSocket) -> Optional[capnp.lib.capnp._DynamicStructReader]:
dat = sock.receive(non_blocking=True)
if dat is not None:
dat = log_from_bytes(dat)
return dat
def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
"""Keep receiving until we get a message"""
while True:
@@ -133,49 +91,105 @@ def recv_one_retry(sock: SubSocket) -> capnp.lib.capnp._DynamicStructReader:
if dat is not None:
return log_from_bytes(dat)
class SubMaster:
def __init__(self, services: List[str], poll: Optional[List[str]] = None,
ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None,
addr: str = "127.0.0.1"):
self.frame = -1
self.updated = {s: False for s in services}
self.rcv_time = {s: 0. for s in services}
self.rcv_frame = {s: 0 for s in services}
self.alive = {s: False for s in services}
self.freq_ok = {s: False for s in services}
self.recv_dts = {s: deque([0.0] * AVG_FREQ_HISTORY, maxlen=AVG_FREQ_HISTORY) for s in services}
self.sock = {}
self.freq = {}
self.data = {}
self.valid = {}
self.logMonoTime = {}
class FrequencyTracker:
def __init__(self, service_freq: float, update_freq: float, is_poll: bool):
freq = max(min(service_freq, update_freq), 1.)
if is_poll:
min_freq = max_freq = freq
else:
max_freq = min(freq, update_freq)
if service_freq >= 2 * update_freq:
min_freq = update_freq
elif update_freq >= 2* service_freq:
min_freq = freq
else:
min_freq = min(freq, freq / 2.)
self.min_freq = min_freq * 0.8
self.max_freq = max_freq * 1.2
self.avg_dt = MovingAverage(int(10 * freq))
self.recent_avg_dt = MovingAverage(int(freq))
self.prev_time = 0.0
def record_recv_time(self, cur_time: float) -> None:
# TODO: Handle case where cur_time is less than prev_time
if self.prev_time > 1e-5:
dt = cur_time - self.prev_time
self.avg_dt.add_value(dt)
self.recent_avg_dt.add_value(dt)
self.prev_time = cur_time
@property
def valid(self) -> bool:
if self.avg_dt.count == 0:
return False
avg_freq = 1.0 / self.avg_dt.get_average()
if self.min_freq <= avg_freq <= self.max_freq:
return True
avg_freq_recent = 1.0 / self.recent_avg_dt.get_average()
return self.min_freq <= avg_freq_recent <= self.max_freq
class SubMaster:
def __init__(self, services: List[str], poll: Optional[str] = None,
ignore_alive: Optional[List[str]] = None, ignore_avg_freq: Optional[List[str]] = None,
ignore_valid: Optional[List[str]] = None, addr: str = "127.0.0.1", frequency: Optional[float] = None):
self.frame = -1
self.services = services
self.seen = {s: False for s in services}
self.updated = {s: False for s in services}
self.recv_time = {s: 0. for s in services}
self.recv_frame = {s: 0 for s in services}
self.sock = {}
self.data = {}
self.logMonoTime = {s: 0 for s in services}
# zero-frequency / on-demand services are always alive and presumed valid; all others must pass checks
on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in services}
self.static_freq_services = set(s for s in services if not on_demand[s])
self.alive = {s: on_demand[s] for s in services}
self.freq_ok = {s: on_demand[s] for s in services}
self.valid = {s: on_demand[s] for s in services}
self.freq_tracker: Dict[str, FrequencyTracker] = {}
self.poller = Poller()
self.non_polled_services = [s for s in services if poll is not None and
len(poll) and s not in poll]
polled_services = set([poll, ] if poll is not None else services)
self.non_polled_services = set(services) - polled_services
self.ignore_average_freq = [] if ignore_avg_freq is None else ignore_avg_freq
self.ignore_alive = [] if ignore_alive is None else ignore_alive
self.ignore_valid = [] if ignore_valid is None else ignore_valid
self.simulation = bool(int(os.getenv("SIMULATION", "0")))
# if freq and poll aren't specified, assume the max to be conservative
assert frequency is None or poll is None, "Do not specify 'frequency' - frequency of the polled service will be used."
self.update_freq = frequency or max([SERVICE_LIST[s].frequency for s in polled_services])
for s in services:
if addr is not None:
p = self.poller if s not in self.non_polled_services else None
self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
self.freq[s] = service_list[s].frequency
p = self.poller if s not in self.non_polled_services else None
self.sock[s] = sub_sock(s, poller=p, addr=addr, conflate=True)
try:
data = new_message(s)
except capnp.lib.capnp.KjException: # pylint: disable=c-extension-no-member
except capnp.lib.capnp.KjException:
data = new_message(s, 0) # lists
self.data[s] = getattr(data, s)
self.logMonoTime[s] = 0
self.valid[s] = data.valid
self.data[s] = getattr(data.as_reader(), s)
self.freq_tracker[s] = FrequencyTracker(SERVICE_LIST[s].frequency, self.update_freq, s == poll)
def __getitem__(self, s: str) -> capnp.lib.capnp._DynamicStructReader:
return self.data[s]
def update(self, timeout: int = 1000) -> None:
def _check_avg_freq(self, s: str) -> bool:
return SERVICE_LIST[s].frequency > 0.99 and (s not in self.ignore_average_freq) and (s not in self.ignore_alive)
def update(self, timeout: int = 100) -> None:
msgs = []
for sock in self.poller.poll(timeout):
msgs.append(recv_one_or_none(sock))
@@ -183,69 +197,43 @@ class SubMaster:
# non-blocking receive for non-polled sockets
for s in self.non_polled_services:
msgs.append(recv_one_or_none(self.sock[s]))
self.update_msgs(sec_since_boot(), msgs)
self.update_msgs(time.monotonic(), msgs)
def update_msgs(self, cur_time: float, msgs: List[capnp.lib.capnp._DynamicStructReader]) -> None:
self.frame += 1
self.updated = dict.fromkeys(self.updated, False)
self.updated = dict.fromkeys(self.services, False)
for msg in msgs:
if msg is None:
continue
s = msg.which()
self.seen[s] = True
self.updated[s] = True
if self.rcv_time[s] > 1e-5 and self.freq[s] > 1e-5 and (s not in self.non_polled_services) \
and (s not in self.ignore_average_freq):
self.recv_dts[s].append(cur_time - self.rcv_time[s])
self.rcv_time[s] = cur_time
self.rcv_frame[s] = self.frame
self.freq_tracker[s].record_recv_time(cur_time)
self.recv_time[s] = cur_time
self.recv_frame[s] = self.frame
self.data[s] = getattr(msg, s)
self.logMonoTime[s] = msg.logMonoTime
self.valid[s] = msg.valid
if SIMULATION:
self.freq_ok[s] = True
self.alive[s] = True
for s in self.static_freq_services:
# alive if delay is within 10x the expected frequency; checks relaxed in simulator
self.alive[s] = (cur_time - self.recv_time[s]) < (10. / SERVICE_LIST[s].frequency) or (self.seen[s] and self.simulation)
self.freq_ok[s] = self.freq_tracker[s].valid or self.simulation
if not SIMULATION:
for s in self.data:
# arbitrary small number to avoid float comparison. If freq is 0, we can skip the check
if self.freq[s] > 1e-5:
# alive if delay is within 10x the expected frequency
self.alive[s] = (cur_time - self.rcv_time[s]) < (10. / self.freq[s])
def all_alive(self, service_list: Optional[List[str]] = None) -> bool:
return all(self.alive[s] for s in (service_list or self.services) if s not in self.ignore_alive)
# TODO: check if update frequency is high enough to not drop messages
# freq_ok if average frequency is higher than 90% of expected frequency
avg_dt = sum(self.recv_dts[s]) / AVG_FREQ_HISTORY
expected_dt = 1 / (self.freq[s] * 0.90)
self.freq_ok[s] = (avg_dt < expected_dt)
else:
self.freq_ok[s] = True
self.alive[s] = True
def all_freq_ok(self, service_list: Optional[List[str]] = None) -> bool:
return all(self.freq_ok[s] for s in (service_list or self.services) if self._check_avg_freq(s))
def all_alive(self, service_list=None) -> bool:
if service_list is None: # check all
service_list = self.alive.keys()
return all(self.alive[s] for s in service_list if s not in self.ignore_alive)
def all_valid(self, service_list: Optional[List[str]] = None) -> bool:
return all(self.valid[s] for s in (service_list or self.services) if s not in self.ignore_valid)
def all_freq_ok(self, service_list=None) -> bool:
if service_list is None: # check all
service_list = self.alive.keys()
return all(self.freq_ok[s] for s in service_list if s not in self.ignore_alive)
def all_checks(self, service_list: Optional[List[str]] = None) -> bool:
return self.all_alive(service_list) and self.all_freq_ok(service_list) and self.all_valid(service_list)
def all_valid(self, service_list=None) -> bool:
if service_list is None: # check all
service_list = self.valid.keys()
return all(self.valid[s] for s in service_list)
def all_checks(self, service_list=None) -> bool:
if service_list is None: # check all
service_list = self.alive.keys()
return self.all_alive(service_list=service_list) \
and self.all_freq_ok(service_list=service_list) \
and self.all_valid(service_list=service_list)
class PubMaster:
def __init__(self, services: List[str]):
@@ -258,5 +246,12 @@ class PubMaster:
dat = dat.to_bytes()
self.sock[s].send(dat)
def wait_for_readers_to_update(self, s: str, timeout: int, dt: float = 0.05) -> bool:
for _ in range(int(timeout*(1./dt))):
if self.sock[s].all_readers_updated():
return True
time.sleep(dt)
return False
def all_readers_updated(self, s: str) -> bool:
return self.sock[s].all_readers_updated() # type: ignore
Binary file not shown.
+19 -62
View File
@@ -1,68 +1,16 @@
#pragma once
#include <cstddef>
#include <map>
#include <string>
#include <vector>
#include <utility>
#include <capnp/serialize.h>
#include "../gen/cpp/log.capnp.h"
#ifdef __APPLE__
#define CLOCK_BOOTTIME CLOCK_MONOTONIC
#endif
#define MSG_MULTIPLE_PUBLISHERS 100
bool messaging_use_zmq();
class Context {
public:
virtual void * getRawContext() = 0;
static Context * create();
virtual ~Context(){};
};
class Message {
public:
virtual void init(size_t size) = 0;
virtual void init(char * data, size_t size) = 0;
virtual void close() = 0;
virtual size_t getSize() = 0;
virtual char * getData() = 0;
virtual ~Message(){};
};
class SubSocket {
public:
virtual int connect(Context *context, std::string endpoint, std::string address, bool conflate=false, bool check_endpoint=true) = 0;
virtual void setTimeout(int timeout) = 0;
virtual Message *receive(bool non_blocking=false) = 0;
virtual void * getRawSocket() = 0;
static SubSocket * create();
static SubSocket * create(Context * context, std::string endpoint, std::string address="127.0.0.1", bool conflate=false, bool check_endpoint=true);
virtual ~SubSocket(){};
};
class PubSocket {
public:
virtual int connect(Context *context, std::string endpoint, bool check_endpoint=true) = 0;
virtual int sendMessage(Message *message) = 0;
virtual int send(char *data, size_t size) = 0;
virtual bool all_readers_updated() = 0;
static PubSocket * create();
static PubSocket * create(Context * context, std::string endpoint, bool check_endpoint=true);
static PubSocket * create(Context * context, std::string endpoint, int port, bool check_endpoint=true);
virtual ~PubSocket(){};
};
class Poller {
public:
virtual void registerSocket(SubSocket *socket) = 0;
virtual std::vector<SubSocket*> poll(int timeout) = 0;
static Poller * create();
static Poller * create(std::vector<SubSocket*> sockets);
virtual ~Poller(){};
};
#include "cereal/gen/cpp/log.capnp.h"
#include "common/timing.h"
#include "msgq/ipc.h"
class SubMaster {
public:
@@ -98,10 +46,7 @@ public:
cereal::Event::Builder initEvent(bool valid = true) {
cereal::Event::Builder event = initRoot<cereal::Event>();
struct timespec t;
clock_gettime(CLOCK_BOOTTIME, &t);
uint64_t current_time = t.tv_sec * 1000000000ULL + t.tv_nsec;
event.setLogMonoTime(current_time);
event.setLogMonoTime(nanos_since_boot());
event.setValid(valid);
return event;
}
@@ -111,6 +56,18 @@ public:
return heapArray_.asBytes();
}
size_t getSerializedSize() {
return capnp::computeSerializedSizeInWords(*this) * sizeof(capnp::word);
}
int serializeToBuffer(unsigned char *buffer, size_t buffer_size) {
size_t serialized_size = getSerializedSize();
if (serialized_size > buffer_size) { return -1; }
kj::ArrayOutputStream out(kj::ArrayPtr<capnp::byte>(buffer, buffer_size));
capnp::writeMessage(out, *this);
return serialized_size;
}
private:
kj::Array<capnp::word> heapArray_;
};
-40
View File
@@ -1,40 +0,0 @@
# distutils: language = c++
#cython: language_level=3
from libcpp.string cimport string
from libcpp.vector cimport vector
from libcpp cimport bool
cdef extern from "messaging.h":
cdef cppclass Context:
@staticmethod
Context * create()
cdef cppclass Message:
void init(size_t)
void init(char *, size_t)
void close()
size_t getSize()
char *getData()
cdef cppclass SubSocket:
@staticmethod
SubSocket * create()
int connect(Context *, string, string, bool)
Message * receive(bool)
void setTimeout(int)
cdef cppclass PubSocket:
@staticmethod
PubSocket * create()
int connect(Context *, string)
int sendMessage(Message *)
int send(char *, size_t)
bool all_readers_updated()
cdef cppclass Poller:
@staticmethod
Poller * create()
void registerSocket(SubSocket *)
vector[SubSocket*] poll(int) nogil
File diff suppressed because it is too large Load Diff
-154
View File
@@ -1,154 +0,0 @@
# distutils: language = c++
# cython: c_string_encoding=ascii, language_level=3
import sys
from libcpp.string cimport string
from libcpp cimport bool
from libc cimport errno
from .messaging cimport Context as cppContext
from .messaging cimport SubSocket as cppSubSocket
from .messaging cimport PubSocket as cppPubSocket
from .messaging cimport Poller as cppPoller
from .messaging cimport Message as cppMessage
class MessagingError(Exception):
pass
class MultiplePublishersError(MessagingError):
pass
cdef class Context:
cdef cppContext * context
def __cinit__(self):
self.context = cppContext.create()
def term(self):
del self.context
self.context = NULL
def __dealloc__(self):
pass
# Deleting the context will hang if sockets are still active
# TODO: Figure out a way to make sure the context is closed last
# del self.context
cdef class Poller:
cdef cppPoller * poller
cdef list sub_sockets
def __cinit__(self):
self.sub_sockets = []
self.poller = cppPoller.create()
def __dealloc__(self):
del self.poller
def registerSocket(self, SubSocket socket):
self.sub_sockets.append(socket)
self.poller.registerSocket(socket.socket)
def poll(self, timeout):
sockets = []
cdef int t = timeout
with nogil:
result = self.poller.poll(t)
for s in result:
socket = SubSocket()
socket.setPtr(s)
sockets.append(socket)
return sockets
cdef class SubSocket:
cdef cppSubSocket * socket
cdef bool is_owner
def __cinit__(self):
self.socket = cppSubSocket.create()
self.is_owner = True
if self.socket == NULL:
raise MessagingError
def __dealloc__(self):
if self.is_owner:
del self.socket
cdef setPtr(self, cppSubSocket * ptr):
if self.is_owner:
del self.socket
self.is_owner = False
self.socket = ptr
def connect(self, Context context, string endpoint, string address=b"127.0.0.1", bool conflate=False):
r = self.socket.connect(context.context, endpoint, address, conflate)
if r != 0:
if errno.errno == errno.EADDRINUSE:
raise MultiplePublishersError
else:
raise MessagingError
def setTimeout(self, int timeout):
self.socket.setTimeout(timeout)
def receive(self, bool non_blocking=False):
msg = self.socket.receive(non_blocking)
if msg == NULL:
# If a blocking read returns no message check errno if SIGINT was caught in the C++ code
if errno.errno == errno.EINTR:
print("SIGINT received, exiting")
sys.exit(1)
return None
else:
sz = msg.getSize()
m = msg.getData()[:sz]
del msg
return m
cdef class PubSocket:
cdef cppPubSocket * socket
def __cinit__(self):
self.socket = cppPubSocket.create()
if self.socket == NULL:
raise MessagingError
def __dealloc__(self):
del self.socket
def connect(self, Context context, string endpoint):
r = self.socket.connect(context.context, endpoint)
if r != 0:
if errno.errno == errno.EADDRINUSE:
raise MultiplePublishersError
else:
raise MessagingError
def send(self, bytes data):
length = len(data)
r = self.socket.send(<char*>data, length)
if r != length:
if errno.errno == errno.EADDRINUSE:
raise MultiplePublishersError
else:
raise MessagingError
def all_readers_updated(self):
return self.socket.all_readers_updated()
Binary file not shown.
+37
View File
@@ -0,0 +1,37 @@
#pragma once
#include <condition_variable>
#include <map>
#include <memory>
#include <mutex>
#include <string>
#include <vector>
#define private public
#include "msgq/impl_msgq.h"
#include "msgq/impl_zmq.h"
class MsgqToZmq {
public:
MsgqToZmq() {}
void run(const std::vector<std::string> &endpoints, const std::string &ip);
protected:
void registerSockets();
void zmqMonitorThread();
struct SocketPair {
std::string endpoint;
std::unique_ptr<ZMQPubSocket> pub_sock;
std::unique_ptr<MSGQSubSocket> sub_sock;
int connected_clients = 0;
};
std::unique_ptr<MSGQContext> msgq_context;
std::unique_ptr<ZMQContext> zmq_context;
std::mutex mutex;
std::condition_variable cv;
std::unique_ptr<MSGQPoller> msgq_poller;
std::map<SubSocket *, ZMQPubSocket *> sub2pub;
std::vector<SocketPair> socket_pairs;
};
+185
View File
@@ -0,0 +1,185 @@
import os
import capnp
import multiprocessing
import numbers
import random
import threading
import time
from parameterized import parameterized
import pytest
from cereal import log, car
import cereal.messaging as messaging
from cereal.services import SERVICE_LIST
events = [evt for evt in log.Event.schema.union_fields if evt in SERVICE_LIST.keys()]
def random_sock():
return random.choice(events)
def random_socks(num_socks=10):
return list({random_sock() for _ in range(num_socks)})
def random_bytes(length=1000):
return bytes([random.randrange(0xFF) for _ in range(length)])
def zmq_sleep(t=1):
if "ZMQ" in os.environ:
time.sleep(t)
# TODO: this should take any capnp struct and returrn a msg with random populated data
def random_carstate():
fields = ["vEgo", "aEgo", "brake", "steeringAngleDeg"]
msg = messaging.new_message("carState")
cs = msg.carState
for f in fields:
setattr(cs, f, random.random() * 10)
return msg
# TODO: this should compare any capnp structs
def assert_carstate(cs1, cs2):
for f in car.CarState.schema.non_union_fields:
# TODO: check all types
val1, val2 = getattr(cs1, f), getattr(cs2, f)
if isinstance(val1, numbers.Number):
assert val1 == val2, f"{f}: sent '{val1}' vs recvd '{val2}'"
def delayed_send(delay, sock, dat):
def send_func():
sock.send(dat)
threading.Timer(delay, send_func).start()
class TestMessaging:
def setUp(self):
# TODO: ZMQ tests are too slow; all sleeps will need to be
# replaced with logic to block on the necessary condition
if "ZMQ" in os.environ:
pytest.skip()
# ZMQ pub socket takes too long to die
# sleep to prevent multiple publishers error between tests
zmq_sleep()
@parameterized.expand(events)
def test_new_message(self, evt):
try:
msg = messaging.new_message(evt)
except capnp.lib.capnp.KjException:
msg = messaging.new_message(evt, random.randrange(200))
assert (time.monotonic() - msg.logMonoTime) < 0.1
assert not msg.valid
assert evt == msg.which()
@parameterized.expand(events)
def test_pub_sock(self, evt):
messaging.pub_sock(evt)
@parameterized.expand(events)
def test_sub_sock(self, evt):
messaging.sub_sock(evt)
@parameterized.expand([
(messaging.drain_sock, capnp._DynamicStructReader),
(messaging.drain_sock_raw, bytes),
])
def test_drain_sock(self, func, expected_type):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sub_sock = messaging.sub_sock(sock, timeout=1000)
zmq_sleep()
# no wait and no msgs in queue
msgs = func(sub_sock)
assert isinstance(msgs, list)
assert len(msgs) == 0
# no wait but msgs are queued up
num_msgs = random.randrange(3, 10)
for _ in range(num_msgs):
pub_sock.send(messaging.new_message(sock).to_bytes())
time.sleep(0.1)
msgs = func(sub_sock)
assert isinstance(msgs, list)
assert all(isinstance(msg, expected_type) for msg in msgs)
assert len(msgs) == num_msgs
def test_recv_sock(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sub_sock = messaging.sub_sock(sock, timeout=100)
zmq_sleep()
# no wait and no msg in queue, socket should timeout
recvd = messaging.recv_sock(sub_sock)
assert recvd is None
# no wait and one msg in queue
msg = random_carstate()
pub_sock.send(msg.to_bytes())
time.sleep(0.01)
recvd = messaging.recv_sock(sub_sock)
assert isinstance(recvd, capnp._DynamicStructReader)
# https://github.com/python/mypy/issues/13038
assert_carstate(msg.carState, recvd.carState)
def test_recv_one(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sub_sock = messaging.sub_sock(sock, timeout=1000)
zmq_sleep()
# no msg in queue, socket should timeout
recvd = messaging.recv_one(sub_sock)
assert recvd is None
# one msg in queue
msg = random_carstate()
pub_sock.send(msg.to_bytes())
recvd = messaging.recv_one(sub_sock)
assert isinstance(recvd, capnp._DynamicStructReader)
assert_carstate(msg.carState, recvd.carState)
@pytest.mark.xfail(condition="ZMQ" in os.environ, reason='ZMQ detected')
def test_recv_one_or_none(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sub_sock = messaging.sub_sock(sock)
zmq_sleep()
# no msg in queue, socket shouldn't block
recvd = messaging.recv_one_or_none(sub_sock)
assert recvd is None
# one msg in queue
msg = random_carstate()
pub_sock.send(msg.to_bytes())
recvd = messaging.recv_one_or_none(sub_sock)
assert isinstance(recvd, capnp._DynamicStructReader)
assert_carstate(msg.carState, recvd.carState)
def test_recv_one_retry(self):
sock = "carState"
sock_timeout = 0.1
pub_sock = messaging.pub_sock(sock)
sub_sock = messaging.sub_sock(sock, timeout=round(sock_timeout*1000))
zmq_sleep()
# this test doesn't work with ZMQ since multiprocessing interrupts it
if "ZMQ" not in os.environ:
# wait 5 socket timeouts and make sure it's still retrying
p = multiprocessing.Process(target=messaging.recv_one_retry, args=(sub_sock,))
p.start()
time.sleep(sock_timeout*5)
assert p.is_alive()
p.terminate()
# wait 5 socket timeouts before sending
msg = random_carstate()
start_time = time.monotonic()
delayed_send(sock_timeout*5, pub_sock, msg.to_bytes())
recvd = messaging.recv_one_retry(sub_sock)
assert (time.monotonic() - start_time) >= sock_timeout*5
assert isinstance(recvd, capnp._DynamicStructReader)
assert_carstate(msg.carState, recvd.carState)
@@ -0,0 +1,160 @@
import random
import time
from typing import Sized, cast
import cereal.messaging as messaging
from cereal.messaging.tests.test_messaging import events, random_sock, random_socks, \
random_bytes, random_carstate, assert_carstate, \
zmq_sleep
from cereal.services import SERVICE_LIST
class TestSubMaster:
def setup_method(self):
# ZMQ pub socket takes too long to die
# sleep to prevent multiple publishers error between tests
zmq_sleep(3)
def test_init(self):
sm = messaging.SubMaster(events)
for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive,
sm.sock, sm.data, sm.logMonoTime, sm.valid]:
assert len(cast(Sized, p)) == len(events)
def test_init_state(self):
socks = random_socks()
sm = messaging.SubMaster(socks)
assert sm.frame == -1
assert not any(sm.updated.values())
assert not any(sm.seen.values())
on_demand = {s: SERVICE_LIST[s].frequency <= 1e-5 for s in sm.services}
assert all(sm.alive[s] == sm.valid[s] == sm.freq_ok[s] == on_demand[s] for s in sm.services)
assert all(t == 0. for t in sm.recv_time.values())
assert all(f == 0 for f in sm.recv_frame.values())
assert all(t == 0 for t in sm.logMonoTime.values())
for p in [sm.updated, sm.recv_time, sm.recv_frame, sm.alive,
sm.sock, sm.data, sm.logMonoTime, sm.valid]:
assert len(cast(Sized, p)) == len(socks)
def test_getitem(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sm = messaging.SubMaster([sock,])
zmq_sleep()
msg = random_carstate()
pub_sock.send(msg.to_bytes())
sm.update(1000)
assert_carstate(msg.carState, sm[sock])
# TODO: break this test up to individually test SubMaster.update and SubMaster.update_msgs
def test_update(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sm = messaging.SubMaster([sock,])
zmq_sleep()
for i in range(10):
msg = messaging.new_message(sock)
pub_sock.send(msg.to_bytes())
sm.update(1000)
assert sm.frame == i
assert all(sm.updated.values())
def test_update_timeout(self):
sock = random_sock()
sm = messaging.SubMaster([sock,])
timeout = random.randrange(1000, 3000)
start_time = time.monotonic()
sm.update(timeout)
t = time.monotonic() - start_time
assert t >= timeout/1000.
assert t < 3
assert not any(sm.updated.values())
def test_avg_frequency_checks(self):
for poll in (True, False):
sm = messaging.SubMaster(["modelV2", "carParams", "carState", "cameraOdometry", "liveCalibration"],
poll=("modelV2" if poll else None),
frequency=(20. if not poll else None))
checks = {
"carState": (20, 20),
"modelV2": (20, 20 if poll else 10),
"cameraOdometry": (20, 10),
"liveCalibration": (4, 4),
"carParams": (None, None),
"userBookmark": (None, None),
}
for service, (max_freq, min_freq) in checks.items():
if max_freq is not None:
assert sm._check_avg_freq(service)
assert sm.freq_tracker[service].max_freq == max_freq*1.2
assert sm.freq_tracker[service].min_freq == min_freq*0.8
else:
assert not sm._check_avg_freq(service)
def test_alive(self):
pass
def test_ignore_alive(self):
pass
def test_valid(self):
pass
# SubMaster should always conflate
def test_conflate(self):
sock = "carState"
pub_sock = messaging.pub_sock(sock)
sm = messaging.SubMaster([sock,])
n = 10
for i in range(n+1):
msg = messaging.new_message(sock)
msg.carState.vEgo = i
pub_sock.send(msg.to_bytes())
time.sleep(0.01)
sm.update(1000)
assert sm[sock].vEgo == n
class TestPubMaster:
def setup_method(self):
# ZMQ pub socket takes too long to die
# sleep to prevent multiple publishers error between tests
zmq_sleep(3)
def test_init(self):
messaging.PubMaster(events)
def test_send(self):
socks = random_socks()
pm = messaging.PubMaster(socks)
sub_socks = {s: messaging.sub_sock(s, conflate=True, timeout=1000) for s in socks}
zmq_sleep()
# PubMaster accepts either a capnp msg builder or bytes
for capnp in [True, False]:
for i in range(100):
sock = socks[i % len(socks)]
if capnp:
try:
msg = messaging.new_message(sock)
except Exception:
msg = messaging.new_message(sock, random.randrange(50))
else:
msg = random_bytes()
pm.send(sock, msg)
recvd = sub_socks[sock].receive()
if capnp:
msg.clear_write_flag()
msg = msg.to_bytes()
assert msg == recvd, i
+21
View File
@@ -0,0 +1,21 @@
import os
import tempfile
from typing import Dict
from parameterized import parameterized
import cereal.services as services
from cereal.services import SERVICE_LIST
class TestServices:
@parameterized.expand(SERVICE_LIST.keys())
def test_services(self, s):
service = SERVICE_LIST[s]
assert service.frequency <= 104
assert service.decimation != 0
def test_generated_header(self):
with tempfile.NamedTemporaryFile(suffix=".h") as f:
ret = os.system(f"python3 {services.__file__} > {f.name} && clang++ {f.name} -std=c++11")
assert ret == 0, "generated services header is not valid C"
+87 -56
View File
@@ -1,62 +1,93 @@
/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT services.py */
#ifndef __SERVICES_H
#define __SERVICES_H
struct service { char name[0x100]; int port; bool should_log; int frequency; int decimation; };
static struct service services[] = {
{ "sensorEvents", 8001, true, 100, 100 },
{ "gpsNMEA", 8002, true, 9, -1 },
{ "deviceState", 8003, true, 2, 1 },
{ "can", 8004, true, 100, -1 },
{ "controlsState", 8005, true, 100, 10 },
{ "pandaStates", 8006, true, 2, 1 },
{ "peripheralState", 8007, true, 2, 1 },
{ "radarState", 8008, true, 20, 5 },
{ "roadEncodeIdx", 8009, false, 20, 1 },
{ "liveTracks", 8010, true, 20, -1 },
{ "sendcan", 8011, true, 100, 139 },
{ "logMessage", 8012, true, 0, -1 },
{ "errorLogMessage", 8013, true, 0, 1 },
{ "liveCalibration", 8014, true, 4, 4 },
{ "androidLog", 8015, true, 0, -1 },
{ "carState", 8016, true, 100, 10 },
{ "carControl", 8017, true, 100, 10 },
{ "longitudinalPlan", 8018, true, 20, 5 },
{ "procLog", 8019, true, 0, -1 },
{ "gpsLocationExternal", 8020, true, 10, 10 },
{ "gpsLocation", 8021, true, 1, 1 },
{ "ubloxGnss", 8023, true, 10, -1 },
{ "qcomGnss", 8024, true, 2, -1 },
{ "gnssMeasurements", 8025, true, 10, 10 },
{ "clocks", 8026, true, 1, 1 },
{ "ubloxRaw", 8027, true, 20, -1 },
{ "liveLocationKalman", 8028, true, 20, 5 },
{ "liveParameters", 8029, true, 20, 5 },
{ "cameraOdometry", 8030, true, 20, 5 },
{ "lateralPlan", 8031, true, 20, 5 },
{ "thumbnail", 8032, true, 0, 1 },
{ "carEvents", 8033, true, 1, 1 },
{ "carParams", 8034, true, 0, 1 },
{ "roadCameraState", 8035, true, 20, 20 },
{ "driverCameraState", 8036, true, 20, 20 },
{ "driverEncodeIdx", 8037, false, 20, 1 },
{ "driverStateV2", 8038, true, 20, 10 },
{ "driverMonitoringState", 8039, true, 20, 10 },
{ "wideRoadEncodeIdx", 8040, false, 20, 1 },
{ "wideRoadCameraState", 8041, true, 20, 20 },
{ "modelV2", 8042, true, 20, 40 },
{ "managerState", 8043, true, 2, 1 },
{ "uploaderState", 8044, true, 0, 1 },
{ "navInstruction", 8045, true, 1, 10 },
{ "navRoute", 8046, true, 0, -1 },
{ "navThumbnail", 8047, true, 0, -1 },
{ "qRoadEncodeIdx", 8048, false, 20, -1 },
{ "testJoystick", 8049, true, 0, -1 },
{ "roadEncodeData", 8050, false, 20, -1 },
{ "driverEncodeData", 8051, false, 20, -1 },
{ "wideRoadEncodeData", 8052, false, 20, -1 },
{ "qRoadEncodeData", 8053, false, 20, -1 },
{ "dragonConf", 8054, false, 1, -1 },
{ "liveMapData", 8055, true, 0, -1 },
#include <map>
#include <string>
struct service { std::string name; bool should_log; float frequency; int decimation; };
static std::map<std::string, service> services = {
{ "gyroscope", {"gyroscope", true, 104.000000, 104}},
{ "gyroscope2", {"gyroscope2", true, 100.000000, 100}},
{ "accelerometer", {"accelerometer", true, 104.000000, 104}},
{ "accelerometer2", {"accelerometer2", true, 100.000000, 100}},
{ "magnetometer", {"magnetometer", true, 25.000000, -1}},
{ "lightSensor", {"lightSensor", true, 100.000000, 100}},
{ "temperatureSensor", {"temperatureSensor", true, 2.000000, 200}},
{ "temperatureSensor2", {"temperatureSensor2", true, 2.000000, 200}},
{ "gpsNMEA", {"gpsNMEA", true, 9.000000, -1}},
{ "deviceState", {"deviceState", true, 2.000000, 1}},
{ "touch", {"touch", true, 20.000000, 1}},
{ "can", {"can", true, 100.000000, 2053}},
{ "controlsState", {"controlsState", true, 100.000000, 10}},
{ "selfdriveState", {"selfdriveState", true, 100.000000, 10}},
{ "pandaStates", {"pandaStates", true, 10.000000, 1}},
{ "peripheralState", {"peripheralState", true, 2.000000, 1}},
{ "radarState", {"radarState", true, 20.000000, 5}},
{ "roadEncodeIdx", {"roadEncodeIdx", false, 20.000000, 1}},
{ "liveTracks", {"liveTracks", true, 20.000000, -1}},
{ "sendcan", {"sendcan", true, 100.000000, 139}},
{ "logMessage", {"logMessage", true, 0.000000, -1}},
{ "errorLogMessage", {"errorLogMessage", true, 0.000000, 1}},
{ "liveCalibration", {"liveCalibration", true, 4.000000, 4}},
{ "liveTorqueParameters", {"liveTorqueParameters", true, 4.000000, 1}},
{ "liveDelay", {"liveDelay", true, 4.000000, 1}},
{ "androidLog", {"androidLog", true, 0.000000, -1}},
{ "carState", {"carState", true, 100.000000, 10}},
{ "carControl", {"carControl", true, 100.000000, 10}},
{ "carOutput", {"carOutput", true, 100.000000, 10}},
{ "longitudinalPlan", {"longitudinalPlan", true, 20.000000, 10}},
{ "driverAssistance", {"driverAssistance", true, 20.000000, 20}},
{ "procLog", {"procLog", true, 0.500000, 15}},
{ "gpsLocationExternal", {"gpsLocationExternal", true, 10.000000, 10}},
{ "gpsLocation", {"gpsLocation", true, 1.000000, 1}},
{ "ubloxGnss", {"ubloxGnss", true, 10.000000, -1}},
{ "qcomGnss", {"qcomGnss", true, 2.000000, -1}},
{ "gnssMeasurements", {"gnssMeasurements", true, 10.000000, 10}},
{ "clocks", {"clocks", true, 0.100000, 1}},
{ "ubloxRaw", {"ubloxRaw", true, 20.000000, -1}},
{ "livePose", {"livePose", true, 20.000000, 4}},
{ "liveParameters", {"liveParameters", true, 20.000000, 5}},
{ "cameraOdometry", {"cameraOdometry", true, 20.000000, 10}},
{ "thumbnail", {"thumbnail", true, 0.016667, 1}},
{ "onroadEvents", {"onroadEvents", true, 1.000000, 1}},
{ "carParams", {"carParams", true, 0.020000, 1}},
{ "roadCameraState", {"roadCameraState", true, 20.000000, 20}},
{ "driverCameraState", {"driverCameraState", true, 20.000000, 20}},
{ "driverEncodeIdx", {"driverEncodeIdx", false, 20.000000, 1}},
{ "driverStateV2", {"driverStateV2", true, 20.000000, 10}},
{ "driverMonitoringState", {"driverMonitoringState", true, 20.000000, 10}},
{ "wideRoadEncodeIdx", {"wideRoadEncodeIdx", false, 20.000000, 1}},
{ "wideRoadCameraState", {"wideRoadCameraState", true, 20.000000, 20}},
{ "drivingModelData", {"drivingModelData", true, 20.000000, 10}},
{ "modelV2", {"modelV2", true, 20.000000, -1}},
{ "managerState", {"managerState", true, 2.000000, 1}},
{ "uploaderState", {"uploaderState", true, 0.000000, 1}},
{ "navInstruction", {"navInstruction", true, 1.000000, 10}},
{ "navRoute", {"navRoute", true, 0.000000, -1}},
{ "navThumbnail", {"navThumbnail", true, 0.000000, -1}},
{ "qRoadEncodeIdx", {"qRoadEncodeIdx", false, 20.000000, -1}},
{ "userBookmark", {"userBookmark", true, 0.000000, 1}},
{ "soundPressure", {"soundPressure", true, 10.000000, 10}},
{ "rawAudioData", {"rawAudioData", false, 20.000000, -1}},
{ "bookmarkButton", {"bookmarkButton", true, 0.000000, 1}},
{ "audioFeedback", {"audioFeedback", true, 0.000000, 1}},
{ "uiDebug", {"uiDebug", true, 0.000000, 1}},
{ "testJoystick", {"testJoystick", true, 0.000000, -1}},
{ "alertDebug", {"alertDebug", true, 20.000000, 5}},
{ "roadEncodeData", {"roadEncodeData", false, 20.000000, -1}},
{ "driverEncodeData", {"driverEncodeData", false, 20.000000, -1}},
{ "wideRoadEncodeData", {"wideRoadEncodeData", false, 20.000000, -1}},
{ "qRoadEncodeData", {"qRoadEncodeData", false, 20.000000, -1}},
{ "livestreamWideRoadEncodeIdx", {"livestreamWideRoadEncodeIdx", false, 20.000000, -1}},
{ "livestreamRoadEncodeIdx", {"livestreamRoadEncodeIdx", false, 20.000000, -1}},
{ "livestreamDriverEncodeIdx", {"livestreamDriverEncodeIdx", false, 20.000000, -1}},
{ "livestreamWideRoadEncodeData", {"livestreamWideRoadEncodeData", false, 20.000000, -1}},
{ "livestreamRoadEncodeData", {"livestreamRoadEncodeData", false, 20.000000, -1}},
{ "livestreamDriverEncodeData", {"livestreamDriverEncodeData", false, 20.000000, -1}},
{ "customReservedRawData0", {"customReservedRawData0", true, 0.000000, -1}},
{ "customReservedRawData1", {"customReservedRawData1", true, 0.000000, -1}},
{ "customReservedRawData2", {"customReservedRawData2", true, 0.000000, -1}},
{ "dpControlsState", {"dpControlsState", false, 100.000000, 10}},
{ "modelExt", {"modelExt", true, 20.000000, -1}},
};
#endif
+57 -34
View File
@@ -1,32 +1,32 @@
#!/usr/bin/env python3
from typing import Optional
RESERVED_PORT = 8022 # sshd
STARTING_PORT = 8001
def new_port(port: int):
port += STARTING_PORT
return port + 1 if port >= RESERVED_PORT else port
class Service:
def __init__(self, port: int, should_log: bool, frequency: float, decimation: Optional[int] = None):
self.port = port
def __init__(self, should_log: bool, frequency: float, decimation: Optional[int] = None):
self.should_log = should_log
self.frequency = frequency
self.decimation = decimation
services = {
_services: dict[str, tuple] = {
# service: (should_log, frequency, qlog decimation (optional))
# note: the "EncodeIdx" packets will still be in the log
"sensorEvents": (True, 100., 100),
"gyroscope": (True, 104., 104),
"gyroscope2": (True, 100., 100),
"accelerometer": (True, 104., 104),
"accelerometer2": (True, 100., 100),
"magnetometer": (True, 25.),
"lightSensor": (True, 100., 100),
"temperatureSensor": (True, 2., 200),
"temperatureSensor2": (True, 2., 200),
"gpsNMEA": (True, 9.),
"deviceState": (True, 2., 1),
"can": (True, 100.),
"touch": (True, 20., 1),
"can": (True, 100., 2053), # decimation gives ~3 msgs in a full segment
"controlsState": (True, 100., 10),
"pandaStates": (True, 2., 1),
"selfdriveState": (True, 100., 10),
"pandaStates": (True, 10., 1),
"peripheralState": (True, 2., 1),
"radarState": (True, 20., 5),
"roadEncodeIdx": (False, 20., 1),
@@ -35,24 +35,27 @@ services = {
"logMessage": (True, 0.),
"errorLogMessage": (True, 0., 1),
"liveCalibration": (True, 4., 4),
"liveTorqueParameters": (True, 4., 1),
"liveDelay": (True, 4., 1),
"androidLog": (True, 0.),
"carState": (True, 100., 10),
"carControl": (True, 100., 10),
"longitudinalPlan": (True, 20., 5),
"procLog": (True, 0.5),
"carOutput": (True, 100., 10),
"longitudinalPlan": (True, 20., 10),
"driverAssistance": (True, 20., 20),
"procLog": (True, 0.5, 15),
"gpsLocationExternal": (True, 10., 10),
"gpsLocation": (True, 1., 1),
"ubloxGnss": (True, 10.),
"qcomGnss": (True, 2.),
"gnssMeasurements": (True, 10., 10),
"clocks": (True, 1., 1),
"clocks": (True, 0.1, 1),
"ubloxRaw": (True, 20.),
"liveLocationKalman": (True, 20., 5),
"livePose": (True, 20., 4),
"liveParameters": (True, 20., 5),
"cameraOdometry": (True, 20., 5),
"lateralPlan": (True, 20., 5),
"thumbnail": (True, 0.2, 1),
"carEvents": (True, 1., 1),
"cameraOdometry": (True, 20., 10),
"thumbnail": (True, 1 / 60., 1),
"onroadEvents": (True, 1., 1),
"carParams": (True, 0.02, 1),
"roadCameraState": (True, 20., 20),
"driverCameraState": (True, 20., 20),
@@ -61,27 +64,42 @@ services = {
"driverMonitoringState": (True, 20., 10),
"wideRoadEncodeIdx": (False, 20., 1),
"wideRoadCameraState": (True, 20., 20),
"modelV2": (True, 20., 40),
"drivingModelData": (True, 20., 10),
"modelV2": (True, 20.),
"managerState": (True, 2., 1),
"uploaderState": (True, 0., 1),
"navInstruction": (True, 1., 10),
"navRoute": (True, 0.),
"navThumbnail": (True, 0.),
"qRoadEncodeIdx": (False, 20.),
"userBookmark": (True, 0., 1),
"soundPressure": (True, 10., 10),
"rawAudioData": (False, 20.),
"bookmarkButton": (True, 0., 1),
"audioFeedback": (True, 0., 1),
# debug
"uiDebug": (True, 0., 1),
"testJoystick": (True, 0.),
"alertDebug": (True, 20., 5),
"roadEncodeData": (False, 20.),
"driverEncodeData": (False, 20.),
"wideRoadEncodeData": (False, 20.),
"qRoadEncodeData": (False, 20.),
# dp
"dragonConf": (False, 1.),
"liveMapData": (True, 0.),
"livestreamWideRoadEncodeIdx": (False, 20.),
"livestreamRoadEncodeIdx": (False, 20.),
"livestreamDriverEncodeIdx": (False, 20.),
"livestreamWideRoadEncodeData": (False, 20.),
"livestreamRoadEncodeData": (False, 20.),
"livestreamDriverEncodeData": (False, 20.),
"customReservedRawData0": (True, 0.),
"customReservedRawData1": (True, 0.),
"customReservedRawData2": (True, 0.),
"dpControlsState": (False, 100., 10),
"modelExt": (True, 20.),
}
service_list = {name: Service(new_port(idx), *vals) for # type: ignore
idx, (name, vals) in enumerate(services.items())}
SERVICE_LIST = {name: Service(*vals) for
idx, (name, vals) in enumerate(_services.items())}
def build_header():
@@ -89,14 +107,19 @@ def build_header():
h += "/* THIS IS AN AUTOGENERATED FILE, PLEASE EDIT services.py */\n"
h += "#ifndef __SERVICES_H\n"
h += "#define __SERVICES_H\n"
h += "struct service { char name[0x100]; int port; bool should_log; int frequency; int decimation; };\n"
h += "static struct service services[] = {\n"
for k, v in service_list.items():
h += "#include <map>\n"
h += "#include <string>\n"
h += "struct service { std::string name; bool should_log; float frequency; int decimation; };\n"
h += "static std::map<std::string, service> services = {\n"
for k, v in SERVICE_LIST.items():
should_log = "true" if v.should_log else "false"
decimation = -1 if v.decimation is None else v.decimation
h += ' { "%s", %d, %s, %d, %d },\n' % \
(k, v.port, should_log, v.frequency, decimation)
h += ' { "%s", {"%s", %s, %f, %d}},\n' % \
(k, k, should_log, v.frequency, decimation)
h += "};\n"
h += "#endif\n"
return h
-4
View File
@@ -1,4 +0,0 @@
from cereal.visionipc.visionipc_pyx import VisionIpcClient, VisionIpcServer, VisionStreamType # pylint: disable=no-name-in-module, import-error
assert VisionIpcClient
assert VisionIpcServer
assert VisionStreamType
-7
View File
@@ -1,7 +0,0 @@
#pragma once
#include <cstddef>
int ipc_connect(const char* socket_path);
int ipc_bind(const char* socket_path);
int ipc_sendrecv_with_fds(bool send, int fd, void *buf, size_t buf_size, int* fds, int num_fds,
int *out_num_fds);
-18
View File
@@ -1,18 +0,0 @@
#pragma once
#include <cstdint>
#include <cstddef>
constexpr int VISIONIPC_MAX_FDS = 128;
struct VisionIpcBufExtra {
uint32_t frame_id;
uint64_t timestamp_sof;
uint64_t timestamp_eof;
};
struct VisionIpcPacket {
uint64_t server_id;
size_t idx;
struct VisionIpcBufExtra extra;
};
-42
View File
@@ -1,42 +0,0 @@
# distutils: language = c++
#cython: language_level=3
from libcpp.string cimport string
from libcpp.vector cimport vector
from libc.stdint cimport uint32_t, uint64_t
from libcpp cimport bool
cdef extern from "visionbuf.h":
cdef enum VisionStreamType:
pass
cdef cppclass VisionBuf:
void * addr
size_t len
size_t width
size_t height
size_t stride
size_t uv_offset
void set_frame_id(uint64_t id)
cdef extern from "visionipc.h":
struct VisionIpcBufExtra:
uint32_t frame_id
uint64_t timestamp_sof
uint64_t timestamp_eof
cdef extern from "visionipc_server.h":
cdef cppclass VisionIpcServer:
VisionIpcServer(string, void*, void*)
void create_buffers(VisionStreamType, size_t, bool, size_t, size_t)
void create_buffers_with_sizes(VisionStreamType, size_t, bool, size_t, size_t, size_t, size_t, size_t)
VisionBuf * get_buffer(VisionStreamType)
void send(VisionBuf *, VisionIpcBufExtra *, bool)
void start_listener()
cdef extern from "visionipc_client.h":
cdef cppclass VisionIpcClient:
VisionIpcClient(string, VisionStreamType, bool, void*, void*)
VisionBuf * recv(VisionIpcBufExtra *, int)
bool connect(bool)
bool is_connected()
File diff suppressed because it is too large Load Diff
-99
View File
@@ -1,99 +0,0 @@
# distutils: language = c++
# cython: c_string_encoding=ascii, language_level=3
import sys
import numpy as np
cimport numpy as cnp
from cython.view cimport array
from libc.string cimport memcpy
from libc.stdint cimport uint32_t, uint64_t
from libcpp cimport bool
from libcpp.string cimport string
from .visionipc cimport VisionIpcServer as cppVisionIpcServer
from .visionipc cimport VisionIpcClient as cppVisionIpcClient
from .visionipc cimport VisionBuf as cppVisionBuf
from .visionipc cimport VisionIpcBufExtra
cpdef enum VisionStreamType:
VISION_STREAM_ROAD
VISION_STREAM_DRIVER
VISION_STREAM_WIDE_ROAD
VISION_STREAM_MAP
cdef class VisionIpcServer:
cdef cppVisionIpcServer * server
def __init__(self, string name):
self.server = new cppVisionIpcServer(name, NULL, NULL)
def create_buffers(self, VisionStreamType tp, size_t num_buffers, bool rgb, size_t width, size_t height):
self.server.create_buffers(tp, num_buffers, rgb, width, height)
def create_buffers_with_sizes(self, VisionStreamType tp, size_t num_buffers, bool rgb, size_t width, size_t height, size_t size, size_t stride, size_t uv_offset):
self.server.create_buffers_with_sizes(tp, num_buffers, rgb, width, height, size, stride, uv_offset)
def send(self, VisionStreamType tp, const unsigned char[:] data, uint32_t frame_id=0, uint64_t timestamp_sof=0, uint64_t timestamp_eof=0):
cdef cppVisionBuf * buf = self.server.get_buffer(tp)
# Populate buffer
assert buf.len == len(data)
memcpy(buf.addr, &data[0], len(data))
buf.set_frame_id(frame_id)
cdef VisionIpcBufExtra extra
extra.frame_id = frame_id
extra.timestamp_sof = timestamp_sof
extra.timestamp_eof = timestamp_eof
self.server.send(buf, &extra, False)
def start_listener(self):
self.server.start_listener()
def __dealloc__(self):
del self.server
cdef class VisionIpcClient:
cdef cppVisionBuf * buf
cdef cppVisionIpcClient * client
def __cinit__(self, string name, VisionStreamType stream, bool conflate):
self.client = new cppVisionIpcClient(name, stream, conflate, NULL, NULL)
self.buf = NULL
def __dealloc__(self):
del self.client
@property
def width(self):
return None if not self.buf else self.buf.width
@property
def height(self):
return None if not self.buf else self.buf.height
@property
def stride(self):
return None if not self.buf else self.buf.stride
@property
def uv_offset(self):
return None if not self.buf else self.buf.uv_offset
def recv(self, int timeout_ms=100):
self.buf = self.client.recv(NULL, timeout_ms)
if not self.buf:
return None
cdef cnp.ndarray dat = np.empty(self.buf.len, dtype=np.uint8)
cdef char[:] dat_view = dat
memcpy(&dat_view[0], self.buf.addr, self.buf.len)
return dat
def connect(self, bool blocking):
return self.client.connect(blocking)
def is_connected(self):
return self.client.is_connected()
Binary file not shown.
-43
View File
@@ -1,43 +0,0 @@
#pragma once
#include <vector>
#include <string>
#include <thread>
#include <atomic>
#include <map>
#include "messaging/messaging.h"
#include "visionipc/visionipc.h"
#include "visionipc/visionbuf.h"
std::string get_endpoint_name(std::string name, VisionStreamType type);
class VisionIpcServer {
private:
cl_device_id device_id = nullptr;
cl_context ctx = nullptr;
uint64_t server_id;
std::atomic<bool> should_exit = false;
std::string name;
std::thread listener_thread;
std::map<VisionStreamType, std::atomic<size_t> > cur_idx;
std::map<VisionStreamType, std::vector<VisionBuf*> > buffers;
std::map<VisionStreamType, std::map<VisionBuf*, size_t> > idxs;
Context * msg_ctx;
std::map<VisionStreamType, PubSocket*> sockets;
void listener(void);
public:
VisionIpcServer(std::string name, cl_device_id device_id=nullptr, cl_context ctx=nullptr);
~VisionIpcServer();
VisionBuf * get_buffer(VisionStreamType type);
void create_buffers(VisionStreamType type, size_t num_buffers, bool rgb, size_t width, size_t height);
void create_buffers_with_sizes(VisionStreamType type, size_t num_buffers, bool rgb, size_t width, size_t height, size_t size, size_t stride, size_t uv_offset);
void send(VisionBuf * buf, VisionIpcBufExtra * extra, bool sync=true);
void start_listener();
};
+29
View File
@@ -0,0 +1,29 @@
Import('env', 'envCython', 'arch')
common_libs = [
'params.cc',
'swaglog.cc',
'util.cc',
'ratekeeper.cc',
'clutil.cc',
]
_common = env.Library('common', common_libs, LIBS="json11")
Export('_common')
if GetOption('extras'):
env.Program('tests/test_common',
['tests/test_runner.cc', 'tests/test_params.cc', 'tests/test_util.cc', 'tests/test_swaglog.cc'],
LIBS=[_common, 'json11', 'zmq', 'pthread'])
# Cython bindings
params_python = envCython.Program('params_pyx.so', 'params_pyx.pyx', LIBS=envCython['LIBS'] + [_common, 'zmq', 'json11'])
SConscript([
'transformations/SConscript',
])
Import('transformations_python')
common_python = [params_python, transformations_python]
Export('common_python')
+58
View File
@@ -0,0 +1,58 @@
import jwt
import os
import requests
from datetime import datetime, timedelta, UTC
from openpilot.system.hardware.hw import Paths
from openpilot.system.version import get_version
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com')
# name : jwt signature algorithm
KEYS = {"id_rsa" : "RS256",
"id_ecdsa" : "ES256"}
class Api:
def __init__(self, dongle_id):
self.dongle_id = dongle_id
self.jwt_algorithm, self.private_key, _ = get_key_pair()
def get(self, *args, **kwargs):
return self.request('GET', *args, **kwargs)
def post(self, *args, **kwargs):
return self.request('POST', *args, **kwargs)
def request(self, method, endpoint, timeout=None, access_token=None, **params):
return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
def get_token(self, payload_extra=None, expiry_hours=1):
now = datetime.now(UTC).replace(tzinfo=None)
payload = {
'identity': self.dongle_id,
'nbf': now,
'iat': now,
'exp': now + timedelta(hours=expiry_hours)
}
if payload_extra is not None:
payload.update(payload_extra)
token = jwt.encode(payload, self.private_key, algorithm=self.jwt_algorithm)
if isinstance(token, bytes):
token = token.decode('utf8')
return token
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
headers = {}
if access_token is not None:
headers['Authorization'] = "JWT " + access_token
headers['User-Agent'] = "openpilot-" + get_version()
return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params)
def get_key_pair():
for key in KEYS:
if os.path.isfile(Paths.persist_root() + f'/comma/{key}') and os.path.isfile(Paths.persist_root() + f'/comma/{key}.pub'):
with open(Paths.persist_root() + f'/comma/{key}') as private, open(Paths.persist_root() + f'/comma/{key}.pub') as public:
return KEYS[key], private.read(), public.read()
return None, None, None
-47
View File
@@ -1,47 +0,0 @@
import jwt
import os
import requests
from datetime import datetime, timedelta
from common.basedir import PERSIST
from system.version import get_version
from common.params import Params
API_HOST = os.getenv('API_HOST', 'https://api.commadotai.com') if not Params().get_bool("dp_api_custom") else Params().get("dp_api_custom_url", encoding='utf-8')
class Api():
def __init__(self, dongle_id):
self.dongle_id = dongle_id
with open(PERSIST+'/comma/id_rsa') as f:
self.private_key = f.read()
def get(self, *args, **kwargs):
return self.request('GET', *args, **kwargs)
def post(self, *args, **kwargs):
return self.request('POST', *args, **kwargs)
def request(self, method, endpoint, timeout=None, access_token=None, **params):
return api_get(endpoint, method=method, timeout=timeout, access_token=access_token, **params)
def get_token(self, expiry_hours=1):
now = datetime.utcnow()
payload = {
'identity': self.dongle_id,
'nbf': now,
'iat': now,
'exp': now + timedelta(hours=expiry_hours)
}
token = jwt.encode(payload, self.private_key, algorithm='RS256')
if isinstance(token, bytes):
token = token.decode('utf8')
return token
def api_get(endpoint, method='GET', timeout=None, access_token=None, **params):
headers = {}
if access_token is not None:
headers['Authorization'] = "JWT " + access_token
headers['User-Agent'] = "openpilot-" + get_version()
return requests.request(method, API_HOST + "/" + endpoint, timeout=timeout, headers=headers, params=params)
-7
View File
@@ -1,11 +1,4 @@
import os
from pathlib import Path
from system.hardware import PC
BASEDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), "../"))
if PC:
PERSIST = os.path.join(str(Path.home()), ".comma", "persist")
else:
PERSIST = "/persist"
-2944
View File
File diff suppressed because it is too large Load Diff
-24
View File
@@ -1,24 +0,0 @@
# distutils: language = c++
# cython: language_level = 3
from posix.time cimport clock_gettime, timespec, CLOCK_MONOTONIC_RAW, clockid_t
IF UNAME_SYSNAME == "Darwin":
# Darwin doesn't have a CLOCK_BOOTTIME
CLOCK_BOOTTIME = CLOCK_MONOTONIC_RAW
ELSE:
from posix.time cimport CLOCK_BOOTTIME
cdef double readclock(clockid_t clock_id):
cdef timespec ts
cdef double current
clock_gettime(clock_id, &ts)
current = ts.tv_sec + (ts.tv_nsec / 1000000000.)
return current
def monotonic_time():
return readclock(CLOCK_MONOTONIC_RAW)
def sec_since_boot():
return readclock(CLOCK_BOOTTIME)
BIN
View File
Binary file not shown.
+2 -2
View File
@@ -22,7 +22,7 @@
})
cl_device_id cl_get_device_id(cl_device_type device_type);
cl_context cl_create_context(cl_device_id device_id);
void cl_release_context(cl_context context);
cl_program cl_program_from_source(cl_context ctx, cl_device_id device_id, const std::string& src, const char* args = nullptr);
cl_program cl_program_from_binary(cl_context ctx, cl_device_id device_id, const uint8_t* binary, size_t length, const char* args = nullptr);
cl_program cl_program_from_file(cl_context ctx, cl_device_id device_id, const char* path, const char* args);
const char* cl_get_error_string(int err);
+23
View File
@@ -0,0 +1,23 @@
import numpy as np
# conversions
class CV:
# Speed
MPH_TO_KPH = 1.609344
KPH_TO_MPH = 1. / MPH_TO_KPH
MS_TO_KPH = 3.6
KPH_TO_MS = 1. / MS_TO_KPH
MS_TO_MPH = MS_TO_KPH * KPH_TO_MPH
MPH_TO_MS = MPH_TO_KPH * KPH_TO_MS
MS_TO_KNOTS = 1.9438
KNOTS_TO_MS = 1. / MS_TO_KNOTS
# Angle
DEG_TO_RAD = np.pi / 180.
RAD_TO_DEG = 1. / DEG_TO_RAD
# Mass
LB_TO_KG = 0.453592
ACCELERATION_DUE_TO_GRAVITY = 9.81 # m/s^2
-9
View File
@@ -1,9 +0,0 @@
# remove all keys that end in DEPRECATED
def strip_deprecated_keys(d):
for k in list(d.keys()):
if isinstance(k, str):
if k.endswith('DEPRECATED'):
d.pop(k)
elif isinstance(d[k], dict):
strip_deprecated_keys(d[k])
return d
-275
View File
@@ -1,275 +0,0 @@
#!/usr/bin/env python3.7
#pylint: skip-file
import os
import sys
import json
import time
from math import floor
'''
* type: Bool, Int8, UInt8, UInt16, Float32
* conf_type: param, struct
* dependencies needs to use struct and loaded prior so we don't have to read the param multiple times.
* update_once: True, False (the param will only load up once, need both param and struct defined)
'''
confs = [
# custom api server
{'name': 'dp_api_custom', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_api_custom_url', 'default': 'https://api.retropilot.org', 'type': 'Text', 'depends': [{'name': 'dp_api_custom', 'vals': [True]}], 'conf_type': ['param']},
{'name': 'dp_atl', 'default': 0, 'type': 'UInt8', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_locale', 'default': 'en-US', 'type': 'Text', 'conf_type': ['param', 'struct'], 'update_once': True},
{'name': 'dp_jetson', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# nav service
{'name': 'dp_otisserv', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_nav_mapbox_token_pk', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_mapbox_token_sk', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_full_screen', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_nav_gmap_enable', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_nav_gmap_key', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_amap_enable', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_nav_amap_key', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_amap_key_2', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_style_day', 'default': 'mapbox://styles/rav4kumar/ckv7dtfba6oik15r0w8dh1c1q', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_nav_style_night', 'default': 'mapbox://styles/rav4kumar/ckvsf3f4u0zb414tcz9vof5jc', 'type': 'Text', 'conf_type': ['param']},
# gpxd
{'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# assign car via param
# echo -n TOYOTA C-HR 2021 > /data/params/d/dp_car_assigned
{'name': 'dp_car_assigned', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_car_list', 'default': '', 'type': 'Text', 'conf_type': ['param']},
{'name': 'dp_last_modified', 'default': str(floor(time.time())), 'type': 'Text', 'conf_type': ['param']},
# lateral - alc
{'name': 'dp_lateral_mode', 'default': 1, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param', 'struct']},
# {'name': 'dp_signal_off_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [0]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_min_mph', 'default': 30, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [1, 2]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_auto_min_mph', 'default': 40, 'type': 'UInt8', 'min': 0, 'max': 255, 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_lc_auto_delay', 'default': 3., 'type': 'Float32', 'min': 0., 'max': 10., 'depends': [{'name': 'dp_lateral_mode', 'vals': [2]}], 'conf_type': ['param', 'struct']},
#ui
{'name': 'dp_ip_addr', 'default': '', 'type': 'Text', 'conf_type': ['struct']},
{'name': 'dp_quiet_drive', 'default': False, 'type': 'Boolean', 'conf_type': ['param']},
{'name': 'dp_ui_top', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_side', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_volume', 'default': -5, 'type': 'Int8', 'min': -5, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_brightness', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 100, 'conf_type': ['param', 'struct']},
{'name': 'dp_ui_display_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 1, 'conf_type': ['param', 'struct']},
#toyota
{'name': 'dp_toyota_sng', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_accel_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_accel_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_accel_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_ap_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_toyota_cruise_override', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_toyota_cruise_override_speed', 'default': 30, 'type': 'UInt8', 'min': 5, 'max': 60, 'conf_type': ['param', 'struct']},
{'name': 'dp_use_lanelines', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_mapd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
{'name': 'dp_lateral_lqr', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# # dashcam related
# {'name': 'dp_dashcamd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# # auto shutdown
{'name': 'dp_auto_shutdown', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
{'name': 'dp_auto_shutdown_in', 'default': 90, 'type': 'UInt16', 'min': 0, 'max': 600, 'depends': [{'name': 'dp_auto_shutdown', 'vals': [True]}], 'conf_type': ['param']},
{'name': 'dp_mazda_steer_alert', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# # service
# {'name': 'dp_updated', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_logger', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_athenad', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
# {'name': 'dp_uploader', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct'], 'update_once': True},
# # {'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_hotspot_on_boot', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# # lat ctrl
# {'name': 'dp_lane_less_mode_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_lane_less_mode', 'default': 2, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_lane_less_mode_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# # long ctrl
# {'name': 'dp_allow_gas', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
# #{'name': 'dp_following_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# #{'name': 'dp_following_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 3, 'depends': [{'name': 'dp_following_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# {'name': 'dp_accel_profile_ctrl', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_accel_profile', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'depends': [{'name': 'dp_accel_profile_ctrl', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# # safety
# {'name': 'dp_gear_check', 'default': True, 'type': 'Bool', 'depends': [{'name': 'dp_atl', 'vals': [False]}], 'conf_type': ['param', 'struct']},
# {'name': 'dp_speed_check', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_temp_monitor', 'default': True, 'type': 'Bool', 'conf_type': ['param']},
# # UIs
# {'name': 'dp_ui_display_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 1, 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_event', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_max_speed', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_face', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_lane', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_lead', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_side', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_top', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_blinker', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_brightness', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 100, 'conf_type': ['param', 'struct']},
# {'name': 'dp_ui_volume', 'default': -5, 'type': 'Int8', 'min': -5, 'max': 100, 'conf_type': ['param', 'struct']},
# # toyota
# {'name': 'dp_toyota_no_min_acc_limit', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_toyota_ldw', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_toyota_zss', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_toyota_fp_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_toyota_ap_btn_link', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_toyota_disable_relay', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_toyota_cruise_override', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_toyota_cruise_override_vego', 'default': False, 'type': 'Bool', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'conf_type': ['param', 'struct']},
# {'name': 'dp_toyota_cruise_override_at', 'default': 44, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., 'conf_type': ['param', 'struct']},
# {'name': 'dp_toyota_cruise_override_speed', 'default': 32, 'type': 'Float32', 'depends': [{'name': 'dp_toyota_cruise_override', 'vals': [True]}], 'min': 0, 'max': 50., 'conf_type': ['param', 'struct']},
# # hyundai
# {'name': 'dp_hkg_smart_mdps', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# # honda
# {'name': 'dp_honda_eps_mod', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_honda_kmh_display', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# # volkswagen
# # {'name': 'dp_vw_panda', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# #misc
# {'name': 'dp_ip_addr', 'default': '', 'type': 'Text', 'conf_type': ['struct']},
# {'name': 'dp_fan_mode', 'default': 0, 'type': 'UInt8', 'min': 0, 'max': 2, 'conf_type': ['param']},
# {'name': 'dp_last_modified', 'default': str(floor(time.time())), 'type': 'Text', 'conf_type': ['param']},
# {'name': 'dp_camera_offset', 'default': 6 if EON else -4 if TICI else 0, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
# {'name': 'dp_path_offset', 'default': 0 if EON else -4 if TICI else 0, 'type': 'Int8', 'min': -100, 'max': 100, 'conf_type': ['param', 'struct']},
#
# {'name': 'dp_reg', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# # sr learner related
# {'name': 'dp_sr_learner', 'default': True, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# {'name': 'dp_sr_custom', 'default': 9.99, 'min': 9.99, 'max': 30., 'type': 'Float32', 'depends': [{'name': 'dp_sr_learner', 'vals': [False]}], 'conf_type': ['param', 'struct']},
# {'name': 'dp_sr_stock', 'default': 9.99, 'min': 9.99, 'max': 100., 'type': 'Float32', 'conf_type': ['param']},
#
# {'name': 'dp_lqr', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_reset_live_param_on_start', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
#
# {'name': 'dp_car_assigned', 'default': '', 'type': 'Text', 'conf_type': ['param']},
# {'name': 'dp_no_batt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_last_candidate', 'default': '', 'type': 'Text', 'conf_type': ['param']},
# {'name': 'dp_prebuilt', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_gpxd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_mapd', 'default': False, 'type': 'Bool', 'conf_type': ['param', 'struct']},
# # no gps is for mr. one's harness + black panda in one solution (without GPS chip)
# {'name': 'dp_panda_no_gps', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
#
# {'name': 'dp_no_offroad_fix', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
# {'name': 'dp_ftpd', 'default': False, 'type': 'Bool', 'conf_type': ['param']},
]
def get_definition(name):
for conf in confs:
if conf['name'] == name:
return conf
return None
def to_param_val(name, val):
conf = get_definition(name)
if conf is not None:
type = conf['type'].lower()
try:
if 'bool' in type:
val = '1' if val else '0'
elif 'int' in type:
val = int(val)
elif 'float' in type:
val = float(val)
return str(val)
except (ValueError, TypeError):
return ''
return ''
def to_struct_val(name, val):
conf = get_definition(name)
if conf is not None:
try:
type = conf['type'].lower()
if 'bool' in type:
val = True if val == '1' else False
elif 'int' in type:
val = int(val)
elif 'float' in type:
val = float(val)
return val
except (ValueError, TypeError):
return None
return None
'''
function to convert param name into struct name.
'''
def get_struct_name(snake_str):
components = snake_str.split('_')
# We capitalize the first letter of each component except the first one
# with the 'title' method and join them together.
return components[0] + ''.join(x.title() for x in components[1:])
'''
function to generate struct for log.capnp
'''
def gen_log_struct():
count = 0
str = "# dp\n"
str += "struct DragonConf {\n"
for conf in confs:
name = get_struct_name(conf['name'])
if 'struct' in conf['conf_type']:
str += f" {name} @{count} :{conf['type']};\n"
count += 1
str += "}"
print(str)
'''
function to generate support car list
'''
def get_support_car_list():
attrs = ['FINGERPRINTS', 'FW_VERSIONS']
cars = dict({"cars": []})
models = []
for car_folder in [x[0] for x in os.walk('/data/openpilot/selfdrive/car')]:
try:
car_name = car_folder.split('/')[-1]
if car_name != "mock":
for attr in attrs:
values = __import__('selfdrive.car.%s.values' % car_name, fromlist=[attr])
if hasattr(values, attr):
attr_values = getattr(values, attr)
else:
continue
if isinstance(attr_values, dict):
for f, v in attr_values.items():
if f not in models:
models.append(f)
except (ImportError, IOError, ValueError):
pass
models.sort()
cars["cars"] = models
return json.dumps(cars)
'''
function to init param value.
should add this into manager.py
'''
def init_params_vals(params):
for conf in confs:
if 'param' in conf['conf_type']:
if conf['name'] == 'dp_car_list':
params.put(conf['name'], get_support_car_list())
elif params.get(conf['name']) is None:
params.put(conf['name'], to_param_val(conf['name'], conf['default']))
def gen_params_cc_keys():
for conf in confs:
if 'param' in conf['conf_type']:
print(" {\"%s\", PERSISTENT}," % conf['name'])
if __name__ == "__main__":
if (len(sys.argv) > 1) and sys.argv[1] == 'cc':
gen_params_cc_keys()
else:
gen_log_struct()
-59
View File
@@ -1,59 +0,0 @@
#!/usr/bin/env python3.7
# import subprocess
# from cereal import car
from common.params import Params
from common.realtime import sec_since_boot
import os
params = Params()
LAST_MODIFIED = params.get_param_path() + "/dp_last_modified"
# delay of reading last modified
# LAST_MODIFIED_TIMER_THERMALD = 10.
LAST_MODIFIED_TIMER_SYSTEMD = 1.
# LAST_MODIFIED_TIMER_LANE_PLANNER = 3.
# LAST_MODIFIED_TIMER_UPLOADER = 10.
# def is_online():
# try:
# return not subprocess.call(["ping", "-W", "4", "-c", "1", "117.28.245.92"])
# except ProcessLookupError:
# return False
#
# def common_controller_ctrl(enabled, dragonconf, blinker_on, steer_req, v_ego):
# if enabled:
# if dragonconf.dpLateralMode == 0 and blinker_on:
# steer_req = 0 if isinstance(steer_req, int) else False
# return steer_req
#
def get_last_modified(delay, old_check, old_modified):
new_check = sec_since_boot()
if os.path.isfile(LAST_MODIFIED) and (old_check is None or new_check - old_check >= delay):
return new_check, os.stat(LAST_MODIFIED).st_mtime
else:
return old_check, old_modified
# def param_get_if_updated(param, type, old_val, old_modified):
# try:
# modified = os.stat(PARAM_PATH + param).st_mtime
# except OSError:
# return old_val, old_modified
# if old_modified != modified:
# new_val = param_get(param, type, old_val)
# new_modified = modified
# else:
# new_val = old_val
# new_modified = old_modified
# return new_val, new_modified
# def param_get(param_name, type, default):
# try:
# val = params.get(param_name, encoding='utf8').rstrip('\x00')
# if type == 'bool':
# val = val == '1'
# elif type == 'int':
# val = int(val)
# elif type == 'float':
# val = float(val)
# except (TypeError, ValueError):
# val = default
# return val
-55
View File
@@ -1,55 +0,0 @@
import os
import sys
import fcntl
import hashlib
import platform
from cffi import FFI
def suffix():
if platform.system() == "Darwin":
return ".dylib"
else:
return ".so"
def ffi_wrap(name, c_code, c_header, tmpdir="/tmp/ccache", cflags="", libraries=None):
if libraries is None:
libraries = []
cache = name + "_" + hashlib.sha1(c_code.encode('utf-8')).hexdigest()
try:
os.mkdir(tmpdir)
except OSError:
pass
fd = os.open(tmpdir, 0)
fcntl.flock(fd, fcntl.LOCK_EX)
try:
sys.path.append(tmpdir)
try:
mod = __import__(cache)
except Exception:
print(f"cache miss {cache}")
compile_code(cache, c_code, c_header, tmpdir, cflags, libraries)
mod = __import__(cache)
finally:
os.close(fd)
return mod.ffi, mod.lib
def compile_code(name, c_code, c_header, directory, cflags="", libraries=None):
if libraries is None:
libraries = []
ffibuilder = FFI()
ffibuilder.set_source(name, c_code, source_extension='.cpp', libraries=libraries)
ffibuilder.cdef(c_header)
os.environ['OPT'] = "-fwrapv -O2 -DNDEBUG -std=c++1z"
os.environ['CFLAGS'] = cflags
ffibuilder.compile(verbose=True, debug=False, tmpdir=directory)
def wrap_compiled(name, directory):
sys.path.append(directory)
mod = __import__(name)
return mod.ffi, mod.lib
-99
View File
@@ -1,99 +0,0 @@
import os
import shutil
import tempfile
from atomicwrites import AtomicWriter
def mkdirs_exists_ok(path):
if path.startswith('http://') or path.startswith('https://'):
raise ValueError('URL path')
try:
os.makedirs(path)
except OSError:
if not os.path.isdir(path):
raise
def rm_not_exists_ok(path):
try:
os.remove(path)
except OSError:
if os.path.exists(path):
raise
def rm_tree_or_link(path):
if os.path.islink(path):
os.unlink(path)
elif os.path.isdir(path):
shutil.rmtree(path)
def get_tmpdir_on_same_filesystem(path):
normpath = os.path.normpath(path)
parts = normpath.split("/")
if len(parts) > 1 and parts[1] == "scratch":
return "/scratch/tmp"
elif len(parts) > 2 and parts[2] == "runner":
return f"/{parts[1]}/runner/tmp"
return "/tmp"
class NamedTemporaryDir():
def __init__(self, temp_dir=None):
self._path = tempfile.mkdtemp(dir=temp_dir)
@property
def name(self):
return self._path
def close(self):
shutil.rmtree(self._path)
def __enter__(self):
return self
def __exit__(self, exc_type, exc_value, traceback):
self.close()
class CallbackReader:
"""Wraps a file, but overrides the read method to also
call a callback function with the number of bytes read so far."""
def __init__(self, f, callback, *args):
self.f = f
self.callback = callback
self.cb_args = args
self.total_read = 0
def __getattr__(self, attr):
return getattr(self.f, attr)
def read(self, *args, **kwargs):
chunk = self.f.read(*args, **kwargs)
self.total_read += len(chunk)
self.callback(*self.cb_args, self.total_read)
return chunk
def _get_fileobject_func(writer, temp_dir):
def _get_fileobject():
return writer.get_fileobject(dir=temp_dir)
return _get_fileobject
def atomic_write_on_fs_tmp(path, **kwargs):
"""Creates an atomic writer using a temporary file in a temporary directory
on the same filesystem as path.
"""
# TODO(mgraczyk): This use of AtomicWriter relies on implementation details to set the temp
# directory.
writer = AtomicWriter(path, **kwargs)
return writer._open(_get_fileobject_func(writer, get_tmpdir_on_same_filesystem(path)))
def atomic_write_in_dir(path, **kwargs):
"""Creates an atomic writer using a temporary file in the same directory
as the destination file.
"""
writer = AtomicWriter(path, **kwargs)
return writer._open(_get_fileobject_func(writer, os.path.dirname(path)))
+17 -1
View File
@@ -1,5 +1,4 @@
class FirstOrderFilter:
# first order filter
def __init__(self, x0, rc, dt, initialized=True):
self.x = x0
self.dt = dt
@@ -16,3 +15,20 @@ class FirstOrderFilter:
self.initialized = True
self.x = x
return self.x
class BounceFilter(FirstOrderFilter):
def __init__(self, x0, rc, dt, initialized=True, bounce=2):
self.velocity = FirstOrderFilter(0.0, 0.15, dt)
self.bounce = bounce
super().__init__(x0, rc, dt, initialized)
def update(self, x):
super().update(x)
scale = self.dt / (1.0 / 60.0) # tuned at 60 fps
self.velocity.x += (x - self.x) * self.bounce * scale * self.dt
self.velocity.update(0.0)
if abs(self.velocity.x) < 1e-5:
self.velocity.x = 0.0
self.x += self.velocity.x
return self.x
+42
View File
@@ -0,0 +1,42 @@
from functools import cache
import subprocess
from openpilot.common.utils import run_cmd, run_cmd_default
@cache
def get_commit(cwd: str = None, branch: str = "HEAD") -> str:
return run_cmd_default(["git", "rev-parse", branch], cwd=cwd)
@cache
def get_commit_date(cwd: str = None, commit: str = "HEAD") -> str:
return run_cmd_default(["git", "show", "--no-patch", "--format='%ct %ci'", commit], cwd=cwd)
@cache
def get_short_branch(cwd: str = None) -> str:
return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "HEAD"], cwd=cwd)
@cache
def get_branch(cwd: str = None) -> str:
return run_cmd_default(["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd=cwd)
@cache
def get_origin(cwd: str = None) -> str:
try:
local_branch = run_cmd(["git", "name-rev", "--name-only", "HEAD"], cwd=cwd)
tracking_remote = run_cmd(["git", "config", "branch." + local_branch + ".remote"], cwd=cwd)
return run_cmd(["git", "config", "remote." + tracking_remote + ".url"], cwd=cwd)
except subprocess.CalledProcessError: # Not on a branch, fallback
return run_cmd_default(["git", "config", "--get", "remote.origin.url"], cwd=cwd)
@cache
def get_normalized_origin(cwd: str = None) -> str:
return get_origin(cwd) \
.replace("git@", "", 1) \
.replace(".git", "", 1) \
.replace("https://", "", 1) \
.replace(":", "/", 1)
-21
View File
@@ -1,21 +0,0 @@
#pragma once
// Pin definitions
#ifdef QCOM2
#define GPIO_HUB_RST_N 30
#define GPIO_UBLOX_RST_N 32
#define GPIO_UBLOX_SAFEBOOT_N 33
#define GPIO_UBLOX_PWR_EN 34
#define GPIO_STM_RST_N 124
#define GPIO_STM_BOOT0 134
#else
#define GPIO_HUB_RST_N 0
#define GPIO_UBLOX_RST_N 0
#define GPIO_UBLOX_SAFEBOOT_N 0
#define GPIO_UBLOX_PWR_EN 0
#define GPIO_STM_RST_N 0
#define GPIO_STM_BOOT0 0
#endif
int gpio_init(int pin_nr, bool output);
int gpio_set(int pin_nr, bool high);
+76 -1
View File
@@ -1,3 +1,8 @@
import os
import fcntl
import ctypes
from functools import cache
def gpio_init(pin: int, output: bool) -> None:
try:
with open(f"/sys/class/gpio/gpio{pin}/direction", 'wb') as f:
@@ -5,10 +10,80 @@ def gpio_init(pin: int, output: bool) -> None:
except Exception as e:
print(f"Failed to set gpio {pin} direction: {e}")
def gpio_set(pin: int, high: bool) -> None:
try:
with open(f"/sys/class/gpio/gpio{pin}/value", 'wb') as f:
f.write(b"1" if high else b"0")
except Exception as e:
print(f"Failed to set gpio {pin} value: {e}")
def gpio_read(pin: int) -> bool | None:
val = None
try:
with open(f"/sys/class/gpio/gpio{pin}/value", 'rb') as f:
val = bool(int(f.read().strip()))
except Exception as e:
print(f"Failed to set gpio {pin} value: {e}")
return val
def gpio_export(pin: int) -> None:
if os.path.isdir(f"/sys/class/gpio/gpio{pin}"):
return
try:
with open("/sys/class/gpio/export", 'w') as f:
f.write(str(pin))
except Exception:
print(f"Failed to export gpio {pin}")
@cache
def get_irq_action(irq: int) -> list[str]:
try:
with open(f"/sys/kernel/irq/{irq}/actions") as f:
actions = f.read().strip().split(',')
return actions
except FileNotFoundError:
return []
def get_irqs_for_action(action: str) -> list[str]:
ret = []
with open("/proc/interrupts") as f:
for l in f.readlines():
irq = l.split(':')[0].strip()
if irq.isdigit() and action in get_irq_action(irq):
ret.append(irq)
return ret
# *** gpiochip ***
class gpioevent_data(ctypes.Structure):
_fields_ = [
("timestamp", ctypes.c_uint64),
("id", ctypes.c_uint32),
]
class gpioevent_request(ctypes.Structure):
_fields_ = [
("lineoffset", ctypes.c_uint32),
("handleflags", ctypes.c_uint32),
("eventflags", ctypes.c_uint32),
("label", ctypes.c_char * 32),
("fd", ctypes.c_int)
]
def gpiochip_get_ro_value_fd(label: str, gpiochip_id: int, pin: int) -> int:
GPIOEVENT_REQUEST_BOTH_EDGES = 0x3
GPIOHANDLE_REQUEST_INPUT = 0x1
GPIO_GET_LINEEVENT_IOCTL = 0xc030b404
rq = gpioevent_request()
rq.lineoffset = pin
rq.handleflags = GPIOHANDLE_REQUEST_INPUT
rq.eventflags = GPIOEVENT_REQUEST_BOTH_EDGES
rq.label = label.encode('utf-8')[:31] + b'\0'
fd = os.open(f"/dev/gpiochip{gpiochip_id}", os.O_RDONLY)
fcntl.ioctl(fd, GPIO_GET_LINEEVENT_IOCTL, rq)
os.close(fd)
return int(rq.fd)
+8
View File
@@ -0,0 +1,8 @@
from openpilot.common.params import Params
def get_gps_location_service(params: Params) -> str:
if params.get_bool("UbloxAvailable"):
return "gpsLocationExternal"
else:
return "gpsLocation"
-20
View File
@@ -1,20 +0,0 @@
import gettext
from common.params import Params
locale_dir = "/data/openpilot/selfdrive/assets/locales"
# supported_language = ["en-US", "zh-TW", "zh-CN", "ja-JP", "ko-KR"]
supported_languages = {
"main_zh-CHT": "zh-TW",
"main_zh-CHS": "zh-CN",
"main_ko": "ko-KR",
}
def events():
locale = Params().get("LanguageSetting", encoding='utf8')
if locale is not None:
locale = supported_languages[locale.strip()]
else:
locale = "en-US"
i18n = gettext.translation("events", localedir=locale_dir, fallback=True, languages=[locale])
i18n.install()
return i18n.gettext
-17
View File
@@ -1,17 +0,0 @@
#pragma once
#include <cstdint>
#include <sys/types.h>
class I2CBus {
private:
int i2c_fd;
public:
I2CBus(uint8_t bus_id);
~I2CBus();
int read_register(uint8_t device_address, uint register_address, uint8_t *buffer, uint8_t len);
int set_register(uint8_t device_address, uint register_address, uint8_t data);
};
-1
View File
@@ -1 +0,0 @@
simple_kalman_impl.c
-3
View File
@@ -1,3 +0,0 @@
# pylint: skip-file
from common.kalman.simple_kalman_impl import KF1D as KF1D
assert KF1D
File diff suppressed because it is too large Load Diff
-18
View File
@@ -1,18 +0,0 @@
# cython: language_level = 3
cdef class KF1D:
cdef public:
double x0_0
double x1_0
double K0_0
double K1_0
double A0_0
double A0_1
double A1_0
double A1_1
double C0_0
double C0_1
double A_K_0
double A_K_1
double A_K_2
double A_K_3
-37
View File
@@ -1,37 +0,0 @@
# distutils: language = c++
# cython: language_level=3
cdef class KF1D:
def __init__(self, x0, A, C, K):
self.x0_0 = x0[0][0]
self.x1_0 = x0[1][0]
self.A0_0 = A[0][0]
self.A0_1 = A[0][1]
self.A1_0 = A[1][0]
self.A1_1 = A[1][1]
self.C0_0 = C[0]
self.C0_1 = C[1]
self.K0_0 = K[0][0]
self.K1_0 = K[1][0]
self.A_K_0 = self.A0_0 - self.K0_0 * self.C0_0
self.A_K_1 = self.A0_1 - self.K0_0 * self.C0_1
self.A_K_2 = self.A1_0 - self.K1_0 * self.C0_0
self.A_K_3 = self.A1_1 - self.K1_0 * self.C0_1
def update(self, meas):
cdef double x0_0 = self.A_K_0 * self.x0_0 + self.A_K_1 * self.x1_0 + self.K0_0 * meas
cdef double x1_0 = self.A_K_2 * self.x0_0 + self.A_K_3 * self.x1_0 + self.K1_0 * meas
self.x0_0 = x0_0
self.x1_0 = x1_0
return [self.x0_0, self.x1_0]
@property
def x(self):
return [[self.x0_0], [self.x1_0]]
@x.setter
def x(self, x):
self.x0_0 = x[0][0]
self.x1_0 = x[1][0]
Binary file not shown.
-23
View File
@@ -1,23 +0,0 @@
import numpy as np
class KF1D:
# this EKF assumes constant covariance matrix, so calculations are much simpler
# the Kalman gain also needs to be precomputed using the control module
def __init__(self, x0, A, C, K):
self.x = x0
self.A = A
self.C = np.atleast_2d(C)
self.K = K
self.A_K = self.A - np.dot(self.K, self.C)
# K matrix needs to be pre-computed as follow:
# import control
# (x, l, K) = control.dare(np.transpose(self.A), np.transpose(self.C), Q, R)
# self.K = np.transpose(K)
def update(self, meas):
self.x = np.dot(self.A_K, self.x) + np.dot(self.K, meas)
return self.x
-87
View File
@@ -1,87 +0,0 @@
import unittest
import random
import timeit
import numpy as np
from common.kalman.simple_kalman import KF1D
from common.kalman.simple_kalman_old import KF1D as KF1D_old
class TestSimpleKalman(unittest.TestCase):
def setUp(self):
dt = 0.01
x0_0 = 0.0
x1_0 = 0.0
A0_0 = 1.0
A0_1 = dt
A1_0 = 0.0
A1_1 = 1.0
C0_0 = 1.0
C0_1 = 0.0
K0_0 = 0.12287673
K1_0 = 0.29666309
self.kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]),
A=np.array([[A0_0, A0_1], [A1_0, A1_1]]),
C=np.array([C0_0, C0_1]),
K=np.array([[K0_0], [K1_0]]))
self.kf = KF1D(x0=[[x0_0], [x1_0]],
A=[[A0_0, A0_1], [A1_0, A1_1]],
C=[C0_0, C0_1],
K=[[K0_0], [K1_0]])
def test_getter_setter(self):
self.kf.x = [[1.0], [1.0]]
self.assertEqual(self.kf.x, [[1.0], [1.0]])
def update_returns_state(self):
x = self.kf.update(100)
self.assertEqual(x, self.kf.x)
def test_old_equal_new(self):
for _ in range(1000):
v_wheel = random.uniform(0, 200)
x_old = self.kf_old.update(v_wheel)
x = self.kf.update(v_wheel)
# Compare the output x, verify that the error is less than 1e-4
np.testing.assert_almost_equal(x_old[0], x[0])
np.testing.assert_almost_equal(x_old[1], x[1])
def test_new_is_faster(self):
setup = """
import numpy as np
from common.kalman.simple_kalman import KF1D
from common.kalman.simple_kalman_old import KF1D as KF1D_old
dt = 0.01
x0_0 = 0.0
x1_0 = 0.0
A0_0 = 1.0
A0_1 = dt
A1_0 = 0.0
A1_1 = 1.0
C0_0 = 1.0
C0_1 = 0.0
K0_0 = 0.12287673
K1_0 = 0.29666309
kf_old = KF1D_old(x0=np.array([[x0_0], [x1_0]]),
A=np.array([[A0_0, A0_1], [A1_0, A1_1]]),
C=np.array([C0_0, C0_1]),
K=np.array([[K0_0], [K1_0]]))
kf = KF1D(x0=[[x0_0], [x1_0]],
A=[[A0_0, A0_1], [A1_0, A1_1]],
C=[C0_0, C0_1],
K=[[K0_0], [K1_0]])
"""
kf_speed = timeit.timeit("kf.update(1234)", setup=setup, number=10000)
kf_old_speed = timeit.timeit("kf_old.update(1234)", setup=setup, number=10000)
self.assertTrue(kf_speed < kf_old_speed / 4)
if __name__ == "__main__":
unittest.main()
+6 -4
View File
@@ -8,6 +8,7 @@ import uuid
import socket
import logging
import traceback
import numpy as np
from threading import local
from collections import OrderedDict
from contextlib import contextmanager
@@ -15,6 +16,8 @@ from contextlib import contextmanager
LOG_TIMESTAMPS = "LOG_TIMESTAMPS" in os.environ
def json_handler(obj):
if isinstance(obj, np.bool_):
return bool(obj)
# if isinstance(obj, (datetime.date, datetime.time)):
# return obj.isoformat()
return repr(obj)
@@ -153,9 +156,9 @@ class SwagLogger(logging.Logger):
def bind_global(self, **kwargs):
self.global_ctx.update(kwargs)
def event(self, event_name, *args, **kwargs):
def event(self, event, *args, **kwargs):
evt = NiceOrderedDict()
evt['event'] = event_name
evt['event'] = event
if args:
evt['args'] = args
evt.update(kwargs)
@@ -196,8 +199,7 @@ class SwagLogger(logging.Logger):
co = f.f_code
filename = os.path.normcase(co.co_filename)
# TODO: is this pylint exception correct?
if filename == _srcfile: # pylint: disable=comparison-with-callable
if filename == _srcfile:
f = f.f_back
continue
sinfo = None
+45
View File
@@ -0,0 +1,45 @@
HTML_REPLACEMENTS = [
(r'&', r'&amp;'),
(r'"', r'&quot;'),
]
def parse_markdown(text: str, tab_length: int = 2) -> str:
lines = text.split("\n")
output: list[str] = []
list_level = 0
def end_outstanding_lists(level: int, end_level: int) -> int:
while level > end_level:
level -= 1
output.append("</ul>")
if level > 0:
output.append("</li>")
return end_level
for i, line in enumerate(lines):
if i + 1 < len(lines) and lines[i + 1].startswith("==="): # heading
output.append(f"<h1>{line}</h1>")
elif line.startswith("==="):
pass
elif line.lstrip().startswith("* "): # list
line_level = 1 + line.count(" " * tab_length, 0, line.index("*"))
if list_level >= line_level:
list_level = end_outstanding_lists(list_level, line_level)
else:
list_level += 1
if list_level > 1:
output[-1] = output[-1].replace("</li>", "")
output.append("<ul>")
output.append(f"<li>{line.replace('*', '', 1).lstrip()}</li>")
else:
list_level = end_outstanding_lists(list_level, 0)
if len(line) > 0:
output.append(line)
end_outstanding_lists(list_level, 0)
output_str = "\n".join(output) + "\n"
for (fr, to) in HTML_REPLACEMENTS:
output_str = output_str.replace(fr, to)
return output_str
+2 -2
View File
@@ -1,7 +1,7 @@
#pragma once
typedef struct vec3 {
float v[3];
float v[3];
} vec3;
typedef struct vec4 {
@@ -9,7 +9,7 @@ typedef struct vec4 {
} vec4;
typedef struct mat3 {
float v[3*3];
float v[3*3];
} mat3;
typedef struct mat4 {
+50
View File
@@ -0,0 +1,50 @@
"""
Utilities for generating mock messages for testing.
example in common/tests/test_mock.py
"""
import functools
import threading
from cereal.messaging import PubMaster
from cereal.services import SERVICE_LIST
from openpilot.common.mock.generators import generate_livePose
from openpilot.common.realtime import Ratekeeper
MOCK_GENERATOR = {
"livePose": generate_livePose
}
def generate_messages_loop(services: list[str], done: threading.Event):
pm = PubMaster(services)
rk = Ratekeeper(100)
i = 0
while not done.is_set():
for s in services:
should_send = i % (100/SERVICE_LIST[s].frequency) == 0
if should_send:
message = MOCK_GENERATOR[s]()
pm.send(s, message)
i += 1
rk.keep_time()
def mock_messages(services: list[str] | str):
if isinstance(services, str):
services = [services]
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
done = threading.Event()
t = threading.Thread(target=generate_messages_loop, args=(services, done))
t.start()
try:
return func(*args, **kwargs)
finally:
done.set()
t.join()
return wrapper
return decorator

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